123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "Flatland.h"
- #include "GLHelper.h"
- namespace android {
- static float colors[][4] = {
- { .85f, .14f, .44f, 1.0f },
- { .91f, .72f, .10f, 1.0f },
- { .04f, .66f, .42f, 1.0f },
- { .84f, .39f, .68f, 1.0f },
- { .38f, .53f, .78f, 1.0f },
- };
- static size_t g_colorIndex;
- const float* genColor() {
- float* color = colors[g_colorIndex];
- g_colorIndex = (g_colorIndex + 1) % NELEMS(colors);
- return color;
- }
- void resetColorGenerator() {
- g_colorIndex = 0;
- }
- class GradientRenderer {
- public:
- bool setUp(GLHelper* helper) {
- bool result;
- result = helper->getShaderProgram("Gradient", &mGradPgm);
- if (!result) {
- return false;
- }
- result = helper->getDitherTexture(&mDitherTexName);
- if (!result) {
- return false;
- }
- mPosAttribLoc = glGetAttribLocation(mGradPgm, "position");
- mUVAttribLoc = glGetAttribLocation(mGradPgm, "uv");
- mUVToInterpUniformLoc = glGetUniformLocation(mGradPgm, "uvToInterp");
- mObjToNdcUniformLoc = glGetUniformLocation(mGradPgm, "objToNdc");
- mDitherKernelSamplerLoc = glGetUniformLocation(mGradPgm, "ditherKernel");
- mInvDitherKernelSizeUniformLoc = glGetUniformLocation(mGradPgm,
- "invDitherKernelSize");
- mInvDitherKernelSizeSqUniformLoc = glGetUniformLocation(mGradPgm,
- "invDitherKernelSizeSq");
- mColor0UniformLoc = glGetUniformLocation(mGradPgm, "color0");
- mColor1UniformLoc = glGetUniformLocation(mGradPgm, "color1");
- return true;
- }
- void tearDown() {
- }
- bool drawGradient() {
- float identity[16] = {
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f,
- };
- const float pos[] = {
- -1.0f, -1.0f,
- 1.0f, -1.0f,
- -1.0f, 1.0f,
- 1.0f, 1.0f,
- };
- const float uv[] = {
- 0.0f, 0.0f,
- 1.0f, 0.0f,
- 0.0f, 1.0f,
- 1.0f, 1.0f,
- };
- const float* color0 = genColor();
- const float* color1 = genColor();
- glUseProgram(mGradPgm);
- glVertexAttribPointer(mPosAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, pos);
- glVertexAttribPointer(mUVAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, uv);
- glEnableVertexAttribArray(mPosAttribLoc);
- glEnableVertexAttribArray(mUVAttribLoc);
- float invDitherKernelSize = 1.0f / float(GLHelper::DITHER_KERNEL_SIZE);
- float invDitherKernelSizeSq = invDitherKernelSize * invDitherKernelSize;
- glUniformMatrix4fv(mObjToNdcUniformLoc, 1, GL_FALSE, identity);
- glUniformMatrix4fv(mUVToInterpUniformLoc, 1, GL_FALSE, identity);
- glUniform1f(mInvDitherKernelSizeUniformLoc, invDitherKernelSize);
- glUniform1f(mInvDitherKernelSizeSqUniformLoc, invDitherKernelSizeSq);
- glUniform4fv(mColor0UniformLoc, 1, color0);
- glUniform4fv(mColor1UniformLoc, 1, color1);
- if (glGetError() != GL_NO_ERROR) {
- fprintf(stderr, "GL error! 0\n");
- }
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, mDitherTexName);
- if (glGetError() != GL_NO_ERROR) {
- fprintf(stderr, "GL error! 1\n");
- }
- glUniform1i(mDitherKernelSamplerLoc, 0);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- glDisableVertexAttribArray(mPosAttribLoc);
- glDisableVertexAttribArray(mUVAttribLoc);
- if (glGetError() != GL_NO_ERROR) {
- fprintf(stderr, "GL error! 2\n");
- }
- return true;
- }
- GLuint mGradPgm;
- GLuint mDitherTexName;
- GLuint mPosAttribLoc;
- GLuint mUVAttribLoc;
- GLuint mObjToNdcUniformLoc;
- GLuint mUVToInterpUniformLoc;
- GLuint mDitherKernelSamplerLoc;
- GLuint mInvDitherKernelSizeUniformLoc;
- GLuint mInvDitherKernelSizeSqUniformLoc;
- GLuint mColor0UniformLoc;
- GLuint mColor1UniformLoc;
- };
- Renderer* staticGradient() {
- class NoRenderer : public Renderer {
- virtual bool setUp(GLHelper* helper) {
- mIsFirstFrame = true;
- mGLHelper = helper;
- return mGradientRenderer.setUp(helper);
- }
- virtual void tearDown() {
- mGradientRenderer.tearDown();
- }
- virtual bool render(EGLSurface surface) {
- if (mIsFirstFrame) {
- bool result;
- mIsFirstFrame = false;
- result = mGLHelper->makeCurrent(surface);
- if (!result) {
- return false;
- }
- result = mGradientRenderer.drawGradient();
- if (!result) {
- return false;
- }
- result = mGLHelper->swapBuffers(surface);
- if (!result) {
- return false;
- }
- }
- return true;
- }
- bool mIsFirstFrame;
- GLHelper* mGLHelper;
- GradientRenderer mGradientRenderer;
- };
- return new NoRenderer;
- }
- } // namespace android
|