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 float[] texCoordBuffer;
private final int[] indexBuffer; private final int[] indexBuffer;
private boolean dirty;
@Getter @Getter
private int currentQuadCount = 0; private int currentQuadCount = 0;
@@ -144,6 +146,8 @@ public class Mesh implements Renderable, Disposable {
System.arraycopy(quadIndices, 0, indexBuffer, indexStartIndex, quadIndices.length); System.arraycopy(quadIndices, 0, indexBuffer, indexStartIndex, quadIndices.length);
currentQuadCount++; currentQuadCount++;
dirty = true;
return quadId; return quadId;
} }
@@ -154,10 +158,13 @@ public class Mesh implements Renderable, Disposable {
var texCoordsIndex = quadId * VERTICES_PER_QUAD * 2; var texCoordsIndex = quadId * VERTICES_PER_QUAD * 2;
System.arraycopy(textureCoordinates, 0, texCoordBuffer, texCoordsIndex, textureCoordinates.length); System.arraycopy(textureCoordinates, 0, texCoordBuffer, texCoordsIndex, textureCoordinates.length);
dirty = true;
} }
public void clear() { public void clear() {
currentQuadCount = 0; currentQuadCount = 0;
dirty = true;
} }
public void removeQuad(int quadId) { public void removeQuad(int quadId) {
@@ -172,6 +179,8 @@ public class Mesh implements Renderable, Disposable {
} }
currentQuadCount--; currentQuadCount--;
dirty = true;
} }
private void swapQuads(int quad1, int quad2) { private void swapQuads(int quad1, int quad2) {
@@ -224,39 +233,47 @@ public class Mesh implements Renderable, Disposable {
glBindVertexArray(vaoId); glBindVertexArray(vaoId);
try (var stack = MemoryStack.stackPush()) { var allIndices = currentQuadCount * INDICES_PER_QUAD;
// 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);
// Texture coordinate buffer if (dirty) {
glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(1)); try (var stack = MemoryStack.stackPush()) {
var texCoordFloatBuffer = stack.mallocFloat(currentQuadCount * VERTICES_PER_QUAD * 2); var allVertices = currentQuadCount * VERTICES_PER_QUAD * 2;
for (int i = 0; i < currentQuadCount * VERTICES_PER_QUAD * 2; i++) {
texCoordFloatBuffer.put(texCoordBuffer[i]); // Vertex buffer
} glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(0));
texCoordFloatBuffer.flip(); var vertexFloatBuffer = stack.mallocFloat(allVertices);
glBufferSubData(GL_ARRAY_BUFFER, 0, texCoordFloatBuffer); for (int i = 0; i < allVertices; i++) {
vertexFloatBuffer.put(vertexBuffer[i]);
}
vertexFloatBuffer.flip();
glBufferSubData(GL_ARRAY_BUFFER, 0, vertexFloatBuffer);
// Index buffer // Texture coordinate buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds.get(2)); glBindBuffer(GL_ARRAY_BUFFER, vboIds.get(1));
var indexIntBuffer = stack.mallocInt(currentQuadCount * INDICES_PER_QUAD); var texCoordFloatBuffer = stack.mallocFloat(allVertices);
for (int i = 0; i < currentQuadCount * INDICES_PER_QUAD; i++) { for (int i = 0; i < allVertices; i++) {
indexIntBuffer.put(indexBuffer[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(0);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glDrawElements(GL_TRIANGLES, currentQuadCount * INDICES_PER_QUAD, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, allIndices, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0); glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1); glDisableVertexAttribArray(1);