1d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian/*
2d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * Copyright (C) 2007 The Android Open Source Project
3d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian *
4d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * you may not use this file except in compliance with the License.
6d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * You may obtain a copy of the License at
7d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian *
8d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian *
10d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * Unless required by applicable law or agreed to in writing, software
11d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * See the License for the specific language governing permissions and
14d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * limitations under the License.
15d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian */
16d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
17d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianpackage com.example.android.apis.os;
18d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
19d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport java.nio.ByteBuffer;
20d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport java.nio.ByteOrder;
21d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport java.nio.FloatBuffer;
22d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport javax.microedition.khronos.egl.EGLConfig;
23d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport javax.microedition.khronos.opengles.GL10;
24d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.app.Activity;
25d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.hardware.Sensor;
26d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.hardware.SensorEvent;
27d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.hardware.SensorEventListener;
28d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.hardware.SensorManager;
29d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.opengl.GLSurfaceView;
30d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianimport android.os.Bundle;
31d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
32d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian/**
33d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * Wrapper activity demonstrating the use of the new
34d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * {@link SensorEvent#values rotation vector sensor}
35d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * ({@link Sensor#TYPE_ROTATION_VECTOR TYPE_ROTATION_VECTOR}).
36d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian *
37d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * @see Sensor
38d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * @see SensorEvent
39d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian * @see SensorManager
40d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian *
41d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian */
42d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopianpublic class RotationVectorDemo extends Activity {
43d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    private GLSurfaceView mGLSurfaceView;
44d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    private SensorManager mSensorManager;
45d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    private MyRenderer mRenderer;
46d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
47d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    @Override
48d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    protected void onCreate(Bundle savedInstanceState) {
49d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        super.onCreate(savedInstanceState);
50d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
51d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // Get an instance of the SensorManager
52d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
53d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
54d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // Create our Preview view and set it as the content of our
55d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // Activity
56d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mRenderer = new MyRenderer();
57d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mGLSurfaceView = new GLSurfaceView(this);
58d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mGLSurfaceView.setRenderer(mRenderer);
59d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        setContentView(mGLSurfaceView);
60d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    }
61d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
62d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    @Override
63d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    protected void onResume() {
64d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // Ideally a game should implement onResume() and onPause()
65d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // to take appropriate action when the activity looses focus
66d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        super.onResume();
67d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mRenderer.start();
68d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mGLSurfaceView.onResume();
69d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    }
70d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
71d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    @Override
72d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    protected void onPause() {
73d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // Ideally a game should implement onResume() and onPause()
74d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        // to take appropriate action when the activity looses focus
75d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        super.onPause();
76d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mRenderer.stop();
77d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        mGLSurfaceView.onPause();
78d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    }
79d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
80d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
81d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    class MyRenderer implements GLSurfaceView.Renderer, SensorEventListener {
82d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        private Cube mCube;
83d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        private Sensor mRotationVectorSensor;
84d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        private final float[] mRotationMatrix = new float[16];
85d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
86d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public MyRenderer() {
87d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // find the rotation-vector sensor
88d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mRotationVectorSensor = mSensorManager.getDefaultSensor(
89d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                    Sensor.TYPE_ROTATION_VECTOR);
90d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
91d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mCube = new Cube();
92d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // initialize the rotation matrix to identity
93d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mRotationMatrix[ 0] = 1;
94d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mRotationMatrix[ 4] = 1;
95d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mRotationMatrix[ 8] = 1;
96d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mRotationMatrix[12] = 1;
97d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
98d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
99d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void start() {
100d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // enable our sensor when the activity is resumed, ask for
101d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // 10 ms updates.
102d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mSensorManager.registerListener(this, mRotationVectorSensor, 10000);
103d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
104d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
105d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void stop() {
106d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // make sure to turn our sensor off when the activity is paused
107d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mSensorManager.unregisterListener(this);
108d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
109d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
110d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void onSensorChanged(SensorEvent event) {
111d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // we received a sensor event. it is a good practice to check
112d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // that we received the proper event
113d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
114d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                // convert the rotation-vector to a 4x4 matrix. the matrix
115d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                // is interpreted by Open GL as the inverse of the
116d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                // rotation-vector, which is what we want.
117d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                SensorManager.getRotationMatrixFromVector(
118d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        mRotationMatrix , event.values);
119d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            }
120d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
121d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
122d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void onDrawFrame(GL10 gl) {
123d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // clear screen
124d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
125d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
126d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // set-up modelview matrix
127d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glMatrixMode(GL10.GL_MODELVIEW);
128d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glLoadIdentity();
129d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glTranslatef(0, 0, -3.0f);
130d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glMultMatrixf(mRotationMatrix, 0);
131d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
132d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // draw our object
133d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
134d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
135d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
136d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            mCube.draw(gl);
137d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
138d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
139d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void onSurfaceChanged(GL10 gl, int width, int height) {
140d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // set view-port
141d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glViewport(0, 0, width, height);
142d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // set projection matrix
143d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            float ratio = (float) width / height;
144d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glMatrixMode(GL10.GL_PROJECTION);
145d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glLoadIdentity();
146d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
147d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
148d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
149d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
150d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // dither is enabled by default, we don't need it
151d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glDisable(GL10.GL_DITHER);
152d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // clear screen in white
153d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            gl.glClearColor(1,1,1,1);
154d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
155d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
156d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        class Cube {
157d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            // initialize our cube
158d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            private FloatBuffer mVertexBuffer;
159d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            private FloatBuffer mColorBuffer;
160d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            private ByteBuffer  mIndexBuffer;
161d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
162d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            public Cube() {
163d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                final float vertices[] = {
164d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        -1, -1, -1,		 1, -1, -1,
165d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                         1,  1, -1,	    -1,  1, -1,
166d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        -1, -1,  1,      1, -1,  1,
167d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                         1,  1,  1,     -1,  1,  1,
168d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                };
169d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
170d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                final float colors[] = {
171d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        0,  0,  0,  1,  1,  0,  0,  1,
172d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        1,  1,  0,  1,  0,  1,  0,  1,
173d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        0,  0,  1,  1,  1,  0,  1,  1,
174d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        1,  1,  1,  1,  0,  1,  1,  1,
175d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                };
176d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
177d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                final byte indices[] = {
178d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        0, 4, 5,    0, 5, 1,
179d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        1, 5, 6,    1, 6, 2,
180d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        2, 6, 7,    2, 7, 3,
181d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        3, 7, 4,    3, 4, 0,
182d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        4, 7, 6,    4, 6, 5,
183d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                        3, 0, 1,    3, 1, 2
184d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                };
185d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
186d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
187d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                vbb.order(ByteOrder.nativeOrder());
188d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mVertexBuffer = vbb.asFloatBuffer();
189d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mVertexBuffer.put(vertices);
190d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mVertexBuffer.position(0);
191d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
192d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);
193d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                cbb.order(ByteOrder.nativeOrder());
194d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mColorBuffer = cbb.asFloatBuffer();
195d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mColorBuffer.put(colors);
196d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mColorBuffer.position(0);
197d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
198d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mIndexBuffer = ByteBuffer.allocateDirect(indices.length);
199d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mIndexBuffer.put(indices);
200d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                mIndexBuffer.position(0);
201d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            }
202d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
203d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            public void draw(GL10 gl) {
204d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                gl.glEnable(GL10.GL_CULL_FACE);
205d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                gl.glFrontFace(GL10.GL_CW);
206d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                gl.glShadeModel(GL10.GL_SMOOTH);
207d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
208d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);
209d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian                gl.glDrawElements(GL10.GL_TRIANGLES, 36, GL10.GL_UNSIGNED_BYTE, mIndexBuffer);
210d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian            }
211d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
212d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian
213d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        public void onAccuracyChanged(Sensor sensor, int accuracy) {
214d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian        }
215d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian    }
216d6e9c61294d19d5dd3d812de6b08127cf7b0ce94Mathias Agopian}
217