public ModelView(edu.union.graphics.Model m, Context c) { super(c); setFocusable(true); this.m = m; context = new OpenGLContext(OpenGLContext.DEPTH_BUFFER); GL10 gl = (GL10) context.getGL(); gl.glShadeModel(GL10.GL_SMOOTH); gl.glClearColor(1, 1, 1, 1); gl.glClearDepthf(1.0f); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); gl.glEnable(GL10.GL_LIGHTING); gl.glEnable(GL10.GL_LIGHT0); gl.glEnable(GL10.GL_NORMALIZE); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, pos, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0); // Pretty perspective gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); gl.glEnable(GL10.GL_CULL_FACE); // Turn on these for textures. ByteBuffer bb; vertices = new IntBuffer[m.getFrameCount()]; for (int i = 0; i < m.getFrameCount(); i++) { Mesh ms = m.getFrame(i).getMesh(); verts = ms.getFaceCount() * 3; // bb = ByteBuffer.allocateDirect(msh.getVertexCount()*3*4); bb = ByteBuffer.allocateDirect(verts * 3 * 4); bb.order(ByteOrder.nativeOrder()); vertices[i] = bb.asIntBuffer(); for (int f = 0; f < ms.getFaceCount(); f++) { int[] face = ms.getFace(f); for (int j = 0; j < 3; j++) { float[] v = ms.getVertexf(face[j]); for (int k = 0; k < 3; k++) { vertices[i].put(FixedPointUtils.toFixed(v[k])); } } } vertices[i].position(0); } Mesh msh = m.getFrame(0).getMesh(); if (msh.getTextureFile() != null) { gl.glEnable(GL10.GL_TEXTURE_2D); tex = loadTexture(gl, BitmapFactory.decodeResource(c.getResources(), R.drawable.skin)); } // bb = ByteBuffer.allocateDirect(msh.getVertexCount()*3*4); bb = ByteBuffer.allocateDirect(verts * 3 * 4); bb.order(ByteOrder.nativeOrder()); normals = bb.asIntBuffer(); bb = ByteBuffer.allocateDirect(verts * 2 * 4); bb.order(ByteOrder.nativeOrder()); texCoords = bb.asIntBuffer(); bb = ByteBuffer.allocateDirect(verts * 2); bb.order(ByteOrder.nativeOrder()); indices = bb.asShortBuffer(); short ct = 0; for (int i = 0; i < msh.getFaceCount(); i++) { int[] face_n = msh.getFaceNormals(i); int[] face_tx = msh.getFaceTextures(i); for (int j = 0; j < 3; j++) { float[] n = msh.getNormalf(face_n[j]); for (int k = 0; k < 3; k++) { normals.put(FixedPointUtils.toFixed(n[k])); } float[] tx = msh.getTextureCoordinatef(face_tx[j]); texCoords.put(FixedPointUtils.toFixed(tx[0])); texCoords.put(FixedPointUtils.toFixed(tx[1])); indices.put(ct++); } } normals.position(0); texCoords.position(0); indices.position(0); animator = new ViewAnimator(this, 5); }