Optimize rendering Mesh

This commit is contained in:
2025-07-18 15:20:26 +02:00
parent 1d1730f97b
commit 4cb710a1b5

View File

@@ -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);