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) {