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