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