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