#ifndef SHADER_H #define SHADER_H #include "foundation/PxVec3.h" #include "foundation/PxMat33.h" #include "foundation/PxTransform.h" #include #include #include #include using namespace physx; #define STRINGIFY(A) #A // ---------------------------------------------------------------------------------- struct ShaderMaterial { void init(unsigned int texId = 0) { this->texId = texId; ambientCoeff = 0.0f; diffuseCoeff = 1.0f; specularCoeff = 0.0f; reflectionCoeff = 0.0f; refractionCoeff = 0.0f; shadowCoeff = 0.0f; color[0] = 1.0f; color[1] = 1.0f; color[2] = 1.0f; color[3] = 1.0f; } void setColor(float r, float g, float b, float a = 1.0f) { color[0] = r; color[1] = g; color[2] = b; color[3] = a; } bool operator == (const ShaderMaterial &m) const { if (texId != m.texId) return false; if (color[0] != m.color[0] || color[1] != m.color[1] || color[2] != m.color[2] || color[3] != m.color[3]) return false; return true; } unsigned int texId; float color[4]; float ambientCoeff; float diffuseCoeff; float specularCoeff; float reflectionCoeff; float refractionCoeff; float shadowCoeff; }; // ---------------------------------------------------------------------------------- class Shader { public: Shader(); virtual ~Shader(); bool isValid(); virtual void activate(); virtual void activate(const ShaderMaterial &mat); virtual void deactivate(); operator GLuint () { return mShaderProgram; } const std::string &getErrorMessage() { return mErrorMessage; } GLuint getShaderProgram() {return mShaderProgram;} //protected: bool loadShaders(const char* vertexShaderFile, const char* fragmentShaderFile); bool loadShaders(const char* vertexShaderFile, const char* geometryShaderFile, const char* fragmentShaderFile); bool loadShaderCode(const char* vertexShaderCode, const char* fragmentShaderCode); bool loadShaderCode(const char* vertexShaderCode, const char* geometryShaderCode, const char* fragmentShaderCode); void deleteShaders(); bool compileShaders(); void getCompileError(GLuint shader); void getLinkError(GLuint shader); void findVariables(); void bindTexture(const char *name, GLuint tex, GLenum target, GLint unit); GLuint mShaderProgram; GLuint mVertexShader; GLuint mGeometryShader; GLuint mFragmentShader; GLuint mGlShaderAttributes; char* mVertexShaderSource; int mVertexShaderSourceLength; char* mGeometryShaderSource; int mGeometryShaderSourceLength; char* mFragmentShaderSource; int mFragmentShaderSourceLength; struct UniformVariable { GLint size; GLenum type; GLint index; }; struct AttributeVariable { GLint size; GLenum type; GLint index; }; enum glShaderAttribute { gl_VERTEX = (1 << 0), gl_NORMAL = (1 << 1), gl_COLOR = (1 << 2), gl_TEXTURE = (1 << 3), }; typedef std::map tUniforms; tUniforms mUniforms; typedef std::map tAttributes; tAttributes mAttributes; std::string mErrorMessage; public: virtual bool setUniform(const char* name, const PxMat33& value); virtual bool setUniform(const char* name, const PxTransform& value); virtual bool setUniform(const char *name, PxU32 size, const PxVec3* value); virtual bool setUniform1(const char* name, float val); virtual bool setUniform2(const char* name, float val0, float val1); virtual bool setUniform3(const char* name, float val0, float val1, float val2); virtual bool setUniform4(const char* name, float val0, float val1, float val2, float val3); virtual bool setUniformfv(const GLchar *name, GLfloat *v, int elementSize, int count=1); virtual bool setUniform(const char* name, float value); virtual bool setUniform(const char* name, int value); virtual bool setUniformMatrix4fv(const GLchar *name, const GLfloat *m, bool transpose); virtual GLint getUniformCommon(const char* name); virtual bool setAttribute(const char* name, PxU32 size, PxU32 stride, GLenum type, void* data); bool loadFile(const char* filename, char*& destination, int& destinationLength); }; #endif