11e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal#pragma once
21e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
31e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal#include "FrameBuffer.h"
41e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
51e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal#include <GLES2/gl2.h>
61e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
71e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal#include <stdint.h>
81e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal#include <stdio.h>
91e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal#include <stdlib.h>
101e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
111e762b1f935c9d4a06af6dd56121590ca81d48b1mbansalclass Renderer {
121e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal  public:
131e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    Renderer();
141e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    virtual ~Renderer();
151e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
161e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    // Initialize OpenGL resources
171e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    // @return true if successful
181e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    virtual bool InitializeGLProgram() = 0;
191e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
201e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    bool SetupGraphics(FrameBuffer* buffer);
211e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    bool SetupGraphics(int width, int height);
221e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
231e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    bool Clear(float r, float g, float b, float a);
241e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
251e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int GetTextureName();
261e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    void SetInputTextureName(GLuint textureName);
271e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    void SetInputTextureDimensions(int width, int height);
281e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    void SetInputTextureType(GLenum textureType);
291e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
301e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    void InitializeGLContext();
311e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
321e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal  protected:
331e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
341e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLuint loadShader(GLenum shaderType, const char* pSource);
351e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLuint createProgram(const char*, const char* );
361e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
371e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int SurfaceWidth() const { return mSurfaceWidth; }
381e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int SurfaceHeight() const { return mSurfaceHeight; }
391e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
401e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    // Source code for shaders.
411e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    virtual const char* VertexShaderSource() const = 0;
421e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    virtual const char* FragmentShaderSource() const = 0;
431e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
441e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    // Redefine this to use special texture types such as
451e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    // GL_TEXTURE_EXTERNAL_OES.
461e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLenum InputTextureType() const { return mInputTextureType; }
471e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
481e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLuint mGlProgram;
491e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLuint mInputTextureName;
501e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLenum mInputTextureType;
511e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int mInputTextureWidth;
521e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int mInputTextureHeight;
531e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
541e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    // Attribute locations
551e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLint  mScalingtransLoc;
561e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLint maPositionHandle;
571e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    GLint maTextureHandle;
581e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
591e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
601e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int mSurfaceWidth;      // Width of target surface.
611e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    int mSurfaceHeight;     // Height of target surface.
621e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
631e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal    FrameBuffer *mFrameBuffer;
641e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal};
651e762b1f935c9d4a06af6dd56121590ca81d48b1mbansal
66