1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include "Flatland.h"
18*38e8c45fSAndroid Build Coastguard Worker #include "GLHelper.h"
19*38e8c45fSAndroid Build Coastguard Worker
20*38e8c45fSAndroid Build Coastguard Worker namespace android {
21*38e8c45fSAndroid Build Coastguard Worker
22*38e8c45fSAndroid Build Coastguard Worker static float colors[][4] = {
23*38e8c45fSAndroid Build Coastguard Worker { .85f, .14f, .44f, 1.0f },
24*38e8c45fSAndroid Build Coastguard Worker { .91f, .72f, .10f, 1.0f },
25*38e8c45fSAndroid Build Coastguard Worker { .04f, .66f, .42f, 1.0f },
26*38e8c45fSAndroid Build Coastguard Worker { .84f, .39f, .68f, 1.0f },
27*38e8c45fSAndroid Build Coastguard Worker { .38f, .53f, .78f, 1.0f },
28*38e8c45fSAndroid Build Coastguard Worker };
29*38e8c45fSAndroid Build Coastguard Worker
30*38e8c45fSAndroid Build Coastguard Worker static size_t g_colorIndex;
31*38e8c45fSAndroid Build Coastguard Worker
genColor()32*38e8c45fSAndroid Build Coastguard Worker const float* genColor() {
33*38e8c45fSAndroid Build Coastguard Worker float* color = colors[g_colorIndex];
34*38e8c45fSAndroid Build Coastguard Worker g_colorIndex = (g_colorIndex + 1) % NELEMS(colors);
35*38e8c45fSAndroid Build Coastguard Worker return color;
36*38e8c45fSAndroid Build Coastguard Worker }
37*38e8c45fSAndroid Build Coastguard Worker
resetColorGenerator()38*38e8c45fSAndroid Build Coastguard Worker void resetColorGenerator() {
39*38e8c45fSAndroid Build Coastguard Worker g_colorIndex = 0;
40*38e8c45fSAndroid Build Coastguard Worker }
41*38e8c45fSAndroid Build Coastguard Worker
42*38e8c45fSAndroid Build Coastguard Worker class GradientRenderer {
43*38e8c45fSAndroid Build Coastguard Worker
44*38e8c45fSAndroid Build Coastguard Worker public:
45*38e8c45fSAndroid Build Coastguard Worker
setUp(GLHelper * helper)46*38e8c45fSAndroid Build Coastguard Worker bool setUp(GLHelper* helper) {
47*38e8c45fSAndroid Build Coastguard Worker bool result;
48*38e8c45fSAndroid Build Coastguard Worker
49*38e8c45fSAndroid Build Coastguard Worker result = helper->getShaderProgram("Gradient", &mGradPgm);
50*38e8c45fSAndroid Build Coastguard Worker if (!result) {
51*38e8c45fSAndroid Build Coastguard Worker return false;
52*38e8c45fSAndroid Build Coastguard Worker }
53*38e8c45fSAndroid Build Coastguard Worker
54*38e8c45fSAndroid Build Coastguard Worker result = helper->getDitherTexture(&mDitherTexName);
55*38e8c45fSAndroid Build Coastguard Worker if (!result) {
56*38e8c45fSAndroid Build Coastguard Worker return false;
57*38e8c45fSAndroid Build Coastguard Worker }
58*38e8c45fSAndroid Build Coastguard Worker
59*38e8c45fSAndroid Build Coastguard Worker mPosAttribLoc = glGetAttribLocation(mGradPgm, "position");
60*38e8c45fSAndroid Build Coastguard Worker mUVAttribLoc = glGetAttribLocation(mGradPgm, "uv");
61*38e8c45fSAndroid Build Coastguard Worker mUVToInterpUniformLoc = glGetUniformLocation(mGradPgm, "uvToInterp");
62*38e8c45fSAndroid Build Coastguard Worker mObjToNdcUniformLoc = glGetUniformLocation(mGradPgm, "objToNdc");
63*38e8c45fSAndroid Build Coastguard Worker mDitherKernelSamplerLoc = glGetUniformLocation(mGradPgm, "ditherKernel");
64*38e8c45fSAndroid Build Coastguard Worker mInvDitherKernelSizeUniformLoc = glGetUniformLocation(mGradPgm,
65*38e8c45fSAndroid Build Coastguard Worker "invDitherKernelSize");
66*38e8c45fSAndroid Build Coastguard Worker mInvDitherKernelSizeSqUniformLoc = glGetUniformLocation(mGradPgm,
67*38e8c45fSAndroid Build Coastguard Worker "invDitherKernelSizeSq");
68*38e8c45fSAndroid Build Coastguard Worker mColor0UniformLoc = glGetUniformLocation(mGradPgm, "color0");
69*38e8c45fSAndroid Build Coastguard Worker mColor1UniformLoc = glGetUniformLocation(mGradPgm, "color1");
70*38e8c45fSAndroid Build Coastguard Worker
71*38e8c45fSAndroid Build Coastguard Worker return true;
72*38e8c45fSAndroid Build Coastguard Worker }
73*38e8c45fSAndroid Build Coastguard Worker
tearDown()74*38e8c45fSAndroid Build Coastguard Worker void tearDown() {
75*38e8c45fSAndroid Build Coastguard Worker }
76*38e8c45fSAndroid Build Coastguard Worker
drawGradient()77*38e8c45fSAndroid Build Coastguard Worker bool drawGradient() {
78*38e8c45fSAndroid Build Coastguard Worker float identity[16] = {
79*38e8c45fSAndroid Build Coastguard Worker 1.0f, 0.0f, 0.0f, 0.0f,
80*38e8c45fSAndroid Build Coastguard Worker 0.0f, 1.0f, 0.0f, 0.0f,
81*38e8c45fSAndroid Build Coastguard Worker 0.0f, 0.0f, 1.0f, 0.0f,
82*38e8c45fSAndroid Build Coastguard Worker 0.0f, 0.0f, 0.0f, 1.0f,
83*38e8c45fSAndroid Build Coastguard Worker };
84*38e8c45fSAndroid Build Coastguard Worker const float pos[] = {
85*38e8c45fSAndroid Build Coastguard Worker -1.0f, -1.0f,
86*38e8c45fSAndroid Build Coastguard Worker 1.0f, -1.0f,
87*38e8c45fSAndroid Build Coastguard Worker -1.0f, 1.0f,
88*38e8c45fSAndroid Build Coastguard Worker 1.0f, 1.0f,
89*38e8c45fSAndroid Build Coastguard Worker };
90*38e8c45fSAndroid Build Coastguard Worker const float uv[] = {
91*38e8c45fSAndroid Build Coastguard Worker 0.0f, 0.0f,
92*38e8c45fSAndroid Build Coastguard Worker 1.0f, 0.0f,
93*38e8c45fSAndroid Build Coastguard Worker 0.0f, 1.0f,
94*38e8c45fSAndroid Build Coastguard Worker 1.0f, 1.0f,
95*38e8c45fSAndroid Build Coastguard Worker };
96*38e8c45fSAndroid Build Coastguard Worker const float* color0 = genColor();
97*38e8c45fSAndroid Build Coastguard Worker const float* color1 = genColor();
98*38e8c45fSAndroid Build Coastguard Worker
99*38e8c45fSAndroid Build Coastguard Worker glUseProgram(mGradPgm);
100*38e8c45fSAndroid Build Coastguard Worker
101*38e8c45fSAndroid Build Coastguard Worker glVertexAttribPointer(mPosAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, pos);
102*38e8c45fSAndroid Build Coastguard Worker glVertexAttribPointer(mUVAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, uv);
103*38e8c45fSAndroid Build Coastguard Worker glEnableVertexAttribArray(mPosAttribLoc);
104*38e8c45fSAndroid Build Coastguard Worker glEnableVertexAttribArray(mUVAttribLoc);
105*38e8c45fSAndroid Build Coastguard Worker
106*38e8c45fSAndroid Build Coastguard Worker float invDitherKernelSize = 1.0f / float(GLHelper::DITHER_KERNEL_SIZE);
107*38e8c45fSAndroid Build Coastguard Worker float invDitherKernelSizeSq = invDitherKernelSize * invDitherKernelSize;
108*38e8c45fSAndroid Build Coastguard Worker
109*38e8c45fSAndroid Build Coastguard Worker glUniformMatrix4fv(mObjToNdcUniformLoc, 1, GL_FALSE, identity);
110*38e8c45fSAndroid Build Coastguard Worker glUniformMatrix4fv(mUVToInterpUniformLoc, 1, GL_FALSE, identity);
111*38e8c45fSAndroid Build Coastguard Worker glUniform1f(mInvDitherKernelSizeUniformLoc, invDitherKernelSize);
112*38e8c45fSAndroid Build Coastguard Worker glUniform1f(mInvDitherKernelSizeSqUniformLoc, invDitherKernelSizeSq);
113*38e8c45fSAndroid Build Coastguard Worker glUniform4fv(mColor0UniformLoc, 1, color0);
114*38e8c45fSAndroid Build Coastguard Worker glUniform4fv(mColor1UniformLoc, 1, color1);
115*38e8c45fSAndroid Build Coastguard Worker
116*38e8c45fSAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR) {
117*38e8c45fSAndroid Build Coastguard Worker fprintf(stderr, "GL error! 0\n");
118*38e8c45fSAndroid Build Coastguard Worker }
119*38e8c45fSAndroid Build Coastguard Worker
120*38e8c45fSAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
121*38e8c45fSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mDitherTexName);
122*38e8c45fSAndroid Build Coastguard Worker
123*38e8c45fSAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR) {
124*38e8c45fSAndroid Build Coastguard Worker fprintf(stderr, "GL error! 1\n");
125*38e8c45fSAndroid Build Coastguard Worker }
126*38e8c45fSAndroid Build Coastguard Worker
127*38e8c45fSAndroid Build Coastguard Worker glUniform1i(mDitherKernelSamplerLoc, 0);
128*38e8c45fSAndroid Build Coastguard Worker
129*38e8c45fSAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
130*38e8c45fSAndroid Build Coastguard Worker
131*38e8c45fSAndroid Build Coastguard Worker glDisableVertexAttribArray(mPosAttribLoc);
132*38e8c45fSAndroid Build Coastguard Worker glDisableVertexAttribArray(mUVAttribLoc);
133*38e8c45fSAndroid Build Coastguard Worker
134*38e8c45fSAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR) {
135*38e8c45fSAndroid Build Coastguard Worker fprintf(stderr, "GL error! 2\n");
136*38e8c45fSAndroid Build Coastguard Worker }
137*38e8c45fSAndroid Build Coastguard Worker
138*38e8c45fSAndroid Build Coastguard Worker return true;
139*38e8c45fSAndroid Build Coastguard Worker }
140*38e8c45fSAndroid Build Coastguard Worker
141*38e8c45fSAndroid Build Coastguard Worker GLuint mGradPgm;
142*38e8c45fSAndroid Build Coastguard Worker GLuint mDitherTexName;
143*38e8c45fSAndroid Build Coastguard Worker GLuint mPosAttribLoc;
144*38e8c45fSAndroid Build Coastguard Worker GLuint mUVAttribLoc;
145*38e8c45fSAndroid Build Coastguard Worker GLuint mObjToNdcUniformLoc;
146*38e8c45fSAndroid Build Coastguard Worker GLuint mUVToInterpUniformLoc;
147*38e8c45fSAndroid Build Coastguard Worker GLuint mDitherKernelSamplerLoc;
148*38e8c45fSAndroid Build Coastguard Worker GLuint mInvDitherKernelSizeUniformLoc;
149*38e8c45fSAndroid Build Coastguard Worker GLuint mInvDitherKernelSizeSqUniformLoc;
150*38e8c45fSAndroid Build Coastguard Worker GLuint mColor0UniformLoc;
151*38e8c45fSAndroid Build Coastguard Worker GLuint mColor1UniformLoc;
152*38e8c45fSAndroid Build Coastguard Worker };
153*38e8c45fSAndroid Build Coastguard Worker
staticGradient()154*38e8c45fSAndroid Build Coastguard Worker Renderer* staticGradient() {
155*38e8c45fSAndroid Build Coastguard Worker class NoRenderer : public Renderer {
156*38e8c45fSAndroid Build Coastguard Worker virtual bool setUp(GLHelper* helper) {
157*38e8c45fSAndroid Build Coastguard Worker mIsFirstFrame = true;
158*38e8c45fSAndroid Build Coastguard Worker mGLHelper = helper;
159*38e8c45fSAndroid Build Coastguard Worker return mGradientRenderer.setUp(helper);
160*38e8c45fSAndroid Build Coastguard Worker }
161*38e8c45fSAndroid Build Coastguard Worker
162*38e8c45fSAndroid Build Coastguard Worker virtual void tearDown() {
163*38e8c45fSAndroid Build Coastguard Worker mGradientRenderer.tearDown();
164*38e8c45fSAndroid Build Coastguard Worker }
165*38e8c45fSAndroid Build Coastguard Worker
166*38e8c45fSAndroid Build Coastguard Worker virtual bool render(EGLSurface surface) {
167*38e8c45fSAndroid Build Coastguard Worker if (mIsFirstFrame) {
168*38e8c45fSAndroid Build Coastguard Worker bool result;
169*38e8c45fSAndroid Build Coastguard Worker mIsFirstFrame = false;
170*38e8c45fSAndroid Build Coastguard Worker
171*38e8c45fSAndroid Build Coastguard Worker result = mGLHelper->makeCurrent(surface);
172*38e8c45fSAndroid Build Coastguard Worker if (!result) {
173*38e8c45fSAndroid Build Coastguard Worker return false;
174*38e8c45fSAndroid Build Coastguard Worker }
175*38e8c45fSAndroid Build Coastguard Worker
176*38e8c45fSAndroid Build Coastguard Worker result = mGradientRenderer.drawGradient();
177*38e8c45fSAndroid Build Coastguard Worker if (!result) {
178*38e8c45fSAndroid Build Coastguard Worker return false;
179*38e8c45fSAndroid Build Coastguard Worker }
180*38e8c45fSAndroid Build Coastguard Worker
181*38e8c45fSAndroid Build Coastguard Worker result = mGLHelper->swapBuffers(surface);
182*38e8c45fSAndroid Build Coastguard Worker if (!result) {
183*38e8c45fSAndroid Build Coastguard Worker return false;
184*38e8c45fSAndroid Build Coastguard Worker }
185*38e8c45fSAndroid Build Coastguard Worker }
186*38e8c45fSAndroid Build Coastguard Worker return true;
187*38e8c45fSAndroid Build Coastguard Worker }
188*38e8c45fSAndroid Build Coastguard Worker
189*38e8c45fSAndroid Build Coastguard Worker bool mIsFirstFrame;
190*38e8c45fSAndroid Build Coastguard Worker GLHelper* mGLHelper;
191*38e8c45fSAndroid Build Coastguard Worker GradientRenderer mGradientRenderer;
192*38e8c45fSAndroid Build Coastguard Worker };
193*38e8c45fSAndroid Build Coastguard Worker return new NoRenderer;
194*38e8c45fSAndroid Build Coastguard Worker }
195*38e8c45fSAndroid Build Coastguard Worker
196*38e8c45fSAndroid Build Coastguard Worker
197*38e8c45fSAndroid Build Coastguard Worker } // namespace android
198