/*! * @file shader.h * @brief Definition of the Shader rendering class */ #ifndef _SHADER_H #define _SHADER_H #include "base_object.h" #include "glincl.h" #include // FORWARD DECLARATION //! A class for ... class Shader : public BaseObject { public: typedef enum { None = 0, Fragment = 1, Vertex = 2, Program = 4, } Type; public: Shader(const std::string& vertexShaderFile = "", const std::string& fragmentShaderFile = ""); virtual ~Shader(); static Shader* getShader(const std::string& vertexShaderFile, const std::string& fragmentShaderFile); static bool unload(Shader* shader); static bool checkShaderAbility(); void activateShader(); static void deactivateShader(); bool loadShaderProgramm(Shader::Type type, const std::string& fileName); void deleteProgram(Shader::Type type); void linkShaderProgram(); char* fileRead(const std::string& fileName); std::vector* fileReadArray(const std::string& fileName); inline static bool shaderActive() { return (Shader::storedShader != NULL)? true : false; }; inline static Shader* getActiveShader() { return Shader::storedShader; }; inline static void suspendShader() { Shader* currShader = storedShader; if (storedShader!= NULL) { Shader::deactivateShader(); Shader::storedShader = currShader;} }; inline static void restoreShader() { if (storedShader != NULL) storedShader->activateShader(); storedShader = NULL; }; GLhandleARB getProgram() const { return this->shaderProgram; } GLhandleARB getVertexS() const { return this->vertexShader; } GLhandleARB getFragmentS() const { return this->fragmentShader; } void debug() const; static void printError(GLhandleARB program); private: std::string fragmentShaderFile; std::string vertexShaderFile; GLhandleARB shaderProgram; GLhandleARB vertexShader; GLhandleARB fragmentShader; static Shader* storedShader; }; #endif /* _SHADER_H */