mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-15 18:34:56 -04:00
rendering: abstract screen resize callback
This commit is contained in:
parent
c613aec539
commit
f587f0af3d
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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) {}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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()}"
|
||||
}
|
||||
|
||||
|
@ -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) {}
|
||||
}
|
@ -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)")
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user