/Research/Example projects/Android OGL/AndroidGL/src/edu/union/GLTutorialEleven.java

https://bitbucket.org/DeveloperUX/behaviortree · Java · 192 lines · 141 code · 36 blank · 15 comment · 6 complexity · e653bfa42f49a5e114f54b7946997652 MD5 · raw file

  1. package edu.union;
  2. import java.nio.FloatBuffer;
  3. import javax.microedition.khronos.opengles.GL10;
  4. import android.content.Context;
  5. import android.opengl.GLU;
  6. import android.view.KeyEvent;
  7. /**
  8. * Approximately corresponds to: http://www.zeuscmd.com/tutorials/opengles/25-Reflections.php
  9. * @author bburns
  10. *
  11. */
  12. public class GLTutorialEleven extends GLTutorialBase {
  13. float y = 1.5f;
  14. float lightAmbient[] = new float[] { 0.2f, 0.3f, 0.6f, 1.0f };
  15. float lightDiffuse[] = new float[] { 0.6f, 0.6f, 0.6f, 1.0f };
  16. float[] lightPos = new float[] {0,0,3,1};
  17. float matAmbient[] = new float[] { 0.6f, 0.6f, 0.6f, 1.0f };
  18. float matDiffuse[] = new float[] { 0.6f, 0.6f, 0.6f, 1.0f };
  19. float white[] = new float[] { 1f, 1f, 1f, 1.0f};
  20. float trans[] = new float[] { 1f, 1f, 1f, 0.3f};
  21. float box[] = new float[] {
  22. // FRONT
  23. -0.5f, -0.5f, 0.5f,
  24. 0.5f, -0.5f, 0.5f,
  25. -0.5f, 0.5f, 0.5f,
  26. 0.5f, 0.5f, 0.5f,
  27. // BACK
  28. -0.5f, -0.5f, -0.5f,
  29. -0.5f, 0.5f, -0.5f,
  30. 0.5f, -0.5f, -0.5f,
  31. 0.5f, 0.5f, -0.5f,
  32. // LEFT
  33. -0.5f, -0.5f, 0.5f,
  34. -0.5f, 0.5f, 0.5f,
  35. -0.5f, -0.5f, -0.5f,
  36. -0.5f, 0.5f, -0.5f,
  37. // RIGHT
  38. 0.5f, -0.5f, -0.5f,
  39. 0.5f, 0.5f, -0.5f,
  40. 0.5f, -0.5f, 0.5f,
  41. 0.5f, 0.5f, 0.5f,
  42. // TOP
  43. -0.5f, 0.5f, 0.5f,
  44. 0.5f, 0.5f, 0.5f,
  45. -0.5f, 0.5f, -0.5f,
  46. 0.5f, 0.5f, -0.5f,
  47. // BOTTOM
  48. -0.5f, -0.5f, 0.5f,
  49. -0.5f, -0.5f, -0.5f,
  50. 0.5f, -0.5f, 0.5f,
  51. 0.5f, -0.5f, -0.5f,
  52. };
  53. float[] floorVertices = new float[] {
  54. -3.0f, 0.0f, 3.0f,
  55. 3.0f, 0.0f, 3.0f,
  56. -3.0f, 0.0f,-3.0f,
  57. 3.0f, 0.0f,-3.0f
  58. };
  59. FloatBuffer cubeBuff;
  60. FloatBuffer floorBuff;
  61. public GLTutorialEleven(Context c) {
  62. super(c, 20);
  63. cubeBuff = makeFloatBuffer(box);
  64. floorBuff = makeFloatBuffer(floorVertices);
  65. }
  66. protected void init(GL10 gl) {
  67. gl.glEnable(GL10.GL_LIGHTING);
  68. gl.glEnable(GL10.GL_LIGHT0);
  69. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0);
  70. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0);
  71. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
  72. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
  73. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);
  74. gl.glEnable(GL10.GL_DEPTH_TEST);
  75. gl.glDepthFunc(GL10.GL_LEQUAL);
  76. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  77. gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  78. gl.glClearDepthf(1.0f);
  79. gl.glEnable(GL10.GL_CULL_FACE);
  80. gl.glShadeModel(GL10.GL_SMOOTH);
  81. gl.glClearStencil(0);
  82. }
  83. float xrot = 0.0f;
  84. float yrot = 0.0f;
  85. public void onDrawFrame(GL10 gl) {
  86. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_STENCIL_BUFFER_BIT);
  87. gl.glMatrixMode(GL10.GL_MODELVIEW);
  88. gl.glLoadIdentity();
  89. GLU.gluLookAt(gl, 0, 3, 7, 0, 0, 0, 0, 1, 0);
  90. // Draw the floor into the stencil buffer.
  91. gl.glDisable(GL10.GL_DEPTH_TEST);
  92. gl.glColorMask(false, false, false, false);
  93. gl.glDepthMask(false);
  94. gl.glEnable(GL10.GL_STENCIL_TEST);
  95. gl.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE);
  96. gl.glStencilFunc(GL10.GL_ALWAYS, 1, 0xffffffff);
  97. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, floorBuff);
  98. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, white, 0);
  99. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, white, 0);
  100. gl.glNormal3f(0,1,0);
  101. gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
  102. // Draw the reflection
  103. gl.glColorMask(true, true, true, true);
  104. gl.glDepthMask(true);
  105. gl.glEnable(GL10.GL_DEPTH_TEST);
  106. gl.glStencilFunc(GL10.GL_EQUAL, 1, 0xffffffff);
  107. gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP);
  108. gl.glPushMatrix();
  109. gl.glScalef(1.0f, -1f, 1f);
  110. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);
  111. gl.glCullFace(GL10.GL_FRONT);
  112. setupCube(gl);
  113. gl.glPushMatrix();
  114. gl.glTranslatef(0.0f,y,-1.0f);
  115. gl.glRotatef(xrot, 1, 0, 0);
  116. gl.glRotatef(yrot, 0, 1, 0);
  117. drawCube(gl);
  118. gl.glPopMatrix();
  119. gl.glCullFace(GL10.GL_BACK);
  120. gl.glPopMatrix();
  121. gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);
  122. gl.glDisable(GL10.GL_STENCIL_TEST);
  123. // Draw the floor for real.
  124. gl.glEnable(GL10.GL_BLEND);
  125. gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
  126. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, floorBuff);
  127. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, trans, 0);
  128. gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, trans, 0);
  129. gl.glNormal3f(0,1,0);
  130. gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
  131. gl.glDisable(GL10.GL_BLEND);
  132. setupCube(gl);
  133. gl.glPushMatrix();
  134. gl.glTranslatef(0.0f,y,-1.0f);
  135. gl.glRotatef(xrot, 1, 0, 0);
  136. gl.glRotatef(yrot, 0, 1, 0);
  137. // Draw the non-reflected cube
  138. drawCube(gl);
  139. gl.glPopMatrix();
  140. xrot+=1.0f;
  141. yrot+=0.5f;
  142. }
  143. @Override
  144. public boolean onKeyDown(int keyCode, KeyEvent event) {
  145. if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
  146. y+=0.1;
  147. invalidate();
  148. }
  149. else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
  150. if (y > 0.5)
  151. y-=0.1;
  152. invalidate();
  153. }
  154. return super.onKeyDown(keyCode, event);
  155. }
  156. }