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