diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt index bbc9bc3cc..444cce9ef 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt @@ -15,7 +15,6 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.text import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec2.Vec2 -import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer @@ -23,6 +22,7 @@ import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRe import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions +import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh open class BillboardTextFeature( @@ -31,6 +31,7 @@ open class BillboardTextFeature( ) : EntityRenderFeature(renderer) { private var mesh: BillboardTextMesh? = null private var info: TextRenderInfo? = null + private var matrix = Mat4() var text: ChatComponent? = text set(value) { if (field == value) return @@ -40,11 +41,12 @@ open class BillboardTextFeature( override fun update(millis: Long, delta: Float) { if (!enabled) return unload() - if (this.mesh != null) return // matrix, ...? - val text = this.text ?: return unload() - if (text.length == 0) return unload() - - createMesh(text) + if (this.mesh == null) { + val text = this.text ?: return unload() + if (text.length == 0) return unload() + createMesh(text) + } + updateMatrix() } private fun createMesh(text: ChatComponent) { @@ -56,14 +58,21 @@ open class BillboardTextFeature( this.info = info } + private fun updateMatrix() { + val matrix = Mat4() + .translateYAssign(renderer.entity.eyeHeight + EYE_OFFSET) + + // TODO: rotate with camera (billboard) + + this.matrix = renderer.matrix * matrix + } + override fun draw() { val mesh = this.mesh ?: return if (mesh.state != Mesh.MeshStates.LOADED) mesh.load() renderer.renderer.context.system.reset(depth = DepthFunctions.ALWAYS) val shader = renderer.renderer.features.text.shader shader.use() - val matrix = Mat4() - .translateAssign(Vec3(renderer.entity.renderInfo.position + renderer.renderer.context.camera.offset.offset) + Vec3(0, 2, 0)) shader.matrix = matrix mesh.draw() } @@ -82,5 +91,6 @@ open class BillboardTextFeature( private companion object { val PROPERTIES = TextRenderProperties(allowNewLine = false) val MAX_SIZE = Vec2(150.0f, PROPERTIES.lineHeight) + const val EYE_OFFSET = 0.5f } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt index ac00447ba..459c0c734 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/EntityRenderer.kt @@ -29,6 +29,7 @@ import de.bixilon.minosoft.gui.rendering.entities.feature.hitbox.HitboxFeature import de.bixilon.minosoft.gui.rendering.entities.feature.text.EntityNameFeature import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign +import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign import de.bixilon.minosoft.util.interpolate.Interpolator abstract class EntityRenderer( @@ -53,13 +54,14 @@ abstract class EntityRenderer( } open fun updateMatrix(delta: Float) { + // TODO: update on demand val position = Vec3(entity.renderInfo.position - renderer.context.camera.offset.offset) matrix.reset() matrix.translateAssign(position) if (entity.isFlipped()) { matrix - .translateAssign(Vec3(0.0f, entity.dimensions.y + 0.2f, 0.0f)) + .translateYAssign(entity.dimensions.y + 0.2f) .rotateRadAssign(FLIP_ROTATION) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt index 5dadc76f5..7f4d26deb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.gui.rendering.entities.renderer.living.player -import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.minosoft.data.entities.Poses import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity @@ -32,6 +31,7 @@ import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMeshBuilder import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureListener import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState +import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign open class PlayerRenderer(renderer: EntitiesRenderer, entity: E) : LivingEntityRenderer(renderer, entity), DynamicTextureListener { protected var model: PlayerModel? = null @@ -116,7 +116,7 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: override fun updateMatrix(delta: Float) { super.updateMatrix(delta) when (entity.pose) { - Poses.SNEAKING -> matrix.translateAssign(SNEAKING_OFFSET) // TODO: interpolate + Poses.SNEAKING -> matrix.translateYAssign(SNEAKING_OFFSET) // TODO: interpolate else -> Unit } } @@ -129,7 +129,7 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: private val SKIN = minecraft("skin") - private val SNEAKING_OFFSET = Vec3(0.0f, -0.125f, 0.0f) + private const val SNEAKING_OFFSET = -0.125f override fun create(renderer: EntitiesRenderer, entity: PlayerEntity) = PlayerRenderer(renderer, entity) override fun buildMesh(context: RenderContext) = PlayerModelMesh(context) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshUtil.kt index 90033971a..3d478cd06 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshUtil.kt @@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec3.Vec3 import kotlin.math.abs object SkeletalMeshUtil { + private const val ADD = +0.001f private fun encodeY(part: Float): Int { if (part <= -1.0f) return 0 @@ -26,9 +27,9 @@ object SkeletalMeshUtil { } fun encodeNormal(normal: Vec3): Int { - val x = (abs(normal.x) * 15.0f).toInt() - val y = encodeY(normal.y + 0.001f) and 0x0F - val z = (abs(normal.z) * 15.0f).toInt() + val x = (abs(normal.x + ADD) * 15.0f).toInt() and 0x0F + val y = encodeY(normal.y + ADD) and 0x0F + val z = (abs(normal.z + ADD) * 15.0f).toInt() and 0x0F return (y shl 8) or (z shl 4) or (x) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt index 19c4b1595..21bc78a22 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/planet/PlanetRenderer.kt @@ -26,6 +26,7 @@ import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture +import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.Z abstract class PlanetRenderer( @@ -80,7 +81,7 @@ abstract class PlanetRenderer( matrix.rotateAssign(calculateAngle().rad, Vec3.Z) - matrix.translateAssign(Vec3(0.0f, -modifier, 0.0f)) // moves the planet closer to the player (appears bigger) + matrix.translateYAssign(-modifier) // moves the planet closer to the player (appears bigger) this.matrix = matrix diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4Util.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4Util.kt index 8b8403644..46da6f2a7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4Util.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4Util.kt @@ -54,7 +54,7 @@ object Mat4Util { System.arraycopy(empty.array, 0, array, 0, Mat4.length) } - fun Mat4.rotateXAssign(rad:Float): Mat4 { + fun Mat4.rotateXAssign(rad: Float): Mat4 { rotateX(this, rad) return this @@ -150,4 +150,12 @@ object Mat4Util { m[0, 2] = res0z m[0, 3] = res0w } + + fun Mat4.translateYAssign(vY: Float): Mat4 { + this[3, 0] += this[1, 0] * vY + this[3, 1] += this[1, 1] * vY + this[3, 2] += this[1, 2] * vY + this[3, 3] += this[1, 3] * vY + return this + } } diff --git a/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh b/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh index f6ffd9dfa..e58844ece 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh @@ -45,8 +45,7 @@ void main() { } finAllowTransparency = skinPart; run_skeletal(partTransformNormal, vinPosition); - vec4 light = getRGBColor(uTintColor & 0xFFFFFFu); - finTintColor *= light; + finTintColor *= getRGBColor(uTintColor & 0xFFFFFFu); finTextureIndex = uIndexLayer >> 28u; finTextureCoordinates = vec3(vinUV, ((uIndexLayer >> 12) & 0xFFFFu)); diff --git a/src/test/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4UtilTest.kt b/src/test/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4UtilTest.kt index 4ba4487e4..5db2c4541 100644 --- a/src/test/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4UtilTest.kt +++ b/src/test/java/de/bixilon/minosoft/gui/rendering/util/mat/mat4/Mat4UtilTest.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.util.mat.mat4 import de.bixilon.kotlinglm.func.rad import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -44,4 +45,12 @@ class Mat4UtilTest { assertEquals(expected, actual) } + + @Test + fun `custom translateYAssign`() { + val expected = Mat4().translateAssign(Vec3(0, 123.0f, 0)) + val actual = Mat4().translateYAssign(123.0f) + + assertEquals(expected, actual) + } }