diff --git a/engine-tests/src/test/java/org/terasology/engine/rendering/assets/mesh/IndexResourceTest.java b/engine-tests/src/test/java/org/terasology/engine/rendering/assets/mesh/IndexResourceTest.java new file mode 100644 index 00000000000..4c8b3d8a517 --- /dev/null +++ b/engine-tests/src/test/java/org/terasology/engine/rendering/assets/mesh/IndexResourceTest.java @@ -0,0 +1,87 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.engine.rendering.assets.mesh; + +import org.junit.jupiter.api.Test; +import org.terasology.engine.rendering.assets.mesh.resource.IndexResource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class IndexResourceTest { + @Test + public void testPutIndexResource() { + IndexResource in = new IndexResource(); + in.put(10); + in.put(11); + in.put(15); + + assertEquals(3, in.indices()); + in.writeBuffer(buffer -> { + assertEquals(3 * Integer.BYTES, buffer.limit()); + + assertEquals(10, buffer.getInt(0)); + assertEquals(11, buffer.getInt(1 * Integer.BYTES)); + assertEquals(15, buffer.getInt(2 * Integer.BYTES)); + }); + } + + @Test + public void testRewind() { + IndexResource in = new IndexResource(); + in.put(10); + in.put(11); + in.put(15); + + assertEquals(3, in.indices()); + in.writeBuffer(buffer -> { + assertEquals(3 * Integer.BYTES, buffer.limit()); + + assertEquals(10, buffer.getInt(0)); + assertEquals(11, buffer.getInt(1 * Integer.BYTES)); + assertEquals(15, buffer.getInt(2 * Integer.BYTES)); + }); + + in.rewind(); + in.put(20); + assertEquals(3, in.indices()); + in.writeBuffer(buffer -> { + assertEquals(3 * Integer.BYTES, buffer.limit()); + + assertEquals(20, buffer.getInt(0)); + assertEquals(11, buffer.getInt(1 * Integer.BYTES)); + assertEquals(15, buffer.getInt(2 * Integer.BYTES)); + }); + + } + + @Test + public void testAllocate() { + + IndexResource in = new IndexResource(); + in.allocateElements(20); // re-allocate to 20 indices + + in.put(100); + in.put(14); + in.put(10); + + assertEquals(20, in.indices()); + in.writeBuffer(buffer -> { + assertEquals(20 * Integer.BYTES, buffer.limit()); + + assertEquals(100, buffer.getInt(0)); + assertEquals(14, buffer.getInt(1 * Integer.BYTES)); + assertEquals(10, buffer.getInt(2 * Integer.BYTES)); + }); + + in.allocateElements(4); // re-allocate to 4 indices + assertEquals(4, in.indices()); + in.writeBuffer(buffer -> { + assertEquals(4 * Integer.BYTES, buffer.limit()); + + assertEquals(100, buffer.getInt(0)); + assertEquals(14, buffer.getInt(1 * Integer.BYTES)); + assertEquals(10, buffer.getInt(2 * Integer.BYTES)); + }); + } +} diff --git a/engine/src/main/java/org/terasology/engine/rendering/assets/mesh/resource/IndexResource.java b/engine/src/main/java/org/terasology/engine/rendering/assets/mesh/resource/IndexResource.java index 375a91ec714..bb03f8da782 100644 --- a/engine/src/main/java/org/terasology/engine/rendering/assets/mesh/resource/IndexResource.java +++ b/engine/src/main/java/org/terasology/engine/rendering/assets/mesh/resource/IndexResource.java @@ -13,7 +13,6 @@ */ public class IndexResource extends BufferedResource { public static final Logger logger = LoggerFactory.getLogger(IndexResource.class); - private int inIndices = 0; private int posIndex = 0; public IndexResource() { @@ -21,13 +20,12 @@ public IndexResource() { } public int indices() { - return inIndices; + return this.inSize / Integer.BYTES; } public void copy(IndexResource resource) { copyBuffer(resource); this.inSize = resource.inSize; - this.inIndices = resource.indices(); } public void reserveElements(int elements) { @@ -36,16 +34,12 @@ public void reserveElements(int elements) { public void rewind() { posIndex = 0; - inIndices = 0; } public void put(int value) { ensureCapacity((posIndex + 1) * Integer.BYTES); buffer.putInt(posIndex * Integer.BYTES, value); posIndex++; - if (posIndex > inIndices) { - inIndices = posIndex; - } } public void putAll(int value, int... values) { @@ -77,10 +71,6 @@ public void put(int index, int value) { @Override public boolean isEmpty() { - return inIndices == 0; + return this.inSize == 0; } - - - - } diff --git a/engine/src/main/java/org/terasology/engine/rendering/opengl/OpenGLMesh.java b/engine/src/main/java/org/terasology/engine/rendering/opengl/OpenGLMesh.java index 8266cd466e6..0a52d1f7e67 100644 --- a/engine/src/main/java/org/terasology/engine/rendering/opengl/OpenGLMesh.java +++ b/engine/src/main/java/org/terasology/engine/rendering/opengl/OpenGLMesh.java @@ -31,7 +31,7 @@ public class OpenGLMesh extends Mesh implements OpenGLMeshBase { private DrawingMode drawMode; private AllocationType allocationType; - private VertexAttributeBinding positions; + private VertexAttributeBinding positions; private VBOContext state = null; @@ -79,7 +79,7 @@ public void render() { if (!isDisposed()) { updateState(state); GL30.glBindVertexArray(disposalAction.vao); - if(this.indexCount == 0) { + if (this.indexCount == 0) { GL30.glDrawArrays(drawMode.glCall, 0, positions.elements()); } else { GL30.glDrawElements(drawMode.glCall, this.indexCount, GL_UNSIGNED_INT, 0);