Stores uniforms with a specific layout. Both named and default uniform blocks
are supported.
*/
-class UniformBlock: public Bufferable
+class UniformBlock: public NonCopyable
+{
+protected:
+ UniformBlock() { }
+public:
+ virtual ~UniformBlock() { }
+
+ virtual void attach(const Program::UniformInfo &, const Uniform &) = 0;
+ virtual void apply(int) const = 0;
+};
+
+/** Stores uniforms for the default uniform block. Uniforms are associated
+with locations, as returned by Program::get_uniform_location. */
+class DefaultUniformBlock: public UniformBlock
+{
+private:
+ std::vector<const Uniform *> uniforms;
+
+public:
+ DefaultUniformBlock();
+
+ virtual void attach(const Program::UniformInfo &, const Uniform &);
+ void attach(int, const Uniform &);
+ virtual void apply(int) const;
+};
+
+/** Stores uniforms for a buffer-backed uniform block. Uniform values are
+stored in a memory block which can be uploaded into a buffer and bound for use
+by a Program. */
+class BufferBackedUniformBlock: public UniformBlock, public Bufferable
{
private:
- std::map<int, const Uniform *> uniforms;
unsigned size;
std::vector<char> data;
mutable BufferRange *buf_range;
- UniformBlock(const UniformBlock &);
- UniformBlock &operator=(const UniformBlock &);
public:
- UniformBlock();
- UniformBlock(unsigned);
- ~UniformBlock();
+ BufferBackedUniformBlock(unsigned);
+ virtual ~BufferBackedUniformBlock();
private:
virtual unsigned get_data_size() const { return size; }
virtual void location_changed(Buffer *, unsigned, unsigned) const;
public:
- void attach(int, const Uniform &);
void attach(const Program::UniformInfo &, const Uniform &);
-
- void apply(int) const;
+ virtual void apply(int) const;
};
} // namespace GL