summaryrefslogtreecommitdiff
path: root/samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java
diff options
context:
space:
mode:
authorJoe Fernandez <joefernandez@google.com>2012-06-14 15:10:46 -0700
committerJoe Fernandez <joefernandez@google.com>2013-08-22 10:25:33 -0700
commit66f6fe66331469618b4edf1e1e163a28ba5dea44 (patch)
treec6ee7aafed29a5b040cd292a9e6829ecfe8d3943 /samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java
parentabb260a280af25500b2d5c95890c9af116981f4d (diff)
Sample code for OpenGL Android training class
( Original Id: Ib1650025a3c4b018c60d70ede3f25113660f68d8 ) Change-Id: I1d760b75d1f2bfe1ec90c71471867577bd146241
Diffstat (limited to 'samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java')
-rw-r--r--samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java166
1 files changed, 166 insertions, 0 deletions
diff --git a/samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java b/samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java
new file mode 100644
index 000000000..71f5b284e
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES20/src/com/example/android/opengl/MyGLRenderer.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.opengl;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.Matrix;
+import android.util.Log;
+
+/**
+ * Provides drawing instructions for a GLSurfaceView object. This class
+ * must override the OpenGL ES drawing lifecycle methods:
+ * <ul>
+ * <li>{@link android.opengl.GLSurfaceView.Renderer#onSurfaceCreated}</li>
+ * <li>{@link android.opengl.GLSurfaceView.Renderer#onDrawFrame}</li>
+ * <li>{@link android.opengl.GLSurfaceView.Renderer#onSurfaceChanged}</li>
+ * </ul>
+ */
+public class MyGLRenderer implements GLSurfaceView.Renderer {
+
+ private static final String TAG = "MyGLRenderer";
+ private Triangle mTriangle;
+ private Square mSquare;
+
+ // mMVPMatrix is an abbreviation for "Model View Projection Matrix"
+ private final float[] mMVPMatrix = new float[16];
+ private final float[] mProjectionMatrix = new float[16];
+ private final float[] mViewMatrix = new float[16];
+ private final float[] mRotationMatrix = new float[16];
+
+ private float mAngle;
+
+ @Override
+ public void onSurfaceCreated(GL10 unused, EGLConfig config) {
+
+ // Set the background frame color
+ GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ mTriangle = new Triangle();
+ mSquare = new Square();
+ }
+
+ @Override
+ public void onDrawFrame(GL10 unused) {
+ float[] scratch = new float[16];
+
+ // Draw background color
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
+
+ // Set the camera position (View matrix)
+ Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
+
+ // Calculate the projection and view transformation
+ Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
+
+ // Draw square
+ mSquare.draw(mMVPMatrix);
+
+ // Create a rotation for the triangle
+
+ // Use the following code to generate constant rotation.
+ // Leave this code out when using TouchEvents.
+ // long time = SystemClock.uptimeMillis() % 4000L;
+ // float angle = 0.090f * ((int) time);
+
+ Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f);
+
+ // Combine the rotation matrix with the projection and camera view
+ // Note that the mMVPMatrix factor *must be first* in order
+ // for the matrix multiplication product to be correct.
+ Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
+
+ // Draw triangle
+ mTriangle.draw(scratch);
+ }
+
+ @Override
+ public void onSurfaceChanged(GL10 unused, int width, int height) {
+ // Adjust the viewport based on geometry changes,
+ // such as screen rotation
+ GLES20.glViewport(0, 0, width, height);
+
+ float ratio = (float) width / height;
+
+ // this projection matrix is applied to object coordinates
+ // in the onDrawFrame() method
+ Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
+
+ }
+
+ /**
+ * Utility method for compiling a OpenGL shader.
+ *
+ * <p><strong>Note:</strong> When developing shaders, use the checkGlError()
+ * method to debug shader coding errors.</p>
+ *
+ * @param type - Vertex or fragment shader type.
+ * @param shaderCode - String containing the shader code.
+ * @return - Returns an id for the shader.
+ */
+ public static int loadShader(int type, String shaderCode){
+
+ // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
+ // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
+ int shader = GLES20.glCreateShader(type);
+
+ // add the source code to the shader and compile it
+ GLES20.glShaderSource(shader, shaderCode);
+ GLES20.glCompileShader(shader);
+
+ return shader;
+ }
+
+ /**
+ * Utility method for debugging OpenGL calls. Provide the name of the call
+ * just after making it:
+ *
+ * <pre>
+ * mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
+ * MyGLRenderer.checkGlError("glGetUniformLocation");</pre>
+ *
+ * If the operation is not successful, the check throws an error.
+ *
+ * @param glOperation - Name of the OpenGL call to check.
+ */
+ public static void checkGlError(String glOperation) {
+ int error;
+ while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+ Log.e(TAG, glOperation + ": glError " + error);
+ throw new RuntimeException(glOperation + ": glError " + error);
+ }
+ }
+
+ /**
+ * Returns the rotation angle of the triangle shape (mTriangle).
+ *
+ * @return - A float representing the rotation angle.
+ */
+ public float getAngle() {
+ return mAngle;
+ }
+
+ /**
+ * Sets the rotation angle of the triangle shape (mTriangle).
+ */
+ public void setAngle(float angle) {
+ mAngle = angle;
+ }
+
+} \ No newline at end of file