1 /*
2  * Copyright (C) 2007 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.android.lightingtest;
18 
19 import java.nio.ByteBuffer;
20 import java.nio.ByteOrder;
21 import java.nio.FloatBuffer;
22 
23 import javax.microedition.khronos.egl.EGL10;
24 import javax.microedition.khronos.egl.EGLConfig;
25 import javax.microedition.khronos.opengles.GL10;
26 
27 import android.app.Activity;
28 import android.content.Context;
29 import android.opengl.GLSurfaceView;
30 import android.os.Bundle;
31 import android.util.Log;
32 import android.view.MotionEvent;
33 
34 public class ClearActivity extends Activity {
35     @Override
onCreate(Bundle savedInstanceState)36     protected void onCreate(Bundle savedInstanceState) {
37         super.onCreate(savedInstanceState);
38         mGLView = new ClearGLSurfaceView(this);
39         setContentView(mGLView);
40     }
41 
42     @Override
onPause()43     protected void onPause() {
44         super.onPause();
45         mGLView.onPause();
46     }
47 
48     @Override
onResume()49     protected void onResume() {
50         super.onResume();
51         mGLView.onResume();
52     }
53     private GLSurfaceView mGLView;
54 }
55 
56 class ClearGLSurfaceView extends GLSurfaceView {
ClearGLSurfaceView(Context context)57     public ClearGLSurfaceView(Context context) {
58         super(context);
59         mRenderer = new ClearRenderer();
60         setRenderer(mRenderer);
61     }
62 
63     ClearRenderer mRenderer;
64 }
65 
66 class ClearRenderer implements GLSurfaceView.Renderer {
ClearRenderer()67     public ClearRenderer() {
68     }
69 
onSurfaceCreated(GL10 gl, EGLConfig config)70     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
71         // Do nothing special.
72     }
73 
onSurfaceChanged(GL10 gl, int w, int h)74     public void onSurfaceChanged(GL10 gl, int w, int h) {
75         // Compute the projection matrix
76         gl.glMatrixMode(GL10.GL_PROJECTION);
77         gl.glLoadIdentity();
78 
79         // Compute the boundaries of the frustum
80         float fl = (float) (-(w / 2)) / 288;
81         float fr = (float) (w / 2) / 288;
82         float ft = (float) (h / 2) / 288;
83         float fb = (float) (-(h / 2)) / 288;
84 
85         // Set the view frustum
86         gl.glFrustumf(fl, fr, fb, ft, 1.0f, 2000.0f);
87 
88         // Set the viewport dimensions
89         gl.glMatrixMode(GL10.GL_MODELVIEW);
90         gl.glLoadIdentity();
91         gl.glViewport(0, 0, w, h);
92     }
93 
onDrawFrame(GL10 gl)94     public void onDrawFrame(GL10 gl) {
95         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
96 
97         final float lightOff[]        = {0.0f, 0.0f,  0.0f, 1.0f};
98         final float lightAmbient[]    = {5.0f, 0.0f,  0.0f, 1.0f};
99         final float lightDiffuse[]    = {0.0f, 2.0f,  0.0f, 0.0f};
100         final float lightPosSpot[]    = {0.0f, 0.0f, -8.0f, 1.0f};
101 
102         final float pos[] = {
103                     -5.0f, -1.5f, 0.0f,
104                      0.0f, -1.5f, 0.0f,
105                      5.0f, -1.5f, 0.0f,
106                 };
107 
108         final float v[] = new float[9];
109         ByteBuffer vbb = ByteBuffer.allocateDirect(v.length*4);
110         vbb.order(ByteOrder.nativeOrder());
111         FloatBuffer vb = vbb.asFloatBuffer();
112 
113         gl.glDisable(GL10.GL_DITHER);
114 
115         gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
116         gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
117         gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightOff, 0);
118         gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosSpot, 0);
119         gl.glEnable(GL10.GL_LIGHT0);
120 
121         gl.glEnable(GL10.GL_LIGHTING);
122 
123 
124         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
125         gl.glNormal3f(0, 0, 1);
126 
127 
128         // draw first 3 triangles, without using transforms
129         for (int i=0 ; i<3 ; i++) {
130             v[0] = -1; v[1] =-1; v[2] = -10;
131             v[3] =  0; v[4] = 1; v[5] = -10;
132             v[6] =  1; v[7] =-1; v[8] = -10;
133             for (int j=0 ; j<3 ; j++) {
134                 v[j*3+0] -= pos[i*3+0];
135                 v[j*3+1] -= pos[i*3+1];
136                 v[j*3+2] -= pos[i*3+2];
137             }
138             vb.put(v).position(0);
139             gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb);
140             gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
141         }
142 
143         // draw the 2nd batch this time with transforms
144         v[0] = -1; v[1] =-1; v[2] = -10;
145         v[3] =  0; v[4] = 1; v[5] = -10;
146         v[6] =  1; v[7] =-1; v[8] = -10;
147         vb.put(v).position(0);
148         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vb);
149 
150         // draw lower left triangle
151         gl.glPushMatrix();
152         gl.glTranslatef(pos[0], pos[1], pos[2]);
153         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
154         gl.glPopMatrix();
155 
156         // draw lower middle triangle
157         gl.glPushMatrix();
158         gl.glTranslatef(pos[3], pos[4], pos[5]);
159         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
160         gl.glPopMatrix();
161 
162         // draw lower right triangle
163         gl.glPushMatrix();
164         gl.glTranslatef(pos[6], pos[7], pos[8]);
165         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
166         gl.glPopMatrix();
167     }
168 
getConfigSpec()169     public int[] getConfigSpec() {
170         int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE };
171         return configSpec;
172     }
173 }
174 
175