]> git.tdb.fi Git - libs/gl.git/blobdiff - source/uniform.h
Rewrite the Uniform classes as templates
[libs/gl.git] / source / uniform.h
index 70db91dfe0d93fbb8e19eff6a2494214258d37e9..32779ced0a06cc0206a20982ee57ac4d52024335 100644 (file)
@@ -1,11 +1,11 @@
 #ifndef MSP_GL_UNIFORM_H_
 #define MSP_GL_UNIFORM_H_
 
+#include <algorithm>
+
 namespace Msp {
 namespace GL {
 
-class Program;
-
 class Uniform
 {
 protected:
@@ -21,83 +21,76 @@ public:
 };
 
 
-class Uniform1i: public Uniform
+template<typename T>
+class UniformScalar: public Uniform
 {
-private:
-       int v;
-
 public:
-       Uniform1i(int v_);
-
-       virtual void apply(int index) const;
-       virtual Uniform1i *clone() const;
-};
-
+       typedef T BaseType;
+       typedef T Type;
 
-class Uniform1f: public Uniform
-{
 private:
-       float v;
+       Type value;
 
 public:
-       Uniform1f(float v_);
+       UniformScalar(Type v): value(v) { }
 
        virtual void apply(int index) const;
-       virtual Uniform1f *clone() const;
+
+       virtual UniformScalar *clone() const
+       { return new UniformScalar(value); }
 };
 
+typedef UniformScalar<int> Uniform1i;
+typedef UniformScalar<float> Uniform1f;
 
-class Uniform2f: public Uniform
-{
-private:
-       float v[2];
 
+template<typename T, unsigned vecsize>
+class UniformVector: public Uniform
+{
 public:
-       Uniform2f(float v0, float v1);
+       typedef T BaseType;
+       typedef T Type[vecsize];
 
-       virtual void apply(int index) const;
-       virtual Uniform2f *clone() const;
-};
-
-
-class Uniform3f: public Uniform
-{
 private:
-       float v[3];
+       Type value;
 
 public:
-       Uniform3f(float v0, float v1, float v2);
+       UniformVector(const T *vp)
+       { std::copy(vp, vp+vecsize, value); }
 
        virtual void apply(int index) const;
-       virtual Uniform3f *clone() const;
+
+       virtual UniformVector *clone() const
+       { return new UniformVector(value); }
 };
 
+typedef UniformVector<float, 2> Uniform2f;
+typedef UniformVector<float, 3> Uniform3f;
+typedef UniformVector<float, 4> Uniform4f;
 
-class Uniform4f: public Uniform
-{
-private:
-       float v[4];
 
+template<typename T, unsigned rows, unsigned cols>
+class UniformMatrix: public Uniform
+{
 public:
-       Uniform4f(float v0, float v1, float v2, float v3);
+       typedef T BaseType;
+       typedef T Type[rows*cols];
 
-       virtual void apply(int index) const;
-       virtual Uniform4f *clone() const;
-};
-
-
-class UniformMatrix4x4f: public Uniform
-{
 private:
-       float v[16];
+       Type value;
 
 public:
-       UniformMatrix4x4f(const float *);
+       UniformMatrix(const T *vp)
+       { std::copy(vp, vp+rows*cols, value); }
 
        virtual void apply(int index) const;
-       virtual UniformMatrix4x4f *clone() const;
+
+       virtual UniformMatrix *clone() const
+       { return new UniformMatrix(value); }
 };
 
+typedef UniformMatrix<float, 4, 4> UniformMatrix4x4f;
+
 } // namespace GL
 } // namespace Msp