5 #include "programdata.h"
14 ProgramData::ProgramData(const Program &p):
17 static RequireExtension _ext("GL_ARB_shader_objects");
20 ProgramData::ProgramData(const ProgramData &other):
21 program(other.program),
24 for(map<int, Uniform *>::iterator i=data.begin(); i!=data.end(); ++i)
25 i->second = i->second->clone();
28 ProgramData::~ProgramData()
30 for(map<int, Uniform *>::iterator i=data.begin(); i!=data.end(); ++i)
34 void ProgramData::uniform(int index, Uniform *uni)
36 map<int, Uniform *>::iterator i = data.find(index);
46 void ProgramData::uniform(int index, int v)
49 uniform(index, new Uniform1i(v));
52 void ProgramData::uniform(int index, float v)
55 uniform(index, new Uniform1f(v));
58 void ProgramData::uniform(int index, float v0, float v1)
61 uniform(index, new Uniform2f(v0, v1));
64 void ProgramData::uniform2(int index, const float *v)
66 uniform(index, v[0], v[1]);
69 void ProgramData::uniform(int index, float v0, float v1, float v2)
72 uniform(index, new Uniform3f(v0, v1, v2));
75 void ProgramData::uniform(int index, const Vector3 &v)
77 uniform(index, v.x, v.y, v.z);
80 void ProgramData::uniform3(int index, const float *v)
82 uniform(index, v[0], v[1], v[2]);
85 void ProgramData::uniform(int index, float v0, float v1, float v2, float v3)
88 uniform(index, new Uniform4f(v0, v1, v2, v3));
91 void ProgramData::uniform(int index, const Vector4 &v)
93 uniform(index, v.x, v.y, v.z, v.w);
96 void ProgramData::uniform(int index, const Color &c)
98 uniform(index, c.r, c.g, c.b, c.a);
101 void ProgramData::uniform4(int index, const float *v)
103 uniform(index, v[0], v[1], v[2], v[3]);
106 void ProgramData::uniform_matrix4(int index, const float *v)
109 uniform(index, new UniformMatrix4x4f(v));
112 void ProgramData::uniform_matrix4(int index, const Matrix &m)
117 copy(m.data(), m.data()+16, v);
118 uniform_matrix4(index, v);
122 void ProgramData::uniform(const string &name, int v)
124 uniform(program.get_uniform_location(name), v);
127 void ProgramData::uniform(const string &name, float v)
129 uniform(program.get_uniform_location(name), v);
132 void ProgramData::uniform(const string &name, float v0, float v1)
134 uniform(program.get_uniform_location(name), v0, v1);
137 void ProgramData::uniform2(const string &name, const float *v)
139 uniform2(program.get_uniform_location(name), v);
142 void ProgramData::uniform(const string &name, float v0, float v1, float v2)
144 uniform(program.get_uniform_location(name), v0, v1, v2);
147 void ProgramData::uniform(const string &name, const Vector3 &v)
149 uniform(program.get_uniform_location(name), v);
152 void ProgramData::uniform3(const string &name, const float *v)
154 uniform3(program.get_uniform_location(name), v);
157 void ProgramData::uniform(const string &name, float v0, float v1, float v2, float v3)
159 uniform(program.get_uniform_location(name), v0, v1, v2, v3);
162 void ProgramData::uniform(const string &name, const Vector4 &v)
164 uniform(program.get_uniform_location(name), v);
167 void ProgramData::uniform4(const string &name, const float *v)
169 uniform4(program.get_uniform_location(name), v);
172 void ProgramData::uniform_matrix4(const string &name, const float *v)
174 uniform_matrix4(program.get_uniform_location(name), v);
177 void ProgramData::uniform_matrix4(const string &name, const Matrix &m)
179 uniform_matrix4(program.get_uniform_location(name), m);
182 void ProgramData::apply() const
184 for(map<int, Uniform *>::const_iterator i=data.begin(); i!=data.end(); ++i)
185 i->second->apply(i->first);
189 ProgramData::Loader::Loader(ProgramData &pd):
190 DataFile::ObjectLoader<ProgramData>(pd)
192 add("uniform1i", &Loader::uniform1i);
193 add("uniform1f", &Loader::uniform1f);
194 add("uniform2f", &Loader::uniform2f);
195 add("uniform3f", &Loader::uniform3f);
196 add("uniform4f", &Loader::uniform4f);
199 void ProgramData::Loader::uniform1i(const string &n, int v)
204 void ProgramData::Loader::uniform1f(const string &n, float v)
209 void ProgramData::Loader::uniform2f(const string &n, float v0, float v1)
211 obj.uniform(n, v0, v1);
214 void ProgramData::Loader::uniform3f(const string &n, float v0, float v1, float v2)
216 obj.uniform(n, v0, v1, v2);
219 void ProgramData::Loader::uniform4f(const string &n, float v0, float v1, float v2, float v3)
221 obj.uniform(n, v0, v1, v2, v3);