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