00001 #ifndef __PROG_GLSL__
00002 #define __PROG_GLSL__
00003
00004 #include "ShaderGLSL.h"
00005 #include "TextureSet.h"
00006 #include <QString>
00007 #include <QStringList>
00008 #include <QList>
00009
00010 namespace apig {
00011
00012 class Uniform;
00013 class UniformGLSL;
00014 class ProgParam;
00015
00020 class ProgGLSL {
00021 public:
00022
00023
00024
00025 static ProgGLSL* create();
00026 ~ProgGLSL();
00027
00028
00029
00030
00031 static ProgGLSL* loadSubDir(QString rootName);
00032 static ProgGLSL* loadDir(QString dirName);
00033 static ProgGLSL* load(QString name);
00034 static ProgGLSL* load(QString vertName, QString fragName);
00035 static ProgGLSL* loadFrag(QString dirName, QString fragName = QString::null);
00036
00037
00038
00039 void activate();
00040 void deactivate();
00041 bool isLinked() const;
00042 void activateTextures() const;
00043
00044
00045
00046
00047 static QStringList sourcesList(QString dirName, ShaderGLSL::Type shaderType, bool relative=true);
00048
00049
00050
00051 void validate();
00052 void printInfo() const;
00053 void printActiveAttribs() const;
00054 void printActiveUniforms() const;
00055
00056
00057
00058
00059 void bindShaderFile(QString fileName, ShaderGLSL::Type type);
00060 void bindShaderSource(QString source, ShaderGLSL::Type type);
00061 void link();
00062
00063
00064
00065
00066
00067 void addUniform(Uniform *uniform, bool warn=true, bool ownUniform=true);
00068 void addUniform(QString name, const float *value, bool warn=true);
00069 void addUniform(QString name, const int *value, bool warn=true);
00070 void addUniform(QString name, const bool *value, bool warn=true);
00071 void addUniformVec2(QString name, const float *value, bool warn=true);
00072 void addUniformVec3(QString name, const float *value, bool warn=true);
00073 void addUniformVec4(QString name, const float *value, bool warn=true);
00074 void addUniformIVec2(QString name, const int *value, bool warn=true);
00075 void addUniformIVec3(QString name, const int *value, bool warn=true);
00076 void addUniformIVec4(QString name, const int *value, bool warn=true);
00077 void addUniformBVec2(QString name, const bool *value, bool warn=true);
00078 void addUniformBVec3(QString name, const bool *value, bool warn=true);
00079 void addUniformBVec4(QString name, const bool *value, bool warn=true);
00080 void addUniformMat2(QString name, const float *value, bool warn=true);
00081 void addUniformMat3(QString name, const float *value, bool warn=true);
00082 void addUniformMat4(QString name, const float *value, bool warn=true);
00083 void addTexture(QString name, Texture *texture, bool warn=true);
00084
00085
00086
00087
00088 void setUniform(QString name, int value, bool warn=true);
00089 void setUniform(QString name, float value, bool warn=true);
00090 void setUniform(QString name, bool value, bool warn=true);
00091 void setUniformVec2(QString name, float v0, float v1, bool warn=true);
00092 void setUniformVec3(QString name, float v0, float v1, float v2, bool warn=true);
00093 void setUniformVec4(QString name, float v0, float v1, float v2, float v3, bool warn=true);
00094 void setUniformVec2(QString name, const float *value, bool warn=true);
00095 void setUniformVec3(QString name, const float *value, bool warn=true);
00096 void setUniformVec4(QString name, const float *value, bool warn=true);
00097 void setUniformIVec2(QString name, int v0, int v1, bool warn=true);
00098 void setUniformIVec3(QString name, int v0, int v1, int v2, bool warn=true);
00099 void setUniformIVec4(QString name, int v0, int v1, int v2, int v3, bool warn=true);
00100 void setUniformIVec2(QString name, const int *value, bool warn=true);
00101 void setUniformIVec3(QString name, const int *value, bool warn=true);
00102 void setUniformIVec4(QString name, const int *value, bool warn=true);
00103 void setUniformBVec2(QString name, bool v0, bool v1, bool warn=true);
00104 void setUniformBVec3(QString name, bool v0, bool v1, bool v2, bool warn=true);
00105 void setUniformBVec4(QString name, bool v0, bool v1, bool v2, bool v3, bool warn=true);
00106 void setUniformBVec2(QString name, const bool *value, bool warn=true);
00107 void setUniformBVec3(QString name, const bool *value, bool warn=true);
00108 void setUniformBVec4(QString name, const bool *value, bool warn=true);
00109 void setUniformMat2(QString name, const float *value, bool warn=true);
00110 void setUniformMat3(QString name, const float *value, bool warn=true);
00111 void setUniformMat4(QString name, const float *value, bool warn=true);
00112
00113 private:
00114 ProgGLSL(GLuint id) : id(id), linked(false) {}
00115 void updateVariables() const;
00116 void clearParameters();
00117 UniformGLSL* createUniformGLSL(QString name, bool warn) const;
00118 void bindShaderDir(QString dirName, ShaderGLSL::Type shaderType);
00119 void attach(ShaderGLSL shader);
00120 void detach(ShaderGLSL shader);
00121 QString getInfoLog() const;
00122 GLint getProgParam(GLenum paramName) const;
00123 static QString typeEnumString(GLenum type);
00124
00125 private:
00126 GLuint id;
00127 bool linked;
00128 QList<ShaderGLSL> shaders;
00129 QList<ProgParam*> parameters;
00130 TextureSet textures;
00131 };
00132 }
00133
00134 #endif
00135