mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-13 01:16:46 -04:00
opengl: abstract vao
Thought I am smarter than opengl, but it totally wasn't good. Keeping the abstraction though
This commit is contained in:
parent
e7daeed5ae
commit
14ee590e98
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2020-2022 Moritz Zwerger
|
* Copyright (C) 2020-2023 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 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.
|
||||||
*
|
*
|
||||||
@ -21,7 +21,7 @@ import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
|||||||
import java.nio.FloatBuffer
|
import java.nio.FloatBuffer
|
||||||
|
|
||||||
class DummyVertexBuffer(
|
class DummyVertexBuffer(
|
||||||
override val structure: MeshStruct,
|
override val struct: MeshStruct,
|
||||||
override var buffer: FloatBuffer,
|
override var buffer: FloatBuffer,
|
||||||
override val type: RenderableBufferTypes = RenderableBufferTypes.ARRAY_BUFFER,
|
override val type: RenderableBufferTypes = RenderableBufferTypes.ARRAY_BUFFER,
|
||||||
) : FloatVertexBuffer {
|
) : FloatVertexBuffer {
|
||||||
|
@ -26,7 +26,6 @@ object RegistriesLoader {
|
|||||||
|
|
||||||
registries.setDefaultParents(version)
|
registries.setDefaultParents(version)
|
||||||
|
|
||||||
|
|
||||||
return registries
|
return registries
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* Minosoft
|
||||||
* Copyright (C) 2021 Moritz Zwerger
|
* Copyright (C) 2020-2023 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 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.
|
||||||
*
|
*
|
||||||
@ -18,7 +18,7 @@ import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
|||||||
interface VertexBuffer {
|
interface VertexBuffer {
|
||||||
val vertices: Int
|
val vertices: Int
|
||||||
val primitiveType: PrimitiveTypes
|
val primitiveType: PrimitiveTypes
|
||||||
val structure: MeshStruct
|
val struct: MeshStruct
|
||||||
|
|
||||||
fun draw()
|
fun draw()
|
||||||
}
|
}
|
||||||
|
@ -21,39 +21,29 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex.PrimitiveType
|
|||||||
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
|
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
|
||||||
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.FloatOpenGLBuffer
|
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.FloatOpenGLBuffer
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
||||||
import org.lwjgl.opengl.GL20.glEnableVertexAttribArray
|
|
||||||
import org.lwjgl.opengl.GL20.glVertexAttribPointer
|
|
||||||
import org.lwjgl.opengl.GL30.*
|
import org.lwjgl.opengl.GL30.*
|
||||||
import java.nio.FloatBuffer
|
import java.nio.FloatBuffer
|
||||||
|
|
||||||
class FloatOpenGLVertexBuffer(
|
class FloatOpenGLVertexBuffer(
|
||||||
renderSystem: OpenGLRenderSystem,
|
renderSystem: OpenGLRenderSystem,
|
||||||
override val structure: MeshStruct,
|
override val struct: MeshStruct,
|
||||||
data: FloatBuffer,
|
data: FloatBuffer,
|
||||||
override val primitiveType: PrimitiveTypes,
|
override val primitiveType: PrimitiveTypes,
|
||||||
) : FloatOpenGLBuffer(renderSystem, data), FloatVertexBuffer {
|
) : FloatOpenGLBuffer(renderSystem, data), FloatVertexBuffer {
|
||||||
|
private val vao = OpenGLVAO(renderSystem, struct)
|
||||||
override var vertices = -1
|
override var vertices = -1
|
||||||
private set
|
private set
|
||||||
private var vao = -1
|
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
val floatsPerVertex = structure.BYTES_PER_VERTEX / Float.SIZE_BYTES
|
val floatsPerVertex = struct.BYTES_PER_VERTEX / Float.SIZE_BYTES
|
||||||
|
|
||||||
vertices = buffer.position() / floatsPerVertex
|
vertices = buffer.position() / floatsPerVertex
|
||||||
vao = glGenVertexArrays()
|
|
||||||
super.init()
|
super.init()
|
||||||
glBindVertexArray(vao)
|
|
||||||
|
|
||||||
super.initialUpload()
|
|
||||||
bind()
|
bind()
|
||||||
|
super.initialUpload()
|
||||||
_data = null
|
_data = null
|
||||||
|
|
||||||
|
vao.init()
|
||||||
for (attribute in structure.attributes) {
|
|
||||||
glVertexAttribPointer(attribute.index, attribute.size, GL_FLOAT, false, structure.BYTES_PER_VERTEX, attribute.stride)
|
|
||||||
glEnableVertexAttribArray(attribute.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
unbind()
|
unbind()
|
||||||
}
|
}
|
||||||
@ -63,16 +53,12 @@ class FloatOpenGLVertexBuffer(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
super.unbind()
|
super.unbind()
|
||||||
glBindVertexArray(0)
|
vao.unbind()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun bindVao() {
|
fun bindVao() {
|
||||||
super.bind()
|
super.bind()
|
||||||
if (renderSystem.boundVao == vao) {
|
vao.bind()
|
||||||
return
|
|
||||||
}
|
|
||||||
glBindVertexArray(vao)
|
|
||||||
renderSystem.boundVao = vao
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun draw() {
|
override fun draw() {
|
||||||
@ -82,13 +68,7 @@ class FloatOpenGLVertexBuffer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun unload() {
|
override fun unload() {
|
||||||
if (state == RenderableBufferStates.UPLOADED) {
|
vao.unload()
|
||||||
glDeleteVertexArrays(vao)
|
|
||||||
if (renderSystem.boundVao == vao) {
|
|
||||||
renderSystem.boundVao = -1
|
|
||||||
}
|
|
||||||
vao = -1
|
|
||||||
}
|
|
||||||
super.unload()
|
super.unload()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,5 +83,4 @@ class FloatOpenGLVertexBuffer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2023 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.system.opengl.buffer.vertex
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
|
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
||||||
|
import org.lwjgl.opengl.GL20.glEnableVertexAttribArray
|
||||||
|
import org.lwjgl.opengl.GL20.glVertexAttribPointer
|
||||||
|
import org.lwjgl.opengl.GL30.*
|
||||||
|
|
||||||
|
class OpenGLVAO(
|
||||||
|
val system: OpenGLRenderSystem,
|
||||||
|
val struct: MeshStruct
|
||||||
|
) {
|
||||||
|
private var handle = -1
|
||||||
|
|
||||||
|
fun init() {
|
||||||
|
if (handle >= 0) throw IllegalArgumentException("VAO already loaded!")
|
||||||
|
handle = glGenVertexArrays()
|
||||||
|
bind()
|
||||||
|
|
||||||
|
for (attribute in struct.attributes) {
|
||||||
|
glVertexAttribPointer(attribute.index, attribute.size, GL_FLOAT, false, struct.BYTES_PER_VERTEX, attribute.stride)
|
||||||
|
glEnableVertexAttribArray(attribute.index)
|
||||||
|
}
|
||||||
|
unbind()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bind() {
|
||||||
|
if (handle < 0) throw IllegalArgumentException("VAO not initialized!")
|
||||||
|
if (system.boundVao == handle) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
glBindVertexArray(handle)
|
||||||
|
system.boundVao = handle
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unbind() {
|
||||||
|
if (RenderConstants.DIRTY_BUFFER_UNBIND) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (handle < 0) throw IllegalArgumentException("VAO not initialized!")
|
||||||
|
glBindVertexArray(-1)
|
||||||
|
system.boundVao = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unload() {
|
||||||
|
if (handle < 0) throw IllegalArgumentException("VAO not initialized!")
|
||||||
|
glDeleteVertexArrays(handle)
|
||||||
|
if (system.boundVao == handle) {
|
||||||
|
system.boundVao = -1
|
||||||
|
}
|
||||||
|
handle = -1
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user