mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 20:05:02 -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.Drawable
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.framebuffer.defaultf.DefaultFramebuffer
|
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(
|
class FramebufferManager(
|
||||||
private val renderWindow: RenderWindow,
|
private val renderWindow: RenderWindow,
|
||||||
) : Drawable {
|
) : Drawable {
|
||||||
val default = DefaultFramebuffer(renderWindow)
|
val default = DefaultFramebuffer(renderWindow)
|
||||||
|
|
||||||
// val gui = GUIFramebuffer(renderWindow)
|
|
||||||
|
|
||||||
|
|
||||||
fun init() {
|
fun init() {
|
||||||
default.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.Drawable
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
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.gui.rendering.system.base.buffer.frame.Framebuffer
|
||||||
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
||||||
|
|
||||||
@ -16,15 +15,14 @@ class DefaultFramebuffer(
|
|||||||
fun init() {
|
fun init() {
|
||||||
framebuffer.init()
|
framebuffer.init()
|
||||||
shader.load()
|
shader.load()
|
||||||
shader.setInt("uTexture", 0)
|
|
||||||
mesh.load()
|
mesh.load()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun draw() {
|
override fun draw() {
|
||||||
renderWindow.renderSystem.framebuffer = null
|
renderWindow.renderSystem.framebuffer = null
|
||||||
renderWindow.renderSystem.disable(RenderingCapabilities.DEPTH_TEST)
|
|
||||||
framebuffer.bindTexture()
|
framebuffer.bindTexture()
|
||||||
shader.use()
|
shader.use()
|
||||||
|
shader.setInt("uTexture", 0)
|
||||||
mesh.draw()
|
mesh.draw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,10 +10,10 @@ class DefaultFramebufferMesh(renderWindow: RenderWindow) : Mesh(renderWindow, De
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
val vertices = arrayOf(
|
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(0.0f, 1.0f),
|
Vec2(-1.0f, +1.0f) to Vec2(0.0f, 0.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(1.0f, 0.0f),
|
Vec2(+1.0f, -1.0f) to Vec2(1.0f, 1.0f),
|
||||||
)
|
)
|
||||||
for ((positionIndex, textureIndex) in this.order) {
|
for ((positionIndex, textureIndex) in this.order) {
|
||||||
addVertex(vertices[positionIndex].first, vertices[textureIndex].second)
|
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.frame.texture.FramebufferTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.Renderbuffer
|
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.Renderbuffer
|
||||||
|
import glm_.vec2.Vec2i
|
||||||
|
|
||||||
interface Framebuffer {
|
interface Framebuffer {
|
||||||
val state: FramebufferState
|
val state: FramebufferState
|
||||||
@ -13,4 +14,6 @@ interface Framebuffer {
|
|||||||
fun attach(texture: FramebufferTexture)
|
fun attach(texture: FramebufferTexture)
|
||||||
|
|
||||||
fun bindTexture()
|
fun bindTexture()
|
||||||
|
|
||||||
|
fun resize(size: Vec2i)
|
||||||
}
|
}
|
||||||
|
@ -7,4 +7,5 @@ interface FramebufferTexture {
|
|||||||
// ToDo: Mode
|
// ToDo: Mode
|
||||||
|
|
||||||
fun init()
|
fun init()
|
||||||
|
fun unload()
|
||||||
}
|
}
|
||||||
|
@ -7,4 +7,5 @@ interface Renderbuffer {
|
|||||||
val size: Vec2i
|
val size: Vec2i
|
||||||
|
|
||||||
fun init()
|
fun init()
|
||||||
|
fun unload()
|
||||||
}
|
}
|
||||||
|
@ -231,7 +231,7 @@ class OpenGLRenderSystem(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun createFramebuffer(): Framebuffer {
|
override fun createFramebuffer(): Framebuffer {
|
||||||
return OpenGLFramebuffer()
|
return OpenGLFramebuffer(renderWindow.window.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createTextureManager(): TextureManager {
|
override fun createTextureManager(): TextureManager {
|
||||||
|
@ -10,24 +10,27 @@ import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.render.OpenGLRende
|
|||||||
import glm_.vec2.Vec2i
|
import glm_.vec2.Vec2i
|
||||||
import org.lwjgl.opengl.GL30.*
|
import org.lwjgl.opengl.GL30.*
|
||||||
|
|
||||||
class OpenGLFramebuffer : Framebuffer {
|
class OpenGLFramebuffer(var size: Vec2i) : Framebuffer {
|
||||||
override var state: FramebufferState = FramebufferState.PREPARING
|
override var state: FramebufferState = FramebufferState.PREPARING
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private var id = -1
|
private var id = -1
|
||||||
|
|
||||||
private lateinit var texture: OpenGLFramebufferTexture
|
private lateinit var texture: OpenGLFramebufferTexture
|
||||||
|
private lateinit var renderbuffer: OpenGLRenderbuffer
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
check(state == FramebufferState.PREPARING) { "Framebuffer is already (un)loaded!" }
|
check(state != FramebufferState.COMPLETE) { "Framebuffer is complete!" }
|
||||||
id = glGenFramebuffers()
|
id = glGenFramebuffers()
|
||||||
unsafeBind()
|
unsafeBind()
|
||||||
|
|
||||||
texture = OpenGLFramebufferTexture(Vec2i(900, 500)) // ToDo
|
glViewport(0, 0, size.x, size.y)
|
||||||
|
|
||||||
|
texture = OpenGLFramebufferTexture(size)
|
||||||
texture.init()
|
texture.init()
|
||||||
attach(texture)
|
attach(texture)
|
||||||
|
|
||||||
val renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_24_STENCIL_8, Vec2i(900, 500)) // ToDo
|
renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_COMPONENT24, size)
|
||||||
renderbuffer.init()
|
renderbuffer.init()
|
||||||
attach(renderbuffer)
|
attach(renderbuffer)
|
||||||
|
|
||||||
@ -51,7 +54,7 @@ class OpenGLFramebuffer : Framebuffer {
|
|||||||
|
|
||||||
override fun attach(renderbuffer: Renderbuffer) {
|
override fun attach(renderbuffer: Renderbuffer) {
|
||||||
check(renderbuffer is OpenGLRenderbuffer) { "Can not attach non OpenGL 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) {
|
override fun attach(texture: FramebufferTexture) {
|
||||||
@ -62,10 +65,27 @@ class OpenGLFramebuffer : Framebuffer {
|
|||||||
override fun delete() {
|
override fun delete() {
|
||||||
check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" }
|
check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" }
|
||||||
glDeleteFramebuffers(id)
|
glDeleteFramebuffers(id)
|
||||||
|
id = -1
|
||||||
state = FramebufferState.DELETED
|
state = FramebufferState.DELETED
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun bindTexture() {
|
override fun bindTexture() {
|
||||||
|
check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" }
|
||||||
glBindTexture(GL_TEXTURE_2D, texture.id)
|
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() {
|
override fun init() {
|
||||||
id = glGenTextures()
|
id = glGenTextures()
|
||||||
glBindTexture(GL_TEXTURE_2D, id)
|
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_MIN_FILTER, GL_LINEAR)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_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)
|
glBindRenderbuffer(GL_RENDERBUFFER, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun unload() {
|
||||||
|
glDeleteRenderbuffers(id)
|
||||||
|
id = -1
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val RenderbufferModes.gl: Int
|
private val RenderbufferModes.gl: Int
|
||||||
get() {
|
get() {
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
layout (location = 0) in vec2 vinPosition;
|
layout (location = 0) in vec2 vinPosition;
|
||||||
layout (location = 0) in vec2 vinUV;
|
layout (location = 1) in vec2 vinUV;
|
||||||
|
|
||||||
out vec2 finUV;
|
out vec2 finUV;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user