Optimize rendering Mesh
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user