From 1dc232307383a6be0dd3047d07f0d57c4528ff29 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 24 Oct 2021 19:58:02 +0200 Subject: [PATCH] restructure hud renderer --- .../minosoft/gui/rendering/Drawable.kt | 21 +++++++++ .../gui/rendering/gui/hud/HUDElement.kt | 45 +++++++++++++++++++ .../gui/rendering/gui/hud/HUDRenderer.kt | 39 +++++++++++----- .../gui/hud/elements/CustomHUDElement.kt | 30 +++++++++++++ .../rendering/gui/hud/elements/HUDBuilder.kt | 3 +- .../{HUDElement.kt => LayoutedHUDElement.kt} | 26 ++++------- .../hud/elements/{ => chat}/ChatHUDElement.kt | 6 ++- .../{ => chat}/InternalMessagesHUDElement.kt | 6 ++- .../hud/elements/hotbar/HotbarHUDElement.kt | 4 +- .../{ => other}/BreakProgressHUDElement.kt | 27 ++++++----- .../{ => other}/CrosshairHUDElement.kt | 7 +-- .../elements/{ => other}/DebugHUDElement.kt | 8 +++- .../{ => other}/WorldInfoHUDElement.kt | 27 ++++------- .../gui/hud/elements/tab/TabListHUDElement.kt | 4 +- 14 files changed, 181 insertions(+), 72 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/Drawable.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDElement.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CustomHUDElement.kt rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{HUDElement.kt => LayoutedHUDElement.kt} (72%) rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{ => chat}/ChatHUDElement.kt (87%) rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{ => chat}/InternalMessagesHUDElement.kt (87%) rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{ => other}/BreakProgressHUDElement.kt (74%) rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{ => other}/CrosshairHUDElement.kt (92%) rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{ => other}/DebugHUDElement.kt (96%) rename src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/{ => other}/WorldInfoHUDElement.kt (82%) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Drawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/Drawable.kt new file mode 100644 index 000000000..17d5290e6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Drawable.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 + +interface Drawable { + /** + * Functions gets called every frame + */ + fun draw() +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDElement.kt new file mode 100644 index 000000000..2343b5b50 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDElement.kt @@ -0,0 +1,45 @@ +/* + * 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.gui.hud + +import de.bixilon.minosoft.gui.rendering.RenderWindow + +interface HUDElement { + val hudRenderer: HUDRenderer + val renderWindow: RenderWindow + var enabled: Boolean + + /** + * Initializes the element (e.g. getting atlas elements, creating shaders, creating textures, etc) + */ + fun init() {} + + /** + * Phase after everything is initialized. May be used to load shaders, ... + * Can not be used to load static textures + */ + fun postInit() {} + + /** + * Functions that gets called every tick + */ + fun tick() {} + + + /** + * Functions that sets new texts, changes data in the element + * May be used to poll data (see Pollable) + */ + fun apply() {} +} 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 23c8f2e49..e4b9bd6ce 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 @@ -18,17 +18,25 @@ import de.bixilon.minosoft.config.key.KeyAction import de.bixilon.minosoft.config.key.KeyBinding import de.bixilon.minosoft.config.key.KeyCodes import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.gui.rendering.Drawable import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.RendererBuilder +import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.HUDAtlasManager -import de.bixilon.minosoft.gui.rendering.gui.hud.elements.* +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.chat.ChatHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.chat.InternalMessagesHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.HotbarHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.other.BreakProgressHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.other.CrosshairHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.other.DebugHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.other.WorldInfoHUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab.TabListHUDElement import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes -import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition @@ -53,7 +61,7 @@ class HUDRenderer( var matrixChange = true private set - private val hudElements: MutableMap> = synchronizedMapOf() + private val hudElements: MutableMap = synchronizedMapOf() private var lastTickTime = 0L @@ -95,7 +103,9 @@ class HUDRenderer( matrixChange = true for (element in hudElements.toSynchronizedMap().values) { - element.layout?.silentApply() + if (element is LayoutedHUDElement<*>) { + element.layout.silentApply() + } element.apply() } }) @@ -142,28 +152,37 @@ class HUDRenderer( continue } element.tick() + if (element is Pollable) { + if (element.poll()) { + element.apply() + } + } } lastTickTime = time } - // ToDo: size > maxSize + renderWindow.renderSystem.reset() + renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER) var z = 0 for (element in hudElements) { if (!element.enabled) { continue } - element.draw() - z += element.layout?.render(element.layoutOffset ?: Vec2i.EMPTY, z, mesh, null) ?: 0 + if (element is Drawable) { + element.draw() + } + if (element is LayoutedHUDElement<*>) { + z += element.layout.render(element.layoutOffset, z, mesh, null) + } } renderWindow.renderSystem.reset() renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER) + mesh.load() - - shader.use() mesh.draw() @@ -172,7 +191,7 @@ class HUDRenderer( } } - operator fun > get(hudBuilder: HUDBuilder<*>): T? { + operator fun > get(hudBuilder: HUDBuilder<*>): T? { return hudElements[hudBuilder.RESOURCE_LOCATION].unsafeCast() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CustomHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CustomHUDElement.kt new file mode 100644 index 000000000..1d74e6d1f --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CustomHUDElement.kt @@ -0,0 +1,30 @@ +/* + * 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.gui.hud.elements + +import de.bixilon.minosoft.gui.rendering.Drawable +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.gui.hud.HUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer + +abstract class CustomHUDElement(final override val hudRenderer: HUDRenderer) : HUDElement, Drawable { + override val renderWindow: RenderWindow = hudRenderer.renderWindow + override var enabled = true + + /** + * Function to draw the custom content. + * May create buffers, changes shaders, resets the render system, etc + */ + override fun draw() {} +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDBuilder.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDBuilder.kt index 1f7988ebf..8ff527f50 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDBuilder.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDBuilder.kt @@ -16,9 +16,10 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements import de.bixilon.minosoft.config.key.KeyBinding import de.bixilon.minosoft.data.registries.CompanionResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.gui.rendering.gui.hud.HUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer -interface HUDBuilder> : CompanionResourceLocation { +interface HUDBuilder : CompanionResourceLocation { val ENABLE_KEY_BINDING_NAME: ResourceLocation? get() = null val ENABLE_KEY_BINDING: KeyBinding? diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedHUDElement.kt similarity index 72% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedHUDElement.kt index e37fc356b..dbf384da3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/HUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedHUDElement.kt @@ -15,28 +15,18 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.gui.elements.Element +import de.bixilon.minosoft.gui.rendering.gui.hud.HUDElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import glm_.vec2.Vec2i -abstract class HUDElement(val hudRenderer: HUDRenderer) { - val renderWindow: RenderWindow = hudRenderer.renderWindow - var enabled = true +abstract class LayoutedHUDElement(final override val hudRenderer: HUDRenderer) : HUDElement { + override val renderWindow: RenderWindow = hudRenderer.renderWindow + override var enabled = true - open val layout: T? - get() = null + abstract val layout: T + abstract val layoutOffset: Vec2i - open val layoutOffset: Vec2i? - get() = null - - open fun init() {} - - open fun postInit() {} - - open fun draw() {} - - open fun tick() { - layout?.tick() + override fun tick() { + layout.tick() } - - open fun apply() {} } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/ChatHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatHUDElement.kt similarity index 87% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/ChatHUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatHUDElement.kt index bf9736694..34cc8d3a7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/ChatHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatHUDElement.kt @@ -11,19 +11,21 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.gui.hud.elements +package de.bixilon.minosoft.gui.rendering.gui.hud.elements.chat import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.ChatTextPositions import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextFlowElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.modding.event.events.ChatMessageReceiveEvent import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i -class ChatHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class ChatHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer) { private val connection = renderWindow.connection override val layout = TextFlowElement(hudRenderer, 20000) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/InternalMessagesHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalMessagesHUDElement.kt similarity index 87% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/InternalMessagesHUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalMessagesHUDElement.kt index af0d3bb04..db1529463 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/InternalMessagesHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalMessagesHUDElement.kt @@ -11,18 +11,20 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.gui.hud.elements +package de.bixilon.minosoft.gui.rendering.gui.hud.elements.chat import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextFlowElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.modding.event.events.InternalMessageReceiveEvent import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i -class InternalMessagesHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class InternalMessagesHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer) { private val connection = renderWindow.connection override val layout = TextFlowElement(hudRenderer, 15000) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt index 324278cbd..88405ba67 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt @@ -18,7 +18,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.other.game.event.handlers.gamemode.GamemodeChangeEvent import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder -import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.modding.event.events.ChatMessageReceiveEvent import de.bixilon.minosoft.modding.event.events.ExperienceChangeEvent import de.bixilon.minosoft.modding.event.events.SelectHotbarSlotEvent @@ -27,7 +27,7 @@ import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i -class HotbarHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class HotbarHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer) { private val connection = renderWindow.connection override lateinit var layout: HotbarElement diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/BreakProgressHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt similarity index 74% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/BreakProgressHUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt index 5b03cb251..1c5137af3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/BreakProgressHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/BreakProgressHUDElement.kt @@ -11,44 +11,47 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.gui.hud.elements +package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other 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.Drawable import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i -class BreakProgressHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class BreakProgressHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer), Drawable { override val layout: TextElement = TextElement(hudRenderer, "") private val leftClickHandler = hudRenderer.renderWindow.inputHandler.leftClickHandler override val layoutOffset: Vec2i get() = Vec2i((hudRenderer.scaledSize.x / 2) + CrosshairHUDElement.CROSSHAIR_SIZE / 2 + 5, (hudRenderer.scaledSize.y - layout.size.y) / 2) - private var lastPercent = -1 + private var percent = -1 override fun draw() { val breakProgress = leftClickHandler.breakProgress if (breakProgress <= 0 || breakProgress >= 1.0) { layout.text = "" - lastPercent = -1 + this.percent = -1 return } val percent = (leftClickHandler.breakProgress * 100).toInt() - if (percent == lastPercent) { + if (percent == this.percent) { return } - val text = TextComponent("$percent%") - text.color = when { - percent <= 30 -> ChatColors.RED - percent <= 70 -> ChatColors.YELLOW - else -> ChatColors.GREEN + layout.text = TextComponent("$percent%").apply { + color = when { + percent <= 30 -> ChatColors.RED + percent <= 70 -> ChatColors.YELLOW + else -> ChatColors.GREEN + } } - layout.text = text - lastPercent = percent + this.percent = percent } companion object : HUDBuilder { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CrosshairHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt similarity index 92% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CrosshairHUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt index 1cb85a505..8174ec272 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/CrosshairHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt @@ -11,21 +11,22 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.gui.hud.elements +package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.registries.ResourceLocation -import de.bixilon.minosoft.gui.rendering.gui.elements.Element import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.HUDAtlasElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.CustomHUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIMesh import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.camera.hit.EntityRaycastHit import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions import de.bixilon.minosoft.util.KUtil.toResourceLocation -class CrosshairHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class CrosshairHUDElement(hudRenderer: HUDRenderer) : CustomHUDElement(hudRenderer) { private lateinit var crosshairAtlasElement: HUDAtlasElement private var mesh: GUIMesh? = null private var previousDebugEnabled: Boolean? = true diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/DebugHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt similarity index 96% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/DebugHUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt index e05d88454..ce1be534f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/DebugHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt @@ -11,7 +11,7 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.gui.hud.elements +package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.config.key.KeyAction @@ -35,8 +35,11 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.spacer.LineSpacerElement import de.bixilon.minosoft.gui.rendering.gui.elements.text.AutoTextElement import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement 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.Vec2Util.EMPTY import de.bixilon.minosoft.modding.event.events.DifficultyChangeEvent import de.bixilon.minosoft.modding.event.events.GameEventChangeEvent import de.bixilon.minosoft.modding.event.events.TimeChangeEvent @@ -54,8 +57,9 @@ import glm_.vec2.Vec2i import glm_.vec4.Vec4i import kotlin.math.abs -class DebugHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class DebugHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer) { private val connection = renderWindow.connection + override val layoutOffset: Vec2i = Vec2i.EMPTY override val layout = GridLayout(hudRenderer, Vec2i(3, 1)).apply { columnConstraints[0].apply { grow = GridGrow.NEVER diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/WorldInfoHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/WorldInfoHUDElement.kt similarity index 82% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/WorldInfoHUDElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/WorldInfoHUDElement.kt index b869308b1..a96c2aca4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/WorldInfoHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/WorldInfoHUDElement.kt @@ -11,23 +11,22 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.rendering.gui.hud.elements +package de.bixilon.minosoft.gui.rendering.gui.hud.elements.other import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.MMath.round10 import glm_.vec2.Vec2i -class WorldInfoHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer), Pollable { - override val layout: TextElement = TextElement(hudRenderer, "", scale = 3.0f) - +class WorldInfoHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer), Pollable { + override val layout: TextElement = TextElement(hudRenderer, "") override val layoutOffset: Vec2i = Vec2i(2, 2) - private var fps = -1.0 - private var hide: Boolean = false override fun tick() { @@ -41,10 +40,13 @@ class WorldInfoHUDElement(hudRenderer: HUDRenderer) : HUDElement(hu } override fun poll(): Boolean { + val debugHUDElement: DebugHUDElement? = hudRenderer[DebugHUDElement] + val hide = debugHUDElement?.enabled == true val fps = hudRenderer.renderWindow.renderStats.smoothAvgFPS.round10 - if (this.fps == fps) { + if (this.hide == hide && this.fps == fps) { return false } + this.hide = hide this.fps = fps return true } @@ -57,17 +59,6 @@ class WorldInfoHUDElement(hudRenderer: HUDRenderer) : HUDElement(hu } } - override fun draw() { - val debugHUDElement: DebugHUDElement? = hudRenderer[DebugHUDElement] - - val debugEnabled = debugHUDElement?.enabled == true - if (this.hide != debugEnabled) { - this.hide = debugEnabled - poll() - apply() - } - } - companion object : HUDBuilder { override val RESOURCE_LOCATION: ResourceLocation = "minosoft:world_info".toResourceLocation() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListHUDElement.kt index 253dff735..24ff5442d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListHUDElement.kt @@ -19,14 +19,14 @@ import de.bixilon.minosoft.config.key.KeyCodes import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder -import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDElement +import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement import de.bixilon.minosoft.modding.event.events.TabListEntryChangeEvent import de.bixilon.minosoft.modding.event.events.TabListInfoChangeEvent import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i -class TabListHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class TabListHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer) { private val connection = renderWindow.connection override val layout = TabListElement(hudRenderer)