/* * Copyright (C) 2007 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.android.lightingtest; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.content.Context; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; public class ClearActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLView = new ClearGLSurfaceView(this); setContentView(mGLView); } @Override protected void onPause() { super.onPause(); mGLView.onPause(); } @Override protected void onResume() { super.onResume(); mGLView.onResume(); } private GLSurfaceView mGLView; } class ClearGLSurfaceView extends GLSurfaceView { public ClearGLSurfaceView(Context context) { super(context); mRenderer = new ClearRenderer(); setRenderer(mRenderer); } ClearRenderer mRenderer; } class ClearRenderer implements GLSurfaceView.Renderer { public ClearRenderer() { } public void onSurfaceCreated(GL10 gl, EGLConfig config) { // Do nothing special. } public void onSurfaceChanged(GL10 gl, int w, int h) { // Compute the projection matrix gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); // Compute the boundaries of the frustum float fl = (float) (-(w / 2)) / 288; float fr = (float) (w / 2) / 288; float ft = (float) (h / 2) / 288; float fb = (float) (-(h / 2)) / 288; // Set the view frustum gl.glFrustumf(fl, fr, fb, ft, 1.0f, 2000.0f); // Set the viewport dimensions gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glViewport(0, 0, w, h); } public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); final float lightOff[] = {0.0f, 0.0f, 0.0f, 1.0f}; final float lightAmbient[] = {5.0f, 0.0f, 0.0f, 1.0f}; final float lightDiffuse[] = {0.0f, 2.0f, 0.0f, 0.0f}; final float lightPosSpot[] = {0.0f, 0.0f, -8.0f, 1.0f}; final float pos[] = { -5.0f, -1.5f, 0.0f, 0.0f, -1.5f, 0.0f, 5.0f, -1.5f, 0.0f, }; final float v[] = new float[9]; ByteBuffer vbb = ByteBuffer.allocateDirect(v.length*4); vbb.order(ByteOrder.nativeOrder()); FloatBuffer vb = vbb.asFloatBuffer(); gl.glDisable(GL10.GL_DITHER); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightOff, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosSpot, 0); gl.glEnable(GL10.GL_LIGHT0); gl.glEnable(GL10.GL_LIGHTING); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glNormal3f(0, 0, 1); // draw first 3 triangles, without using transforms for (int i=0 ; i<3 ; i++) { v[0] = -1; v[1] =-1; v[2] = -10; v[3] = 0; v[4] = 1; v[5] = -10; v[6] = 1; v[7] =-1; v[8] = -10; for (int j=0 ; j<3 ; j++) { v[j*3+0] -= pos[i*3+0]; v[j*3+1] -= pos[i*3+1]; v[j*3+2] -= pos[i*3+2]; } vb.put(v).position(0); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); } // draw the 2nd batch this time with transforms v[0] = -1; v[1] =-1; v[2] = -10; v[3] = 0; v[4] = 1; v[5] = -10; v[6] = 1; v[7] =-1; v[8] = -10; vb.put(v).position(0); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb); // draw lower left triangle gl.glPushMatrix(); gl.glTranslatef(pos[0], pos[1], pos[2]); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); gl.glPopMatrix(); // draw lower middle triangle gl.glPushMatrix(); gl.glTranslatef(pos[3], pos[4], pos[5]); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); gl.glPopMatrix(); // draw lower right triangle gl.glPushMatrix(); gl.glTranslatef(pos[6], pos[7], pos[8]); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); gl.glPopMatrix(); } public int[] getConfigSpec() { int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE }; return configSpec; } }