Browse Source

now using short instead of int for indices. converting while loading -> could be more efficient

Fabio Arnold 10 years ago
parent
commit
c17a33cca1

+ 14 - 5
src/de/tudarmstadt/informatik/hostage/ui2/fragment/opengl/AnimatedMesh.java

@@ -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);