From b33779f71f86d07065f1b7bcb14c65f27a077cea Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 14 Apr 2021 00:19:14 +0200 Subject: [PATCH] rendering rewrite parts of the hud * Will re-add soon: Hotbar, ChatBox --- .../minosoft/data/text/BaseComponent.kt | 8 +- .../minosoft/data/text/ChatComponent.kt | 6 +- .../minosoft/data/text/TextComponent.kt | 13 +- .../minosoft/gui/rendering/RenderWindow.kt | 11 ++ .../minosoft/gui/rendering/hud/HUDRenderer.kt | 24 +-- .../rendering/hud/atlas/TextureLikeTexture.kt | 38 ++++ .../hud/elements/chat/ChatBoxHUDElement.kt | 64 ------ .../hud/elements/input/KeyConsumer.kt | 3 +- .../elements/input/SubmittableTextField.kt | 46 ----- .../rendering/hud/elements/input/TextField.kt | 104 ---------- .../hud/elements/other/CrosshairHUDElement.kt | 12 +- .../hud/elements/other/HotbarHUDElement.kt | 187 ------------------ .../hud/elements/primitive/HealthBar.kt | 135 ------------- .../hud/elements/primitive/Layout.kt | 125 ------------ .../hud/elements/primitive/ProgressBar.kt | 66 ------- .../hud/{elements => nodes}/HUDElement.kt | 6 +- .../debug/DebugScreenNode.kt} | 15 +- .../debug/HUDSystemDebugNode.kt} | 11 +- .../debug/HUDWorldDebugNode.kt} | 13 +- .../hud/nodes/layout/AbsoluteLayout.kt | 137 +++++++++++++ .../primitive/ImageNode.kt} | 40 ++-- .../primitive/LabelNode.kt} | 40 ++-- .../Element.kt => nodes/primitive/Node.kt} | 30 ++- .../hud/nodes/properties/NodeAlignment.kt | 21 ++ .../properties/NodeSizing.kt} | 25 +-- .../rendering/hud/nodes/properties/Spacing.kt | 21 ++ .../rendering/shader/hud_fragment.glsl | 7 +- .../assets/minosoft/textures/white.png | Bin 0 -> 107 bytes 28 files changed, 338 insertions(+), 870 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/atlas/TextureLikeTexture.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/chat/ChatBoxHUDElement.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/SubmittableTextField.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/TextField.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/HotbarHUDElement.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/HealthBar.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Layout.kt delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ProgressBar.kt rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements => nodes}/HUDElement.kt (85%) rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/debug/DebugScreen.kt => nodes/debug/DebugScreenNode.kt} (64%) rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/debug/HUDSystemDebugElement.kt => nodes/debug/HUDSystemDebugNode.kt} (91%) rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/debug/HUDWorldDebugElement.kt => nodes/debug/HUDWorldDebugNode.kt} (93%) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/layout/AbsoluteLayout.kt rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/primitive/ImageElement.kt => nodes/primitive/ImageNode.kt} (75%) rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/primitive/TextElement.kt => nodes/primitive/LabelNode.kt} (57%) rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/primitive/Element.kt => nodes/primitive/Node.kt} (73%) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeAlignment.kt rename src/main/java/de/bixilon/minosoft/gui/rendering/hud/{elements/primitive/EndElement.kt => nodes/properties/NodeSizing.kt} (65%) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/Spacing.kt create mode 100644 src/main/resources/assets/minosoft/textures/white.png 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 57b87bf6b..e90b0ab1e 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.kt @@ -15,8 +15,8 @@ package de.bixilon.minosoft.data.text import com.google.gson.JsonObject import de.bixilon.minosoft.data.locale.minecraft.Translator -import de.bixilon.minosoft.gui.rendering.font.Font -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.TextElement +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import glm_.vec2.Vec2i import javafx.collections.ObservableList @@ -174,9 +174,9 @@ class BaseComponent : ChatComponent { return nodes } - override fun prepareRender(startPosition: Vec2i, offset: Vec2i, font: Font, textElement: TextElement, z: Int, retMaxSize: Vec2i) { + override fun prepareRender(startPosition: Vec2i, offset: Vec2i, renderWindow: RenderWindow, textElement: LabelNode, z: Int, retMaxSize: Vec2i) { for (part in parts) { - part.prepareRender(startPosition, offset, font, textElement, z, retMaxSize) + part.prepareRender(startPosition, offset, renderWindow, textElement, z, retMaxSize) } } diff --git a/src/main/java/de/bixilon/minosoft/data/text/ChatComponent.kt b/src/main/java/de/bixilon/minosoft/data/text/ChatComponent.kt index d8864308e..90d12e460 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/ChatComponent.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/ChatComponent.kt @@ -17,8 +17,8 @@ import com.google.gson.JsonObject import com.google.gson.JsonParser import com.google.gson.JsonPrimitive import de.bixilon.minosoft.data.locale.minecraft.Translator -import de.bixilon.minosoft.gui.rendering.font.Font -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.TextElement +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode import de.bixilon.minosoft.util.nbt.tag.StringTag import glm_.vec2.Vec2i import javafx.collections.FXCollections @@ -61,7 +61,7 @@ interface ChatComponent { /** * Prepares the chat component for rendering (used in opengl) */ - fun prepareRender(startPosition: Vec2i, offset: Vec2i, font: Font, textElement: TextElement, z: Int, retMaxSize: Vec2i) + fun prepareRender(startPosition: Vec2i, offset: Vec2i, renderWindow: RenderWindow, textElement: LabelNode, z: Int, retMaxSize: Vec2i) companion object { 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 cf023151b..cbbb7ac24 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt @@ -14,12 +14,13 @@ package de.bixilon.minosoft.data.text import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.gui.rendering.RenderConstants +import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.font.Font -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.ImageElement -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.TextElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.ImageNode +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.Util -import glm_.vec2.Vec2 import glm_.vec2.Vec2i import javafx.animation.Animation import javafx.animation.KeyFrame @@ -160,7 +161,7 @@ open class TextComponent( } - override fun prepareRender(startPosition: Vec2i, offset: Vec2i, font: Font, textElement: TextElement, z: Int, retMaxSize: Vec2i) { + override fun prepareRender(startPosition: Vec2i, offset: Vec2i, renderWindow: RenderWindow, textElement: LabelNode, z: Int, retMaxSize: Vec2i) { val color = this.color ?: ChatColors.WHITE @@ -177,11 +178,11 @@ open class TextComponent( retMaxSize.y += yOffset continue } - val fontChar = font.getChar(char) + val fontChar = renderWindow.font.getChar(char) val scaledWidth = (fontChar.size.x * (Font.CHAR_HEIGHT / fontChar.height.toFloat())).toInt() val charStart = startPosition + offset - textElement.batchAdd(ImageElement(charStart, fontChar, charStart + Vec2(scaledWidth, Font.CHAR_HEIGHT), z, color)) + textElement.addChild(charStart, ImageNode(renderWindow, NodeSizing(minSize = Vec2i(scaledWidth, Font.CHAR_HEIGHT)), fontChar, 1, color)) // ad spacer between chars offset.x += scaledWidth + Font.SPACE_BETWEEN_CHARS diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index 7d249e644..92b2e2fb1 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -24,6 +24,8 @@ import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.chunk.WorldRenderer import de.bixilon.minosoft.gui.rendering.font.Font import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.hud.atlas.TextureLike +import de.bixilon.minosoft.gui.rendering.hud.atlas.TextureLikeTexture import de.bixilon.minosoft.gui.rendering.hud.elements.input.KeyConsumer import de.bixilon.minosoft.gui.rendering.textures.Texture import de.bixilon.minosoft.gui.rendering.textures.TextureArray @@ -86,6 +88,8 @@ class RenderWindow( private var skipNextChatPress = false + lateinit var WHITE_TEXTURE: TextureLike + var currentKeyConsumer: KeyConsumer? get() = _currentInputConsumer set(value) { @@ -304,6 +308,13 @@ class RenderWindow( textures.allTextures.add(Texture(RenderConstants.DEBUG_TEXTURE_RESOURCE_LOCATION)) + WHITE_TEXTURE = TextureLikeTexture( + texture = Texture(ResourceLocation("minosoft:textures/white.png")), + uvStart = Vec2(0, 0), + uvEnd = Vec2(1.0f, 1.0f), + size = Vec2i(16, 16) + ) + textures.allTextures.add(WHITE_TEXTURE.texture) font.load(connection.assetsManager) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt index c54671737..165a523ce 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt @@ -21,12 +21,10 @@ import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.hud.atlas.HUDAtlasElement -import de.bixilon.minosoft.gui.rendering.hud.elements.HUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.chat.ChatBoxHUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.debug.HUDSystemDebugElement -import de.bixilon.minosoft.gui.rendering.hud.elements.debug.HUDWorldDebugElement import de.bixilon.minosoft.gui.rendering.hud.elements.other.CrosshairHUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.other.HotbarHUDElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.HUDElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.debug.HUDSystemDebugNode +import de.bixilon.minosoft.gui.rendering.hud.nodes.debug.HUDWorldDebugNode import de.bixilon.minosoft.gui.rendering.shader.Shader import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition @@ -73,30 +71,22 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow } private fun registerDefaultElements() { - addElement(ElementsNames.HOTBAR_RESOURCE_LOCATION, HotbarHUDElement(this), HUDElementProperties( - position = Vec2(0.0f, -1.0f), - xBinding = HUDElementProperties.PositionBindings.CENTER, - )) - addElement(ElementsNames.CROSSHAIR_RESOURCE_LOCATION, CrosshairHUDElement(this), HUDElementProperties( position = Vec2(0.0f, 0.0f), xBinding = HUDElementProperties.PositionBindings.CENTER, yBinding = HUDElementProperties.PositionBindings.CENTER, )) - addElement(ElementsNames.WORLD_DEBUG_SCREEN_RESOURCE_LOCATION, HUDWorldDebugElement(this), HUDElementProperties( + + addElement(ElementsNames.WORLD_DEBUG_SCREEN_RESOURCE_LOCATION, HUDWorldDebugNode(this), HUDElementProperties( position = Vec2(-1.0f, 1.0f), toggleKeyBinding = KeyBindingsNames.TOGGLE_DEBUG_SCREEN, enabled = false, )) - addElement(ElementsNames.SYSTEM_DEBUG_SCREEN_RESOURCE_LOCATION, HUDSystemDebugElement(this), HUDElementProperties( + addElement(ElementsNames.SYSTEM_DEBUG_SCREEN_RESOURCE_LOCATION, HUDSystemDebugNode(this), HUDElementProperties( position = Vec2(1.0f, 1.0f), toggleKeyBinding = KeyBindingsNames.TOGGLE_DEBUG_SCREEN, enabled = false, )) - addElement(ElementsNames.CHAT_RESOURCE_LOCATION, ChatBoxHUDElement(this), HUDElementProperties( - position = Vec2(0.0f, -1.0f), - xBinding = HUDElementProperties.PositionBindings.CENTER, - )) } fun addElement(resourceLocation: ResourceLocation, hudElement: HUDElement, defaultProperties: HUDElementProperties) { @@ -183,7 +173,7 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow if (forcePrepare || needsUpdate) { for ((elementProperties, hudElement) in enabledHUDElement.values) { val realScaleFactor = elementProperties.scale * Minosoft.getConfig().config.game.hud.scale - val realSize = Vec2i(hudElement.layout.fakeX ?: (hudElement.layout.size.x * realScaleFactor), hudElement.layout.fakeY ?: (hudElement.layout.size.y * realScaleFactor)) + val realSize = hudElement.layout.sizing.currentSize * realScaleFactor val elementStart = getRealPosition(realSize, elementProperties, renderWindow.screenDimensions) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/atlas/TextureLikeTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/atlas/TextureLikeTexture.kt new file mode 100644 index 000000000..a393e8621 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/atlas/TextureLikeTexture.kt @@ -0,0 +1,38 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.hud.atlas + +import de.bixilon.minosoft.gui.rendering.textures.Texture +import glm_.vec2.Vec2 +import glm_.vec2.Vec2i + +class TextureLikeTexture( + override val texture: Texture, + override val uvStart: Vec2, + override val uvEnd: Vec2, + override val size: Vec2i, +) : TextureLike diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/chat/ChatBoxHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/chat/ChatBoxHUDElement.kt deleted file mode 100644 index c49f11491..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/chat/ChatBoxHUDElement.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.chat - -import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames -import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer -import de.bixilon.minosoft.gui.rendering.hud.elements.HUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.input.SubmittableTextField -import glm_.vec2.Vec2i - -class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { - private lateinit var inputField: SubmittableTextField - - override fun init() { - inputField = SubmittableTextField(font = hudRenderer.renderWindow.font, z = 100, maxLength = 256, onSubmit = { - try { - hudRenderer.renderWindow.connection.sender.sendChatMessage(it) - closeChat() - return@SubmittableTextField true - } catch (exception: Exception) { - closeChat() - return@SubmittableTextField false - } - }) - - layout.addChild(inputField) - - hudRenderer.renderWindow.registerKeyCallback(KeyBindingsNames.OPEN_CHAT) { _, _ -> - openChat() - } - hudRenderer.renderWindow.registerKeyCallback(KeyBindingsNames.CLOSE_CHAT) { _, _ -> - closeChat() - } - } - - override fun screenChangeResizeCallback(screenDimensions: Vec2i) { - layout.fakeX = screenDimensions.x - 2 // 1 pixel padding on every side - inputField.fakeX = layout.fakeX - } - - fun openChat() { - hudRenderer.renderWindow.currentKeyConsumer = inputField - hudRenderer.renderWindow.currentElement.remove(KeyBindingsNames.WHEN_IN_GAME) - hudRenderer.renderWindow.currentElement.add(KeyBindingsNames.WHEN_IN_CHAT) - } - - fun closeChat() { - inputField.clearText() - hudRenderer.renderWindow.currentKeyConsumer = null - hudRenderer.renderWindow.currentElement.remove(KeyBindingsNames.WHEN_IN_CHAT) - hudRenderer.renderWindow.currentElement.add(KeyBindingsNames.WHEN_IN_GAME) - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/KeyConsumer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/KeyConsumer.kt index 72f658a03..17e8d6262 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/KeyConsumer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/KeyConsumer.kt @@ -21,6 +21,5 @@ interface KeyConsumer { fun charInput(char: Char) {} - fun keyInput(keyCodes: KeyCodes) { - } + fun keyInput(keyCodes: KeyCodes) {} } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/SubmittableTextField.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/SubmittableTextField.kt deleted file mode 100644 index 417aa3416..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/SubmittableTextField.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.input - -import de.bixilon.minosoft.config.key.KeyCodes -import de.bixilon.minosoft.gui.rendering.font.Font -import glm_.vec2.Vec2i - -class SubmittableTextField( - start: Vec2i = Vec2i(0, 0), - z: Int = 0, - font: Font, - defaultText: String = "", - maxLength: Int = 256, - private val onSubmit: (text: String) -> Boolean, -) : TextField(start, z, font, defaultText, maxLength) { - - fun submit() { - if (!onSubmit.invoke(text)) { - // failed - return - } - text = "" - } - - - override fun keyInput(keyCodes: KeyCodes) { - if (keyCodes == KeyCodes.KEY_ENTER) { - // submit - submit() - return - } - super.keyInput(keyCodes) - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/TextField.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/TextField.kt deleted file mode 100644 index a7ef749ec..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/input/TextField.kt +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.input - -import de.bixilon.minosoft.config.key.KeyCodes -import de.bixilon.minosoft.data.text.ChatComponent -import de.bixilon.minosoft.gui.rendering.RenderConstants -import de.bixilon.minosoft.gui.rendering.font.Font -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.ImageElement -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.Layout -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.TextElement -import de.bixilon.minosoft.util.MMath -import glm_.vec2.Vec2i - -open class TextField( - start: Vec2i = Vec2i(0, 0), - z: Int = 0, - font: Font, - defaultText: String = "", - var maxLength: Int = 256, -) : Layout(start, z), KeyConsumer, MouseConsumer { - override var focused: Boolean = true - private var textBuilder: StringBuilder = StringBuilder(defaultText) - private val textElement = TextElement(ChatComponent.valueOf(raw = text), font, background = false) - private var position = text.length - - var text: String - get() = textBuilder.toString() - set(value) { - position = value.length - textBuilder = StringBuilder(value) - update() - } - - init { - addChild(textElement) - addChild(ImageElement(Vec2i(0, 0), null, Vec2i(-1), z, RenderConstants.TEXT_BACKGROUND_COLOR)) - } - - fun clearText() { - textBuilder.clear() - update() - } - - private fun update() { - textElement.text = ChatComponent.valueOf(raw = text) - } - - override fun keyInput(keyCodes: KeyCodes) { - when (keyCodes) { - KeyCodes.KEY_BACKSPACE -> { - if (textBuilder.isEmpty()) { - return - } - textBuilder.deleteCharAt(--position) - } - KeyCodes.KEY_DELETE -> { - if (textBuilder.isEmpty() || position == textBuilder.length) { - return - } - textBuilder.deleteCharAt(position) - } - KeyCodes.KEY_ENTER -> { - if (position > maxLength) { - return - } - textBuilder.insert(position++, '\n') - } - KeyCodes.KEY_LEFT -> { - position = MMath.clamp(position - 1, 0, text.length) - return - } - KeyCodes.KEY_RIGHT -> { - position = MMath.clamp(position + 1, 0, text.length) - return - } - // ToDo: Up and down for line breaks, shift and ctrl modifier, ... - else -> { - return - } - } - update() - super.keyInput(keyCodes) - } - - override fun charInput(char: Char) { - if (position >= maxLength) { - return - } - textBuilder.insert(position++, char.toString()) - update() - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/CrosshairHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/CrosshairHUDElement.kt index 57a59e7f9..7476841c6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/CrosshairHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/CrosshairHUDElement.kt @@ -15,17 +15,19 @@ package de.bixilon.minosoft.gui.rendering.hud.elements.other import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer -import de.bixilon.minosoft.gui.rendering.hud.elements.HUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.ImageElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.HUDElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.ImageNode +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing +import glm_.vec2.Vec2i class CrosshairHUDElement( hudRender: HUDRenderer, ) : HUDElement(hudRender) { - private lateinit var crosshairImage: ImageElement + private lateinit var crosshairImage: ImageNode override fun init() { val atlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:crosshair")]!! - crosshairImage = ImageElement(end = atlasElement.binding.size, textureLike = atlasElement) - layout.addChild(crosshairImage) + crosshairImage = ImageNode(hudRenderer.renderWindow, NodeSizing(minSize = atlasElement.binding.size), textureLike = atlasElement) + layout.addChild(Vec2i(0, 0), crosshairImage) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/HotbarHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/HotbarHUDElement.kt deleted file mode 100644 index 0c2270c31..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/other/HotbarHUDElement.kt +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.other - -import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames -import de.bixilon.minosoft.data.Gamemodes -import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.data.text.TextComponent -import de.bixilon.minosoft.gui.rendering.RenderConstants -import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer -import de.bixilon.minosoft.gui.rendering.hud.atlas.HUDAtlasElement -import de.bixilon.minosoft.gui.rendering.hud.elements.HUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.* -import de.bixilon.minosoft.modding.event.EventInvokerCallback -import de.bixilon.minosoft.modding.event.events.ChangeGameStateEvent -import de.bixilon.minosoft.modding.event.events.ExperienceChangeEvent -import de.bixilon.minosoft.modding.event.events.HeldItemChangeEvent -import de.bixilon.minosoft.modding.event.events.UpdateHealthEvent -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketChangeGameState -import glm_.vec2.Vec2 -import glm_.vec2.Vec2i - -class HotbarHUDElement( - hudRender: HUDRenderer, -) : HUDElement(hudRender) { - private lateinit var hotbarBase: HotbarBaseElement - - private lateinit var experienceBar: ProgressBar - private lateinit var levelText: TextElement - - private lateinit var healthBar: HealthBar - - - override fun init() { - hotbarBase = HotbarBaseElement( - baseHUDAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:hotbar_base")]!!, - frameHUDAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:hotbar_selected_slot_frame")]!! - ) - - experienceBar = ProgressBar( - emptyAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:experience_bar_empty")]!!, - fullAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:experience_bar_full")]!!, - z = 1, - ) - - levelText = TextElement( - font = hudRenderer.renderWindow.font, - background = false, - z = 2, - ) - - healthBar = HealthBar( - blackHeartContainerAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:black_heart_container")]!!, - whiteHeartContainerAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:white_heart_container")]!!, - halfHartAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:half_red_heart")]!!, - hartAtlasElement = hudRenderer.hudAtlasElements[ResourceLocation("minecraft:full_red_heart")]!!, - maxValue = 20.0f, - textReplaceValue = 40.0f, - textColor = RenderConstants.HP_TEXT_COLOR, - font = hudRenderer.renderWindow.font, - z = 5, - ) - - registerEvents() - - prepare() - } - - private fun registerEvents() { - for ((slotIndex, resourceLocation) in KeyBindingsNames.SELECT_HOTBAR_SLOTS.withIndex()) { - hudRenderer.renderWindow.registerKeyCallback(resourceLocation) { _, _ -> - hudRenderer.connection.sender.selectSlot(slotIndex) - prepare() - } - } - - hudRenderer.connection.registerEvent(EventInvokerCallback { - experienceBar.progress = it.bar - levelText.text = TextComponent(it.level.toString()).color(RenderConstants.EXPERIENCE_BAR_LEVEL_COLOR) - experienceBar.prepare() - prepare() - }) - - hudRenderer.connection.registerEvent(EventInvokerCallback { - hotbarBase.selectedSlot = it.slot - hotbarBase.prepare() - prepare() - }) - hudRenderer.connection.registerEvent(EventInvokerCallback { - if (it.reason != PacketChangeGameState.Reason.CHANGE_GAMEMODE) { - return@EventInvokerCallback - } - prepare() - }) - hudRenderer.connection.registerEvent(EventInvokerCallback { - healthBar.value = it.health - healthBar.prepare() - prepare() - }) - } - - private fun prepare() { - layout.clear() - if (hudRenderer.connection.player.entity.gamemode == Gamemodes.SPECTATOR) { - // ToDo: Spectator hotbar - return - } - - - if (hudRenderer.connection.player.entity.gamemode != Gamemodes.CREATIVE) { - // add health bar, hunger, armor, experience and more - layout.addChild(healthBar) - - - // if (hudRenderer.connection.player.level != 0) { - // experience - levelText.start = Vec2i((hotbarBase.size.x - levelText.size.x) / 2, layout.size.y - (levelText.size.y - ELEMENT_PADDING) + ELEMENT_PADDING) - layout.addChild(levelText) - // } - - // experience bar - experienceBar.start = Vec2i(0, levelText.start.y + levelText.size.y - ELEMENT_PADDING) - layout.addChild(experienceBar) - } - - - hotbarBase.start = Vec2i(0, layout.size.y + ELEMENT_PADDING) - - layout.addChild(hotbarBase) - } - - companion object { - private const val ELEMENT_PADDING = 2 - } - - class HotbarBaseElement( - start: Vec2i = Vec2i(0, 0), - val baseHUDAtlasElement: HUDAtlasElement, - val frameHUDAtlasElement: HUDAtlasElement, - z: Int = 1, - ) : Layout(start, z) { - private var _selectedSlot = 0 - - var selectedSlot: Int - get() = _selectedSlot - set(value) { - _selectedSlot = value - prepare() - } - - private val base = ImageElement(textureLike = baseHUDAtlasElement) - private val frame = ImageElement(textureLike = frameHUDAtlasElement, z = 2) - - init { - fakeX = base.size.x - addChild(base) - addChild(frame) - } - - fun prepare() { - // selectedFrame - val slotBinding = baseHUDAtlasElement.slots[selectedSlot] ?: return - val frameSlotBinding = frameHUDAtlasElement.slots[0] ?: return - - val frameSizeFactor = slotBinding.size / frameSlotBinding.size - - val selectedFrameOffset = Vec2(((frameHUDAtlasElement.binding.size.y * frameSizeFactor.y) - baseHUDAtlasElement.binding.size.y) * 2) - - frame.start = slotBinding.start - selectedFrameOffset - frame.end = slotBinding.end + selectedFrameOffset - - cache.clear() - } - } -} - diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/HealthBar.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/HealthBar.kt deleted file mode 100644 index c5eff35cc..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/HealthBar.kt +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive - -import de.bixilon.minosoft.data.text.RGBColor -import de.bixilon.minosoft.data.text.TextComponent -import de.bixilon.minosoft.gui.rendering.font.Font -import de.bixilon.minosoft.gui.rendering.hud.atlas.HUDAtlasElement -import de.bixilon.minosoft.util.MMath -import glm_.mat4x4.Mat4 -import glm_.vec2.Vec2i - -class HealthBar( - start: Vec2i = Vec2i(0, 0), - var blackHeartContainerAtlasElement: HUDAtlasElement, - var whiteHeartContainerAtlasElement: HUDAtlasElement, - var halfHartAtlasElement: HUDAtlasElement, - var hartAtlasElement: HUDAtlasElement, - var maxValue: Float, - var textReplaceValue: Float, - var textColor: RGBColor, - var font: Font, - z: Int = 1, -) : Layout(start, z) { - private val singleHeartSize = blackHeartContainerAtlasElement.binding.size - private val width = singleHeartSize.x * MAX_HEARTS_IN_ROW - - private val alternativeText = TextElement(font = font, start = Vec2i(0, 0), background = false) - private var _value = 0.0f - var value: Float - get() = _value - set(value) { - _value = if (value < 0.0f) { - 0.0f - } else { - value - } - cache.clear() - } - - fun prepare() { - clear() - - if (value >= textReplaceValue) { - alternativeText.text = TextComponent(value.toString()).color(textColor) - alternativeText.start = Vec2i((width - alternativeText.size.x) / 2, 0) - - addChild(alternativeText) - return - } - - val offset = Vec2i(0, 0) - val containerCount = (maxValue + 1.0f).toInt() / 2 - - // heart container - val rows = MMath.divideUp(containerCount, MAX_HEARTS_IN_ROW) - for (row in 0 until rows) { - val heartsToDraw = if (row == 0 && containerCount % MAX_HEARTS_IN_ROW != 0) { - containerCount % MAX_HEARTS_IN_ROW - } else { - MAX_HEARTS_IN_ROW - } - for (i in 0 until heartsToDraw) { - drawHeart(this.start + offset, blackHeartContainerAtlasElement, z) - - offset.x += singleHeartSize.x - 1 - } - offset.y += singleHeartSize.y - offset.x = 0 - } - - - offset.x = 0 - offset.y = 0 - val halfHeartCount = MMath.round10Up(value) - val fullHeartCount = halfHeartCount / 2 - - val addHalfHeart = halfHeartCount % 2 == 1 - - var currentHeart = fullHeartCount - 1 - if (addHalfHeart) { - currentHeart += 1 - } - - for (row in rows - 1 downTo 0) { - val heartsInRow = if (row == 0 && containerCount % MAX_HEARTS_IN_ROW != 0) { - containerCount % MAX_HEARTS_IN_ROW - } else { - MAX_HEARTS_IN_ROW - } - for (i in 0 until heartsInRow) { - - if (currentHeart < 0) { - break - } - - if (currentHeart == 0 && addHalfHeart) { - drawHeart(this.start + offset, halfHartAtlasElement, z + 1) - } else { - drawHeart(this.start + offset, hartAtlasElement, z + 1) - } - - currentHeart-- - offset.x += singleHeartSize.x - 1 - } - offset.y += singleHeartSize.y - offset.x = 0 - } - } - - override fun prepareCache(start: Vec2i, scaleFactor: Float, matrix: Mat4, z: Int) { - prepare() - super.prepareCache(start, scaleFactor, matrix, z) - } - - - private fun drawHeart(elementStart: Vec2i, element: HUDAtlasElement, z: Int) { - addChild(ImageElement(elementStart, element, elementStart + singleHeartSize, this.z + z)) - } - - companion object { - const val MAX_HEARTS_IN_ROW = 10 - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Layout.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Layout.kt deleted file mode 100644 index 7b29dd964..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Layout.kt +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive - -import glm_.mat4x4.Mat4 -import glm_.vec2.Vec2i - -open class Layout( - start: Vec2i, - val z: Int, -) : Element(start) { - override var size: Vec2i - get() = Vec2i(fakeX ?: super.size.x, fakeY ?: super.size.y) - set(value) { - super.size = value - } - private val children: MutableList = mutableListOf() - var fakeX: Int? = null - var fakeY: Int? = null - - - fun clear() { - synchronized(children) { - children.clear() - } - clearCache() - recalculateSize() - } - - fun finishBatchAdd() { - cache.clear() - recalculateSize() - } - - fun batchAdd(child: Element) { - child.parent = this - synchronized(children) { - children.add(child) - } - } - - fun addChild(child: Element) { - batchAdd(child) - finishBatchAdd() - } - - override fun recalculateSize() { - if (children.isEmpty()) { - size = Vec2i(0, 0) - } else { - synchronized(children) { - for (child in children) { - checkSize(child.start + child.size) - } - } - } - parent?.recalculateSize() - } - - override fun clearCache() { - cache.clear() - parent?.clearCache() - } - - private fun checkSize(vec2: Vec2i) { - var changed = false - if (vec2.x > size.x) { - size.x = vec2.x - changed = true - } - if (vec2.y > size.y) { - size.y = vec2.y - changed = true - } - if (changed) { - clearCache() - } - } - - fun pushChildrenToRight(offset: Int = 0) { - for (child in children) { - child.start = Vec2i((size.x - child.size.x) - offset, child.start.y) - child.clearCache() - } - } - - private fun addToStart(start: Vec2i, elementPosition: Vec2i): Vec2i { - return Vec2i(start.x + elementPosition.x, start.y - elementPosition.y) - } - - override fun prepareCache(start: Vec2i, scaleFactor: Float, matrix: Mat4, z: Int) { - val normalStart = addToStart(start, this.start * scaleFactor) - - - synchronized(children) { - for (child in children) { - child.checkCache(normalStart, scaleFactor, matrix, this.z + z) - cache.addCache(child.cache) - } - } - } - - fun clearChildrenCache() { - synchronized(children) { - for (child in children) { - if (child is Layout) { - child.clearChildrenCache() - } - child.clearCache() - } - } - clearCache() - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ProgressBar.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ProgressBar.kt deleted file mode 100644 index ef670be73..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ProgressBar.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program.If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive - -import de.bixilon.minosoft.gui.rendering.hud.atlas.HUDAtlasElement -import de.bixilon.minosoft.gui.rendering.hud.atlas.TextureLike -import de.bixilon.minosoft.gui.rendering.textures.Texture -import glm_.vec2.Vec2 -import glm_.vec2.Vec2i - -class ProgressBar( - start: Vec2i = Vec2i(0, 0), - val emptyAtlasElement: HUDAtlasElement, - end: Vec2i = emptyAtlasElement.size, - val fullAtlasElement: HUDAtlasElement, - z: Int = 1, -) : Layout(start, z) { - private var _progress = 0.0f - var progress: Float - get() = _progress - set(value) { - check(value >= 0.0f) { "Value is smaller than 0" } - check(value <= 1.0f) { "Value is greater than 1" } - prepare() - _progress = value - } - - private val emptyImage = ImageElement(this.start, emptyAtlasElement, end, z) - private val fullImage = ImageElement(this.start, fullAtlasElement, end, z) - - init { - addChild(emptyImage) - addChild(fullImage) - recalculateSize() - } - - override fun recalculateSize() { - size = emptyAtlasElement.binding.size - } - - fun prepare() { - fullImage.textureLike = object : TextureLike { - override val texture: Texture - get() = fullAtlasElement.texture - override val uvStart: Vec2 - get() = fullAtlasElement.uvStart - override val uvEnd: Vec2 - get() = Vec2((fullAtlasElement.uvEnd.x - fullAtlasElement.uvStart.x) * progress + fullAtlasElement.uvStart.x, fullAtlasElement.uvEnd.y) - override val size: Vec2i - get() = this@ProgressBar.size - } - - cache.clear() - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/HUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt similarity index 85% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/HUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt index 2d9c4e4b2..09274ac9f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/HUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt @@ -11,14 +11,14 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements +package de.bixilon.minosoft.gui.rendering.hud.nodes import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.Layout +import de.bixilon.minosoft.gui.rendering.hud.nodes.layout.AbsoluteLayout import glm_.vec2.Vec2i abstract class HUDElement(protected val hudRenderer: HUDRenderer) { - val layout = Layout(Vec2i(), 0) + val layout = AbsoluteLayout(hudRenderer.renderWindow) open fun init() {} open fun postInit() {} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/DebugScreen.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt similarity index 64% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/DebugScreen.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt index e57deca04..1eb43a911 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/DebugScreen.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/DebugScreenNode.kt @@ -11,21 +11,22 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.debug +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.elements.HUDElement -import de.bixilon.minosoft.gui.rendering.hud.elements.primitive.TextElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.HUDElement +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode import glm_.vec2.Vec2i -abstract class DebugScreen(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +abstract class DebugScreenNode(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { protected var lastPrepareTime = 0L - fun text(text: String = ""): TextElement { - val textElement = TextElement(ChatComponent.valueOf(raw = text), hudRenderer.renderWindow.font, Vec2i(2, layout.size.y + RenderConstants.TEXT_LINE_PADDING)) - layout.addChild(textElement) + fun text(text: String = ""): LabelNode { + val textElement = LabelNode(hudRenderer.renderWindow, text = ChatComponent.valueOf(raw = text)) + layout.addChild(Vec2i(0, layout.sizing.currentSize.y + RenderConstants.TEXT_LINE_PADDING), textElement) + layout.apply() return textElement } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/HUDSystemDebugElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt similarity index 91% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/HUDSystemDebugElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt index 1b37028d5..7c0c091d3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/HUDSystemDebugElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt @@ -11,9 +11,10 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.debug +package de.bixilon.minosoft.gui.rendering.hud.nodes.debug import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeAlignment import de.bixilon.minosoft.modding.loading.ModLoader import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.GitInfo @@ -23,9 +24,12 @@ import glm_.vec2.Vec2i import org.lwjgl.opengl.GL11.* -class HUDSystemDebugElement(hudRenderer: HUDRenderer) : DebugScreen(hudRenderer) { +class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer) { init { + layout.sizing.forceAlign = NodeAlignment.RIGHT + layout.sizing.padding.top = 2 + layout.sizing.padding.right = 2 text("Java: ${Runtime.version()} ${System.getProperty("sun.arch.data.model")}bit") } @@ -59,7 +63,6 @@ class HUDSystemDebugElement(hudRenderer: HUDRenderer) : DebugScreen(hudRenderer) override fun screenChangeResizeCallback(screenDimensions: Vec2i) { displayText.sText = "Display: ${getScreenDimensions()}" - layout.pushChildrenToRight(1) } override fun init() { @@ -73,7 +76,7 @@ class HUDSystemDebugElement(hudRenderer: HUDRenderer) : DebugScreen(hudRenderer) } memoryText.sText = "Memory: ${getUsedMemoryPercent()}% ${getFormattedUsedMemory()}/${SystemInformation.MAX_MEMORY_TEXT}" allocatedMemoryText.sText = "Allocated: ${getAllocatedMemoryPercent()}% ${getFormattedAllocatedMemory()}" - layout.pushChildrenToRight(1) + lastPrepareTime = System.currentTimeMillis() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/HUDWorldDebugElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDWorldDebugNode.kt similarity index 93% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/HUDWorldDebugElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDWorldDebugNode.kt index 85acb4aa8..22aa2a7be 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/debug/HUDWorldDebugElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDWorldDebugNode.kt @@ -11,18 +11,25 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.debug +package de.bixilon.minosoft.gui.rendering.hud.nodes.debug import de.bixilon.minosoft.data.Directions import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeAlignment import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.UnitFormatter -class HUDWorldDebugElement(hudRenderer: HUDRenderer) : DebugScreen(hudRenderer) { +class HUDWorldDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer) { private val camera = hudRenderer.renderWindow.camera - private val brandText = text("§cMinosoft 0.1-pre1") + init { + layout.sizing.forceAlign = NodeAlignment.LEFT + layout.sizing.padding.left = 2 + layout.sizing.padding.top = 2 + text("§cMinosoft 0.1-pre1") + } + private val fpsText = text("TBA") private val timingsText = text("TBA") private val chunksText = text("TBA") diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/layout/AbsoluteLayout.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/layout/AbsoluteLayout.kt new file mode 100644 index 000000000..b408c214f --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/layout/AbsoluteLayout.kt @@ -0,0 +1,137 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.hud.nodes.layout + +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.Node +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeAlignment +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing +import de.bixilon.minosoft.util.MMath +import glm_.mat4x4.Mat4 +import glm_.vec2.Vec2i +import java.util.concurrent.ConcurrentHashMap + +open class AbsoluteLayout( + renderWindow: RenderWindow, + sizing: NodeSizing = NodeSizing(), + initialCacheSize: Int = DEFAULT_INITIAL_CACHE_SIZE, +) : Node(renderWindow, sizing, initialCacheSize) { + protected val children: MutableMap = ConcurrentHashMap() + + fun clearChildren() { + children.clear() + } + + fun addChild(start: Vec2i, child: Node) { + child.parent = this + child.apply() + if (children.isEmpty()) { + start.x += child.sizing.margin.left + sizing.padding.left + start.y += child.sizing.margin.top + sizing.padding.top + } + children[child] = start + apply() + } + + fun recursiveApply() { + for ((child, _) in children) { + if (child is AbsoluteLayout) { + child.recursiveApply() + } else { + child.apply() + } + } + } + + private fun checkAlignment() { + when (sizing.forceAlign) { + NodeAlignment.RIGHT -> { + for ((child, start) in children) { + start.x = sizing.currentSize.x - (child.sizing.margin.right + sizing.padding.right + child.sizing.currentSize.x) + } + } + NodeAlignment.LEFT -> { + for ((child, start) in children) { + start.x = child.sizing.margin.left + sizing.padding.left + } + } + NodeAlignment.CENTER -> { + for ((child, start) in children) { + start.x = (sizing.currentSize.x - child.sizing.currentSize.x) / 2 + } + } + } + } + + override fun apply() { + clearCache() + recalculateSize() + checkAlignment() + parent?.apply() + } + + private fun recalculateSize() { + if (children.isEmpty()) { + sizing.currentSize.x = sizing.minSize.x + sizing.currentSize.y = sizing.minSize.y + } else { + for ((childNode, start) in children) { + checkSize(childNode, start) + } + } + } + + override fun clearCache() { + cache.clear() + parent?.clearCache() + } + + private fun checkSize(child: Node, start: Vec2i) { + var changed = false + val end = start + child.sizing.currentSize + if (end.x > sizing.currentSize.x) { + sizing.currentSize.x = MMath.clamp(end.x, sizing.minSize.x, sizing.maxSize.x) + changed = true + } + if (end.y > sizing.currentSize.y) { + sizing.currentSize.y = MMath.clamp(end.y, sizing.minSize.y, sizing.maxSize.y) + changed = true + } + if (changed) { + clearCache() + } + } + + private fun addToStart(start: Vec2i, elementPosition: Vec2i): Vec2i { + return Vec2i(start.x + elementPosition.x, start.y - elementPosition.y) + } + + override fun prepareCache(start: Vec2i, scaleFactor: Float, matrix: Mat4, z: Int) { + for ((child, childStart) in children) { + child.checkCache(addToStart(start, childStart * scaleFactor), scaleFactor, matrix, z) + cache.addCache(child.cache) + } + } + + fun clearChildrenCache() { + for ((child, _) in children) { + if (child is AbsoluteLayout) { + child.clearChildrenCache() + } else { + child.clearCache() + } + } + clearCache() + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ImageElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/ImageNode.kt similarity index 75% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ImageElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/ImageNode.kt index fef4b9f65..315df6fd2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/ImageElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/ImageNode.kt @@ -11,34 +11,27 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive +package de.bixilon.minosoft.gui.rendering.hud.nodes.primitive import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.RenderConstants +import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.hud.HUDMesh import de.bixilon.minosoft.gui.rendering.hud.atlas.TextureLike +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing import glm_.mat4x4.Mat4 import glm_.vec2.Vec2 import glm_.vec2.Vec2i import glm_.vec3.Vec3 import glm_.vec4.Vec4 -class ImageElement( - start: Vec2i = Vec2i(0, 0), +class ImageNode( + renderWindow: RenderWindow, + sizing: NodeSizing = NodeSizing(), var textureLike: TextureLike?, - end: Vec2i = textureLike?.size ?: Vec2i(0, 0), val z: Int = 0, val tintColor: RGBColor? = null, -) : EndElement(start, end, initialCacheSize = HUDMesh.FLOATS_PER_VERTEX * 6) { - - init { - recalculateSize() - } - - override fun recalculateSize() { - size = end - start - parent?.recalculateSize() - } +) : Node(renderWindow, sizing = sizing, initialCacheSize = HUDMesh.FLOATS_PER_VERTEX * 6) { private fun addToStart(start: Vec2i, elementPosition: Vec2i): Vec2i { @@ -49,22 +42,11 @@ class ImageElement( return Vec2i(start.x + elementPosition.x, start.y - elementPosition.y) } + override fun apply() {} + override fun prepareCache(start: Vec2i, scaleFactor: Float, matrix: Mat4, z: Int) { - val ourStart = addToStart(start, this.start * scaleFactor) - val modelStart = matrix * Vec4(RenderConstants.PIXEL_UV_PIXEL_ADD + ourStart, 1.0f, 1.0f) - val realEnd = Vec2i( - x = if (end.x == -1) { - parent!!.size.x - } else { - end.x * scaleFactor - }, - y = if (end.y == -1) { - parent!!.size.y - } else { - end.y * scaleFactor - } - ) - val ourEnd = addToEnd(start, realEnd) + val modelStart = matrix * Vec4(RenderConstants.PIXEL_UV_PIXEL_ADD + start, 1.0f, 1.0f) + val ourEnd = addToEnd(start, sizing.currentSize * scaleFactor) val modelEnd = matrix * Vec4(RenderConstants.PIXEL_UV_PIXEL_ADD + ourEnd, 1.0f, 1.0f) val uvStart = textureLike?.uvStart ?: Vec2() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/TextElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt similarity index 57% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/TextElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt index 640902d6b..f2190a215 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/TextElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/LabelNode.kt @@ -11,28 +11,31 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive +package de.bixilon.minosoft.gui.rendering.hud.nodes.primitive import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.RenderConstants +import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.font.Font +import de.bixilon.minosoft.gui.rendering.hud.nodes.layout.AbsoluteLayout +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing import glm_.vec2.Vec2i -class TextElement( - private var _text: ChatComponent = ChatComponent.valueOf(raw = ""), - private val font: Font, - start: Vec2i = Vec2i(0, 0), - z: Int = 1, +class LabelNode( + renderWindow: RenderWindow, + sizing: NodeSizing = NodeSizing(minSize = Vec2i(0, Font.CHAR_HEIGHT)), + text: ChatComponent = ChatComponent.valueOf(raw = ""), var background: Boolean = true, -) : Layout(start, z) { +) : AbsoluteLayout(renderWindow, sizing) { + private var _text: ChatComponent = text var text: ChatComponent get() = _text set(value) { - size = Vec2i(0, 0) _text = value prepare() + apply() } var sText: String get() = text.message @@ -45,22 +48,17 @@ class TextElement( } private fun prepare() { - clear() - if (text.message.isBlank()) { - fakeY = Font.CHAR_HEIGHT - } else { - fakeY = null - val textSize = Vec2i(0, 0) - text.prepareRender(Vec2i(1, 1), Vec2i(), font, this, this.z + z + 1, textSize) - finishBatchAdd() + clearChildren() + val textSize = Vec2i(0, 0) + text.prepareRender(Vec2i(1, 1), Vec2i(), renderWindow, this, 1, textSize) + apply() - if (background) { - drawBackground(textSize + 1, z) - } + if (background) { + drawBackground(textSize + 1) } } - private fun drawBackground(end: Vec2i, z: Int, tintColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR) { - addChild(ImageElement(Vec2i(0, 0), null, end, this.z + z, tintColor)) + 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)) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Element.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/Node.kt similarity index 73% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Element.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/Node.kt index 86c75931d..a4e91b655 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/Element.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/primitive/Node.kt @@ -11,31 +11,23 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive +package de.bixilon.minosoft.gui.rendering.hud.nodes.primitive +import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.hud.HUDCacheMesh +import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing import glm_.mat4x4.Mat4 import glm_.vec2.Vec2i -abstract class Element( - private var _start: Vec2i, - initialCacheSize: Int = 1000, +abstract class Node( + val renderWindow: RenderWindow, + val sizing: NodeSizing = NodeSizing(), + initialCacheSize: Int = DEFAULT_INITIAL_CACHE_SIZE, ) { - var start: Vec2i - get() { - return _start - } - set(value) { - _start = value - parent?.recalculateSize() - clearCache() - } - val cache = HUDCacheMesh(initialCacheSize) - open var parent: Element? = null - open var size: Vec2i = Vec2i() + open var parent: Node? = null - abstract fun recalculateSize() + abstract fun apply() fun needsCacheUpdate(): Boolean { return cache.isEmpty() @@ -53,4 +45,8 @@ abstract class Element( } abstract fun prepareCache(start: Vec2i, scaleFactor: Float, matrix: Mat4, z: Int = 1) + + companion object { + const val DEFAULT_INITIAL_CACHE_SIZE = 1000 + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeAlignment.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeAlignment.kt new file mode 100644 index 000000000..dbe710538 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeAlignment.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.hud.nodes.properties + +enum class NodeAlignment { + LEFT, + RIGHT, + CENTER, + +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/EndElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeSizing.kt similarity index 65% rename from src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/EndElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeSizing.kt index e39947b43..e0e94ba32 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/elements/primitive/EndElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/NodeSizing.kt @@ -11,23 +11,16 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.hud.elements.primitive +package de.bixilon.minosoft.gui.rendering.hud.nodes.properties import glm_.vec2.Vec2i -abstract class EndElement( - start: Vec2i, - private var _end: Vec2i, - initialCacheSize: Int = 10000, -) : Element(start, initialCacheSize = initialCacheSize) { - var end: Vec2i - get() { - return _end - } - set(value) { - _end = value - parent?.recalculateSize() - clearCache() - } - +data class NodeSizing( + val minSize: Vec2i = Vec2i(0, 0), + val margin: Spacing = Spacing(), + val padding: Spacing = Spacing(), + val maxSize: Vec2i = Vec2i(Int.MAX_VALUE, Int.MAX_VALUE), + var forceAlign: NodeAlignment? = null, +) { + val currentSize: Vec2i = Vec2i(minSize) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/Spacing.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/Spacing.kt new file mode 100644 index 000000000..3e9f895c5 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/properties/Spacing.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.hud.nodes.properties + +data class Spacing( + var top: Int = 0, + var right: Int = 0, + var bottom: Int = 0, + var left: Int = 0, +) diff --git a/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl b/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl index bf1712446..50c256570 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl @@ -47,12 +47,7 @@ void main() { texelColor *= passTintColor; } - // ToDo - if (passTintColor.r == 0.0f && passTintColor.g == 0.0f && passTintColor.b == 0.0f && passTintColor.a != 0.0f){ - outColor= vec4(passTintColor.rgb * (vec3(1.0f) / texelColor.rgb), passTintColor.a); - } else { - outColor = texelColor; - } + outColor = texelColor; // // outColor = vec4(1.0f, 0.0f, 0.5f, 1.0f); diff --git a/src/main/resources/assets/minosoft/textures/white.png b/src/main/resources/assets/minosoft/textures/white.png new file mode 100644 index 0000000000000000000000000000000000000000..247e577cd4666669bfd4cbbaeaec1128198a9d67 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GmLLkhjIQx?^P*B#> z#WBR9H~G*1|NraRxEO?0XSwrAm?m6lIGDn~kbR0pX8FU?V4y+