/Research/Example projects/Android OGL/ModelRenderer/src/edu/union/android/ModelView.java

https://bitbucket.org/DeveloperUX/behaviortree · Java · 231 lines · 179 code · 45 blank · 7 comment · 17 complexity · 20b410554c6795a9aee4a24e7d1cf2d7 MD5 · raw file

  1. package edu.union.android;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.nio.IntBuffer;
  5. import java.nio.ShortBuffer;
  6. import javax.microedition.khronos.opengles.GL10;
  7. import javax.microedition.khronos.opengles.GL11;
  8. import android.content.Context;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.graphics.Canvas;
  12. import android.graphics.OpenGLContext;
  13. import android.opengl.GLU;
  14. import android.view.KeyEvent;
  15. import android.view.View;
  16. import edu.union.graphics.Model;
  17. import edu.union.graphics.Mesh;
  18. import edu.union.graphics.FixedPointUtils;
  19. public class ModelView extends View {
  20. private Model m;
  21. private OpenGLContext context;
  22. ViewAnimator animator;
  23. int tex;
  24. int verts;
  25. float lightAmbient[] = new float[] { 0.2f, 0.3f, 0.6f, 1.0f };
  26. float lightDiffuse[] = new float[] { 1f, 1f, 1f, 1.0f };
  27. float matAmbient[] = new float[] { 1f, 1f, 1f, 1.0f };
  28. float matDiffuse[] = new float[] { 1f, 1f, 1f, 1.0f };
  29. float[] pos = new float[] {0,20,20,1};
  30. int frame_ix = 0;
  31. private IntBuffer[] vertices;
  32. private IntBuffer normals;
  33. private IntBuffer texCoords;
  34. private ShortBuffer indices;
  35. protected static int loadTexture(GL10 gl, Bitmap bmp) {
  36. ByteBuffer bb = ByteBuffer.allocateDirect(bmp.height()*bmp.width()*4);
  37. bb.order(ByteOrder.nativeOrder());
  38. IntBuffer ib = bb.asIntBuffer();
  39. for (int y=0;y<bmp.height();y++)
  40. for (int x=0;x<bmp.width();x++) {
  41. ib.put(bmp.getPixel(x,y));
  42. }
  43. ib.position(0);
  44. bb.position(0);
  45. int[] tmp_tex = new int[1];
  46. gl.glGenTextures(1, tmp_tex, 0);
  47. int tx = tmp_tex[0];
  48. gl.glBindTexture(GL10.GL_TEXTURE_2D, tx);
  49. gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bmp.width(), bmp.height(), 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);
  50. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
  51. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
  52. return tx;
  53. }
  54. public ModelView(edu.union.graphics.Model m, Context c) {
  55. super(c);
  56. setFocusable(true);
  57. this.m = m;
  58. context = new OpenGLContext(OpenGLContext.DEPTH_BUFFER);
  59. GL10 gl = (GL10)context.getGL();
  60. gl.glShadeModel(GL10.GL_SMOOTH);
  61. gl.glClearColor(1,1,1,1);
  62. gl.glClearDepthf(1.0f);
  63. gl.glEnable(GL10.GL_DEPTH_TEST);
  64. gl.glDepthFunc(GL10.GL_LEQUAL);
  65. gl.glEnable(GL10.GL_LIGHTING);
  66. gl.glEnable(GL10.GL_LIGHT0);
  67. gl.glEnable(GL10.GL_NORMALIZE);
  68. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
  69. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
  70. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, pos, 0);
  71. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0);
  72. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0);
  73. // Pretty perspective
  74. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
  75. gl.glEnable(GL10.GL_CULL_FACE);
  76. // Turn on these for textures.
  77. ByteBuffer bb;
  78. vertices = new IntBuffer[m.getFrameCount()];
  79. for (int i=0;i<m.getFrameCount();i++) {
  80. Mesh ms = m.getFrame(i).getMesh();
  81. verts = ms.getFaceCount()*3;
  82. //bb = ByteBuffer.allocateDirect(msh.getVertexCount()*3*4);
  83. bb = ByteBuffer.allocateDirect(verts*3*4);
  84. bb.order(ByteOrder.nativeOrder());
  85. vertices[i] = bb.asIntBuffer();
  86. for (int f=0;f<ms.getFaceCount();f++) {
  87. int[] face = ms.getFace(f);
  88. for (int j=0;j<3;j++) {
  89. float[] v = ms.getVertexf(face[j]);
  90. for (int k=0;k<3;k++) {
  91. vertices[i].put(FixedPointUtils.toFixed(v[k]));
  92. }
  93. }
  94. }
  95. vertices[i].position(0);
  96. }
  97. Mesh msh = m.getFrame(0).getMesh();
  98. if (msh.getTextureFile() != null) {
  99. gl.glEnable(GL10.GL_TEXTURE_2D);
  100. tex = loadTexture(gl, BitmapFactory.decodeResource(c.getResources(),R.drawable.skin));
  101. }
  102. //bb = ByteBuffer.allocateDirect(msh.getVertexCount()*3*4);
  103. bb = ByteBuffer.allocateDirect(verts*3*4);
  104. bb.order(ByteOrder.nativeOrder());
  105. normals = bb.asIntBuffer();
  106. bb = ByteBuffer.allocateDirect(verts*2*4);
  107. bb.order(ByteOrder.nativeOrder());
  108. texCoords = bb.asIntBuffer();
  109. bb = ByteBuffer.allocateDirect(verts*2);
  110. bb.order(ByteOrder.nativeOrder());
  111. indices = bb.asShortBuffer();
  112. short ct = 0;
  113. for (int i=0;i<msh.getFaceCount();i++) {
  114. int[] face_n = msh.getFaceNormals(i);
  115. int[] face_tx = msh.getFaceTextures(i);
  116. for (int j=0;j<3;j++) {
  117. float[] n = msh.getNormalf(face_n[j]);
  118. for (int k=0;k<3;k++) {
  119. normals.put(FixedPointUtils.toFixed(n[k]));
  120. }
  121. float[] tx = msh.getTextureCoordinatef(face_tx[j]);
  122. texCoords.put(FixedPointUtils.toFixed(tx[0]));
  123. texCoords.put(FixedPointUtils.toFixed(tx[1]));
  124. indices.put(ct++);
  125. }
  126. }
  127. normals.position(0);
  128. texCoords.position(0);
  129. indices.position(0);
  130. animator = new ViewAnimator(this, 5);
  131. }
  132. @Override
  133. protected void onAttachedToWindow() {
  134. animator.start();
  135. super.onAttachedToWindow();
  136. }
  137. @Override
  138. protected void onDetachedFromWindow() {
  139. animator.stop();
  140. super.onDetachedFromWindow();
  141. }
  142. @Override
  143. protected void onDraw(Canvas canvas) {
  144. GL11 gl = (GL11)context.getGL();
  145. int w = getWidth();
  146. int h = getHeight();
  147. context.waitNative(canvas, this);
  148. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  149. gl.glMatrixMode(GL10.GL_PROJECTION);
  150. gl.glLoadIdentity();
  151. gl.glViewport(0,0,w,h);
  152. GLU.gluPerspective(gl, 45.0f, ((float)w)/h, 1f, 100f);
  153. gl.glMatrixMode(GL10.GL_MODELVIEW);
  154. gl.glLoadIdentity();
  155. GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);
  156. gl.glTranslatef(0,0,-10);
  157. gl.glRotatef(30.0f, 1, 0, 0);
  158. //gl.glRotatef(40.0f, 0, 1, 0);
  159. gl.glVertexPointer(3,GL10.GL_FIXED, 0, vertices[frame_ix]);
  160. gl.glNormalPointer(GL10.GL_FIXED,0, normals);
  161. gl.glTexCoordPointer(2,GL10.GL_FIXED,0,texCoords);
  162. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  163. gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
  164. gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  165. //gl.glColor4f(1,0,0,1);
  166. gl.glBindTexture(GL10.GL_TEXTURE_2D, tex);
  167. //gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
  168. gl.glDrawElements(GL10.GL_TRIANGLES, verts, GL10.GL_UNSIGNED_SHORT, indices);
  169. frame_ix = (frame_ix+1)%m.getFrameCount();
  170. context.waitGL();
  171. }
  172. @Override
  173. public boolean onKeyDown(int keyCode, KeyEvent event) {
  174. if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {
  175. frame_ix--;
  176. if (frame_ix < 0)
  177. frame_ix = m.getFrameCount()-1;
  178. invalidate();
  179. }
  180. else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
  181. frame_ix = (frame_ix+1)%m.getFrameCount();
  182. invalidate();
  183. }
  184. return super.onKeyUp(keyCode, event);
  185. }
  186. }