1fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich/* 2fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Copyright (C) 2009 The Android Open Source Project 3fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 4fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License"); 5fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * you may not use this file except in compliance with the License. 6fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * You may obtain a copy of the License at 7fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 8fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * http://www.apache.org/licenses/LICENSE-2.0 9fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 10fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Unless required by applicable law or agreed to in writing, software 11fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS, 12fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * See the License for the specific language governing permissions and 14fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * limitations under the License. 15fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich */ 16fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 17fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichpackage com.android.test; 18fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich/* 19fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Copyright (C) 2008 The Android Open Source Project 20fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 21fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License"); 22fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * you may not use this file except in compliance with the License. 23fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * You may obtain a copy of the License at 24fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 25fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * http://www.apache.org/licenses/LICENSE-2.0 26fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 27fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Unless required by applicable law or agreed to in writing, software 28fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS, 29fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 30fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * See the License for the specific language governing permissions and 31fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * limitations under the License. 32fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich */ 33fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 34fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport java.nio.ByteBuffer; 35fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport java.nio.ByteOrder; 36fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport java.nio.CharBuffer; 37fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport java.nio.FloatBuffer; 38fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 39fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport android.content.Context; 40fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport android.opengl.GLSurfaceView; 41fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport android.util.AttributeSet; 42fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport android.util.Log; 43fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport android.view.KeyEvent; 44fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport android.view.MotionEvent; 45fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 46fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport javax.microedition.khronos.egl.EGL10; 47fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport javax.microedition.khronos.egl.EGLConfig; 48fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport javax.microedition.khronos.opengles.GL; 49fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport javax.microedition.khronos.opengles.GL10; 50fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichimport javax.microedition.khronos.opengles.GL11; 51fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich/** 52fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * An implementation of SurfaceView that uses the dedicated surface for 53fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * displaying an OpenGL animation. This allows the animation to run in a 54fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * separate thread, without requiring that it be driven by the update mechanism 55fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * of the view hierarchy. 56fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 57fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * The application-specific rendering code is delegated to a GLView.Renderer 58fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * instance. 59fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich */ 60fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevichclass TestView extends GLSurfaceView { 61fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich TestView(Context context) { 62fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich super(context); 63fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich init(); 64fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 65fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 66fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public TestView(Context context, AttributeSet attrs) { 67fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich super(context, attrs); 68fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich init(); 69fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 70fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 71fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private void init() { 72fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich setRenderer(new Renderer()); 73fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich setRenderMode(RENDERMODE_WHEN_DIRTY); 74fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 75fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 76fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich /** A grid is a topologically rectangular array of vertices. 77fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 78fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * The vertex and index data are held in VBO objects because on most 79fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * GPUs VBO objects are the fastest way of rendering static vertex 80fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * and index data. 81fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 82fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich */ 83fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 84fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private static class Grid { 85fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // Size of vertex data elements in bytes: 86fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich final static int FLOAT_SIZE = 4; 87fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich final static int CHAR_SIZE = 2; 88fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 89fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // Vertex structure: 90fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // float x, y, z; 91fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 92fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich final static int VERTEX_SIZE = 3 * FLOAT_SIZE; 93fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 94fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private int mVertexBufferObjectId; 95fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private int mElementBufferObjectId; 96fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 97fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // These buffers are used to hold the vertex and index data while 98fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // constructing the grid. Once createBufferObjects() is called 99fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // the buffers are nulled out to save memory. 100fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 101fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private ByteBuffer mVertexByteBuffer; 102fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private FloatBuffer mVertexBuffer; 103fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private CharBuffer mIndexBuffer; 104fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 105fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private int mW; 106fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private int mH; 107fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private int mIndexCount; 108fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 109fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public Grid(int w, int h) { 110fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich if (w < 0 || w >= 65536) { 111fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich throw new IllegalArgumentException("w"); 112fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 113fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich if (h < 0 || h >= 65536) { 114fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich throw new IllegalArgumentException("h"); 115fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 116fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich if (w * h >= 65536) { 117fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich throw new IllegalArgumentException("w * h >= 65536"); 118fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 119fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 120fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mW = w; 121fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mH = h; 122fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int size = w * h; 123fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 124fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexByteBuffer = ByteBuffer.allocateDirect(VERTEX_SIZE * size) 125fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich .order(ByteOrder.nativeOrder()); 126fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBuffer = mVertexByteBuffer.asFloatBuffer(); 127fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 128fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int quadW = mW - 1; 129fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int quadH = mH - 1; 130fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int quadCount = quadW * quadH; 131fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int indexCount = quadCount * 6; 132fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexCount = indexCount; 133fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer = ByteBuffer.allocateDirect(CHAR_SIZE * indexCount) 134fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich .order(ByteOrder.nativeOrder()).asCharBuffer(); 135fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 136fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich /* 137fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * Initialize triangle list mesh. 138fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 139fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * [0]-----[ 1] ... 140fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * | / | 141fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * | / | 142fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * | / | 143fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * [w]-----[w+1] ... 144fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * | | 145fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich * 146fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich */ 147fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 148fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich { 149fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int i = 0; 150fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich for (int y = 0; y < quadH; y++) { 151fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich for (int x = 0; x < quadW; x++) { 152fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich char a = (char) (y * mW + x); 153fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich char b = (char) (y * mW + x + 1); 154fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich char c = (char) ((y + 1) * mW + x); 155fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich char d = (char) ((y + 1) * mW + x + 1); 156fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 157fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.put(i++, a); 158fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.put(i++, c); 159fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.put(i++, b); 160fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 161fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.put(i++, b); 162fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.put(i++, c); 163fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.put(i++, d); 164fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 165fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 166fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 167fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 168fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 169fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 170fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public void set(int i, int j, float x, float y, float z) { 171fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich if (i < 0 || i >= mW) { 172fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich throw new IllegalArgumentException("i"); 173fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 174fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich if (j < 0 || j >= mH) { 175fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich throw new IllegalArgumentException("j"); 176fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 177fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 178fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int index = mW * j + i; 179fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 180fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBuffer.position(index * VERTEX_SIZE / FLOAT_SIZE); 181fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBuffer.put(x); 182fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBuffer.put(y); 183fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBuffer.put(z); 184fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 185fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 186fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public void createBufferObjects(GL gl) { 187fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // Generate a the vertex and element buffer IDs 188fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich int[] vboIds = new int[2]; 189fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich GL11 gl11 = (GL11) gl; 190fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glGenBuffers(2, vboIds, 0); 191fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBufferObjectId = vboIds[0]; 192fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mElementBufferObjectId = vboIds[1]; 193fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 194fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // Upload the vertex data 195fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertexBufferObjectId); 196fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexByteBuffer.position(0); 197fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mVertexByteBuffer.capacity(), mVertexByteBuffer, GL11.GL_STATIC_DRAW); 198fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 199fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mElementBufferObjectId); 200fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer.position(0); 201fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer.capacity() * CHAR_SIZE, mIndexBuffer, GL11.GL_STATIC_DRAW); 202fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 203fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich // We don't need the in-memory data any more 204fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexBuffer = null; 205fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mVertexByteBuffer = null; 206fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mIndexBuffer = null; 207fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 208fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 209fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public void draw(GL10 gl) { 210fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich GL11 gl11 = (GL11) gl; 211fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 212fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 213fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 214fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertexBufferObjectId); 215fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glVertexPointer(3, GL10.GL_FLOAT, VERTEX_SIZE, 0); 216fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 217fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mElementBufferObjectId); 218fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glDrawElements(GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, 0); 219fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 220fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); 221fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0); 222fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 223fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 224fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 225fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 226fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private class Renderer implements GLSurfaceView.Renderer { 227fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private static final String TAG = "Renderer"; 228fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private Grid mGrid; 229fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 230fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public void onDrawFrame(GL10 gl) { 231fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glClearColor(0,0,1,1); 232fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 233fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mGrid.draw(gl); 234fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 235fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 236fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public void onSurfaceChanged(GL10 gl, int width, int height) { 237fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glViewport(0, 0, width, height); 238fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glMatrixMode(GL11.GL_PROJECTION); 239fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glLoadIdentity(); 240fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glOrthof(0, width, height, 0, -1, 1); 241fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich gl.glMatrixMode(GL11.GL_MODELVIEW); 242fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich createGrid(gl, width, height); 243fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 244fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 245fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich public void onSurfaceCreated(GL10 gl, EGLConfig config) { 246fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 247fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 248fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich private void createGrid(GL10 gl, float w, float h) { 249fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mGrid = new Grid(2, 2); 250fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich for (int j = 0; j < 2; j++) { 251fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich for (int i = 0; i < 2; i++) { 252fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich float x = w * i; 253fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich float y = h * j; 254fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich float z = 0.0f; 255fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mGrid.set(i,j, x, y, z); 256fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 257fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 258fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich mGrid.createBufferObjects(gl); 259fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 260fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich } 261fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich} 262fbbbb7c855be5ed261b98b90d6ab437460462dc1Jack Palevich 263