146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian/* 246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * Copyright (C) 2007 The Android Open Source Project 346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * 446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * you may not use this file except in compliance with the License. 646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * You may obtain a copy of the License at 746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * 846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * 1046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * Unless required by applicable law or agreed to in writing, software 1146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 1246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * See the License for the specific language governing permissions and 1446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian * limitations under the License. 1546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian */ 1646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 1746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianpackage com.android.lightingtest; 1846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 1946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport java.nio.ByteBuffer; 2046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport java.nio.ByteOrder; 2146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport java.nio.FloatBuffer; 2246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 2346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport javax.microedition.khronos.egl.EGL10; 2446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport javax.microedition.khronos.egl.EGLConfig; 2546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport javax.microedition.khronos.opengles.GL10; 2646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 2746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport android.app.Activity; 2846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport android.content.Context; 2946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport android.opengl.GLSurfaceView; 3046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport android.os.Bundle; 3146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport android.util.Log; 3246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianimport android.view.MotionEvent; 3346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 3446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianpublic class ClearActivity extends Activity { 3546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian @Override 3646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian protected void onCreate(Bundle savedInstanceState) { 3746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian super.onCreate(savedInstanceState); 3846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian mGLView = new ClearGLSurfaceView(this); 3946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian setContentView(mGLView); 4046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 4146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 4246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian @Override 4346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian protected void onPause() { 4446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian super.onPause(); 4546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian mGLView.onPause(); 4646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 4746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 4846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian @Override 4946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian protected void onResume() { 5046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian super.onResume(); 5146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian mGLView.onResume(); 5246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 5346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian private GLSurfaceView mGLView; 5446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian} 5546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 5646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianclass ClearGLSurfaceView extends GLSurfaceView { 5746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian public ClearGLSurfaceView(Context context) { 5846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian super(context); 5946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian mRenderer = new ClearRenderer(); 6046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian setRenderer(mRenderer); 6146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 6246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 6346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian ClearRenderer mRenderer; 6446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian} 6546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 6646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopianclass ClearRenderer implements GLSurfaceView.Renderer { 6746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian public ClearRenderer() { 6846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 6946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 7046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian public void onSurfaceCreated(GL10 gl, EGLConfig config) { 7146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // Do nothing special. 7246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 7346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 7446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian public void onSurfaceChanged(GL10 gl, int w, int h) { 7546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // Compute the projection matrix 7646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glMatrixMode(GL10.GL_PROJECTION); 7746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glLoadIdentity(); 7846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 7946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // Compute the boundaries of the frustum 8046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian float fl = (float) (-(w / 2)) / 288; 8146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian float fr = (float) (w / 2) / 288; 8246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian float ft = (float) (h / 2) / 288; 8346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian float fb = (float) (-(h / 2)) / 288; 8446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 8546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // Set the view frustum 8646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glFrustumf(fl, fr, fb, ft, 1.0f, 2000.0f); 8746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 8846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // Set the viewport dimensions 8946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glMatrixMode(GL10.GL_MODELVIEW); 9046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glLoadIdentity(); 9146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glViewport(0, 0, w, h); 9246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 9346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 9446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian public void onDrawFrame(GL10 gl) { 9546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 9646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 97de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian final float lightOff[] = {0.0f, 0.0f, 0.0f, 1.0f}; 98de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian final float lightAmbient[] = {5.0f, 0.0f, 0.0f, 1.0f}; 99de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian final float lightDiffuse[] = {0.0f, 2.0f, 0.0f, 0.0f}; 100de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian final float lightPosSpot[] = {0.0f, 0.0f, -8.0f, 1.0f}; 10146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 102de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian final float pos[] = { 103de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian -5.0f, -1.5f, 0.0f, 104de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian 0.0f, -1.5f, 0.0f, 105de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian 5.0f, -1.5f, 0.0f, 106de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian }; 10746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 108de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian final float v[] = new float[9]; 10946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian ByteBuffer vbb = ByteBuffer.allocateDirect(v.length*4); 11046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian vbb.order(ByteOrder.nativeOrder()); 11146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian FloatBuffer vb = vbb.asFloatBuffer(); 11246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 11346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glDisable(GL10.GL_DITHER); 11446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 11546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0); 116de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0); 117de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightOff, 0); 118de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosSpot, 0); 11946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glEnable(GL10.GL_LIGHT0); 120de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian 12146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glEnable(GL10.GL_LIGHTING); 12246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 12346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 12446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 12546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glNormal3f(0, 0, 1); 126de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian 12746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 128de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian // draw first 3 triangles, without using transforms 129de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian for (int i=0 ; i<3 ; i++) { 130de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[0] = -1; v[1] =-1; v[2] = -10; 131de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[3] = 0; v[4] = 1; v[5] = -10; 132de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[6] = 1; v[7] =-1; v[8] = -10; 133de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian for (int j=0 ; j<3 ; j++) { 134de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[j*3+0] -= pos[i*3+0]; 135de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[j*3+1] -= pos[i*3+1]; 136de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[j*3+2] -= pos[i*3+2]; 137de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian } 138de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian vb.put(v).position(0); 139de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb); 140de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 141de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian } 142de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian 143de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian // draw the 2nd batch this time with transforms 144de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[0] = -1; v[1] =-1; v[2] = -10; 145de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[3] = 0; v[4] = 1; v[5] = -10; 146de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian v[6] = 1; v[7] =-1; v[8] = -10; 14746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian vb.put(v).position(0); 14846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb); 14946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 15046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // draw lower left triangle 15146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glPushMatrix(); 152de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glTranslatef(pos[0], pos[1], pos[2]); 15346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 15446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glPopMatrix(); 15546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 15646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // draw lower middle triangle 15746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glPushMatrix(); 158de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glTranslatef(pos[3], pos[4], pos[5]); 15946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 16046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glPopMatrix(); 16146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 16246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian // draw lower right triangle 16346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glPushMatrix(); 164de15ddc86ce4d3c3acdff297c75ef56f65e10457Mathias Agopian gl.glTranslatef(pos[6], pos[7], pos[8]); 16546d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); 16646d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian gl.glPopMatrix(); 16746d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 16846d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 16946d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian public int[] getConfigSpec() { 17046d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE }; 17146d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian return configSpec; 17246d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian } 17346d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian} 17446d7ccb403f416fbebf22c8ea2669a9d00fc74f7Mathias Agopian 175