From fa84eff093f78d7391d8692b2b274f56f024208f Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 5 Aug 2021 11:29:22 +0200 Subject: [PATCH] pre size calculation --- .../minosoft/gui/rendering/font/CharData.kt | 2 +- .../font/renderer/BaseComponentRenderer.kt | 2 +- .../font/renderer/ChatComponentRenderer.kt | 4 ++-- .../font/renderer/TextComponentRenderer.kt | 9 +++++++-- .../gui/rendering/gui/elements/text/TextElement.kt | 14 ++++++++++++-- .../minosoft/gui/rendering/gui/hud/HUDRenderer.kt | 2 +- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/CharData.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/CharData.kt index e75abbf77..020b69015 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/CharData.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/CharData.kt @@ -99,7 +99,7 @@ class CharData( } if (style.formatting.contains(PreChatFormattingCodes.STRIKETHROUGH)) { - vertexConsumer.addQuad(startPosition + Vec2(-Font.HORIZONTAL_SPACING, Font.CHAR_HEIGHT / 2.0f + 0.5f), Vec2(endPosition.x + Font.HORIZONTAL_SPACING, startPosition.y + Font.CHAR_HEIGHT / 2.0f + 1.5f), z + 1, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color) + vertexConsumer.addQuad(startPosition + Vec2(-Font.HORIZONTAL_SPACING, Font.CHAR_HEIGHT / 2.0f), Vec2(endPosition.x + Font.HORIZONTAL_SPACING, startPosition.y + Font.CHAR_HEIGHT / 2.0f + 1.0f), z + 1, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color) } if (style.formatting.contains(PreChatFormattingCodes.UNDERLINED)) { 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 fe7c7427c..0bbe81d22 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 @@ -21,7 +21,7 @@ import glm_.vec2.Vec2i object BaseComponentRenderer : ChatComponentRenderer { - override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: BaseComponent) { + override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: BaseComponent) { for (part in text.parts) { ChatComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, part) } 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 d4e8e2b1d..8e2ce348a 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 @@ -23,12 +23,12 @@ import glm_.vec2.Vec2i interface ChatComponentRenderer { - fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: T) + fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: T) companion object : ChatComponentRenderer { - override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: ChatComponent) { + override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: ChatComponent) { when (text) { is BaseComponent -> BaseComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, text) is TextComponent -> TextComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, text) 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 82f7298e2..476a4e4cb 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 @@ -25,7 +25,7 @@ import glm_.vec2.Vec2i object TextComponentRenderer : ChatComponentRenderer { - override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: TextComponent) { + override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: TextComponent) { var first = true /** @@ -79,6 +79,11 @@ object TextComponentRenderer : ChatComponentRenderer { if (first) { first = false + + // Add initial size + if (size.y == 0) { + size.y = Font.CHAR_HEIGHT + Font.VERTICAL_SPACING + } } else if (offset.x != initialOffset.x && add(Font.HORIZONTAL_SPACING)) { return } @@ -88,7 +93,7 @@ object TextComponentRenderer : ChatComponentRenderer { if (offset.x == initialOffset.x && offset.x - initialOffset.x + width > element.maxSize.x) { return } - charData.render(offset, z, text, consumer) + consumer?.let { charData.render(offset, z, text, it) } if (add(width)) { return diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt index f98ca9278..99af45d7f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt @@ -30,19 +30,29 @@ class TextElement( prepared = false } - override var textComponent: ChatComponent = ChatComponent.of(text) + override var textComponent: ChatComponent = ChatComponent.of("") private set(value) { size = minSize + if (value.message.isNotEmpty()) { + val size = Vec2i(0, 0) + ChatComponentRenderer.render(Vec2i(0, 0), Vec2i(0, 0), size, 0, this, renderWindow, null, value) + this.size = size + } field = value } + init { + textComponent = ChatComponent.of(text) + } + override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int { ChatComponentRenderer.render(Vec2i(offset), offset, Vec2i(0, 0), z, this, renderWindow, consumer, textComponent) + prepared = true return LAYERS } companion object { - const val LAYERS = 4 + const val LAYERS = 4 // 1 layer for the text, 1 for strikethrough. * 2 for shadow } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt index f6a12d562..b878367bb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt @@ -97,7 +97,7 @@ class HUDRenderer( ), ) if (!text2.prepared) { - text2.render(Vec2i(10, 60), 0, mesh) + text2.render(Vec2i(0, 40), 0, mesh) } mesh.load()