diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/chunk/ChunkBorderRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/chunk/ChunkBorderRenderer.kt
index 233f7dd77..a8105d5ce 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/chunk/ChunkBorderRenderer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/chunk/ChunkBorderRenderer.kt
@@ -38,7 +38,7 @@ class ChunkBorderRenderer(
if (chunkPosition == lastChunkPosition && lastMesh != null) {
return
}
- lastMesh?.unload(false)
+ lastMesh?.unload(true)
val mesh = LineMesh(renderWindow)
val dimension = renderWindow.connection.world.dimension ?: return
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityHitBoxRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityHitBoxRenderer.kt
index ac8f4264d..674e53a13 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityHitBoxRenderer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityHitBoxRenderer.kt
@@ -87,7 +87,7 @@ class EntityHitBoxRenderer(
val mesh = this.meshes.getAndRemove(it.entity) ?: return@of
renderWindow.queue += {
- mesh.unload(false)
+ mesh.unload(true)
}
})
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt
index 432d099e9..2c7cac754 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/hud/HUDRenderer.kt
@@ -179,7 +179,7 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
hudElement.layout.checkCache(elementStart, realScaleFactor, orthographicMatrix, 0)
tempMesh.addCacheMesh(hudElement.layout.cache)
}
- currentHUDMesh.unload(false)
+ currentHUDMesh.unload(true)
tempMesh.load()
currentHUDMesh = tempMesh
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBuffer.kt
index 72478d2e6..e7998e943 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBuffer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBuffer.kt
@@ -1,6 +1,7 @@
package de.bixilon.minosoft.gui.rendering.system.base.buffer
interface RenderBuffer {
+ val state: RenderBufferStates
val type: RenderBufferTypes
fun init()
@@ -9,5 +10,5 @@ interface RenderBuffer {
fun bind()
fun unbind()
- fun unload()
-}
\ No newline at end of file
+ fun unload(ignoreUnloaded: Boolean)
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBufferStates.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBufferStates.kt
new file mode 100644
index 000000000..964141ecd
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/RenderBufferStates.kt
@@ -0,0 +1,21 @@
+/*
+ * Minosoft
+ * Copyright (C) 2021 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.gui.rendering.system.base.buffer
+
+enum class RenderBufferStates {
+ PREPARING,
+ UPLOADED,
+ UNLOADED,
+ ;
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/vertex/PrimitiveTypes.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/vertex/PrimitiveTypes.kt
index 80f1fbc74..c0fcfa98c 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/vertex/PrimitiveTypes.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/buffer/vertex/PrimitiveTypes.kt
@@ -1,9 +1,9 @@
package de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex
-enum class PrimitiveTypes {
- POINT,
- LINE,
- TRIANGLE,
- QUADS,
+enum class PrimitiveTypes(val vertices: Int) {
+ POINT(1),
+ LINE(2),
+ TRIANGLE(4),
+ QUAD(4),
;
-}
\ No newline at end of file
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/FloatOpenGLBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/FloatOpenGLBuffer.kt
index ea3782c3e..413658e3d 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/FloatOpenGLBuffer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/FloatOpenGLBuffer.kt
@@ -2,6 +2,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.buffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.FloatBuffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferDrawTypes
+import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferStates
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferTypes
import org.lwjgl.opengl.GL15.glBufferData
import org.lwjgl.opengl.GL15.glBufferSubData
@@ -18,6 +19,7 @@ open class FloatOpenGLBuffer(protected var _data: FloatArray?) : OpenGLRenderBuf
bind()
glBufferData(type.gl, data, drawTypes.gl)
unbind()
+ state = RenderBufferStates.UPLOADED
}
override fun upload() {
@@ -25,4 +27,4 @@ open class FloatOpenGLBuffer(protected var _data: FloatArray?) : OpenGLRenderBuf
glBufferSubData(type.gl, 0, data)
unbind()
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/OpenGLRenderBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/OpenGLRenderBuffer.kt
index e2dcd1f2b..7262e11cd 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/OpenGLRenderBuffer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/OpenGLRenderBuffer.kt
@@ -2,11 +2,13 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.buffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBuffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferDrawTypes
+import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferStates
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferTypes
import org.lwjgl.opengl.GL15.*
import org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER
abstract class OpenGLRenderBuffer(override val type: RenderBufferTypes) : RenderBuffer {
+ override var state: RenderBufferStates = RenderBufferStates.PREPARING
abstract val drawTypes: RenderBufferDrawTypes
protected var id: Int = -1
@@ -24,8 +26,14 @@ abstract class OpenGLRenderBuffer(override val type: RenderBufferTypes) : Render
glBindBuffer(type.gl, 0)
}
- override fun unload() {
- glDeleteBuffers(id)
+ override fun unload(ignoreUnloaded: Boolean) {
+ if (state != RenderBufferStates.UPLOADED && !ignoreUnloaded) {
+ error("")
+ }
+ if (state != RenderBufferStates.UPLOADED) {
+ state = RenderBufferStates.UNLOADED
+ glDeleteBuffers(id)
+ }
}
@@ -48,4 +56,4 @@ abstract class OpenGLRenderBuffer(override val type: RenderBufferTypes) : Render
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/FloatOpenGLUniformBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/FloatOpenGLUniformBuffer.kt
index eb9720b80..e7c68f4e6 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/FloatOpenGLUniformBuffer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/FloatOpenGLUniformBuffer.kt
@@ -13,6 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.uniform
+import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferStates
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.FloatUniformBuffer
import org.lwjgl.opengl.GL15.glBufferData
import org.lwjgl.opengl.GL15.glBufferSubData
@@ -25,6 +26,7 @@ class FloatOpenGLUniformBuffer(bindingIndex: Int = 0, override var data: FloatAr
bind()
glBufferData(type.gl, data, drawTypes.gl)
unbind()
+ state = RenderBufferStates.UPLOADED
}
override fun upload() {
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/IntOpenGLUniformBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/IntOpenGLUniformBuffer.kt
index cc017dad7..222c16b0d 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/IntOpenGLUniformBuffer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/uniform/IntOpenGLUniformBuffer.kt
@@ -13,6 +13,7 @@
package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.uniform
+import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferStates
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.IntUniformBuffer
import org.lwjgl.opengl.GL15.glBufferData
import org.lwjgl.opengl.GL15.glBufferSubData
@@ -25,6 +26,7 @@ class IntOpenGLUniformBuffer(bindingIndex: Int = 0, override var data: IntArray
bind()
glBufferData(type.gl, data, drawTypes.gl)
unbind()
+ state = RenderBufferStates.UPLOADED
}
override fun upload() {
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt
index 2cbc34d16..a1aa1c581 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/vertex/FloatOpenGLVertexBuffer.kt
@@ -1,5 +1,6 @@
package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.vertex
+import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderBufferStates
import de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex.FloatVertexBuffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex.PrimitiveTypes
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.FloatOpenGLBuffer
@@ -10,6 +11,7 @@ import de.bixilon.minosoft.util.Util
import org.lwjgl.opengl.ARBVertexArrayObject.glBindVertexArray
import org.lwjgl.opengl.ARBVertexArrayObject.glGenVertexArrays
import org.lwjgl.opengl.GL11.*
+import org.lwjgl.opengl.GL15.glBufferData
import org.lwjgl.opengl.GL20.glEnableVertexAttribArray
import org.lwjgl.opengl.GL20.glVertexAttribPointer
import kotlin.reflect.KClass
@@ -22,8 +24,6 @@ class FloatOpenGLVertexBuffer(override val structure: KClass<*>, data: FloatArra
private var vao = -1
override fun init() {
- super.init()
-
Util.forceClassInit(structure.java)
val bytesPerVertex = structure.companionObjectInstance!!.unsafeCast().BYTES_PER_VERTEX
@@ -32,9 +32,12 @@ class FloatOpenGLVertexBuffer(override val structure: KClass<*>, data: FloatArra
vertices = data.size / floatsPerVertex
vao = glGenVertexArrays()
- glBindVertexArray(vao)
super.init()
- super.initialUpload()
+ glBindVertexArray(vao)
+
+ bind()
+ glBufferData(type.gl, data, drawTypes.gl)
+ state = RenderBufferStates.UPLOADED
_data = null
@@ -61,11 +64,11 @@ class FloatOpenGLVertexBuffer(override val structure: KClass<*>, data: FloatArra
get() {
return when (this) {
PrimitiveTypes.POINT -> GL_POINTS
- PrimitiveTypes.LINE -> GL_LINE
+ PrimitiveTypes.LINE -> GL_LINES
PrimitiveTypes.TRIANGLE -> GL_TRIANGLES
- PrimitiveTypes.QUADS -> GL_QUADS
+ PrimitiveTypes.QUAD -> GL_QUADS
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt
index 366994734..eb98257d6 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt
@@ -53,8 +53,13 @@ abstract class Mesh(
buffer.draw()
}
- fun unload(todo: Boolean = false) {
- buffer.unload()
+ fun unload(ignoreUnloaded: Boolean = false) {
+ if (!this::buffer.isInitialized && !ignoreUnloaded) {
+ error("")
+ }
+ if (this::buffer.isInitialized) {
+ buffer.unload(ignoreUnloaded)
+ }
}
fun addQuad(start: Vec3, end: Vec3, textureStart: Vec2 = Vec2(0.0f, 0.0f), textureEnd: Vec2 = Vec2(1.0f, 1.0f), vertexConsumer: (position: Vec3, textureCoordinate: Vec2) -> Unit) {