From 8ce641cacf8847973eaa929c13cff4be86d0577b Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 13 Jun 2023 21:25:30 +0200 Subject: [PATCH] newline rendering --- .../component/ChatComponentRendererTest.kt | 6 ++-- .../component/BaseComponentRenderer.kt | 6 ++-- .../component/ChatComponentRenderer.kt | 8 ++--- .../component/TextComponentRenderer.kt | 32 +++++++++++++++---- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRendererTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRendererTest.kt index 2210eeb7a..627c0186a 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRendererTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/font/renderer/component/ChatComponentRendererTest.kt @@ -154,7 +154,7 @@ class ChatComponentRendererTest { info.assert( lineIndex = 1, lines = listOf( - TextLineInfo(BaseComponent(TextComponent("")), 0.0f), + TextLineInfo(BaseComponent(), 0.0f), ), size = Vec2(0.0f, 11.0f), ) @@ -175,10 +175,10 @@ class ChatComponentRendererTest { fun `basic new line 2`() { val info = render(TextComponent("bcd\n\nefgh")) info.assert( - lineIndex = 1, + lineIndex = 2, lines = listOf( TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f), - TextLineInfo(BaseComponent(TextComponent("")), 0.0f), + TextLineInfo(BaseComponent(), 0.0f), TextLineInfo(BaseComponent(TextComponent("efgh")), 14.0f), ), size = Vec2(14f, 33.0f), diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/BaseComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/BaseComponentRenderer.kt index 649eadf30..cf33fe7b6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/BaseComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/BaseComponentRenderer.kt @@ -26,10 +26,12 @@ import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions object BaseComponentRenderer : ChatComponentRenderer { - override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: BaseComponent) { + override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: BaseComponent): Boolean { for (part in text.parts) { - ChatComponentRenderer.render(offset, fontManager, properties, info, consumer, options, part) + val filled = ChatComponentRenderer.render(offset, fontManager, properties, info, consumer, options, part) + if (filled) return true } + return false } override fun render3dFlat(context: RenderContext, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: BaseComponent, light: Int) { 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 012d739f3..1b409afb5 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 @@ -37,7 +37,7 @@ interface ChatComponentRenderer { /** * Returns true if the text exceeded the maximum size */ - fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: T) + fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: T): Boolean fun render3dFlat(context: RenderContext, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: T, light: Int) @@ -46,11 +46,11 @@ interface ChatComponentRenderer { companion object : ChatComponentRenderer { const val TEXT_BLOCK_RESOLUTION = 128 - override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: ChatComponent) { - when (text) { + override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: ChatComponent): Boolean { + return when (text) { is BaseComponent -> BaseComponentRenderer.render(offset, fontManager, properties, info, consumer, options, text) is TextComponent -> TextComponentRenderer.render(offset, fontManager, properties, info, consumer, options, text) - is EmptyComponent -> return + is EmptyComponent -> return false else -> TODO("Don't know how to render ${text::class.java}") } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/TextComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/TextComponentRenderer.kt index 217f0c718..8d7e86532 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/TextComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/component/TextComponentRenderer.kt @@ -41,8 +41,19 @@ object TextComponentRenderer : ChatComponentRenderer { return properties.forcedColor ?: text.color ?: properties.fallbackColor } - private fun renderNewline(offset: TextOffset, info: TextRenderInfo) { - TODO() + private fun renderNewline(properties: TextRenderProperties, offset: TextOffset, info: TextRenderInfo, updateSize: Boolean): Boolean { + val height = offset.getNextLineHeight(properties) + if (!offset.addLine(info, height)) { + info.cutOff = true + return true + } + + if (updateSize) { + info.size.y += height + } + + + return false } private fun renderStrikethrough() { @@ -53,8 +64,8 @@ object TextComponentRenderer : ChatComponentRenderer { TODO() } - override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: TextComponent) { - if (text.message.isEmpty()) return + override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: TextComponent): Boolean { + if (text.message.isEmpty()) return false val textFont = fontManager[text.font] val color = getColor(properties, text) @@ -62,12 +73,14 @@ object TextComponentRenderer : ChatComponentRenderer { var skipWhitespaces = false val line = StringBuilder() + var filled = false for (codePoint in text.message.codePoints()) { if (codePoint == '\n'.code) { - renderNewline(offset, info) + filled = renderNewline(properties, offset, info, consumer == null) + info.lines[info.lineIndex - 1].push(text, line) skipWhitespaces = true - continue + if (filled) break else continue } if (skipWhitespaces && Character.isWhitespace(codePoint)) { continue @@ -86,7 +99,10 @@ object TextComponentRenderer : ChatComponentRenderer { val lineInfo = renderer.render(offset, color, properties, info, formatting, codePoint, consumer, options) if (consumer != null) continue // already know that information - if (lineInfo == CodePointAddResult.BREAK) break + if (lineInfo == CodePointAddResult.BREAK) { + filled = true + break + } if (lineIndex != info.lineIndex) { // new line started @@ -98,6 +114,8 @@ object TextComponentRenderer : ChatComponentRenderer { if (line.isNotEmpty()) { info.lines[info.lineIndex].push(text, line) } + + return filled } override fun calculatePrimitiveCount(text: TextComponent): Int {