rendering: abstract screen resize callback

This commit is contained in:
Bixilon 2021-04-15 17:27:33 +02:00
parent c613aec539
commit f587f0af3d
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
9 changed files with 63 additions and 26 deletions

View File

@ -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()
}

View File

@ -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<ScreenResizeCallback> = 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)

View File

@ -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) {}
}

View File

@ -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<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
private val enabledHUDElement: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = 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)
}
}

View File

@ -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) {}
}

View File

@ -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()

View File

@ -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()}"
}

View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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) {}
}

View File

@ -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)")
}
}