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