Main Page | Class Hierarchy | Class List | Directories | File List

Uniform.h

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); }    // attache la texture a la variable sampler2D correspondante du shader
00025         private:
00026             GLuint texID;   // l'identifiant de la texture
00027             int texNum;     // numero de texture (correspondant au GL_TEXTURE<i>)
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) {}    // précondition : value != NULL
00036             virtual void update(const UniformGLSL *u) const { (u->*setUniform)(value); }   // précondition : u != NULL
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 // version allouant de la mémoire :
00064 template<class baseType, int N, void (UniformGLSL::*setUniform)(const baseType*) const>
00065 class UniformGenMem : public Uniform {
00066     public:
00067         UniformGenMem(QString name) : Uniform(name), value(new baseType[N]) {}
00068         ~UniformGenMem() { delete[] value; }
00069         virtual void update(const UniformGLSL *u) const { (u->*setUniform)(value); }   // précondition : u != NULL
00070         baseType* operator*() { return value; }
00071     private:
00072         baseType *value;
00073     };
00074 
00075 typedef UniformGenMem<int,    1, &UniformGLSL::setUniform1iv>        UnifInt;
00076 typedef UniformGenMem<float,  1, &UniformGLSL::setUniform1fv>        UnifFloat;
00077 typedef UniformGenMem<float,  2, &UniformGLSL::setUniform2fv>        UnifVec2;
00078 typedef UniformGenMem<float,  3, &UniformGLSL::setUniform3fv>        UnifVec3;
00079 typedef UniformGenMem<float,  4, &UniformGLSL::setUniform4fv>        UnifVec4;
00080 typedef UniformGenMem<float,  4, &UniformGLSL::setUniformMatrix2fv>  UnifMat2;
00081 typedef UniformGenMem<float,  9, &UniformGLSL::setUniformMatrix3fv>  UnifMat3;
00082 typedef UniformGenMem<float, 16, &UniformGLSL::setUniformMatrix4fv>  UnifMat4;
00083 */
00084 
00085 #endif
00086 

Generated on Fri Nov 14 20:49:47 2008 for Api Graphics by  doxygen 1.4.4