diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/mesh/Mesh.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/mesh/Mesh.java index b3ab3478..2e647c6b 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/mesh/Mesh.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/mesh/Mesh.java @@ -48,6 +48,8 @@ public class Mesh implements Renderable, Disposable { private final float[] texCoordBuffer; private final int[] indexBuffer; + private boolean dirty; + @Getter private int currentQuadCount = 0; @@ -144,6 +146,8 @@ public class Mesh implements Renderable, Disposable { System.arraycopy(quadIndices, 0, indexBuffer, indexStartIndex, quadIndices.length); currentQuadCount++; + dirty = true; + return quadId; } @@ -154,10 +158,13 @@ public class Mesh implements Renderable, Disposable { var texCoordsIndex = quadId * VERTICES_PER_QUAD * 2; System.arraycopy(textureCoordinates, 0, texCoordBuffer, texCoordsIndex, textureCoordinates.length); + + dirty = true; } public void clear() { currentQuadCount = 0; + dirty = true; } public void removeQuad(int quadId) { @@ -172,6 +179,8 @@ public class Mesh implements Renderable, Disposable { } currentQuadCount--; + + dirty = true; } private void swapQuads(int quad1, int quad2) { @@ -224,39 +233,47 @@ public class Mesh implements Renderable, Disposable { glBindVertexArray(vaoId); - try (var stack = MemoryStack.stackPush()) { - // Vertex buffer - glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(0)); - var vertexFloatBuffer = stack.mallocFloat(currentQuadCount * VERTICES_PER_QUAD * 2); - for (int i = 0; i < currentQuadCount * VERTICES_PER_QUAD * 2; i++) { - vertexFloatBuffer.put(vertexBuffer[i]); - } - vertexFloatBuffer.flip(); - glBufferSubData(GL_ARRAY_BUFFER, 0, vertexFloatBuffer); + var allIndices = currentQuadCount * INDICES_PER_QUAD; - // Texture coordinate buffer - glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(1)); - var texCoordFloatBuffer = stack.mallocFloat(currentQuadCount * VERTICES_PER_QUAD * 2); - for (int i = 0; i < currentQuadCount * VERTICES_PER_QUAD * 2; i++) { - texCoordFloatBuffer.put(texCoordBuffer[i]); - } - texCoordFloatBuffer.flip(); - glBufferSubData(GL_ARRAY_BUFFER, 0, texCoordFloatBuffer); + if (dirty) { + try (var stack = MemoryStack.stackPush()) { + var allVertices = currentQuadCount * VERTICES_PER_QUAD * 2; + + // Vertex buffer + glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(0)); + var vertexFloatBuffer = stack.mallocFloat(allVertices); + for (int i = 0; i < allVertices; i++) { + vertexFloatBuffer.put(vertexBuffer[i]); + } + vertexFloatBuffer.flip(); + glBufferSubData(GL_ARRAY_BUFFER, 0, vertexFloatBuffer); - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds.get(2)); - var indexIntBuffer = stack.mallocInt(currentQuadCount * INDICES_PER_QUAD); - for (int i = 0; i < currentQuadCount * INDICES_PER_QUAD; i++) { - indexIntBuffer.put(indexBuffer[i]); + // Texture coordinate buffer + glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(1)); + var texCoordFloatBuffer = stack.mallocFloat(allVertices); + for (int i = 0; i < allVertices; i++) { + texCoordFloatBuffer.put(texCoordBuffer[i]); + } + texCoordFloatBuffer.flip(); + glBufferSubData(GL_ARRAY_BUFFER, 0, texCoordFloatBuffer); + + // Index buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds.get(2)); + var indexIntBuffer = stack.mallocInt(allIndices); + for (int i = 0; i < allIndices; i++) { + indexIntBuffer.put(indexBuffer[i]); + } + indexIntBuffer.flip(); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexIntBuffer); } - indexIntBuffer.flip(); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexIntBuffer); + + dirty = false; } glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); - glDrawElements(GL_TRIANGLES, currentQuadCount * INDICES_PER_QUAD, GL_UNSIGNED_INT, 0); + glDrawElements(GL_TRIANGLES, allIndices, GL_UNSIGNED_INT, 0); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1);