]> git.tdb.fi Git - libs/gl.git/blobdiff - source/uniformblock.cpp
Restructure ProgramData to support sharing between Programs
[libs/gl.git] / source / uniformblock.cpp
diff --git a/source/uniformblock.cpp b/source/uniformblock.cpp
new file mode 100644 (file)
index 0000000..95e1c2b
--- /dev/null
@@ -0,0 +1,113 @@
+#include <stdexcept>
+#include "color.h"
+#include "matrix.h"
+#include "uniform.h"
+#include "uniformblock.h"
+#include "vector.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+UniformBlock::~UniformBlock()
+{
+       for(map<int, Uniform *>::iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
+               delete i->second;
+}
+
+void UniformBlock::uniform(int index, Uniform *uni)
+{
+       map<int, Uniform *>::iterator i = uniforms.find(index);
+       if(i!=uniforms.end())
+       {
+               delete i->second;
+               i->second = uni;
+       }
+       else
+               uniforms[index] = uni;
+}
+
+void UniformBlock::uniform(int index, const Uniform &uni)
+{
+       uniform(index, uni.clone());
+}
+
+void UniformBlock::uniform(int index, int v)
+{
+       uniform(index, new Uniform1i(v));
+}
+
+void UniformBlock::uniform(int index, float v)
+{
+       uniform(index, new Uniform1f(v));
+}
+
+void UniformBlock::uniform(int index, float v0, float v1)
+{
+       uniform(index, new Uniform2f(v0, v1));
+}
+
+void UniformBlock::uniform2(int index, const float *v)
+{
+       uniform(index, v[0], v[1]);
+}
+
+void UniformBlock::uniform(int index, float v0, float v1, float v2)
+{
+       uniform(index, new Uniform3f(v0, v1, v2));
+}
+
+void UniformBlock::uniform(int index, const Vector3 &v)
+{
+       uniform(index, v.x, v.y, v.z);
+}
+
+void UniformBlock::uniform3(int index, const float *v)
+{
+       uniform(index, v[0], v[1], v[2]);
+}
+
+void UniformBlock::uniform(int index, float v0, float v1, float v2, float v3)
+{
+       uniform(index, new Uniform4f(v0, v1, v2, v3));
+}
+
+void UniformBlock::uniform(int index, const Vector4 &v)
+{
+       uniform(index, v.x, v.y, v.z, v.w);
+}
+
+void UniformBlock::uniform(int index, const Color &c)
+{
+       uniform(index, c.r, c.g, c.b, c.a);
+}
+
+void UniformBlock::uniform4(int index, const float *v)
+{
+       uniform(index, v[0], v[1], v[2], v[3]);
+}
+
+void UniformBlock::uniform_matrix4(int index, const float *v)
+{
+       uniform(index, new UniformMatrix4x4f(v));
+}
+
+void UniformBlock::uniform_matrix4(int index, const Matrix &m)
+{
+       float v[16];
+       copy(m.data(), m.data()+16, v);
+       uniform_matrix4(index, v);
+}
+
+void UniformBlock::apply(int index) const
+{
+       if(index>=0)
+               throw logic_error("GL_ARB_uniform_buffer_object support not implemented yet");
+
+       for(map<int, Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
+               i->second->apply(i->first);
+}
+
+} // namespace GL
+} // namespace Msp