diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/buffer/DummyFramebuffer.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/buffer/DummyFramebuffer.kt index 85fb7f26d..e128ab2dc 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/buffer/DummyFramebuffer.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/system/dummy/buffer/DummyFramebuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -37,6 +37,6 @@ class DummyFramebuffer : Framebuffer { override fun bindTexture() { } - override fun resize(size: Vec2i) { + override fun resize(size: Vec2i, scale: Float) { } } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfile.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfile.kt index 106a4e395..796d81786 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfile.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfile.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -26,6 +26,7 @@ import de.bixilon.minosoft.config.profile.profiles.rendering.light.LightC import de.bixilon.minosoft.config.profile.profiles.rendering.movement.MovementC import de.bixilon.minosoft.config.profile.profiles.rendering.overlay.OverlayC import de.bixilon.minosoft.config.profile.profiles.rendering.performance.PerformanceC +import de.bixilon.minosoft.config.profile.profiles.rendering.quality.QualityC import de.bixilon.minosoft.config.profile.profiles.rendering.sky.SkyC import de.bixilon.minosoft.config.profile.profiles.rendering.textures.TexturesC import de.bixilon.minosoft.config.profile.storage.ProfileStorage @@ -53,6 +54,7 @@ class RenderingProfile( val overlay = OverlayC(this) val sky = SkyC(this) val textures = TexturesC(this) + val quality = QualityC(this) override fun toString(): String { diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/quality/QualityC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/quality/QualityC.kt new file mode 100644 index 000000000..61d280a91 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/quality/QualityC.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2020-2024 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.config.profile.profiles.rendering.quality + +import de.bixilon.minosoft.config.profile.profiles.rendering.RenderingProfile +import de.bixilon.minosoft.config.profile.profiles.rendering.quality.resolution.ResolutionC + +class QualityC(profile: RenderingProfile) { + val resolution = ResolutionC(profile) +} diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/quality/resolution/ResolutionC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/quality/resolution/ResolutionC.kt new file mode 100644 index 000000000..e24c90ab6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/quality/resolution/ResolutionC.kt @@ -0,0 +1,34 @@ +/* + * Minosoft + * Copyright (C) 2020-2024 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.config.profile.profiles.rendering.quality.resolution + +import de.bixilon.minosoft.config.profile.delegate.primitive.FloatDelegate +import de.bixilon.minosoft.config.profile.profiles.rendering.RenderingProfile + +class ResolutionC(profile: RenderingProfile) { + + /** + * Scale of the gui (and hud) framebuffer. If you change this, the font will look weird and maybe blurry. Do not change this. + */ + var guiScale by FloatDelegate(profile, 1.0f, ranges = arrayOf(0.0001f..4.0f)) + + /** + * Scale of the world (blocks, entities, particles, ...) framebuffer. + * If you lower this, the framebuffer will be smaller and thus performance should go up. + * This is only useful when your gpu is bottlenecked by the number of pixels/texels + * (e.g. if you make the window smaller, your fps go up) + * Otherwise do not change this, this will not reduce cpu load or gpu load of other stages. + */ + var worldScale by FloatDelegate(profile, 1.0f, ranges = arrayOf(0.0001f..4.0f)) +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt index 2db9953da..c14ca23d3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -33,8 +33,8 @@ class FramebufferManager( gui.init() context.connection.events.listen { - world.framebuffer.resize(it.size) - gui.framebuffer.resize(it.size) + world.resize(it.size) + gui.resize(it.size) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt index 67fde704a..3d283142f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -13,6 +13,7 @@ package de.bixilon.minosoft.gui.rendering.framebuffer +import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions @@ -54,4 +55,9 @@ interface IntegratedFramebuffer : Drawable { shader.use() mesh.draw() } + + fun resize(size: Vec2i) = resize(size, 1.0f) + fun resize(size: Vec2i, scale: Float) { + framebuffer.resize(size, scale) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/gui/GUIFramebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/gui/GUIFramebuffer.kt index d1f4a8c6e..e821ba60e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/gui/GUIFramebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/gui/GUIFramebuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -13,6 +13,8 @@ package de.bixilon.minosoft.gui.rendering.framebuffer.gui +import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.framebuffer.FramebufferMesh import de.bixilon.minosoft.gui.rendering.framebuffer.FramebufferShader @@ -28,4 +30,15 @@ class GUIFramebuffer( override val framebuffer: Framebuffer = context.system.createFramebuffer(color = true, depth = false) override val mesh = FramebufferMesh(context) override var polygonMode: PolygonModes = PolygonModes.DEFAULT + + private var scale = 1.0f + + override fun init() { + super.init() + context.connection.profiles.rendering.quality.resolution::guiScale.observe(this, instant = true) { this.scale = it } + } + + override fun resize(size: Vec2i) { + super.resize(size, this.scale) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/WorldFramebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/WorldFramebuffer.kt index 9a947a973..84fe69e7f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/WorldFramebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/WorldFramebuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -13,6 +13,8 @@ package de.bixilon.minosoft.gui.rendering.framebuffer.world +import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.framebuffer.FramebufferMesh import de.bixilon.minosoft.gui.rendering.framebuffer.FramebufferShader @@ -35,6 +37,8 @@ class WorldFramebuffer( override val mesh = FramebufferMesh(context) override var polygonMode: PolygonModes = PolygonModes.DEFAULT + private var scale = 1.0f + override fun init() { framebuffer.init() defaultShader.load() @@ -43,6 +47,7 @@ class WorldFramebuffer( mesh.load() overlay.init() + context.connection.profiles.rendering.quality.resolution::worldScale.observe(this, instant = true) { this.scale = it } } override fun postInit() { @@ -56,4 +61,8 @@ class WorldFramebuffer( super.draw() overlay.draw() } + + override fun resize(size: Vec2i) { + super.resize(size, this.scale) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt index 546b01150..5b9f83ae4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -142,7 +142,7 @@ interface RenderSystem { fun createIntUniformBuffer(data: IntArray = IntArray(0)): IntUniformBuffer fun createFloatUniformBuffer(data: FloatBuffer): FloatUniformBuffer - fun createFramebuffer(color: Boolean, depth: Boolean): Framebuffer + fun createFramebuffer(color: Boolean, depth: Boolean, scale: Float = 1.0f): Framebuffer fun createTextureManager(): TextureManager diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/Framebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/Framebuffer.kt index 779369d14..b32ad6bb8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/Framebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/Framebuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -28,5 +28,5 @@ interface Framebuffer { fun bindTexture() - fun resize(size: Vec2i) + fun resize(size: Vec2i, scale: Float = 1.0f) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt index b53c91a58..74588c35d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt @@ -98,6 +98,7 @@ class OpenGLRenderSystem( } if (value == null) { glBindFramebuffer(GL_FRAMEBUFFER, 0) + viewport = context.window.size } else { check(value is OpenGLFramebuffer) { "Can not use non OpenGL framebuffer!" } value.bind() @@ -238,7 +239,7 @@ class OpenGLRenderSystem( override fun readPixels(start: Vec2i, end: Vec2i): TextureBuffer { val size = Vec2i(end.x - start.x, end.y - start.y) val buffer = RGB8Buffer(size) - glReadPixels(start.x, start.y, end.x, end.y, GL_RGB8, GL_UNSIGNED_BYTE, buffer.data) + glReadPixels(start.x, start.y, end.x, end.y, GL_RGB8, GL_UNSIGNED_BYTE, buffer.data) // TODO: This is somehow through a GL_INVALID_ENUM error return buffer } @@ -258,8 +259,8 @@ class OpenGLRenderSystem( return IntOpenGLUniformBuffer(this, uniformBufferBindingIndex++, data) } - override fun createFramebuffer(color: Boolean, depth: Boolean): OpenGLFramebuffer { - return OpenGLFramebuffer(this, context.window.size, color, depth) + override fun createFramebuffer(color: Boolean, depth: Boolean, scale: Float): OpenGLFramebuffer { + return OpenGLFramebuffer(this, context.window.size, scale, color, depth) } override fun createTextureManager(): OpenGLTextureManager { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/OpenGLFramebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/OpenGLFramebuffer.kt index fb0de7160..5f707d21b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/OpenGLFramebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/OpenGLFramebuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -29,9 +29,11 @@ import org.lwjgl.opengl.GL30.* class OpenGLFramebuffer( val system: OpenGLRenderSystem, var size: Vec2i, + var scale: Float, val color: Boolean, val depth: Boolean, ) : Framebuffer { + private var scaled = size override var state: FramebufferState = FramebufferState.PREPARING private set @@ -43,21 +45,23 @@ class OpenGLFramebuffer( override fun init() { check(state != FramebufferState.COMPLETE) { "Framebuffer is complete!" } + if (scale <= 0.0f) throw IllegalArgumentException("Invalid scale: $scale") + if (size.x <= 0 || size.y <= 0) throw IllegalArgumentException("Invalid framebuffer size: $size") system.log { "Generated framebuffer buffer $this" } id = glGenFramebuffers() unsafeBind() - glViewport(0, 0, size.x, size.y) + this.scaled = if (scale == 1.0f) size else Vec2i(size.x * scale, size.y * scale) if (color) { - val colorTexture = OpenGLFramebufferColorTexture(size) + val colorTexture = OpenGLFramebufferColorTexture(scaled) this.colorTexture = colorTexture colorTexture.init() attach(colorTexture) } if (depth) { - val depth = OpenGLRenderbuffer(system, RenderbufferModes.DEPTH_COMPONENT24, size) + val depth = OpenGLRenderbuffer(system, RenderbufferModes.DEPTH_COMPONENT24, scaled) this.depthBuffer = depth depth.init() attach(depth) @@ -75,6 +79,7 @@ class OpenGLFramebuffer( fun bind() { check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete: $state" } unsafeBind() + system.viewport = scaled } private fun unsafeBind() { @@ -108,12 +113,14 @@ class OpenGLFramebuffer( depthTexture?.bind(1) } - override fun resize(size: Vec2i) { - if (size == this.size) { + override fun resize(size: Vec2i, scale: Float) { + if (size.x <= 0 || size.y <= 0) throw IllegalArgumentException("Invalid framebuffer size: $size") + if (size == this.size && this.scale == scale) { return } colorTexture?.unload() depthBuffer?.unload() + this.scale = scale this.size = size delete() init() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt index 9c63fad3f..bdc2d0c49 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/glfw/GLFWWindow.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 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. * @@ -190,6 +190,7 @@ class GLFWWindow( setOpenGLVersion(3, 3, true) } glfwWindowHint(GLFW_VISIBLE, false.glfw) + glfwWindowHint(GLFW_ALPHA_BITS, 0) glfwWindowHint(GLFW_DEPTH_BITS, 0) glfwWindowHint(GLFW_STENCIL_BITS, 0) diff --git a/src/main/java/de/bixilon/minosoft/protocol/PlayerPublicKey.kt b/src/main/java/de/bixilon/minosoft/protocol/PlayerPublicKey.kt index cdb85b87f..4dbd8f7c2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/PlayerPublicKey.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/PlayerPublicKey.kt @@ -36,13 +36,11 @@ class PlayerPublicKey( constructor(nbt: JsonObject) : this(Instant.ofEpochMilli(nbt["expires_at"].toLong()), CryptManager.getPlayerPublicKey(nbt["key"].toString()), nbt["signature"].toString().fromBase64()) - fun toNbt(): JsonObject { - return mapOf( - "expires_at" to expiresAt.epochSecond, - "key" to publicKey.encoded.toBase64(), - "signature" to signature.toBase64(), - ) - } + fun toNbt() = mapOf( + "expires_at" to expiresAt.epochSecond, + "key" to publicKey.encoded.toBase64(), + "signature" to signature.toBase64(), + ) fun isExpired(): Boolean { return expiresAt.isAfter(Instant.now())