#define MSP_GL_UNIFORMBLOCK_H_
#include <map>
+#include <vector>
+#include "bufferable.h"
+#include "program.h"
+#include "vector.h"
namespace Msp {
namespace GL {
-class Color;
+class BufferRange;
class Matrix;
class Uniform;
-class Vector3;
-class Vector4;
+struct Color;
-class UniformBlock
+/**
+Stores uniforms with a specific layout. Both named and default uniform blocks
+are supported.
+*/
+class UniformBlock: public Bufferable
{
private:
- std::map<int, Uniform *> uniforms;
+ 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();
+ UniformBlock(unsigned);
~UniformBlock();
private:
- void uniform(int, Uniform *);
+ virtual unsigned get_data_size() const { return size; }
+ virtual const void *get_data_pointer() const { return &data[0]; }
+ virtual unsigned get_alignment() const;
+ virtual void offset_changed();
+ virtual void upload_data(char *) const;
+
public:
- void uniform(int, const Uniform &);
- void uniform(int, int);
- void uniform(int, float);
- void uniform(int, float, float);
- void uniform2(int, const float *);
- void uniform(int, float, float, float);
- void uniform(int, const Vector3 &);
- void uniform3(int, const float *);
- void uniform(int, float, float, float, float);
- void uniform(int, const Vector4 &);
- void uniform(int, const Color &);
- void uniform4(int, const float *);
- void uniform_matrix4(int, const float *);
- void uniform_matrix4(int, const Matrix &);
+ void attach(int, const Uniform &);
+ void attach(const Program::UniformInfo &, const Uniform &);
void apply(int) const;
};