mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 03:44:54 -04:00
ton of framebuffer changes and fixes
This commit is contained in:
parent
cba569f6a6
commit
13ce836539
@ -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<ResizeWindowEvent> {
|
||||
default.framebuffer.resize(it.size)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -7,4 +7,5 @@ interface FramebufferTexture {
|
||||
// ToDo: Mode
|
||||
|
||||
fun init()
|
||||
fun unload()
|
||||
}
|
||||
|
@ -7,4 +7,5 @@ interface Renderbuffer {
|
||||
val size: Vec2i
|
||||
|
||||
fun init()
|
||||
fun unload()
|
||||
}
|
||||
|
@ -231,7 +231,7 @@ class OpenGLRenderSystem(
|
||||
}
|
||||
|
||||
override fun createFramebuffer(): Framebuffer {
|
||||
return OpenGLFramebuffer()
|
||||
return OpenGLFramebuffer(renderWindow.window.size)
|
||||
}
|
||||
|
||||
override fun createTextureManager(): TextureManager {
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user