]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/uniformblock.h
Split UniformBlock into two classes
[libs/gl.git] / source / core / uniformblock.h
index c8b8d36a3d8e2deceaf8881d5dbb83ec0ae1f825..5a037edb4b5e53323e32bddf7a1fbf44f4353581 100644 (file)
@@ -19,20 +19,45 @@ struct Color;
 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::map<int, 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:
        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; }
@@ -41,10 +66,8 @@ private:
        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