diff --git a/src/main/java/de/bixilon/minosoft/data/player/Hands.kt b/src/main/java/de/bixilon/minosoft/data/player/Hands.kt index 79c23e104..7ae63d961 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/Hands.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/Hands.kt @@ -23,6 +23,5 @@ enum class Hands { companion object : ValuesEnum { override val VALUES: Array = values() override val NAME_MAP: Map = KUtil.getEnumValues(VALUES) - } } diff --git a/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.kt b/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.kt index 6afe75a93..4343be54f 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.kt @@ -193,7 +193,6 @@ class BaseComponent : ChatComponent { return legacyText } - private fun MutableSet.addOrRemove(value: T, addOrRemove: Boolean?) { if (addOrRemove == null) { return diff --git a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt index 4d6777ba7..851c6dc1f 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt @@ -170,33 +170,43 @@ open class TextComponent( // bring chars in right order and reverse them if right bound val charArray = this.message.toCharArray().toList() + fun checkGetSize(charEnd: Vec2i) { + if (charEnd.x > getProperties.size.x) { + getProperties.size.x = charEnd.x + } + if (charEnd.y > getProperties.size.y) { + getProperties.size.y = charEnd.y + } + } + + fun pushNewLine() { + offset.x = 0 + offset.y += Font.CHAR_HEIGHT + RenderConstants.TEXT_LINE_PADDING + + checkGetSize(Vec2i(0, 0)) + } // add all chars for (char in charArray) { - if (char == '\n') { - offset.x = 0 - val yOffset = Font.CHAR_HEIGHT + RenderConstants.TEXT_LINE_PADDING - offset.y += yOffset - getProperties.size.y += yOffset + if (ProtocolDefinition.LINE_BREAK_CHARS.contains(char)) { + pushNewLine() continue } val fontChar = renderWindow.font.getChar(char) - val scaledWidth = (fontChar.size.x * (Font.CHAR_HEIGHT / fontChar.height.toFloat())).toInt() + val charSize = fontChar.size - val charStart = startPosition + offset - textElement.addChild(charStart, ImageNode(renderWindow, NodeSizing(minSize = Vec2i(scaledWidth, Font.CHAR_HEIGHT)), fontChar, 1, color)) + var charStart = Vec2i(offset) + var charEnd = charStart + charSize - // ad spacer between chars - offset.x += scaledWidth + Font.SPACE_BETWEEN_CHARS - if (offset.x > getProperties.size.x) { - getProperties.size.x += scaledWidth + Font.SPACE_BETWEEN_CHARS - } - if (offset.y >= getProperties.size.y) { - if (getProperties.size.y < fontChar.height) { - getProperties.size.y = fontChar.height - } - getProperties.lines = (offset.y + Font.CHAR_HEIGHT) / (Font.CHAR_HEIGHT + RenderConstants.TEXT_LINE_PADDING) + if (charEnd.x >= setProperties.hardWrap) { + pushNewLine() + charStart = Vec2i(offset) + charEnd = charStart + charSize } + textElement.addChild(charStart + startPosition, ImageNode(renderWindow, NodeSizing(minSize = charSize), fontChar, 1, color)) + offset.x += charSize.x + Font.SPACE_BETWEEN_CHARS + + checkGetSize(charEnd) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt index 13d4db406..f7ebfb403 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt @@ -45,7 +45,7 @@ object RenderConstants { val TEXT_BACKGROUND_COLOR = RGBColor(0, 0, 0, 80) - const val TEXT_LINE_PADDING = 0 + const val TEXT_LINE_PADDING = 2 val WORD_SEPARATORS = arrayOf(' ', '.', ',', '!', '-', '?') const val CHUNK_SECTIONS_PER_MESH = 1 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/FontChar.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/FontChar.kt index 817430292..afa990f63 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/FontChar.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/FontChar.kt @@ -25,7 +25,7 @@ data class FontChar( val column: Int, var startPixel: Int, var endPixel: Int, - val height: Int, + private val height: Int, ) : TextureLike { override lateinit var uvStart: Vec2 private set diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt index e92410eaa..9889082f7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt @@ -14,7 +14,6 @@ package de.bixilon.minosoft.gui.rendering.hud.nodes.debug import de.bixilon.minosoft.data.text.ChatComponent -import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.hud.nodes.HUDElement import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode @@ -25,7 +24,7 @@ abstract class DebugScreenNode(hudRenderer: HUDRenderer) : HUDElement(hudRendere fun text(text: String = ""): LabelNode { val textElement = LabelNode(hudRenderer.renderWindow, text = ChatComponent.of(text)) - layout.addChild(Vec2i(0, layout.sizing.currentSize.y + RenderConstants.TEXT_LINE_PADDING), textElement) + layout.addChild(Vec2i(0, layout.sizing.currentSize.y), textElement) layout.apply() return textElement } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt index e78748a8b..f7295b821 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt @@ -26,7 +26,7 @@ import glm_.vec2.Vec2i class LabelNode( renderWindow: RenderWindow, - sizing: NodeSizing = NodeSizing(minSize = Vec2i(0, Font.CHAR_HEIGHT)), + sizing: NodeSizing = NodeSizing(minSize = Vec2i(0, Font.CHAR_HEIGHT + 2 * TEXT_BACKGROUND_OFFSET)), text: ChatComponent = ChatComponent.of(""), var background: Boolean = true, val setProperties: TextSetProperties = TextSetProperties(), @@ -54,15 +54,20 @@ class LabelNode( private fun prepare() { clearChildren() getProperties = TextGetProperties() - text.prepareRender(Vec2i(1, 1), Vec2i(), renderWindow, this, 1, setProperties, getProperties) - apply() + val textStartPosition = Vec2i(TEXT_BACKGROUND_OFFSET, TEXT_BACKGROUND_OFFSET) + text.prepareRender(textStartPosition, Vec2i(), renderWindow, this, 1, setProperties, getProperties) - if (background) { - drawBackground(getProperties.size + 1) + if (background && text.message.isNotBlank()) { + drawBackground(getProperties.size + textStartPosition + TEXT_BACKGROUND_OFFSET) } + apply() } private fun drawBackground(end: Vec2i, z: Int = 1, tintColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR) { addChild(Vec2i(0, 0), ImageNode(renderWindow, NodeSizing(minSize = end), renderWindow.WHITE_TEXTURE, 0, tintColor)) } + + companion object { + private const val TEXT_BACKGROUND_OFFSET = 1 + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java index 504539e44..21add9661 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java @@ -106,6 +106,8 @@ public final class ProtocolDefinition { public static final RGBColor DEFAULT_COLOR = ChatColors.WHITE; + public static final char[] LINE_BREAK_CHARS = {'\n', '\r'}; + public static final String[] RELEVANT_MINECRAFT_ASSETS = {"minecraft/lang/", "minecraft/sounds.json", "minecraft/sounds/", "minecraft/textures/", "minecraft/font/"}; // whitelist for all assets we care (we have our own block models, etc) diff --git a/src/main/resources/assets/minosoft/rendering/shader/chunk_vertex.glsl b/src/main/resources/assets/minosoft/rendering/shader/chunk_vertex.glsl index 13e497c28..8572ff72d 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/chunk_vertex.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/chunk_vertex.glsl @@ -63,5 +63,4 @@ void main() { passSecondTextureCoordinates = vec3(textureIndex, secondTexture & 0xFFFFFFu); passInterpolateBetweenTextures = interpolation / 100.0f; - }