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 6a8c47040..2f4921192 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 @@ -3,18 +3,21 @@ package de.bixilon.minosoft.gui.rendering.framebuffer import de.bixilon.minosoft.gui.rendering.Drawable import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.framebuffer.defaultf.DefaultFramebuffer +import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent +import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker class FramebufferManager( private val renderWindow: RenderWindow, ) : Drawable { val default = DefaultFramebuffer(renderWindow) - // val gui = GUIFramebuffer(renderWindow) - fun init() { default.init() - // gui = renderWindow.renderSystem.createFramebuffer(2) + + renderWindow.connection.registerEvent(CallbackEventInvoker.of { + default.framebuffer.resize(it.size) + }) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebuffer.kt index b86bd9d77..81c89daea 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebuffer.kt @@ -2,7 +2,6 @@ package de.bixilon.minosoft.gui.rendering.framebuffer.defaultf import de.bixilon.minosoft.gui.rendering.Drawable import de.bixilon.minosoft.gui.rendering.RenderWindow -import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer import de.bixilon.minosoft.util.KUtil.toResourceLocation @@ -16,15 +15,14 @@ class DefaultFramebuffer( fun init() { framebuffer.init() shader.load() - shader.setInt("uTexture", 0) mesh.load() } override fun draw() { renderWindow.renderSystem.framebuffer = null - renderWindow.renderSystem.disable(RenderingCapabilities.DEPTH_TEST) framebuffer.bindTexture() shader.use() + shader.setInt("uTexture", 0) mesh.draw() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebufferMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebufferMesh.kt index 3f85b8dfb..a01dadb7a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebufferMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/defaultf/DefaultFramebufferMesh.kt @@ -10,10 +10,10 @@ class DefaultFramebufferMesh(renderWindow: RenderWindow) : Mesh(renderWindow, De init { val vertices = arrayOf( - Vec2(-1.0f, -1.0f) to Vec2(0.0f, 0.0f), - Vec2(-1.0f, +1.0f) to Vec2(0.0f, 1.0f), - Vec2(+1.0f, +1.0f) to Vec2(1.0f, 1.0f), - Vec2(+1.0f, -1.0f) to Vec2(1.0f, 0.0f), + Vec2(-1.0f, -1.0f) to Vec2(0.0f, 1.0f), + Vec2(-1.0f, +1.0f) to Vec2(0.0f, 0.0f), + Vec2(+1.0f, +1.0f) to Vec2(1.0f, 0.0f), + Vec2(+1.0f, -1.0f) to Vec2(1.0f, 1.0f), ) for ((positionIndex, textureIndex) in this.order) { addVertex(vertices[positionIndex].first, vertices[textureIndex].second) 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 fa639fb2b..8b1fe65f0 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 @@ -2,6 +2,7 @@ package de.bixilon.minosoft.gui.rendering.system.base.buffer.frame import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.texture.FramebufferTexture import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.Renderbuffer +import glm_.vec2.Vec2i interface Framebuffer { val state: FramebufferState @@ -13,4 +14,6 @@ interface Framebuffer { fun attach(texture: FramebufferTexture) fun bindTexture() + + fun resize(size: Vec2i) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/texture/FramebufferTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/texture/FramebufferTexture.kt index 780d476b7..65bc59f49 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/texture/FramebufferTexture.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/frame/texture/FramebufferTexture.kt @@ -7,4 +7,5 @@ interface FramebufferTexture { // ToDo: Mode fun init() + fun unload() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/render/Renderbuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/render/Renderbuffer.kt index cbfe2687c..ebe0c3b99 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/render/Renderbuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/render/Renderbuffer.kt @@ -7,4 +7,5 @@ interface Renderbuffer { val size: Vec2i fun init() + fun unload() } 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 ac6a62575..e66981043 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 @@ -231,7 +231,7 @@ class OpenGLRenderSystem( } override fun createFramebuffer(): Framebuffer { - return OpenGLFramebuffer() + return OpenGLFramebuffer(renderWindow.window.size) } override fun createTextureManager(): TextureManager { 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 0bb97a0d0..26cc60730 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 @@ -10,24 +10,27 @@ import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.render.OpenGLRende import glm_.vec2.Vec2i import org.lwjgl.opengl.GL30.* -class OpenGLFramebuffer : Framebuffer { +class OpenGLFramebuffer(var size: Vec2i) : Framebuffer { override var state: FramebufferState = FramebufferState.PREPARING private set private var id = -1 private lateinit var texture: OpenGLFramebufferTexture + private lateinit var renderbuffer: OpenGLRenderbuffer override fun init() { - check(state == FramebufferState.PREPARING) { "Framebuffer is already (un)loaded!" } + check(state != FramebufferState.COMPLETE) { "Framebuffer is complete!" } id = glGenFramebuffers() unsafeBind() - texture = OpenGLFramebufferTexture(Vec2i(900, 500)) // ToDo + glViewport(0, 0, size.x, size.y) + + texture = OpenGLFramebufferTexture(size) texture.init() attach(texture) - val renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_24_STENCIL_8, Vec2i(900, 500)) // ToDo + renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_COMPONENT24, size) renderbuffer.init() attach(renderbuffer) @@ -51,7 +54,7 @@ class OpenGLFramebuffer : Framebuffer { override fun attach(renderbuffer: Renderbuffer) { check(renderbuffer is OpenGLRenderbuffer) { "Can not attach non OpenGL renderbuffer!" } - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffer.id) + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer.id) } override fun attach(texture: FramebufferTexture) { @@ -62,10 +65,27 @@ class OpenGLFramebuffer : Framebuffer { override fun delete() { check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" } glDeleteFramebuffers(id) + id = -1 state = FramebufferState.DELETED } override fun bindTexture() { + check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" } glBindTexture(GL_TEXTURE_2D, texture.id) } + + override fun resize(size: Vec2i) { + if (size == this.size) { + return + } + if (this::texture.isInitialized) { + texture.unload() + } + if (this::renderbuffer.isInitialized) { + renderbuffer.unload() + } + this.size = size + delete() + init() + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/texture/OpenGLFramebufferTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/texture/OpenGLFramebufferTexture.kt index a0f9a94cb..989c53a3d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/texture/OpenGLFramebufferTexture.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/texture/OpenGLFramebufferTexture.kt @@ -14,8 +14,14 @@ class OpenGLFramebufferTexture( override fun init() { id = glGenTextures() glBindTexture(GL_TEXTURE_2D, id) - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, null as ByteBuffer?) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, null as ByteBuffer?) + //glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT24, size.x, size.y, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) } + + override fun unload() { + glDeleteTextures(id) + id = -1 + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/render/OpenGLRenderbuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/render/OpenGLRenderbuffer.kt index 3c1b80432..e5d808758 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/render/OpenGLRenderbuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/render/OpenGLRenderbuffer.kt @@ -22,6 +22,11 @@ class OpenGLRenderbuffer( glBindRenderbuffer(GL_RENDERBUFFER, id) } + override fun unload() { + glDeleteRenderbuffers(id) + id = -1 + } + companion object { private val RenderbufferModes.gl: Int get() { diff --git a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.vsh b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.vsh index 9f2e9f801..45f23f2f5 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.vsh @@ -14,7 +14,7 @@ #version 330 core layout (location = 0) in vec2 vinPosition; -layout (location = 0) in vec2 vinUV; +layout (location = 1) in vec2 vinUV; out vec2 finUV;