+
+template<typename T>
+class UniformArray: public Uniform
+{
+private:
+ typedef typename T::BaseType BaseType;
+ enum { elemsize = sizeof(typename T::Type)/sizeof(typename T::BaseType) };
+
+ unsigned size_;
+ BaseType *values;
+
+public:
+ UniformArray(unsigned n, const BaseType *vp):
+ size_(n),
+ values(new BaseType[elemsize*size_])
+ {
+ set(vp);
+ }
+
+ ~UniformArray()
+ {
+ delete[] values;
+ }
+
+ unsigned size() const { return size_; }
+
+ void set(const BaseType *vp)
+ { std::copy(vp, vp+elemsize*size_, values); }
+
+ virtual void apply(int index) const
+ { T::apply(index, size_, values); }
+
+ virtual void store(const Program::UniformInfo &info, void *buffer) const
+ {
+ for(unsigned i=0; i<size_; ++i)
+ T::store(info, reinterpret_cast<char *>(buffer)+i*info.array_stride, values+i*elemsize);
+ }
+
+ virtual UniformArray *clone() const
+ { return new UniformArray(size_, values); }
+};
+