1d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich/*
2d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * Copyright (C) 2009 The Android Open Source Project
3d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich *
4d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
5d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * you may not use this file except in compliance with the License.
6d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * You may obtain a copy of the License at
7d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich *
8d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
9d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich *
10d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * Unless required by applicable law or agreed to in writing, software
11d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
12d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * See the License for the specific language governing permissions and
14d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * limitations under the License.
15d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich */
16d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
17d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichpackage com.android.testlatency;
18d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
19d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.content.Context;
20d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.opengl.GLSurfaceView;
21d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.util.AttributeSet;
22d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.util.Log;
23d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.view.KeyEvent;
24d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.view.MotionEvent;
25d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
26d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport java.nio.ByteBuffer;
27d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport java.nio.ByteOrder;
28d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport java.nio.FloatBuffer;
29d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
30d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport javax.microedition.khronos.egl.EGL10;
31d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport javax.microedition.khronos.egl.EGLConfig;
32d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport javax.microedition.khronos.egl.EGLContext;
33d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport javax.microedition.khronos.egl.EGLDisplay;
34d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport javax.microedition.khronos.opengles.GL10;
35d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
36d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichimport android.opengl.GLES20;
37d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
38d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich/**
39d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * An implementation of SurfaceView that uses the dedicated surface for
40d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * displaying an OpenGL animation.  This allows the animation to run in a
41d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * separate thread, without requiring that it be driven by the update mechanism
42d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * of the view hierarchy.
43d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich *
44d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * The application-specific rendering code is delegated to a GLView.Renderer
45d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich * instance.
46d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich */
47d7a4f91401d869dad63e1a461240f4800a969312Jack Palevichclass TestLatencyView extends GLSurfaceView {
48d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private static String TAG = "TestLatencyiew";
49d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private float mX;
50d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private float mY;
51d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private float mDX;
52d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private float mDY;
53d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private long  mT;
54d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private long  mDT;
55d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
56d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    public TestLatencyView(Context context) {
57d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        super(context);
58d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        setEGLContextClientVersion(2);
59d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        setRenderer(new Renderer());
60d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    }
61d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
62d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    @Override
63d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    public boolean onTouchEvent(MotionEvent event) {
64d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        switch (event.getAction()) {
65d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        case MotionEvent.ACTION_MOVE:
66d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            float x = event.getX();
67d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            float y = event.getY();
68d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            long  t = event.getEventTime();
69d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            synchronized(this) {
70d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mDT = t - mT;
71d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mT = t;
72d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mDX = x - mX;
73d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mX = x;
74d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mDY = y - mY;
75d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mY = y;
76d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
77d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            break;
78d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        default:
79d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            break;
80d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
81d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        return true;
82d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    }
83d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
84d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    private class Renderer implements GLSurfaceView.Renderer {
85d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private float mScaleX, mScaleY, mOffsetX, mOffsetY;
86d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private final float MS_PER_FRAME = 1000 / 60;
87d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        public Renderer() {
88d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mTriangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length * 4)
89d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                .order(ByteOrder.nativeOrder()).asFloatBuffer();
90d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
91d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
92d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
93d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        public void onDrawFrame(GL10 gl) {
94d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            GLES20.glClearColor(0.4f, 0.4f, 0.4f, 1.0f);
95d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
96d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            GLES20.glUseProgram(mProgram);
97d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            checkGlError("glUseProgram");
98d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
99d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            float x, y, dx, dy;
100d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            long t, dt;
101d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            synchronized(TestLatencyView.this) {
102d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                x = mX;
103d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                y = mY;
104d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                dx = mDX;
105d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                dy = mDY;
106d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                dt = mDT;
107d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
108d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
109d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (dt > 0) {
110d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                dx = dx * MS_PER_FRAME / dt;
111d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                dy = dy * MS_PER_FRAME / dt;
112d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
113d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
114d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            GLES20.glEnableVertexAttribArray(mvPositionHandle);
115d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            checkGlError("glEnableVertexAttribArray");
116d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            GLES20.glEnableVertexAttribArray(mvColorHandle);
117d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            checkGlError("glEnableVertexAttribArray");
118d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            for(int step = 0; step < 8; step++) {
119d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                float sx = (x + dx * step) * mScaleX + mOffsetX;
120d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                float sy = (y + dy * step) * mScaleY + mOffsetY;
121d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                int cbase = step * 4;
122d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
123d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                for (int i = 0; i < mTriangleVerticesData.length; i += 6) {
124d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    mTriangleVerticesData2[i] = sx + mTriangleVerticesData[i];
125d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    mTriangleVerticesData2[i+1] = -sy + mTriangleVerticesData[i+1];
126d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    mTriangleVerticesData2[i+2] = mColors[cbase];
127d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    mTriangleVerticesData2[i+3] = mColors[cbase+1];
128d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    mTriangleVerticesData2[i+4] = mColors[cbase+2];
129d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    mTriangleVerticesData2[i+5] = mColors[cbase+3];
130d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                }
131d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mTriangleVertices.position(0);
132d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mTriangleVertices.put(mTriangleVerticesData2).position(0);
133d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
134d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glVertexAttribPointer(mvPositionHandle, 2, GLES20.GL_FLOAT, false, 6*4, mTriangleVertices);
135d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                checkGlError("glVertexAttribPointer mvPosition");
136d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                mTriangleVertices.put(mTriangleVerticesData2).position(2);
137d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glVertexAttribPointer(mvColorHandle, 4, GLES20.GL_FLOAT, false, 6*4, mTriangleVertices);
138d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                checkGlError("glVertexAttribPointer mvColor");
139d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
140d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                checkGlError("glDrawArrays");
141d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
142d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
143d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
144d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        public void onSurfaceChanged(GL10 gl, int width, int height) {
145d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            GLES20.glViewport(0, 0, width, height);
146d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mScaleX = 2.0f / width;
147d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mScaleY = 2.0f / height;
148d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mOffsetX = -1f;
149d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mOffsetY = -1f;
150d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
151d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
152d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
153d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mProgram = createProgram(mVertexShader, mFragmentShader);
154d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (mProgram == 0) {
155d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                return;
156d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
157d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mvPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
158d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            checkGlError("glGetAttribLocation");
159d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (mvPositionHandle == -1) {
160d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                throw new RuntimeException("Could not get attrib location for vPosition");
161d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
162d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            mvColorHandle = GLES20.glGetAttribLocation(mProgram, "aColor");
163d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            checkGlError("glGetAttribLocation");
164d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (mvColorHandle == -1) {
165d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                throw new RuntimeException("Could not get attrib location for vColor");
166d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
167d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
168d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
169d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private int loadShader(int shaderType, String source) {
170d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            int shader = GLES20.glCreateShader(shaderType);
171d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (shader != 0) {
172d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glShaderSource(shader, source);
173d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glCompileShader(shader);
174d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                int[] compiled = new int[1];
175d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
176d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                if (compiled[0] == 0) {
177d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    Log.e(TAG, "Could not compile shader " + shaderType + ":");
178d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
179d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    GLES20.glDeleteShader(shader);
180d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    shader = 0;
181d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                }
182d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
183d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            return shader;
184d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
185d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
186d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private int createProgram(String vertexSource, String fragmentSource) {
187d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
188d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (vertexShader == 0) {
189d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                return 0;
190d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
191d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
192d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
193d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (pixelShader == 0) {
194d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                return 0;
195d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
196d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
197d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            int program = GLES20.glCreateProgram();
198d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            if (program != 0) {
199d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glAttachShader(program, vertexShader);
200d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                checkGlError("glAttachShader vertexShader");
201d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glAttachShader(program, pixelShader);
202d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                checkGlError("glAttachShader pixelShader");
203d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glLinkProgram(program);
204d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                int[] linkStatus = new int[1];
205d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
206d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                if (linkStatus[0] != GLES20.GL_TRUE) {
207d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    Log.e(TAG, "Could not link program: ");
208d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    Log.e(TAG, GLES20.glGetProgramInfoLog(program));
209d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    GLES20.glDeleteProgram(program);
210d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                    program = 0;
211d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                }
212d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
213d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            return program;
214d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
215d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
216d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private void checkGlError(String op) {
217d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            int error;
218d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
219d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                Log.e(TAG, op + ": glError " + error);
220d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                throw new RuntimeException(op + ": glError " + error);
221d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            }
222d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        }
223d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
224d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        // X, Y, R G B A
225d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private final float[] mTriangleVerticesData = {
226d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                -0.025f, 0.3f, 0.0f, 1.0f, 0.0f, 1.0f,
227d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                 0.0f  , 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
228d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                 0.025f, 0.3f, 1.0f, 1.0f, 255.0f, 1.0f
229d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                };
230d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
231d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        // Color cascade:
232d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private final float[] mColors = {
233d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                0.0f, 0.0f, 0.0f, 1.0f,
234d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                0.5f, 0.0f, 0.0f, 1.0f,
235d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                0.0f, 0.5f, 0.0f, 1.0f,
236d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                0.5f, 0.5f, 0.0f, 1.0f,
237d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
238d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                0.0f, 0.0f, 0.5f, 1.0f,
239d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                1.0f, 0.0f, 0.0f, 1.0f,
240d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                1.0f, 1.0f, 1.0f, 1.0f,
241d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich                0.0f, 1.0f, 0.0f, 1.0f
242d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        };
243d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
244d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private float[] mTriangleVerticesData2 = new float[mTriangleVerticesData.length];
245d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private FloatBuffer mTriangleVertices;
246d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
247d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private final String mVertexShader = "attribute vec4 aPosition;\n"
248d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "attribute vec4 aColor;\n"
249d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "varying vec4 vColor;\n"
250d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "void main() {\n"
251d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "  gl_Position = aPosition;\n"
252d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "  vColor = aColor;\n"
253d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "}\n";
254d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
255d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private final String mFragmentShader = "precision mediump float;\n"
256d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "varying vec4 vColor;\n"
257d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "void main() {\n"
258d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "  gl_FragColor = vColor;\n"
259d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich            + "}\n";
260d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
261d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private int mProgram;
262d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private int mvPositionHandle;
263d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich        private int mvColorHandle;
264d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
265d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich    }
266d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich}
267d7a4f91401d869dad63e1a461240f4800a969312Jack Palevich
268