+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#include "extension.h"
+#include "programdata.h"
+#include "uniform.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+ProgramData::ProgramData()
+{
+ require_extension("GL_ARB_shader_objects");
+}
+
+ProgramData::~ProgramData()
+{
+ for(map<int, Uniform *>::iterator i=data.begin(); i!=data.end(); ++i)
+ delete i->second;
+}
+
+void ProgramData::uniform(int index, Uniform *uni)
+{
+ if(index<0)
+ return;
+
+ map<int, Uniform *>::iterator i=data.find(index);
+ if(i!=data.end())
+ {
+ delete i->second;
+ i->second=uni;
+ }
+ else
+ data[index]=uni;
+}
+
+void ProgramData::uniform(int index, int v)
+{
+ uniform(index, new Uniform1i(v));
+}
+
+void ProgramData::uniform(int index, float v)
+{
+ uniform(index, new Uniform1f(v));
+}
+
+void ProgramData::uniform(int index, float v0, float v1)
+{
+ uniform(index, new Uniform2f(v0, v1));
+}
+
+void ProgramData::uniform2(int index, const float *v)
+{
+ uniform(index, v[0], v[1]);
+}
+
+void ProgramData::uniform(int index, float v0, float v1, float v2)
+{
+ uniform(index, new Uniform3f(v0, v1, v2));
+}
+
+void ProgramData::uniform3(int index, const float *v)
+{
+ uniform(index, v[0], v[1], v[2]);
+}
+
+void ProgramData::uniform(int index, float v0, float v1, float v2, float v3)
+{
+ uniform(index, new Uniform4f(v0, v1, v2, v3));
+}
+
+void ProgramData::uniform4(int index, const float *v)
+{
+ uniform(index, v[0], v[1], v[2], v[3]);
+}
+
+void ProgramData::apply() const
+{
+ for(map<int, Uniform *>::const_iterator i=data.begin(); i!=data.end(); ++i)
+ i->second->apply(i->first);
+}
+
+} // namespace GL
+} // namespace Msp