summaryrefslogtreecommitdiffstats
path: root/samples/OpenGL/HelloOpenGLES10
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/HelloOpenGLES10
parentabb260a280af25500b2d5c95890c9af116981f4d (diff)
downloadandroid_development-66f6fe66331469618b4edf1e1e163a28ba5dea44.tar.gz
android_development-66f6fe66331469618b4edf1e1e163a28ba5dea44.tar.bz2
android_development-66f6fe66331469618b4edf1e1e163a28ba5dea44.zip
Sample code for OpenGL Android training class
( Original Id: Ib1650025a3c4b018c60d70ede3f25113660f68d8 ) Change-Id: I1d760b75d1f2bfe1ec90c71471867577bd146241
Diffstat (limited to 'samples/OpenGL/HelloOpenGLES10')
-rw-r--r--samples/OpenGL/HelloOpenGLES10/.gitignore9
-rw-r--r--samples/OpenGL/HelloOpenGLES10/AndroidManifest.xml44
-rw-r--r--samples/OpenGL/HelloOpenGLES10/res/drawable/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--samples/OpenGL/HelloOpenGLES10/res/layout/main.xml28
-rw-r--r--samples/OpenGL/HelloOpenGLES10/res/values/strings.xml20
-rw-r--r--samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLRenderer.java105
-rw-r--r--samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLSurfaceView.java82
-rw-r--r--samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/OpenGLES10Activity.java55
-rw-r--r--samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Square.java93
-rw-r--r--samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Triangle.java85
10 files changed, 521 insertions, 0 deletions
diff --git a/samples/OpenGL/HelloOpenGLES10/.gitignore b/samples/OpenGL/HelloOpenGLES10/.gitignore
new file mode 100644
index 000000000..ad7a3ead5
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/.gitignore
@@ -0,0 +1,9 @@
+# Files ignored for git source control
+#
+# Add this file to source control so the following files
+# are not tracked and added to git:
+.project
+.classpath
+project.properties
+bin/
+gen/
diff --git a/samples/OpenGL/HelloOpenGLES10/AndroidManifest.xml b/samples/OpenGL/HelloOpenGLES10/AndroidManifest.xml
new file mode 100644
index 000000000..64097dadc
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.opengl"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="4"
+ android:targetSdkVersion="17" />
+
+ <!-- Tell the system this app requires OpenGL ES 1.0 or higher-->
+ <uses-feature android:glEsVersion="0x00010000" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:allowBackup="true" >
+ <activity
+ android:name="com.example.android.opengl.OpenGLES10Activity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest> \ No newline at end of file
diff --git a/samples/OpenGL/HelloOpenGLES10/res/drawable/ic_launcher.png b/samples/OpenGL/HelloOpenGLES10/res/drawable/ic_launcher.png
new file mode 100644
index 000000000..359047dfa
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/res/drawable/ic_launcher.png
Binary files differ
diff --git a/samples/OpenGL/HelloOpenGLES10/res/layout/main.xml b/samples/OpenGL/HelloOpenGLES10/res/layout/main.xml
new file mode 100644
index 000000000..7c7aee80d
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/res/layout/main.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/hello" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/samples/OpenGL/HelloOpenGLES10/res/values/strings.xml b/samples/OpenGL/HelloOpenGLES10/res/values/strings.xml
new file mode 100644
index 000000000..e4488894f
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<resources>
+ <string name="hello">Hello, OpenGL ES 1.0!</string>
+ <string name="app_name">Hello OpenGL ES 1.0</string>
+</resources>
diff --git a/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLRenderer.java b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLRenderer.java
new file mode 100644
index 000000000..96efb3858
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLRenderer.java
@@ -0,0 +1,105 @@
+/*
+ * 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.GLSurfaceView;
+import android.opengl.GLU;
+
+/**
+ * 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 Triangle mTriangle;
+ private Square mSquare;
+ private float mAngle;
+
+ @Override
+ public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+ // Set the background frame color
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ mTriangle = new Triangle();
+ mSquare = new Square();
+ }
+
+ @Override
+ public void onDrawFrame(GL10 gl) {
+
+ // Draw background color
+ gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
+
+ // Set GL_MODELVIEW transformation mode
+ gl.glMatrixMode(GL10.GL_MODELVIEW);
+ gl.glLoadIdentity(); // reset the matrix to its default state
+
+ // When using GL_MODELVIEW, you must set the view point
+ GLU.gluLookAt(gl, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
+
+ // Draw square
+ mSquare.draw(gl);
+
+ // 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);
+
+ gl.glRotatef(mAngle, 0.0f, 0.0f, 1.0f);
+
+ // Draw triangle
+ mTriangle.draw(gl);
+ }
+
+ @Override
+ public void onSurfaceChanged(GL10 gl, int width, int height) {
+ // Adjust the viewport based on geometry changes
+ // such as screen rotations
+ gl.glViewport(0, 0, width, height);
+
+ // make adjustments for screen ratio
+ float ratio = (float) width / height;
+ gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode
+ gl.glLoadIdentity(); // reset the matrix to its default state
+ gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix
+ }
+
+ /**
+ * 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
diff --git a/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLSurfaceView.java b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLSurfaceView.java
new file mode 100644
index 000000000..e9b2c8c93
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/MyGLSurfaceView.java
@@ -0,0 +1,82 @@
+/*
+ * 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 android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.view.MotionEvent;
+
+/**
+ * A view container where OpenGL ES graphics can be drawn on screen.
+ * This view can also be used to capture touch events, such as a user
+ * interacting with drawn objects.
+ */
+public class MyGLSurfaceView extends GLSurfaceView {
+
+ private final MyGLRenderer mRenderer;
+
+ public MyGLSurfaceView(Context context) {
+ super(context);
+
+ // Set the Renderer for drawing on the GLSurfaceView
+ mRenderer = new MyGLRenderer();
+ setRenderer(mRenderer);
+
+ // Render the view only when there is a change in the drawing data
+ setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
+ }
+
+ private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
+ private float mPreviousX;
+ private float mPreviousY;
+
+ @Override
+ public boolean onTouchEvent(MotionEvent e) {
+ // MotionEvent reports input details from the touch screen
+ // and other input controls. In this case, we are only
+ // interested in events where the touch position changed.
+
+ float x = e.getX();
+ float y = e.getY();
+
+ switch (e.getAction()) {
+ case MotionEvent.ACTION_MOVE:
+
+ float dx = x - mPreviousX;
+ float dy = y - mPreviousY;
+
+ // reverse direction of rotation above the mid-line
+ if (y > getHeight() / 2) {
+ dx = dx * -1 ;
+ }
+
+ // reverse direction of rotation to left of the mid-line
+ if (x < getWidth() / 2) {
+ dy = dy * -1 ;
+ }
+
+ mRenderer.setAngle(
+ mRenderer.getAngle() +
+ ((dx + dy) * TOUCH_SCALE_FACTOR)); // = 180.0f / 320
+ requestRender();
+ }
+
+ mPreviousX = x;
+ mPreviousY = y;
+ return true;
+ }
+
+}
diff --git a/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/OpenGLES10Activity.java b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/OpenGLES10Activity.java
new file mode 100644
index 000000000..44abd20ff
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/OpenGLES10Activity.java
@@ -0,0 +1,55 @@
+/*
+ * 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 android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+
+public class OpenGLES10Activity extends Activity {
+
+ private GLSurfaceView mGLView;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Create a GLSurfaceView instance and set it
+ // as the ContentView for this Activity.
+ mGLView = new MyGLSurfaceView(this);
+ setContentView(mGLView);
+ }
+
+ @Override
+ protected void onPause() {
+ // The following call pauses the rendering thread.
+ // If your OpenGL application is memory intensive,
+ // you should consider de-allocating objects that
+ // consume significant memory here.
+ super.onPause();
+ mGLView.onPause();
+ }
+
+ @Override
+ protected void onResume() {
+ // The following call resumes a paused rendering thread.
+ // If you de-allocated graphic objects for onPause()
+ // this is a good place to re-allocate them.
+ super.onResume();
+ mGLView.onResume();
+ }
+
+} \ No newline at end of file
diff --git a/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Square.java b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Square.java
new file mode 100644
index 000000000..85f3a4a2a
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Square.java
@@ -0,0 +1,93 @@
+/*
+ * 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 java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.ShortBuffer;
+
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A two-dimensional square for use as a drawn object in OpenGL ES 1.0/1.1.
+ */
+public class Square {
+
+ private final FloatBuffer vertexBuffer;
+ private final ShortBuffer drawListBuffer;
+
+ // number of coordinates per vertex in this array
+ static final int COORDS_PER_VERTEX = 3;
+ static float squareCoords[] = {
+ -0.5f, 0.5f, 0.0f, // top left
+ -0.5f, -0.5f, 0.0f, // bottom left
+ 0.5f, -0.5f, 0.0f, // bottom right
+ 0.5f, 0.5f, 0.0f }; // top right
+
+ private final short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices
+
+ float color[] = { 0.2f, 0.709803922f, 0.898039216f, 1.0f };
+
+ /**
+ * Sets up the drawing object data for use in an OpenGL ES context.
+ */
+ public Square() {
+ // initialize vertex byte buffer for shape coordinates
+ ByteBuffer bb = ByteBuffer.allocateDirect(
+ // (# of coordinate values * 4 bytes per float)
+ squareCoords.length * 4);
+ bb.order(ByteOrder.nativeOrder());
+ vertexBuffer = bb.asFloatBuffer();
+ vertexBuffer.put(squareCoords);
+ vertexBuffer.position(0);
+
+ // initialize byte buffer for the draw list
+ ByteBuffer dlb = ByteBuffer.allocateDirect(
+ // (# of coordinate values * 2 bytes per short)
+ drawOrder.length * 2);
+ dlb.order(ByteOrder.nativeOrder());
+ drawListBuffer = dlb.asShortBuffer();
+ drawListBuffer.put(drawOrder);
+ drawListBuffer.position(0);
+ }
+
+ /**
+ * Encapsulates the OpenGL ES instructions for drawing this shape.
+ *
+ * @param gl - The OpenGL ES context in which to draw this shape.
+ */
+ public void draw(GL10 gl) {
+ // Since this shape uses vertex arrays, enable them
+ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
+
+ // draw the shape
+ gl.glColor4f( // set color
+ color[0], color[1],
+ color[2], color[3]);
+ gl.glVertexPointer( // point to vertex data:
+ COORDS_PER_VERTEX,
+ GL10.GL_FLOAT, 0, vertexBuffer);
+ gl.glDrawElements( // draw shape:
+ GL10.GL_TRIANGLES,
+ drawOrder.length, GL10.GL_UNSIGNED_SHORT,
+ drawListBuffer);
+
+ // Disable vertex array drawing to avoid
+ // conflicts with shapes that don't use it
+ gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
+ }
+} \ No newline at end of file
diff --git a/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Triangle.java b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Triangle.java
new file mode 100644
index 000000000..e207f9281
--- /dev/null
+++ b/samples/OpenGL/HelloOpenGLES10/src/com/example/android/opengl/Triangle.java
@@ -0,0 +1,85 @@
+/*
+ * 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 java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A two-dimensional triangle for use as a drawn object in OpenGL ES 1.0/1.1.
+ */
+public class Triangle {
+
+ private final FloatBuffer vertexBuffer;
+
+ // number of coordinates per vertex in this array
+ static final int COORDS_PER_VERTEX = 3;
+ static float triangleCoords[] = {
+ // in counterclockwise order:
+ 0.0f, 0.622008459f, 0.0f,// top
+ -0.5f, -0.311004243f, 0.0f,// bottom left
+ 0.5f, -0.311004243f, 0.0f // bottom right
+ };
+
+ float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 0.0f };
+
+ /**
+ * Sets up the drawing object data for use in an OpenGL ES context.
+ */
+ public Triangle() {
+ // initialize vertex byte buffer for shape coordinates
+ ByteBuffer bb = ByteBuffer.allocateDirect(
+ // (number of coordinate values * 4 bytes per float)
+ triangleCoords.length * 4);
+ // use the device hardware's native byte order
+ bb.order(ByteOrder.nativeOrder());
+
+ // create a floating point buffer from the ByteBuffer
+ vertexBuffer = bb.asFloatBuffer();
+ // add the coordinates to the FloatBuffer
+ vertexBuffer.put(triangleCoords);
+ // set the buffer to read the first coordinate
+ vertexBuffer.position(0);
+ }
+
+ /**
+ * Encapsulates the OpenGL ES instructions for drawing this shape.
+ *
+ * @param gl - The OpenGL ES context in which to draw this shape.
+ */
+ public void draw(GL10 gl) {
+ // Since this shape uses vertex arrays, enable them
+ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
+
+ // draw the shape
+ gl.glColor4f( // set color:
+ color[0], color[1],
+ color[2], color[3]);
+ gl.glVertexPointer( // point to vertex data:
+ COORDS_PER_VERTEX,
+ GL10.GL_FLOAT, 0, vertexBuffer);
+ gl.glDrawArrays( // draw shape:
+ GL10.GL_TRIANGLES, 0,
+ triangleCoords.length / COORDS_PER_VERTEX);
+
+ // Disable vertex array drawing to avoid
+ // conflicts with shapes that don't use it
+ gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
+ }
+}