1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.performanceLaunch.helper; 18 19 import javax.microedition.khronos.egl.EGLConfig; 20 import javax.microedition.khronos.opengles.GL10; 21 22 import android.opengl.GLES20; 23 import android.opengl.GLSurfaceView; 24 import android.opengl.Matrix; 25 import android.util.Log; 26 27 /** 28 * Provides drawing instructions for a GLSurfaceView object. This class must override the OpenGL ES 29 * drawing lifecycle methods: 30 * <ul> 31 * <li>{@link android.opengl.GLSurfaceView.Renderer#onSurfaceCreated}</li> 32 * <li>{@link android.opengl.GLSurfaceView.Renderer#onDrawFrame}</li> 33 * <li>{@link android.opengl.GLSurfaceView.Renderer#onSurfaceChanged}</li> 34 * </ul> 35 * Source : development/samples/OpenGL/HelloOpenGLES20 36 */ 37 public class SimpleGLRenderer implements GLSurfaceView.Renderer { 38 39 private static final String TAG = "MyGLRenderer"; 40 private Triangle mTriangle; 41 private Square mSquare; 42 43 // mMVPMatrix is an abbreviation for "Model View Projection Matrix" 44 private final float[] mMVPMatrix = new float[16]; 45 private final float[] mProjectionMatrix = new float[16]; 46 private final float[] mViewMatrix = new float[16]; 47 private final float[] mRotationMatrix = new float[16]; 48 49 private float mAngle; 50 51 @Override onSurfaceCreated(GL10 unused, EGLConfig config)52 public void onSurfaceCreated(GL10 unused, EGLConfig config) { 53 54 // Set the background frame color 55 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 56 57 mTriangle = new Triangle(); 58 mSquare = new Square(); 59 } 60 61 @Override onDrawFrame(GL10 unused)62 public void onDrawFrame(GL10 unused) { 63 float[] scratch = new float[16]; 64 65 // Draw background color 66 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 67 68 // Set the camera position (View matrix) 69 Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 70 71 // Calculate the projection and view transformation 72 Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); 73 74 // Draw square 75 mSquare.draw(mMVPMatrix); 76 77 // Create a rotation for the triangle 78 79 // Use the following code to generate constant rotation. 80 // Leave this code out when using TouchEvents. 81 // long time = SystemClock.uptimeMillis() % 4000L; 82 // float angle = 0.090f * ((int) time); 83 84 Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f); 85 86 // Combine the rotation matrix with the projection and camera view 87 // Note that the mMVPMatrix factor *must be first* in order 88 // for the matrix multiplication product to be correct. 89 Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0); 90 91 // Draw triangle 92 mTriangle.draw(scratch); 93 } 94 95 @Override onSurfaceChanged(GL10 unused, int width, int height)96 public void onSurfaceChanged(GL10 unused, int width, int height) { 97 // Adjust the viewport based on geometry changes, 98 // such as screen rotation 99 GLES20.glViewport(0, 0, width, height); 100 101 float ratio = (float) width / height; 102 103 // this projection matrix is applied to object coordinates 104 // in the onDrawFrame() method 105 Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 106 107 } 108 109 /** 110 * Utility method for compiling a OpenGL shader. 111 * <p> 112 * <strong>Note:</strong> When developing shaders, use the checkGlError() method to debug shader 113 * coding errors. 114 * </p> 115 * 116 * @param type - Vertex or fragment shader type. 117 * @param shaderCode - String containing the shader code. 118 * @return - Returns an id for the shader. 119 */ loadShader(int type, String shaderCode)120 public static int loadShader(int type, String shaderCode) { 121 122 // create a vertex shader type (GLES20.GL_VERTEX_SHADER) 123 // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER) 124 int shader = GLES20.glCreateShader(type); 125 126 // add the source code to the shader and compile it 127 GLES20.glShaderSource(shader, shaderCode); 128 GLES20.glCompileShader(shader); 129 130 return shader; 131 } 132 133 /** 134 * Utility method for debugging OpenGL calls. Provide the name of the call just after making it: 135 * 136 * <pre> 137 * mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); 138 * MyGLRenderer.checkGlError("glGetUniformLocation"); 139 * </pre> 140 * 141 * If the operation is not successful, the check throws an error. 142 * 143 * @param glOperation - Name of the OpenGL call to check. 144 */ checkGlError(String glOperation)145 public static void checkGlError(String glOperation) { 146 int error; 147 while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { 148 Log.e(TAG, glOperation + ": glError " + error); 149 throw new RuntimeException(glOperation + ": glError " + error); 150 } 151 } 152 153 /** 154 * Returns the rotation angle of the triangle shape (mTriangle). 155 * 156 * @return - A float representing the rotation angle. 157 */ getAngle()158 public float getAngle() { 159 return mAngle; 160 } 161 162 /** 163 * Sets the rotation angle of the triangle shape (mTriangle). 164 */ setAngle(float angle)165 public void setAngle(float angle) { 166 mAngle = angle; 167 } 168 169 } 170