diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt index 3bf359c99..0423f1356 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt @@ -65,15 +65,14 @@ class SignBlockEntityRenderer( return true } - private fun renderText(offset: FloatArray, rotationVector: Vec3, yRotation: Float, mesh: ChunkMesh, light: Int) { + private fun renderText(offset: FloatArray, rotationVector: Vec3, yRotation: Float, mesh: SingleChunkMesh, light: Int) { val textPosition = offset.toVec3() + rotationVector - val textMesh = mesh.textMesh!! var primitives = 0 for (line in sign.lines) { primitives += ChatComponentRenderer.calculatePrimitiveCount(line) } - textMesh.data.ensureSize(primitives * textMesh.order.size * SingleChunkMesh.WorldMeshStruct.FLOATS_PER_VERTEX) + mesh.data.ensureSize(primitives * mesh.order.size * SingleChunkMesh.WorldMeshStruct.FLOATS_PER_VERTEX) val alignment = context.connection.profiles.block.rendering.entities.sign.fontAlignment @@ -90,7 +89,7 @@ class SignBlockEntityRenderer( val rotationVector = Vec3(X_OFFSET, 17.5f / BLOCK_SIZE - Y_OFFSET, 9.0f / BLOCK_SIZE + Z_OFFSET) rotationVector.signRotate(yRotation.rad) - renderText(offset, rotationVector, yRotation, mesh, light) + renderText(offset, rotationVector, yRotation, mesh.textMesh!!, light) } private fun renderWallText(position: FloatArray, mesh: ChunkMesh, light: Int) { @@ -104,7 +103,7 @@ class SignBlockEntityRenderer( val rotationVector = Vec3(X_OFFSET, 12.5f / BLOCK_SIZE - Y_OFFSET, 2.0f / BLOCK_SIZE + Z_OFFSET) rotationVector.signRotate(yRotation.rad) - renderText(position, rotationVector, yRotation, mesh, light) + renderText(position, rotationVector, yRotation, mesh.textMesh!!, light) } private fun Vec3.signRotate(yRotation: Float) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesh/SingleChunkMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesh/SingleChunkMesh.kt index 4ad5f90c1..8907294cb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesh/SingleChunkMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesh/SingleChunkMesh.kt @@ -63,7 +63,6 @@ class SingleChunkMesh(context: RenderContext, initialCacheSize: Int, onDemand: B } companion object { - // TODO: uv coordinates should start in the upper left corner, then a 0=>0 mapping is possible val TRIANGLE_ORDER = intArrayOf( 0, 0, 3, 3, diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/WorldGUIConsumer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/WorldGUIConsumer.kt index a5ac4c2df..388b2639b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/WorldGUIConsumer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/WorldGUIConsumer.kt @@ -18,6 +18,8 @@ import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.minosoft.data.text.formatting.color.RGBColor import de.bixilon.minosoft.gui.rendering.chunk.mesh.SingleChunkMesh import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRenderer +import de.bixilon.minosoft.gui.rendering.font.renderer.properties.FontProperties +import de.bixilon.minosoft.gui.rendering.font.renderer.properties.FormattingProperties import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMeshCache import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions @@ -34,6 +36,28 @@ class WorldGUIConsumer(val mesh: SingleChunkMesh, val transform: Mat4, val light mesh.addVertex(transformed, uv, (texture as Texture?) ?: whiteTexture.texture, tint.rgb, light) } + override fun addChar(start: Vec2, end: Vec2, texture: Texture?, uvStart: Vec2, uvEnd: Vec2, italic: Boolean, tint: RGBColor, options: GUIVertexOptions?) { + // TODO: remove that override and change vertex order globally + val topOffset = if (italic) (end.y - start.y) / FontProperties.CHAR_BASE_HEIGHT * FormattingProperties.ITALIC_OFFSET else 0.0f + + val positions = arrayOf( + Vec2(start.x + topOffset, start.y), + Vec2(end.x + topOffset, start.y), + end, + Vec2(start.x, end.y), + ) + val texturePositions = arrayOf( + uvStart, + Vec2(uvEnd.x, uvStart.y), + uvEnd, + Vec2(uvStart.x, uvEnd.y), + ) + + for (index in 0 until order.size step 2) { + addVertex(positions[order[index]], texture, texturePositions[order[index + 1]], tint, options) + } + } + override fun addCache(cache: GUIMeshCache) { throw IllegalStateException("This is not hud!") } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRenderer.kt index 52e8adbb5..ea7b8bc48 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRenderer.kt @@ -21,7 +21,6 @@ import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.EmptyComponent import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.gui.rendering.RenderContext -import de.bixilon.minosoft.gui.rendering.chunk.mesh.ChunkMesh import de.bixilon.minosoft.gui.rendering.chunk.mesh.SingleChunkMesh import de.bixilon.minosoft.gui.rendering.font.WorldGUIConsumer import de.bixilon.minosoft.gui.rendering.font.manager.FontManager @@ -53,17 +52,16 @@ interface ChatComponentRenderer { } } - fun render3dFlat(context: RenderContext, position: Vec3, properties: TextRenderProperties, rotation: Vec3, maxSize: Vec2, mesh: ChunkMesh, text: ChatComponent, light: Int): TextRenderInfo { + fun render3dFlat(context: RenderContext, position: Vec3, properties: TextRenderProperties, rotation: Vec3, maxSize: Vec2, mesh: SingleChunkMesh, text: ChatComponent, light: Int): TextRenderInfo { val matrix = Mat4() .translateAssign(position) .rotateDegreesAssign(rotation) .translateAssign(Vec3(0, 0, -1)) - val textMesh = mesh.textMesh!! val primitives = calculatePrimitiveCount(text) - textMesh.data.ensureSize(primitives * textMesh.order.size * SingleChunkMesh.WorldMeshStruct.FLOATS_PER_VERTEX) + mesh.data.ensureSize(primitives * mesh.order.size * SingleChunkMesh.WorldMeshStruct.FLOATS_PER_VERTEX) - val consumer = WorldGUIConsumer(textMesh, matrix, light) + val consumer = WorldGUIConsumer(mesh, matrix, light) val info = TextRenderInfo(maxSize) render(TextOffset(), context.font, properties, info, null, null, text)