diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt index cc0c576df..4b7699939 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt @@ -32,9 +32,9 @@ object BaseComponentRenderer : ChatComponentRenderer { return false } - override fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: BaseComponent, light: Int) { + override fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: BaseComponent, light: Int) { for (part in text.parts) { - ChatComponentRenderer.render3dFlat(renderWindow, scale, consumer, part, light) + ChatComponentRenderer.render3dFlat(renderWindow, offset, scale, maxSize, consumer, part, light) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt index 6a13d9a75..b49327c60 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt @@ -35,7 +35,7 @@ interface ChatComponentRenderer { */ fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, element: Element, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, renderInfo: TextRenderInfo, text: T): Boolean - fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: T, light: Int) + fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: T, light: Int) fun calculatePrimitiveCount(text: T): Int @@ -50,15 +50,15 @@ interface ChatComponentRenderer { } } - override fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: ChatComponent, light: Int) { + override fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: ChatComponent, light: Int) { when (text) { - is BaseComponent -> BaseComponentRenderer.render3dFlat(renderWindow, scale, consumer, text, light) - is TextComponent -> TextComponentRenderer.render3dFlat(renderWindow, scale, consumer, text, light) + is BaseComponent -> BaseComponentRenderer.render3dFlat(renderWindow, offset, scale, maxSize, consumer, text, light) + is TextComponent -> TextComponentRenderer.render3dFlat(renderWindow, offset, scale, maxSize, consumer, text, light) else -> TODO("Don't know how to render ${text::class.java}") } } - fun render3dFlat(renderWindow: RenderWindow, position: Vec3, scale: Float, rotation: Vec3, mesh: WorldMesh, text: ChatComponent, light: Int) { + fun render3dFlat(renderWindow: RenderWindow, position: Vec3, scale: Float, rotation: Vec3, maxSize: Vec2i, mesh: WorldMesh, text: ChatComponent, light: Int) { val matrix = Mat4() .translateAssign(position) .rotateDegreesAssign(rotation) @@ -69,7 +69,7 @@ interface ChatComponentRenderer { textMesh.data.ensureSize(primitives * textMesh.order.size * SingleWorldMesh.SectionArrayMeshStruct.FLOATS_PER_VERTEX) val consumer = WorldGUIConsumer(textMesh, matrix, light) - render3dFlat(renderWindow, scale, consumer, text, light) + render3dFlat(renderWindow, Vec2i(), scale, maxSize, consumer, text, light) } override fun calculatePrimitiveCount(text: ChatComponent): Int { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt index 55aee3cc1..1a01dd6a0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt @@ -204,16 +204,22 @@ object TextComponentRenderer : ChatComponentRenderer { return count } - override fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: TextComponent, light: Int) { + override fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: TextComponent, light: Int) { val color = text.color ?: ChatColors.BLACK val italic = text.formatting.contains(PreChatFormattingCodes.ITALIC) val bold = text.formatting.contains(PreChatFormattingCodes.BOLD) val strikethrough = text.formatting.contains(PreChatFormattingCodes.STRIKETHROUGH) val underlined = text.formatting.contains(PreChatFormattingCodes.UNDERLINED) + for (char in text.message.codePoints()) { val data = renderWindow.font[char] ?: continue - val width = data.render3d(consumer, color, shadow = false, italic = italic, bold = bold, strikethrough = strikethrough, underlined = underlined, scale = scale) + Font.HORIZONTAL_SPACING - consumer.offset((width / ChatComponentRenderer.TEXT_BLOCK_RESOLUTION) * scale) + val expectedWidth = ((data.width + Font.HORIZONTAL_SPACING) * scale).toInt() + if (maxSize.x - offset.x < expectedWidth) { // ToDo + return + } + val width = ((data.render3d(consumer, color, shadow = false, italic = italic, bold = bold, strikethrough = strikethrough, underlined = underlined, scale = scale) + Font.HORIZONTAL_SPACING) * scale).toInt() + offset.x += width + consumer.offset((width / ChatComponentRenderer.TEXT_BLOCK_RESOLUTION.toFloat())) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt index adf88dbe8..461724c15 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.gui.rendering.world.entities.renderer.sign import de.bixilon.kotlinglm.func.rad +import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.cast.CastUtil.nullCast @@ -26,6 +27,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.entity.sign.StandingSignBlock import de.bixilon.minosoft.data.registries.blocks.types.entity.sign.WallSignBlock import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.font.Font import de.bixilon.minosoft.gui.rendering.font.renderer.ChatComponentRenderer import de.bixilon.minosoft.gui.rendering.models.unbaked.element.UnbakedElement import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3 @@ -65,7 +67,7 @@ class SignBlockEntityRenderer( textMesh.data.ensureSize(primitives * textMesh.order.size * SingleWorldMesh.SectionArrayMeshStruct.FLOATS_PER_VERTEX) for (line in sign.lines) { - ChatComponentRenderer.render3dFlat(renderWindow, textPosition, TEXT_SCALE, Vec3(0.0f, -yRotation, 0.0f), mesh, line, light) + ChatComponentRenderer.render3dFlat(renderWindow, textPosition, TEXT_SCALE, Vec3(0.0f, -yRotation, 0.0f), Vec2i(SIGN_MAX_WIDTH * TEXT_SCALE, Font.TOTAL_CHAR_HEIGHT * TEXT_SCALE), mesh, line, light) textPosition.y -= 0.11f } }