ThreatIndicatorGLRenderer.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 program;
  30. private FloatBuffer vertexBuffer;
  31. private float [] mvp;
  32. private AnimatedMesh androidMesh = null;
  33. public ThreatIndicatorGLRenderer() {}
  34. public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
  35. GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  36. try {
  37. InputStream is = assets.open("meshes/mario.amh");
  38. androidMesh = new AnimatedMesh(is);
  39. } catch (IOException e) {
  40. Log.e("gl", "Couldn't open mesh");
  41. }
  42. final float [] positions = {
  43. 0.0f, 0.5f, 0.0f, 1.0f,
  44. 0.5f, -0.5f, 0.0f, 1.0f,
  45. -0.5f, -0.5f, 0.0f, 1.0f,
  46. };
  47. ByteBuffer bb = ByteBuffer.allocateDirect(4 * positions.length);
  48. bb.order(ByteOrder.nativeOrder());
  49. vertexBuffer = bb.asFloatBuffer();
  50. vertexBuffer.put(positions);
  51. vertexBuffer.position(0);
  52. mvp = new float[16];
  53. Matrix.setIdentityM(mvp, 0);
  54. final String vertexSource =
  55. "uniform mat4 mvp;" +
  56. "attribute vec4 position;" +
  57. "void main() {" +
  58. " gl_Position = mvp * position;" +
  59. "}";
  60. final String fragmentSource =
  61. "precision mediump float;" +
  62. "uniform vec4 color;" +
  63. "void main() {" +
  64. " gl_FragColor = color;" +
  65. "}";
  66. program = loadProgram(vertexSource, fragmentSource);
  67. }
  68. public void onDrawFrame(GL10 arg0) {
  69. GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
  70. GLES20.glUseProgram(program);
  71. int positionAttribLoc = GLES20.glGetAttribLocation(program, "position");
  72. int colorUniformLoc = GLES20.glGetUniformLocation(program, "color");
  73. int mvpUniformLoc = GLES20.glGetUniformLocation(program, "mvp");
  74. float [] color = {0.0f, 1.0f, 0.0f, 1.0f};
  75. GLES20.glUniform4fv(colorUniformLoc, 1, color, 0);
  76. Matrix.rotateM(mvp, 0, 4.0f, 0.0f, 0.0f, 1.0f);
  77. GLES20.glUniformMatrix4fv(mvpUniformLoc, 1, false, mvp, 0);
  78. /*
  79. GLES20.glEnableVertexAttribArray(positionAttribLoc);
  80. GLES20.glVertexAttribPointer(positionAttribLoc, 4, GLES20.GL_FLOAT, false, 0, vertexBuffer);
  81. GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
  82. GLES20.glDisableVertexAttribArray(positionAttribLoc);
  83. */
  84. androidMesh.draw();
  85. }
  86. public void onSurfaceChanged(GL10 arg0, int width, int height) {
  87. GLES20.glViewport(0, 0, width, height);
  88. }
  89. }