ThreatIndicatorGLRenderer.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package de.tudarmstadt.informatik.hostage.ui2.fragment.opengl;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.nio.ByteBuffer;
  5. import java.nio.ByteOrder;
  6. import java.nio.FloatBuffer;
  7. import javax.microedition.khronos.egl.EGLConfig;
  8. import javax.microedition.khronos.opengles.GL10;
  9. import android.content.res.AssetManager;
  10. import android.opengl.GLES20;
  11. import android.opengl.GLSurfaceView.Renderer;
  12. import android.opengl.Matrix;
  13. import android.util.Log;
  14. public class ThreatIndicatorGLRenderer implements Renderer {
  15. public static int loadShader(int type, String source) {
  16. int shader = GLES20.glCreateShader(type);
  17. GLES20.glShaderSource(shader, source);
  18. GLES20.glCompileShader(shader);
  19. return shader;
  20. }
  21. public static int loadProgram(String vertexSource, String fragmentSource) {
  22. int program = GLES20.glCreateProgram();
  23. GLES20.glAttachShader(program, loadShader(GLES20.GL_VERTEX_SHADER, vertexSource));
  24. GLES20.glAttachShader(program, loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource));
  25. GLES20.glLinkProgram(program);
  26. return program;
  27. }
  28. public static AssetManager assets;
  29. private int width;
  30. private int height;
  31. private float aspectRatio;
  32. private int program;
  33. private FloatBuffer vertexBuffer;
  34. private float [] modelview;
  35. private float [] projection;
  36. private float [] mvp;
  37. private AnimatedMesh androidMesh = null;
  38. public ThreatIndicatorGLRenderer() {}
  39. public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
  40. GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  41. GLES20.glEnable(GLES20.GL_DEPTH_TEST);
  42. GLES20.glEnable(GLES20.GL_CULL_FACE);
  43. try {
  44. InputStream is = assets.open("meshes/mario.amh");
  45. androidMesh = new AnimatedMesh(is);
  46. } catch (IOException e) {
  47. Log.e("gl", "Couldn't open mesh");
  48. }
  49. final float [] positions = {
  50. 0.0f, 0.5f, 0.0f, 1.0f,
  51. 0.5f, -0.5f, 0.0f, 1.0f,
  52. -0.5f, -0.5f, 0.0f, 1.0f,
  53. };
  54. ByteBuffer bb = ByteBuffer.allocateDirect(4 * positions.length);
  55. bb.order(ByteOrder.nativeOrder());
  56. vertexBuffer = bb.asFloatBuffer();
  57. vertexBuffer.put(positions);
  58. vertexBuffer.position(0);
  59. modelview = new float[16];
  60. Matrix.setIdentityM(modelview, 0);
  61. projection = new float[16];
  62. mvp = new float[16];
  63. final String vertexSource =
  64. "uniform mat4 mvp;" +
  65. "attribute vec3 position;" +
  66. "attribute vec3 normal;" +
  67. "varying vec3 vertexNormal;" +
  68. "void main() {" +
  69. " vertexNormal = normal;" +
  70. " gl_Position = mvp * vec4(position, 1.0);" +
  71. "}";
  72. final String fragmentSource =
  73. "precision mediump float;" +
  74. "uniform vec4 color;" +
  75. "varying vec3 vertexNormal;" +
  76. "void main() {" +
  77. " vec3 normal = normalize(vertexNormal);" +
  78. " gl_FragColor = max(0.0, -normal.y) * color;" +
  79. "}";
  80. program = loadProgram(vertexSource, fragmentSource);
  81. }
  82. public void onDrawFrame(GL10 arg0) {
  83. GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
  84. GLES20.glUseProgram(program);
  85. int colorUniformLoc = GLES20.glGetUniformLocation(program, "color");
  86. int mvpUniformLoc = GLES20.glGetUniformLocation(program, "mvp");
  87. float [] color = {1.0f, 1.0f, 1.0f, 1.0f};
  88. GLES20.glUniform4fv(colorUniformLoc, 1, color, 0);
  89. //Matrix.rotateM(mvp, 0, 4.0f, 0.0f, 0.0f, 1.0f);
  90. Matrix.setIdentityM(modelview, 0);
  91. Matrix.rotateM(modelview, 0, -90.0f, 1.0f, 0.0f, 0.0f);
  92. Matrix.multiplyMM(mvp, 0, projection, 0, modelview, 0);
  93. GLES20.glUniformMatrix4fv(mvpUniformLoc, 1, false, mvp, 0);
  94. /*
  95. GLES20.glEnableVertexAttribArray(positionAttribLoc);
  96. GLES20.glVertexAttribPointer(positionAttribLoc, 4, GLES20.GL_FLOAT, false, 0, vertexBuffer);
  97. GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
  98. GLES20.glDisableVertexAttribArray(positionAttribLoc);
  99. */
  100. androidMesh.draw(program);
  101. }
  102. public void onSurfaceChanged(GL10 arg0, int w, int h) {
  103. width = w;
  104. height = h;
  105. aspectRatio = (float)w / (float)h;
  106. Matrix.orthoM(projection, 0, -aspectRatio, aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f);
  107. GLES20.glViewport(0, 0, width, height);
  108. }
  109. }