00001 #ifndef __UNIFORM__
00002 #define __UNIFORM__
00003
00004 #include <OpenGL.h>
00005 #include "UniformGLSL.h"
00006 #include <QString>
00007
00008 namespace apig {
00009
00010 class Uniform {
00011 public:
00012 Uniform(QString name) : name(name) {}
00013 virtual ~Uniform() {}
00014 virtual void update(const UniformGLSL *u) const = 0;
00015 public:
00016 const QString name;
00017 };
00018
00020
00021 class Sampler : public Uniform {
00022 public:
00023 Sampler(QString name, GLuint texID, int texNum) : Uniform(name), texID(texID), texNum(texNum) {}
00024 virtual void update(const UniformGLSL *u) const { u->setSampler(texID, texNum); }
00025 private:
00026 GLuint texID;
00027 int texNum;
00028 };
00029
00031
00032 template<class baseType, void (UniformGLSL::*setUniform)(const baseType*) const>
00033 class UniformGen : public Uniform {
00034 public:
00035 UniformGen(QString name, const baseType *value) : Uniform(name), value(value) {}
00036 virtual void update(const UniformGLSL *u) const { (u->*setUniform)(value); }
00037 private:
00038 const baseType *value;
00039 };
00040
00041 typedef UniformGen<int, &UniformGLSL::setUniform1iv> UniformInt;
00042 typedef UniformGen<int, &UniformGLSL::setUniform2iv> UniformIVec2;
00043 typedef UniformGen<int, &UniformGLSL::setUniform3iv> UniformIVec3;
00044 typedef UniformGen<int, &UniformGLSL::setUniform4iv> UniformIVec4;
00045
00046 typedef UniformGen<bool, &UniformGLSL::setUniform1bv> UniformBool;
00047 typedef UniformGen<bool, &UniformGLSL::setUniform2bv> UniformBVec2;
00048 typedef UniformGen<bool, &UniformGLSL::setUniform3bv> UniformBVec3;
00049 typedef UniformGen<bool, &UniformGLSL::setUniform4bv> UniformBVec4;
00050
00051 typedef UniformGen<float, &UniformGLSL::setUniform1fv> UniformFloat;
00052 typedef UniformGen<float, &UniformGLSL::setUniform2fv> UniformVec2;
00053 typedef UniformGen<float, &UniformGLSL::setUniform3fv> UniformVec3;
00054 typedef UniformGen<float, &UniformGLSL::setUniform4fv> UniformVec4;
00055
00056 typedef UniformGen<float, &UniformGLSL::setUniformMatrix2fv> UniformMat2;
00057 typedef UniformGen<float, &UniformGLSL::setUniformMatrix3fv> UniformMat3;
00058 typedef UniformGen<float, &UniformGLSL::setUniformMatrix4fv> UniformMat4;
00059
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 #endif
00086