mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 02:45:13 -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.chunkPosition
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition
|
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.VecUtil.sectionHeight
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.abstractions.ScreenResizeCallback
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
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.PlayerPositionAndRotationC2SPacket
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.PlayerPositionC2SPacket
|
import de.bixilon.minosoft.protocol.packets.c2s.play.PlayerPositionC2SPacket
|
||||||
@ -46,7 +47,7 @@ class Camera(
|
|||||||
val connection: PlayConnection,
|
val connection: PlayConnection,
|
||||||
var fov: Float,
|
var fov: Float,
|
||||||
val renderWindow: RenderWindow,
|
val renderWindow: RenderWindow,
|
||||||
) {
|
) : ScreenResizeCallback {
|
||||||
private var mouseSensitivity = Minosoft.getConfig().config.game.camera.moseSensitivity
|
private var mouseSensitivity = Minosoft.getConfig().config.game.camera.moseSensitivity
|
||||||
private var movementSpeed = 7
|
private var movementSpeed = 7
|
||||||
var cameraPosition = Vec3(0.0f, 0.0f, 0.0f)
|
var cameraPosition = Vec3(0.0f, 0.0f, 0.0f)
|
||||||
@ -196,7 +197,7 @@ class Camera(
|
|||||||
this.shaders.addAll(shaders)
|
this.shaders.addAll(shaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun screenChangeResizeCallback() {
|
override fun onScreenResize(screenDimensions: Vec2i) {
|
||||||
recalculateViewProjectionMatrix()
|
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.Texture
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.TextureArray
|
import de.bixilon.minosoft.gui.rendering.textures.TextureArray
|
||||||
import de.bixilon.minosoft.gui.rendering.util.ScreenshotTaker
|
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.EventInvokerCallback
|
||||||
import de.bixilon.minosoft.modding.event.events.ConnectionStateChangeEvent
|
import de.bixilon.minosoft.modding.event.events.ConnectionStateChangeEvent
|
||||||
import de.bixilon.minosoft.modding.event.events.PacketReceiveEvent
|
import de.bixilon.minosoft.modding.event.events.PacketReceiveEvent
|
||||||
@ -92,6 +93,11 @@ class RenderWindow(
|
|||||||
lateinit var WHITE_TEXTURE: TextureLike
|
lateinit var WHITE_TEXTURE: TextureLike
|
||||||
|
|
||||||
|
|
||||||
|
val screenResizeCallbacks: MutableSet<ScreenResizeCallback> = mutableSetOf(
|
||||||
|
camera,
|
||||||
|
hudRenderer,
|
||||||
|
)
|
||||||
|
|
||||||
var tickCount = 0L
|
var tickCount = 0L
|
||||||
var lastTickTimer = System.currentTimeMillis()
|
var lastTickTimer = System.currentTimeMillis()
|
||||||
|
|
||||||
@ -344,8 +350,9 @@ class RenderWindow(
|
|||||||
glViewport(0, 0, width, height)
|
glViewport(0, 0, width, height)
|
||||||
screenDimensions = Vec2i(width, height)
|
screenDimensions = Vec2i(width, height)
|
||||||
screenDimensionsF = Vec2(screenDimensions)
|
screenDimensionsF = Vec2(screenDimensions)
|
||||||
camera.screenChangeResizeCallback()
|
for (callback in screenResizeCallbacks) {
|
||||||
hudRenderer.screenChangeResizeCallback(screenDimensions)
|
callback.onScreenResize(screenDimensions)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -372,11 +379,12 @@ class RenderWindow(
|
|||||||
|
|
||||||
registerGlobalKeyCombinations()
|
registerGlobalKeyCombinations()
|
||||||
|
|
||||||
hudRenderer.screenChangeResizeCallback(screenDimensions)
|
|
||||||
|
|
||||||
camera.addShaders(worldRenderer.chunkShader)
|
camera.addShaders(worldRenderer.chunkShader)
|
||||||
|
|
||||||
camera.screenChangeResizeCallback()
|
for (callback in screenResizeCallbacks) {
|
||||||
|
callback.onScreenResize(screenDimensions)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST)
|
glEnable(GL_DEPTH_TEST)
|
||||||
|
|
||||||
|
@ -13,11 +13,8 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering
|
package de.bixilon.minosoft.gui.rendering
|
||||||
|
|
||||||
import glm_.vec2.Vec2i
|
|
||||||
|
|
||||||
interface Renderer {
|
interface Renderer {
|
||||||
fun init()
|
fun init()
|
||||||
fun postInit()
|
fun postInit()
|
||||||
fun draw()
|
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.HUDSystemDebugNode
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.nodes.debug.HUDWorldDebugNode
|
import de.bixilon.minosoft.gui.rendering.hud.nodes.debug.HUDWorldDebugNode
|
||||||
import de.bixilon.minosoft.gui.rendering.shader.Shader
|
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.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import de.bixilon.minosoft.util.MMath
|
import de.bixilon.minosoft.util.MMath
|
||||||
@ -36,7 +37,7 @@ import glm_.mat4x4.Mat4
|
|||||||
import glm_.vec2.Vec2
|
import glm_.vec2.Vec2
|
||||||
import glm_.vec2.Vec2i
|
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 hudElements: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
|
||||||
private val enabledHUDElement: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
|
private val enabledHUDElement: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
|
||||||
private val hudShader = Shader(
|
private val hudShader = Shader(
|
||||||
@ -105,6 +106,9 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
|
|||||||
if (needToSafeConfig) {
|
if (needToSafeConfig) {
|
||||||
Minosoft.getConfig().saveToFile()
|
Minosoft.getConfig().saveToFile()
|
||||||
}
|
}
|
||||||
|
if (hudElement is ScreenResizeCallback) {
|
||||||
|
renderWindow.screenResizeCallbacks.add(hudElement)
|
||||||
|
}
|
||||||
val pair = Pair(properties, hudElement)
|
val pair = Pair(properties, hudElement)
|
||||||
hudElements[resourceLocation] = pair
|
hudElements[resourceLocation] = pair
|
||||||
|
|
||||||
@ -128,10 +132,17 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun removeElement(resourceLocation: ResourceLocation) {
|
fun removeElement(resourceLocation: ResourceLocation) {
|
||||||
hudElements[resourceLocation]?.first?.toggleKeyBinding?.let {
|
val element = hudElements[resourceLocation] ?: return
|
||||||
renderWindow.unregisterKeyBinding(it)
|
|
||||||
|
element.second.let {
|
||||||
|
if (it is ScreenResizeCallback) {
|
||||||
|
renderWindow.screenResizeCallbacks.remove(it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
element.first.toggleKeyBinding?.let {
|
||||||
|
renderWindow.unregisterKeyBinding(it)
|
||||||
|
}
|
||||||
enabledHUDElement.remove(resourceLocation)
|
enabledHUDElement.remove(resourceLocation)
|
||||||
hudElements.remove(resourceLocation)
|
hudElements.remove(resourceLocation)
|
||||||
forcePrepare = true
|
forcePrepare = true
|
||||||
@ -149,11 +160,10 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun screenChangeResizeCallback(screenDimensions: Vec2i) {
|
override fun onScreenResize(screenDimensions: Vec2i) {
|
||||||
orthographicMatrix = glm.ortho(-screenDimensions.x / 2f, screenDimensions.x / 2f, -screenDimensions.y / 2f, screenDimensions.y / 2f)
|
orthographicMatrix = glm.ortho(-screenDimensions.x / 2.0f, screenDimensions.x / 2.0f, -screenDimensions.y / 2.0f, screenDimensions.y / 2.0f)
|
||||||
for ((_, hudElement) in hudElements.values) {
|
for ((_, hudElement) in hudElements.values) {
|
||||||
hudElement.layout.clearChildrenCache()
|
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.HUDRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.nodes.layout.AbsoluteLayout
|
import de.bixilon.minosoft.gui.rendering.hud.nodes.layout.AbsoluteLayout
|
||||||
import glm_.vec2.Vec2i
|
|
||||||
|
|
||||||
abstract class HUDElement(protected val hudRenderer: HUDRenderer) {
|
abstract class HUDElement(protected val hudRenderer: HUDRenderer) {
|
||||||
val layout = AbsoluteLayout(hudRenderer.renderWindow)
|
val layout = AbsoluteLayout(hudRenderer.renderWindow)
|
||||||
@ -23,5 +22,4 @@ abstract class HUDElement(protected val hudRenderer: HUDRenderer) {
|
|||||||
open fun init() {}
|
open fun init() {}
|
||||||
open fun postInit() {}
|
open fun postInit() {}
|
||||||
open fun draw() {}
|
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.primitive.ImageNode
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeSizing
|
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.hud.nodes.properties.Spacing
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.abstractions.ScreenResizeCallback
|
||||||
import de.bixilon.minosoft.util.MMath
|
import de.bixilon.minosoft.util.MMath
|
||||||
import glm_.vec2.Vec2i
|
import glm_.vec2.Vec2i
|
||||||
|
|
||||||
class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer) {
|
class ChatBoxHUDElement(hudRenderer: HUDRenderer) : HUDElement(hudRenderer), ScreenResizeCallback {
|
||||||
private lateinit var inputField: SubmittableTextField
|
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)
|
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
|
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.maxSize.x = screenDimensions.x
|
||||||
layout.sizing.validate()
|
layout.sizing.validate()
|
||||||
layout.apply()
|
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.HUDRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeAlignment
|
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.modding.loading.ModLoader
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import de.bixilon.minosoft.util.GitInfo
|
import de.bixilon.minosoft.util.GitInfo
|
||||||
@ -24,7 +25,7 @@ import glm_.vec2.Vec2i
|
|||||||
import org.lwjgl.opengl.GL11.*
|
import org.lwjgl.opengl.GL11.*
|
||||||
|
|
||||||
|
|
||||||
class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer) {
|
class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer), ScreenResizeCallback {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
layout.sizing.forceAlign = NodeAlignment.RIGHT
|
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")
|
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()}"
|
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) {
|
if (buffer.versionId < ProtocolVersions.V_19W11A) {
|
||||||
difficulty = Difficulties.byId(buffer.readUnsignedByte().toInt())
|
difficulty = Difficulties.byId(buffer.readUnsignedByte())
|
||||||
}
|
}
|
||||||
if (buffer.versionId >= ProtocolVersions.V_20W22A) {
|
if (buffer.versionId >= ProtocolVersions.V_20W22A) {
|
||||||
dimension = buffer.connection.mapping.dimensionRegistry.get(buffer.readResourceLocation())!!
|
dimension = buffer.connection.mapping.dimensionRegistry.get(buffer.readResourceLocation())!!
|
||||||
@ -66,7 +66,7 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
|||||||
if (buffer.versionId >= ProtocolVersions.V_19W36A) {
|
if (buffer.versionId >= ProtocolVersions.V_19W36A) {
|
||||||
hashedSeed = buffer.readLong()
|
hashedSeed = buffer.readLong()
|
||||||
}
|
}
|
||||||
gamemode = Gamemodes.byId(buffer.readUnsignedByte().toInt())
|
gamemode = Gamemodes.byId(buffer.readUnsignedByte())
|
||||||
if (buffer.versionId >= ProtocolVersions.V_1_16_PRE6) {
|
if (buffer.versionId >= ProtocolVersions.V_1_16_PRE6) {
|
||||||
buffer.readByte() // previous game mode
|
buffer.readByte() // previous game mode
|
||||||
}
|
}
|
||||||
@ -96,6 +96,6 @@ class PacketRespawn(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun log() {
|
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