14d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian/* 24d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * Copyright (C) 2007 The Android Open Source Project 34d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * 44d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 54d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * you may not use this file except in compliance with the License. 64d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * You may obtain a copy of the License at 74d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * 84d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 94d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * 104d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * Unless required by applicable law or agreed to in writing, software 114d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 124d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * See the License for the specific language governing permissions and 144d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian * limitations under the License. 154d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian */ 164d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 174d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianpackage com.android.lightingtest; 184d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 194d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport java.nio.ByteBuffer; 204d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport java.nio.ByteOrder; 214d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport java.nio.FloatBuffer; 224d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 234d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport javax.microedition.khronos.egl.EGL10; 244d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport javax.microedition.khronos.egl.EGLConfig; 254d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport javax.microedition.khronos.opengles.GL10; 264d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 274d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport android.app.Activity; 284d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport android.content.Context; 294d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport android.opengl.GLSurfaceView; 304d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport android.os.Bundle; 314d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport android.util.Log; 324d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianimport android.view.MotionEvent; 334d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 344d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianpublic class ClearActivity extends Activity { 354d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian @Override 364d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian protected void onCreate(Bundle savedInstanceState) { 374d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian super.onCreate(savedInstanceState); 384d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian mGLView = new ClearGLSurfaceView(this); 394d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian setContentView(mGLView); 404d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 414d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 424d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian @Override 434d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian protected void onPause() { 444d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian super.onPause(); 454d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian mGLView.onPause(); 464d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 474d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 484d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian @Override 494d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian protected void onResume() { 504d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian super.onResume(); 514d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian mGLView.onResume(); 524d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 534d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian private GLSurfaceView mGLView; 544d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian} 554d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 564d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianclass ClearGLSurfaceView extends GLSurfaceView { 574d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian public ClearGLSurfaceView(Context context) { 584d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian super(context); 594d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian mRenderer = new ClearRenderer(); 604d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian setRenderer(mRenderer); 614d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 624d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 634d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian ClearRenderer mRenderer; 644d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian} 654d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 664d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopianclass ClearRenderer implements GLSurfaceView.Renderer { 674d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian public ClearRenderer() { 684d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 694d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 704d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian public void onSurfaceCreated(GL10 gl, EGLConfig config) { 714d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // Do nothing special. 724d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 734d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 744d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian public void onSurfaceChanged(GL10 gl, int w, int h) { 754d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // Compute the projection matrix 764d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glMatrixMode(GL10.GL_PROJECTION); 774d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glLoadIdentity(); 784d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 794d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // Compute the boundaries of the frustum 804d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian float fl = (float) (-(w / 2)) / 288; 814d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian float fr = (float) (w / 2) / 288; 824d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian float ft = (float) (h / 2) / 288; 834d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian float fb = (float) (-(h / 2)) / 288; 844d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 854d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // Set the view frustum 864d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glFrustumf(fl, fr, fb, ft, 1.0f, 2000.0f); 874d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 884d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // Set the viewport dimensions 894d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glMatrixMode(GL10.GL_MODELVIEW); 904d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glLoadIdentity(); 914d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glViewport(0, 0, w, h); 924d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 934d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 944d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian public void onDrawFrame(GL10 gl) { 954d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 964d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 9717836acabf2024b4d124db955811eed6e3604853Mathias Agopian final float lightOff[] = {0.0f, 0.0f, 0.0f, 1.0f}; 9817836acabf2024b4d124db955811eed6e3604853Mathias Agopian final float lightAmbient[] = {5.0f, 0.0f, 0.0f, 1.0f}; 9917836acabf2024b4d124db955811eed6e3604853Mathias Agopian final float lightDiffuse[] = {0.0f, 2.0f, 0.0f, 0.0f}; 10017836acabf2024b4d124db955811eed6e3604853Mathias Agopian final float lightPosSpot[] = {0.0f, 0.0f, -8.0f, 1.0f}; 1014d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 10217836acabf2024b4d124db955811eed6e3604853Mathias Agopian final float pos[] = { 10317836acabf2024b4d124db955811eed6e3604853Mathias Agopian -5.0f, -1.5f, 0.0f, 10417836acabf2024b4d124db955811eed6e3604853Mathias Agopian 0.0f, -1.5f, 0.0f, 10517836acabf2024b4d124db955811eed6e3604853Mathias Agopian 5.0f, -1.5f, 0.0f, 10617836acabf2024b4d124db955811eed6e3604853Mathias Agopian }; 1074d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 10817836acabf2024b4d124db955811eed6e3604853Mathias Agopian final float v[] = new float[9]; 1094d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian ByteBuffer vbb = ByteBuffer.allocateDirect(v.length*4); 1104d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian vbb.order(ByteOrder.nativeOrder()); 1114d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian FloatBuffer vb = vbb.asFloatBuffer(); 1124d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1134d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glDisable(GL10.GL_DITHER); 1144d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1154d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0); 11617836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0); 11717836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightOff, 0); 11817836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosSpot, 0); 1194d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glEnable(GL10.GL_LIGHT0); 12017836acabf2024b4d124db955811eed6e3604853Mathias Agopian 1214d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glEnable(GL10.GL_LIGHTING); 1224d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1234d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1244d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 1254d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glNormal3f(0, 0, 1); 12617836acabf2024b4d124db955811eed6e3604853Mathias Agopian 1274d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 12817836acabf2024b4d124db955811eed6e3604853Mathias Agopian // draw first 3 triangles, without using transforms 12917836acabf2024b4d124db955811eed6e3604853Mathias Agopian for (int i=0 ; i<3 ; i++) { 13017836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[0] = -1; v[1] =-1; v[2] = -10; 13117836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[3] = 0; v[4] = 1; v[5] = -10; 13217836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[6] = 1; v[7] =-1; v[8] = -10; 13317836acabf2024b4d124db955811eed6e3604853Mathias Agopian for (int j=0 ; j<3 ; j++) { 13417836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[j*3+0] -= pos[i*3+0]; 13517836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[j*3+1] -= pos[i*3+1]; 13617836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[j*3+2] -= pos[i*3+2]; 13717836acabf2024b4d124db955811eed6e3604853Mathias Agopian } 13817836acabf2024b4d124db955811eed6e3604853Mathias Agopian vb.put(v).position(0); 13917836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb); 14017836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 14117836acabf2024b4d124db955811eed6e3604853Mathias Agopian } 14217836acabf2024b4d124db955811eed6e3604853Mathias Agopian 14317836acabf2024b4d124db955811eed6e3604853Mathias Agopian // draw the 2nd batch this time with transforms 14417836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[0] = -1; v[1] =-1; v[2] = -10; 14517836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[3] = 0; v[4] = 1; v[5] = -10; 14617836acabf2024b4d124db955811eed6e3604853Mathias Agopian v[6] = 1; v[7] =-1; v[8] = -10; 1474d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian vb.put(v).position(0); 1484d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb); 1494d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1504d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // draw lower left triangle 1514d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glPushMatrix(); 15217836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glTranslatef(pos[0], pos[1], pos[2]); 1534d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 1544d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glPopMatrix(); 1554d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1564d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // draw lower middle triangle 1574d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glPushMatrix(); 15817836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glTranslatef(pos[3], pos[4], pos[5]); 1594d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 1604d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glPopMatrix(); 1614d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1624d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian // draw lower right triangle 1634d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glPushMatrix(); 16417836acabf2024b4d124db955811eed6e3604853Mathias Agopian gl.glTranslatef(pos[6], pos[7], pos[8]); 1654d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 1664d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian gl.glPopMatrix(); 1674d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 1684d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 1694d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian public int[] getConfigSpec() { 1704d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE }; 1714d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian return configSpec; 1724d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian } 1734d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian} 1744d661eb62c0e52f0a6105f3898bafe68a2e82f54Mathias Agopian 175