development
Revisão | f74109fc37b7be67f07c9bed06114b549347da07 (tree) |
---|---|
Hora | 2011-01-18 16:31:34 |
Autor | Jack Palevich <jackpal@goog...> |
Commiter | Android Git Automerger |
am 80ea3ea8: am 2fd42883: am 5e38995f: Merge "Add BasicGLSurfaceView sample." into gingerbread
* commit '80ea3ea8e1ad5e9d5189a1136b380d162999e2a8':
@@ -154,6 +154,7 @@ development/samples/AccessibilityService samples/${PLATFORM_NAME}/Accessibil | ||
154 | 154 | development/samples/AccelerometerPlay samples/${PLATFORM_NAME}/AccelerometerPlay |
155 | 155 | development/samples/ApiDemos samples/${PLATFORM_NAME}/ApiDemos |
156 | 156 | development/samples/BackupRestore samples/${PLATFORM_NAME}/BackupRestore |
157 | +development/samples/BasicGLSurfaceView samples/${PLATFORM_NAME}/BasicGLSurfaceView | |
157 | 158 | development/samples/BluetoothChat samples/${PLATFORM_NAME}/BluetoothChat |
158 | 159 | development/samples/ContactManager samples/${PLATFORM_NAME}/ContactManager |
159 | 160 | development/samples/CrossCompatibility samples/${PLATFORM_NAME}/CrossCompatibility |
@@ -0,0 +1,13 @@ | ||
1 | +LOCAL_PATH:= $(call my-dir) | |
2 | +include $(CLEAR_VARS) | |
3 | + | |
4 | +LOCAL_MODULE_TAGS := samples | |
5 | + | |
6 | +# Only compile source java files in this apk. | |
7 | +LOCAL_SRC_FILES := $(call all-java-files-under, src) | |
8 | + | |
9 | +LOCAL_PACKAGE_NAME := BasicGLSurfaceView | |
10 | + | |
11 | +LOCAL_SDK_VERSION := current | |
12 | + | |
13 | +include $(BUILD_PACKAGE) |
@@ -0,0 +1,36 @@ | ||
1 | +<?xml version="1.0" encoding="utf-8"?> | |
2 | +<!-- | |
3 | +/* | |
4 | +** | |
5 | +** Copyright 2011, The Android Open Source Project | |
6 | +** | |
7 | +** Licensed under the Apache License, Version 2.0 (the "License"); | |
8 | +** you may not use this file except in compliance with the License. | |
9 | +** You may obtain a copy of the License at | |
10 | +** | |
11 | +** http://www.apache.org/licenses/LICENSE-2.0 | |
12 | +** | |
13 | +** Unless required by applicable law or agreed to in writing, software | |
14 | +** distributed under the License is distributed on an "AS IS" BASIS, | |
15 | +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
16 | +** See the License for the specific language governing permissions and | |
17 | +** limitations under the License. | |
18 | +*/ | |
19 | +--> | |
20 | + | |
21 | +<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
22 | + package="com.example.android.basicglsurfaceview"> | |
23 | + <uses-feature android:glEsVersion="0x00020000" /> | |
24 | + <application | |
25 | + android:label="@string/app_name"> | |
26 | + <activity android:name="BasicGLSurfaceViewActivity" | |
27 | + android:theme="@android:style/Theme.NoTitleBar.Fullscreen" | |
28 | + android:launchMode="singleTask" | |
29 | + android:configChanges="orientation|keyboardHidden"> | |
30 | + <intent-filter> | |
31 | + <action android:name="android.intent.action.MAIN" /> | |
32 | + <category android:name="android.intent.category.LAUNCHER" /> | |
33 | + </intent-filter> | |
34 | + </activity> | |
35 | + </application> | |
36 | +</manifest> |
@@ -0,0 +1,29 @@ | ||
1 | +<?xml version="1.0" encoding="utf-8"?> | |
2 | +<!-- | |
3 | +/* | |
4 | +** | |
5 | +** Copyright 2011, The Android Open Source Project | |
6 | +** | |
7 | +** Licensed under the Apache License, Version 2.0 (the "License"); | |
8 | +** you may not use this file except in compliance with the License. | |
9 | +** You may obtain a copy of the License at | |
10 | +** | |
11 | +** http://www.apache.org/licenses/LICENSE-2.0 | |
12 | +** | |
13 | +** Unless required by applicable law or agreed to in writing, software | |
14 | +** distributed under the License is distributed on an "AS IS" BASIS, | |
15 | +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
16 | +** See the License for the specific language governing permissions and | |
17 | +** limitations under the License. | |
18 | +*/ | |
19 | +--> | |
20 | + | |
21 | +<!-- This file contains resource definitions for displayed strings, allowing | |
22 | + them to be changed based on the locale and options. --> | |
23 | + | |
24 | +<resources> | |
25 | + <!-- Simple strings. --> | |
26 | + <string name="app_name">Basic GLSurfaceView</string> | |
27 | + | |
28 | +</resources> | |
29 | + |
@@ -0,0 +1,31 @@ | ||
1 | +/* | |
2 | + * Copyright (C) 2011 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.example.android.basicglsurfaceview; | |
18 | + | |
19 | +import android.content.Context; | |
20 | +import android.opengl.GLSurfaceView; | |
21 | + | |
22 | +import android.opengl.GLES20; | |
23 | + | |
24 | +class BasicGLSurfaceView extends GLSurfaceView { | |
25 | + public BasicGLSurfaceView(Context context) { | |
26 | + super(context); | |
27 | + setEGLContextClientVersion(2); | |
28 | + setRenderer(new GLES20TriangleRenderer(context)); | |
29 | + } | |
30 | +} | |
31 | + |
@@ -0,0 +1,48 @@ | ||
1 | +/* | |
2 | + * Copyright (C) 2011 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.example.android.basicglsurfaceview; | |
18 | + | |
19 | +import android.app.Activity; | |
20 | +import android.os.Bundle; | |
21 | +import android.view.WindowManager; | |
22 | + | |
23 | +import java.io.File; | |
24 | + | |
25 | + | |
26 | +public class BasicGLSurfaceViewActivity extends Activity { | |
27 | + | |
28 | + private BasicGLSurfaceView mView; | |
29 | + | |
30 | + @Override | |
31 | + protected void onCreate(Bundle icicle) { | |
32 | + super.onCreate(icicle); | |
33 | + mView = new BasicGLSurfaceView(getApplication()); | |
34 | + setContentView(mView); | |
35 | + } | |
36 | + | |
37 | + @Override | |
38 | + protected void onPause() { | |
39 | + super.onPause(); | |
40 | + mView.onPause(); | |
41 | + } | |
42 | + | |
43 | + @Override | |
44 | + protected void onResume() { | |
45 | + super.onResume(); | |
46 | + mView.onResume(); | |
47 | + } | |
48 | +} |
@@ -0,0 +1,253 @@ | ||
1 | +/* | |
2 | + * Copyright (C) 2011 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.example.android.basicglsurfaceview; | |
18 | + | |
19 | +import java.io.IOException; | |
20 | +import java.io.InputStream; | |
21 | +import java.nio.ByteBuffer; | |
22 | +import java.nio.ByteOrder; | |
23 | +import java.nio.FloatBuffer; | |
24 | + | |
25 | +import javax.microedition.khronos.egl.EGLConfig; | |
26 | +import javax.microedition.khronos.opengles.GL10; | |
27 | + | |
28 | +import android.content.Context; | |
29 | +import android.graphics.Bitmap; | |
30 | +import android.graphics.BitmapFactory; | |
31 | +import android.opengl.GLES20; | |
32 | +import android.opengl.GLSurfaceView; | |
33 | +import android.opengl.GLUtils; | |
34 | +import android.opengl.Matrix; | |
35 | +import android.os.SystemClock; | |
36 | +import android.util.Log; | |
37 | + | |
38 | +class GLES20TriangleRenderer implements GLSurfaceView.Renderer { | |
39 | + | |
40 | + public GLES20TriangleRenderer(Context context) { | |
41 | + mContext = context; | |
42 | + mTriangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length | |
43 | + * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
44 | + mTriangleVertices.put(mTriangleVerticesData).position(0); | |
45 | + } | |
46 | + | |
47 | + public void onDrawFrame(GL10 glUnused) { | |
48 | + // Ignore the passed-in GL10 interface, and use the GLES20 | |
49 | + // class's static methods instead. | |
50 | + GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); | |
51 | + GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); | |
52 | + GLES20.glUseProgram(mProgram); | |
53 | + checkGlError("glUseProgram"); | |
54 | + | |
55 | + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); | |
56 | + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID); | |
57 | + | |
58 | + mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); | |
59 | + GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, | |
60 | + TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); | |
61 | + checkGlError("glVertexAttribPointer maPosition"); | |
62 | + mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); | |
63 | + GLES20.glEnableVertexAttribArray(maPositionHandle); | |
64 | + checkGlError("glEnableVertexAttribArray maPositionHandle"); | |
65 | + GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, | |
66 | + TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); | |
67 | + checkGlError("glVertexAttribPointer maTextureHandle"); | |
68 | + GLES20.glEnableVertexAttribArray(maTextureHandle); | |
69 | + checkGlError("glEnableVertexAttribArray maTextureHandle"); | |
70 | + | |
71 | + long time = SystemClock.uptimeMillis() % 4000L; | |
72 | + float angle = 0.090f * ((int) time); | |
73 | + Matrix.setRotateM(mMMatrix, 0, angle, 0, 0, 1.0f); | |
74 | + Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0); | |
75 | + Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0); | |
76 | + | |
77 | + GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); | |
78 | + GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3); | |
79 | + checkGlError("glDrawArrays"); | |
80 | + } | |
81 | + | |
82 | + public void onSurfaceChanged(GL10 glUnused, int width, int height) { | |
83 | + // Ignore the passed-in GL10 interface, and use the GLES20 | |
84 | + // class's static methods instead. | |
85 | + GLES20.glViewport(0, 0, width, height); | |
86 | + float ratio = (float) width / height; | |
87 | + Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); | |
88 | + } | |
89 | + | |
90 | + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { | |
91 | + // Ignore the passed-in GL10 interface, and use the GLES20 | |
92 | + // class's static methods instead. | |
93 | + mProgram = createProgram(mVertexShader, mFragmentShader); | |
94 | + if (mProgram == 0) { | |
95 | + return; | |
96 | + } | |
97 | + maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); | |
98 | + checkGlError("glGetAttribLocation aPosition"); | |
99 | + if (maPositionHandle == -1) { | |
100 | + throw new RuntimeException("Could not get attrib location for aPosition"); | |
101 | + } | |
102 | + maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord"); | |
103 | + checkGlError("glGetAttribLocation aTextureCoord"); | |
104 | + if (maTextureHandle == -1) { | |
105 | + throw new RuntimeException("Could not get attrib location for aTextureCoord"); | |
106 | + } | |
107 | + | |
108 | + muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); | |
109 | + checkGlError("glGetUniformLocation uMVPMatrix"); | |
110 | + if (muMVPMatrixHandle == -1) { | |
111 | + throw new RuntimeException("Could not get attrib location for uMVPMatrix"); | |
112 | + } | |
113 | + | |
114 | + /* | |
115 | + * Create our texture. This has to be done each time the | |
116 | + * surface is created. | |
117 | + */ | |
118 | + | |
119 | + int[] textures = new int[1]; | |
120 | + GLES20.glGenTextures(1, textures, 0); | |
121 | + | |
122 | + mTextureID = textures[0]; | |
123 | + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID); | |
124 | + | |
125 | + GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, | |
126 | + GLES20.GL_NEAREST); | |
127 | + GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, | |
128 | + GLES20.GL_TEXTURE_MAG_FILTER, | |
129 | + GLES20.GL_LINEAR); | |
130 | + | |
131 | + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, | |
132 | + GLES20.GL_REPEAT); | |
133 | + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, | |
134 | + GLES20.GL_REPEAT); | |
135 | + | |
136 | + InputStream is = mContext.getResources() | |
137 | + .openRawResource(R.raw.robot); | |
138 | + Bitmap bitmap; | |
139 | + try { | |
140 | + bitmap = BitmapFactory.decodeStream(is); | |
141 | + } finally { | |
142 | + try { | |
143 | + is.close(); | |
144 | + } catch(IOException e) { | |
145 | + // Ignore. | |
146 | + } | |
147 | + } | |
148 | + | |
149 | + GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); | |
150 | + bitmap.recycle(); | |
151 | + | |
152 | + Matrix.setLookAtM(mVMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); | |
153 | + } | |
154 | + | |
155 | + private int loadShader(int shaderType, String source) { | |
156 | + int shader = GLES20.glCreateShader(shaderType); | |
157 | + if (shader != 0) { | |
158 | + GLES20.glShaderSource(shader, source); | |
159 | + GLES20.glCompileShader(shader); | |
160 | + int[] compiled = new int[1]; | |
161 | + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); | |
162 | + if (compiled[0] == 0) { | |
163 | + Log.e(TAG, "Could not compile shader " + shaderType + ":"); | |
164 | + Log.e(TAG, GLES20.glGetShaderInfoLog(shader)); | |
165 | + GLES20.glDeleteShader(shader); | |
166 | + shader = 0; | |
167 | + } | |
168 | + } | |
169 | + return shader; | |
170 | + } | |
171 | + | |
172 | + private int createProgram(String vertexSource, String fragmentSource) { | |
173 | + int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource); | |
174 | + if (vertexShader == 0) { | |
175 | + return 0; | |
176 | + } | |
177 | + | |
178 | + int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); | |
179 | + if (pixelShader == 0) { | |
180 | + return 0; | |
181 | + } | |
182 | + | |
183 | + int program = GLES20.glCreateProgram(); | |
184 | + if (program != 0) { | |
185 | + GLES20.glAttachShader(program, vertexShader); | |
186 | + checkGlError("glAttachShader"); | |
187 | + GLES20.glAttachShader(program, pixelShader); | |
188 | + checkGlError("glAttachShader"); | |
189 | + GLES20.glLinkProgram(program); | |
190 | + int[] linkStatus = new int[1]; | |
191 | + GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); | |
192 | + if (linkStatus[0] != GLES20.GL_TRUE) { | |
193 | + Log.e(TAG, "Could not link program: "); | |
194 | + Log.e(TAG, GLES20.glGetProgramInfoLog(program)); | |
195 | + GLES20.glDeleteProgram(program); | |
196 | + program = 0; | |
197 | + } | |
198 | + } | |
199 | + return program; | |
200 | + } | |
201 | + | |
202 | + private void checkGlError(String op) { | |
203 | + int error; | |
204 | + while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { | |
205 | + Log.e(TAG, op + ": glError " + error); | |
206 | + throw new RuntimeException(op + ": glError " + error); | |
207 | + } | |
208 | + } | |
209 | + | |
210 | + private static final int FLOAT_SIZE_BYTES = 4; | |
211 | + private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES; | |
212 | + private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0; | |
213 | + private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3; | |
214 | + private final float[] mTriangleVerticesData = { | |
215 | + // X, Y, Z, U, V | |
216 | + -1.0f, -0.5f, 0, -0.5f, 0.0f, | |
217 | + 1.0f, -0.5f, 0, 1.5f, -0.0f, | |
218 | + 0.0f, 1.11803399f, 0, 0.5f, 1.61803399f }; | |
219 | + | |
220 | + private FloatBuffer mTriangleVertices; | |
221 | + | |
222 | + private final String mVertexShader = | |
223 | + "uniform mat4 uMVPMatrix;\n" + | |
224 | + "attribute vec4 aPosition;\n" + | |
225 | + "attribute vec2 aTextureCoord;\n" + | |
226 | + "varying vec2 vTextureCoord;\n" + | |
227 | + "void main() {\n" + | |
228 | + " gl_Position = uMVPMatrix * aPosition;\n" + | |
229 | + " vTextureCoord = aTextureCoord;\n" + | |
230 | + "}\n"; | |
231 | + | |
232 | + private final String mFragmentShader = | |
233 | + "precision mediump float;\n" + | |
234 | + "varying vec2 vTextureCoord;\n" + | |
235 | + "uniform sampler2D sTexture;\n" + | |
236 | + "void main() {\n" + | |
237 | + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + | |
238 | + "}\n"; | |
239 | + | |
240 | + private float[] mMVPMatrix = new float[16]; | |
241 | + private float[] mProjMatrix = new float[16]; | |
242 | + private float[] mMMatrix = new float[16]; | |
243 | + private float[] mVMatrix = new float[16]; | |
244 | + | |
245 | + private int mProgram; | |
246 | + private int mTextureID; | |
247 | + private int muMVPMatrixHandle; | |
248 | + private int maPositionHandle; | |
249 | + private int maTextureHandle; | |
250 | + | |
251 | + private Context mContext; | |
252 | + private static String TAG = "GLES20TriangleRenderer"; | |
253 | +} |