|
@@ -7,6 +7,7 @@ import java.nio.ByteBuffer;
|
|
|
import java.nio.ByteOrder;
|
|
|
import java.nio.FloatBuffer;
|
|
|
import java.nio.IntBuffer;
|
|
|
+import java.nio.ShortBuffer;
|
|
|
|
|
|
import android.opengl.GLES20;
|
|
|
import android.util.Log;
|
|
@@ -43,6 +44,7 @@ public class AnimatedMesh {
|
|
|
|
|
|
int magicNum = data.getInt();
|
|
|
int version = data.getInt();
|
|
|
+ assert(magicNum == ('A' << 24 | 'M' << 16 | 'S' << 8 | 'H') && version == 1);
|
|
|
|
|
|
vertexSize = 48;
|
|
|
vertexOffset = data.getInt();
|
|
@@ -58,15 +60,22 @@ public class AnimatedMesh {
|
|
|
GLES20.glGenBuffers(2, buffers); // buffer names
|
|
|
vertexBuffer = buffers.get();
|
|
|
indexBuffer = buffers.get();
|
|
|
-
|
|
|
- GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
|
|
|
+
|
|
|
data.position(vertexOffset);
|
|
|
+ GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
|
|
|
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexSize * vertexCount, data.asFloatBuffer(), GLES20.GL_STATIC_DRAW);
|
|
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
|
|
|
+
|
|
|
+ // convert int indices to short
|
|
|
+ // TODO: more efficient way?
|
|
|
+ data.position(triangleOffset);
|
|
|
+ ShortBuffer indexBufferData = ShortBuffer.allocate(3 * triangleCount);
|
|
|
+ for (int i = 0; i < 3 * triangleCount; i++)
|
|
|
+ indexBufferData.put((short)data.getInt());
|
|
|
+ indexBufferData.position(0);
|
|
|
|
|
|
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
|
- data.position(triangleOffset);
|
|
|
- GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 12 * triangleCount, data.asIntBuffer(), GLES20.GL_STATIC_DRAW);
|
|
|
+ GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 6 * triangleCount, indexBufferData, GLES20.GL_STATIC_DRAW);
|
|
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
|
|
|
}
|
|
|
|
|
@@ -86,7 +95,7 @@ public class AnimatedMesh {
|
|
|
//data.position(triangleOffset);
|
|
|
//GLES20.glDrawElements(GLES20.GL_TRIANGLES, 3 * triangleCount, GLES20.GL_UNSIGNED_INT, data.asIntBuffer());
|
|
|
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
|
- GLES20.glDrawElements(GLES20.GL_TRIANGLES, 3 * triangleCount, GLES20.GL_UNSIGNED_INT, 0);
|
|
|
+ GLES20.glDrawElements(GLES20.GL_TRIANGLES, 3 * triangleCount, GLES20.GL_UNSIGNED_SHORT, 0);
|
|
|
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
|
|
|
|