From f587f0af3d635aab2119a47c784c55ace6622332 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 15 Apr 2021 17:27:33 +0200 Subject: [PATCH] rendering: abstract screen resize callback --- .../bixilon/minosoft/gui/rendering/Camera.kt | 5 +++-- .../minosoft/gui/rendering/RenderWindow.kt | 18 ++++++++++----- .../minosoft/gui/rendering/Renderer.kt | 3 --- .../minosoft/gui/rendering/hud/HUDRenderer.kt | 22 ++++++++++++++----- .../gui/rendering/hud/nodes/HUDElement.kt | 2 -- .../hud/nodes/chat/ChatBoxHUDElement.kt | 7 +++--- .../hud/nodes/debug/HUDSystemDebugNode.kt | 5 +++-- .../util/abstractions/ScreenResizeCallback.kt | 21 ++++++++++++++++++ .../packets/s2c/play/PacketRespawn.kt | 6 ++--- 9 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/util/abstractions/ScreenResizeCallback.kt diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt index bba0229b0..d340af9b8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt @@ -27,6 +27,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight +import de.bixilon.minosoft.gui.rendering.util.abstractions.ScreenResizeCallback import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.c2s.play.PlayerPositionAndRotationC2SPacket import de.bixilon.minosoft.protocol.packets.c2s.play.PlayerPositionC2SPacket @@ -46,7 +47,7 @@ class Camera( val connection: PlayConnection, var fov: Float, val renderWindow: RenderWindow, -) { +) : ScreenResizeCallback { private var mouseSensitivity = Minosoft.getConfig().config.game.camera.moseSensitivity private var movementSpeed = 7 var cameraPosition = Vec3(0.0f, 0.0f, 0.0f) @@ -196,7 +197,7 @@ class Camera( this.shaders.addAll(shaders) } - fun screenChangeResizeCallback() { + override fun onScreenResize(screenDimensions: Vec2i) { recalculateViewProjectionMatrix() } 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 cbf9070df..31f1ae0f8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -30,6 +30,7 @@ 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 import de.bixilon.minosoft.gui.rendering.util.ScreenshotTaker +import de.bixilon.minosoft.gui.rendering.util.abstractions.ScreenResizeCallback import de.bixilon.minosoft.modding.event.EventInvokerCallback import de.bixilon.minosoft.modding.event.events.ConnectionStateChangeEvent import de.bixilon.minosoft.modding.event.events.PacketReceiveEvent @@ -92,6 +93,11 @@ class RenderWindow( lateinit var WHITE_TEXTURE: TextureLike + val screenResizeCallbacks: MutableSet = mutableSetOf( + camera, + hudRenderer, + ) + var tickCount = 0L var lastTickTimer = System.currentTimeMillis() @@ -344,8 +350,9 @@ class RenderWindow( glViewport(0, 0, width, height) screenDimensions = Vec2i(width, height) screenDimensionsF = Vec2(screenDimensions) - camera.screenChangeResizeCallback() - hudRenderer.screenChangeResizeCallback(screenDimensions) + for (callback in screenResizeCallbacks) { + callback.onScreenResize(screenDimensions) + } } }) @@ -372,11 +379,12 @@ class RenderWindow( registerGlobalKeyCombinations() - hudRenderer.screenChangeResizeCallback(screenDimensions) - camera.addShaders(worldRenderer.chunkShader) - camera.screenChangeResizeCallback() + for (callback in screenResizeCallbacks) { + callback.onScreenResize(screenDimensions) + } + glEnable(GL_DEPTH_TEST) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt index d9f14db14..1f8e8fb70 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt @@ -13,11 +13,8 @@ package de.bixilon.minosoft.gui.rendering -import glm_.vec2.Vec2i - interface Renderer { fun init() fun postInit() fun draw() - fun screenChangeResizeCallback(screenDimensions: Vec2i) {} } 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 53be6eca3..91fc31d6a 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 @@ -27,6 +27,7 @@ import de.bixilon.minosoft.gui.rendering.hud.nodes.chat.ChatBoxHUDElement 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.gui.rendering.util.abstractions.ScreenResizeCallback import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.MMath @@ -36,7 +37,7 @@ import glm_.mat4x4.Mat4 import glm_.vec2.Vec2 import glm_.vec2.Vec2i -class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow) : Renderer { +class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow) : Renderer, ScreenResizeCallback { private val hudElements: MutableMap> = mutableMapOf() private val enabledHUDElement: MutableMap> = mutableMapOf() private val hudShader = Shader( @@ -105,6 +106,9 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow if (needToSafeConfig) { Minosoft.getConfig().saveToFile() } + if (hudElement is ScreenResizeCallback) { + renderWindow.screenResizeCallbacks.add(hudElement) + } val pair = Pair(properties, hudElement) hudElements[resourceLocation] = pair @@ -128,10 +132,17 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow } fun removeElement(resourceLocation: ResourceLocation) { - hudElements[resourceLocation]?.first?.toggleKeyBinding?.let { - renderWindow.unregisterKeyBinding(it) + val element = hudElements[resourceLocation] ?: return + + element.second.let { + if (it is ScreenResizeCallback) { + renderWindow.screenResizeCallbacks.remove(it) + } } + element.first.toggleKeyBinding?.let { + renderWindow.unregisterKeyBinding(it) + } enabledHUDElement.remove(resourceLocation) hudElements.remove(resourceLocation) forcePrepare = true @@ -149,11 +160,10 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow } } - override fun screenChangeResizeCallback(screenDimensions: Vec2i) { - orthographicMatrix = glm.ortho(-screenDimensions.x / 2f, screenDimensions.x / 2f, -screenDimensions.y / 2f, screenDimensions.y / 2f) + override fun onScreenResize(screenDimensions: Vec2i) { + orthographicMatrix = glm.ortho(-screenDimensions.x / 2.0f, screenDimensions.x / 2.0f, -screenDimensions.y / 2.0f, screenDimensions.y / 2.0f) for ((_, hudElement) in hudElements.values) { hudElement.layout.clearChildrenCache() - hudElement.screenChangeResizeCallback(screenDimensions) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt index 672a08fde..214b25c9c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/HUDElement.kt @@ -15,7 +15,6 @@ package de.bixilon.minosoft.gui.rendering.hud.nodes import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.hud.nodes.layout.AbsoluteLayout -import glm_.vec2.Vec2i abstract class HUDElement(protected val hudRenderer: HUDRenderer) { val layout = AbsoluteLayout(hudRenderer.renderWindow) @@ -23,5 +22,4 @@ abstract class HUDElement(protected val hudRenderer: HUDRenderer) { open fun init() {} open fun postInit() {} open fun draw() {} - open fun screenChangeResizeCallback(screenDimensions: Vec2i) {} } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/chat/ChatBoxHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/chat/ChatBoxHUDElement.kt index 22dce8266..9eb616adc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/chat/ChatBoxHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/chat/ChatBoxHUDElement.kt @@ -23,10 +23,11 @@ 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 de.bixilon.minosoft.gui.rendering.hud.nodes.properties.Spacing +import de.bixilon.minosoft.gui.rendering.util.abstractions.ScreenResizeCallback import de.bixilon.minosoft.util.MMath import glm_.vec2.Vec2i -class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { +class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer), ScreenResizeCallback { private lateinit var inputField: SubmittableTextField private var inputFieldBackground = ImageNode(hudRenderer.renderWindow, sizing = NodeSizing(margin = Spacing(left = 1, right = 1)), textureLike = hudRenderer.renderWindow.WHITE_TEXTURE, z = 0, tintColor = RenderConstants.TEXT_BACKGROUND_COLOR) @@ -47,9 +48,9 @@ class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) { } } - override fun screenChangeResizeCallback(screenDimensions: Vec2i) { + override fun onScreenResize(screenDimensions: Vec2i) { layout.sizing.minSize.x = screenDimensions.x - inputFieldBackground.sizing.forceSize = Vec2i(screenDimensions.x - 2, MMath.clamp(inputField.sizing.currentSize.y, Font.CHAR_HEIGHT, Int.MAX_VALUE)) // 2 pixels for log + inputFieldBackground.sizing.forceSize = Vec2i(screenDimensions.x - 2, MMath.clamp(inputField.sizing.currentSize.y, Font.CHAR_HEIGHT, Int.MAX_VALUE)) // 2 pixels for margin layout.sizing.maxSize.x = screenDimensions.x layout.sizing.validate() layout.apply() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt index 5eedb2f30..334e35372 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/nodes/debug/HUDSystemDebugNode.kt @@ -15,6 +15,7 @@ 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.gui.rendering.util.abstractions.ScreenResizeCallback import de.bixilon.minosoft.modding.loading.ModLoader import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.GitInfo @@ -24,7 +25,7 @@ import glm_.vec2.Vec2i import org.lwjgl.opengl.GL11.* -class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer) { +class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer), ScreenResizeCallback { init { layout.sizing.forceAlign = NodeAlignment.RIGHT @@ -61,7 +62,7 @@ class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer text("Mods: ${ModLoader.MOD_MAP.size} active, ${hudRenderer.connection.eventListenerSize} listeners") } - override fun screenChangeResizeCallback(screenDimensions: Vec2i) { + override fun onScreenResize(screenDimensions: Vec2i) { displayText.sText = "Display: ${getScreenDimensions()}" } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/abstractions/ScreenResizeCallback.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/abstractions/ScreenResizeCallback.kt new file mode 100644 index 000000000..23701c381 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/abstractions/ScreenResizeCallback.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.util.abstractions + +import glm_.vec2.Vec2i + +interface ScreenResizeCallback { + + fun onScreenResize(screenDimensions: Vec2i) {} +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt index f2741755e..99ed455a9 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketRespawn.kt @@ -58,7 +58,7 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() { } } if (buffer.versionId < ProtocolVersions.V_19W11A) { - difficulty = Difficulties.byId(buffer.readUnsignedByte().toInt()) + difficulty = Difficulties.byId(buffer.readUnsignedByte()) } if (buffer.versionId >= ProtocolVersions.V_20W22A) { dimension = buffer.connection.mapping.dimensionRegistry.get(buffer.readResourceLocation())!! @@ -66,7 +66,7 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() { if (buffer.versionId >= ProtocolVersions.V_19W36A) { hashedSeed = buffer.readLong() } - gamemode = Gamemodes.byId(buffer.readUnsignedByte().toInt()) + gamemode = Gamemodes.byId(buffer.readUnsignedByte()) if (buffer.versionId >= ProtocolVersions.V_1_16_PRE6) { buffer.readByte() // previous game mode } @@ -96,6 +96,6 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() { } override fun log() { - Log.protocol(String.format("[IN] Respawn packet received (dimension=%s, difficulty=%s, gamemode=%s, levelType=%s)", dimension, difficulty, gamemode, levelType)) + Log.protocol("[IN] Respawn packet received (dimension=$dimension, difficulty=$difficulty, gamemode=$gamemode, levelType=$levelType)") } }