152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/*
252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * you may not use this file except in compliance with the License.
652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * You may obtain a copy of the License at
752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * See the License for the specific language governing permissions and
1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * limitations under the License.
1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpackage com.example.android.apis.graphics.kube;
1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.opengl.GLSurfaceView;
2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport javax.microedition.khronos.egl.EGLConfig;
2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport javax.microedition.khronos.opengles.GL10;
2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/**
2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Example of how to use OpenGL|ES in a custom view
2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectclass KubeRenderer implements GLSurfaceView.Renderer {
3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public interface AnimationCallback {
3152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        void animate();
3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public KubeRenderer(GLWorld world, AnimationCallback callback) {
3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        mWorld = world;
3652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        mCallback = callback;
3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public void onDrawFrame(GL10 gl) {
4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         if (mCallback != null) {
4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project             mCallback.animate();
4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         }
4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /*
4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * Usually, the first thing one might want to do is to clear
4652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * the screen. The most efficient way of doing this is to use
4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * glClear(). However we must make sure to set the scissor
4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * correctly first. The scissor is always specified in window
4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * coordinates:
5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
5152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glClearColor(0.5f,0.5f,0.5f,1);
5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /*
5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * Now we're ready to draw some 3D object
5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glMatrixMode(GL10.GL_MODELVIEW);
6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glLoadIdentity();
6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glTranslatef(0, 0, -3.0f);
6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glScalef(0.5f, 0.5f, 0.5f);
6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glRotatef(mAngle,        0, 1, 0);
6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glRotatef(mAngle*0.25f,  1, 0, 0);
6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
6652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glColor4f(0.7f, 0.7f, 0.7f, 1.0f);
6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glEnable(GL10.GL_CULL_FACE);
7052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glShadeModel(GL10.GL_SMOOTH);
7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glEnable(GL10.GL_DEPTH_TEST);
7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        mWorld.draw(gl);
7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
7552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public void onSurfaceChanged(GL10 gl, int width, int height) {
7752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glViewport(0, 0, width, height);
7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /*
8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * Set our projection matrix. This doesn't have to be done
8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * each time we draw, but usually a new projection needs to be set
8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * when the viewport is resized.
8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        float ratio = (float)width / height;
8652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glMatrixMode(GL10.GL_PROJECTION);
8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glLoadIdentity();
8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glFrustumf(-ratio, ratio, -1, 1, 2, 12);
8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /*
9152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * By default, OpenGL enables features that improve quality
9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * but reduce performance. One might want to tweak that
9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * especially on software renderer.
9452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glDisable(GL10.GL_DITHER);
9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        gl.glActiveTexture(GL10.GL_TEXTURE0);
9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
9852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
10052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        // Nothing special, don't have any textures we need to recreate.
10152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public void setAngle(float angle) {
10452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        mAngle = angle;
10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public float getAngle() {
10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        return mAngle;
10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    private GLWorld mWorld;
11252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    private AnimationCallback mCallback;
11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    private float mAngle;
11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project}
11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
11652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
117