]> git.tdb.fi Git - libs/gl.git/blobdiff - source/uniform.h
Rewrite the Uniform classes as templates
[libs/gl.git] / source / uniform.h
index ac73e99db01347c6de3edcdabf048d9e3916bc47..32779ced0a06cc0206a20982ee57ac4d52024335 100644 (file)
@@ -1,18 +1,11 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #ifndef MSP_GL_UNIFORM_H_
 #define MSP_GL_UNIFORM_H_
 
+#include <algorithm>
+
 namespace Msp {
 namespace GL {
 
-class Program;
-
 class Uniform
 {
 protected:
@@ -23,75 +16,81 @@ private:
 public:
        virtual ~Uniform() { }
 
-       virtual void apply(int) const =0;
-       virtual Uniform *clone() const =0;
+       virtual void apply(int) const = 0;
+       virtual Uniform *clone() const = 0;
 };
 
 
-class Uniform1i: public Uniform
+template<typename T>
+class UniformScalar: public Uniform
 {
-private:
-       int v;
-
 public:
-       Uniform1i(int v_);
+       typedef T BaseType;
+       typedef T Type;
 
-       virtual void apply(int index) const;
-       virtual Uniform1i *clone() const;
-};
-
-
-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
+template<typename T, unsigned rows, unsigned cols>
+class UniformMatrix: public Uniform
 {
+public:
+       typedef T BaseType;
+       typedef T Type[rows*cols];
+
 private:
-       float v[4];
+       Type value;
 
 public:
-       Uniform4f(float v0, float v1, float v2, float v3);
+       UniformMatrix(const T *vp)
+       { std::copy(vp, vp+rows*cols, value); }
 
        virtual void apply(int index) const;
-       virtual Uniform4f *clone() const;
+
+       virtual UniformMatrix *clone() const
+       { return new UniformMatrix(value); }
 };
 
+typedef UniformMatrix<float, 4, 4> UniformMatrix4x4f;
+
 } // namespace GL
 } // namespace Msp