public:
UniformScalar(Type v): value(v) { }
- virtual void apply(int index) const;
+ virtual void apply(int index) const
+ { apply(index, 1, &value); }
+
+ static void apply(int, unsigned, const T *);
virtual UniformScalar *clone() const
{ return new UniformScalar(value); }
UniformVector(const T *vp)
{ std::copy(vp, vp+vecsize, value); }
- virtual void apply(int index) const;
+ virtual void apply(int index) const
+ { apply(index, 1, value); }
+
+ static void apply(int index, unsigned size, const T *value);
virtual UniformVector *clone() const
{ return new UniformVector(value); }
UniformMatrix(const T *vp)
{ std::copy(vp, vp+rows*cols, value); }
- virtual void apply(int index) const;
+ virtual void apply(int index) const
+ { apply(index, 1, value); }
+
+ static void apply(int index, unsigned size, const T *value);
virtual UniformMatrix *clone() const
{ return new UniformMatrix(value); }
typedef UniformMatrix<float, 4, 4> UniformMatrix4x4f;
+
+template<typename T>
+class UniformArray: public Uniform
+{
+private:
+ typedef typename T::BaseType BaseType;
+
+ BaseType *values;
+ unsigned size;
+
+public:
+ UniformArray(unsigned n, const BaseType *vp):
+ size(n)
+ {
+ unsigned elemsize = sizeof(typename T::Type)/sizeof(typename T::BaseType);
+ values = new BaseType[elemsize*size];
+ std::copy(vp, vp+elemsize*size, values);
+ }
+
+ virtual void apply(int index) const
+ { T::apply(index, size, values); }
+
+ virtual UniformArray *clone() const
+ { return new UniformArray(size, values); }
+};
+
} // namespace GL
} // namespace Msp