diff --git a/doc/rendering/GUI.md b/doc/rendering/GUI.md index 3ad2249cc..37e8c6336 100644 --- a/doc/rendering/GUI.md +++ b/doc/rendering/GUI.md @@ -32,3 +32,8 @@ ## ToDo: - make `TextElement`, `GridLayout` final +- TextInput +- Keyboard navigation +- Chat +- Inventory +- Pause menu diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/layout/grid/GridLayout.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/layout/grid/GridLayout.kt index 41e45aaf9..ae052cb0d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/layout/grid/GridLayout.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/layout/grid/GridLayout.kt @@ -24,7 +24,7 @@ import glm_.vec2.Vec2i import java.lang.Integer.min import kotlin.math.max -open class GridLayout(guiRenderer: GUIRenderer, val grid: Vec2i) : Element(guiRenderer) { +class GridLayout(guiRenderer: GUIRenderer, val grid: Vec2i) : Element(guiRenderer) { val columnConstraints: Array = Array(grid.x) { GridColumnConstraint() } val rowConstraints: Array = Array(grid.y) { GridRowConstraint() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt index 9e139f989..d74a6a4e3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt @@ -24,6 +24,6 @@ class PauseMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) { init { addButton(ButtonElement(guiRenderer, "Back to game") { guiRenderer.gui.pause(false) }) addButton(ConfirmButtonElement(guiRenderer, "§cDisconnect", "§cClick again to disconnect!") { guiRenderer.connection.network.disconnect() }) - addButton(ConfirmButtonElement(guiRenderer, "§4Exit", "§4Click again to exit!") { ShutdownManager.shutdown() }) + addButton(ConfirmButtonElement(guiRenderer, "§4Exit", "§4Click again to exit!") { guiRenderer.connection.network.disconnect(); ShutdownManager.shutdown() }) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt index fab4a215c..7a8910196 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt @@ -17,26 +17,31 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer +import de.bixilon.minosoft.gui.rendering.gui.elements.Element import de.bixilon.minosoft.gui.rendering.gui.elements.LayoutedElement import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedGUIElement +import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer +import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions import de.bixilon.minosoft.gui.rendering.renderer.Drawable import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i -class BreakProgressHUDElement(guiRenderer: GUIRenderer) : TextElement(guiRenderer, ""), LayoutedElement, Drawable { +class BreakProgressHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Drawable { + private val textElement = TextElement(guiRenderer, "").apply { parent = this@BreakProgressHUDElement } private val breakInteractionHandler = guiRenderer.renderWindow.inputHandler.interactionManager.`break` override val layoutOffset: Vec2i - get() = Vec2i((guiRenderer.scaledSize.x / 2) + CrosshairHUDElement.CROSSHAIR_SIZE / 2 + 5, (guiRenderer.scaledSize.y - super.size.y) / 2) + get() = Vec2i((guiRenderer.scaledSize.x / 2) + CrosshairHUDElement.CROSSHAIR_SIZE / 2 + 5, (guiRenderer.scaledSize.y - textElement.size.y) / 2) + private var percent = -1 override fun draw() { val breakProgress = breakInteractionHandler.breakProgress if (breakProgress <= 0 || breakProgress >= 1.0) { - super.text = "" + textElement.text = "" this.percent = -1 return } @@ -44,7 +49,7 @@ class BreakProgressHUDElement(guiRenderer: GUIRenderer) : TextElement(guiRendere if (percent == this.percent) { return } - super.text = TextComponent("$percent%").apply { + textElement.text = TextComponent("$percent%").apply { color = when { percent <= 30 -> ChatColors.RED percent <= 70 -> ChatColors.YELLOW @@ -54,6 +59,19 @@ class BreakProgressHUDElement(guiRenderer: GUIRenderer) : TextElement(guiRendere this.percent = percent } + override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer, options: GUIVertexOptions?): Int { + return textElement.forceRender(offset, z, consumer, options) + } + + override fun onChildChange(child: Element) { + forceSilentApply() + super.onChildChange(this) + } + + override fun forceSilentApply() { + cacheUpToDate = false + } + companion object : HUDBuilder> { override val RESOURCE_LOCATION: ResourceLocation = "minosoft:progress_indicator".toResourceLocation() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt index c5f840784..ec2be0df2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt @@ -38,6 +38,8 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement import de.bixilon.minosoft.gui.rendering.gui.hud.Initializable import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedGUIElement +import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer +import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY @@ -55,15 +57,16 @@ import glm_.vec2.Vec2i import glm_.vec4.Vec4i import kotlin.math.abs -class DebugHUDElement(guiRenderer: GUIRenderer) : GridLayout(guiRenderer, Vec2i(3, 1)), LayoutedElement, Initializable { +class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable { private val connection = renderWindow.connection + private val layout = GridLayout(guiRenderer, Vec2i(3, 1)).apply { parent = this@DebugHUDElement } override val layoutOffset: Vec2i = Vec2i.EMPTY init { - columnConstraints[0].apply { + layout.columnConstraints[0].apply { grow = GridGrow.NEVER } - columnConstraints[2].apply { + layout.columnConstraints[2].apply { grow = GridGrow.NEVER alignment = HorizontalAlignments.RIGHT } @@ -73,8 +76,8 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : GridLayout(guiRenderer, Vec2i( override fun init() { - this[Vec2i(0, 0)] = initLeft() - this[Vec2i(2, 0)] = initRight() + layout[Vec2i(0, 0)] = initLeft() + layout[Vec2i(2, 0)] = initRight() this.prefMaxSize = Vec2i(-1, Int.MAX_VALUE) this.ignoreDisplaySize = true @@ -285,6 +288,23 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : GridLayout(guiRenderer, Vec2i( } } + override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer, options: GUIVertexOptions?): Int { + return layout.forceRender(offset, z, consumer, options) + } + + override fun forceSilentApply() { + cacheUpToDate = false + } + + override fun onChildChange(child: Element) { + super.onChildChange(child) + forceSilentApply() + } + + override fun tick() { + layout.tick() + } + companion object : HUDBuilder> { override val RESOURCE_LOCATION: ResourceLocation = "minosoft:debug_hud".toResourceLocation() override val ENABLE_KEY_BINDING_NAME: ResourceLocation = "minosoft:enable_debug_hud".toResourceLocation() diff --git a/src/main/resources/assets/minosoft/eros/main/about/about.fxml b/src/main/resources/assets/minosoft/eros/main/about/about.fxml index 8db84710b..cec7afafa 100644 --- a/src/main/resources/assets/minosoft/eros/main/about/about.fxml +++ b/src/main/resources/assets/minosoft/eros/main/about/about.fxml @@ -67,7 +67,7 @@