]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.cpp
Drop Id tags and copyright notices from files
[libs/gl.git] / source / programdata.cpp
1 #include "color.h"
2 #include "extension.h"
3 #include "matrix.h"
4 #include "program.h"
5 #include "programdata.h"
6 #include "uniform.h"
7 #include "vector.h"
8
9 using namespace std;
10
11 namespace Msp {
12 namespace GL {
13
14 ProgramData::ProgramData(const Program &p):
15         program(p)
16 {
17         static RequireExtension _ext("GL_ARB_shader_objects");
18 }
19
20 ProgramData::ProgramData(const ProgramData &other):
21         program(other.program),
22         data(other.data)
23 {
24         for(map<int, Uniform *>::iterator i=data.begin(); i!=data.end(); ++i)
25                 i->second = i->second->clone();
26 }
27
28 ProgramData::~ProgramData()
29 {
30         for(map<int, Uniform *>::iterator i=data.begin(); i!=data.end(); ++i)
31                 delete i->second;
32 }
33
34 void ProgramData::uniform(int index, Uniform *uni)
35 {
36         map<int, Uniform *>::iterator i = data.find(index);
37         if(i!=data.end())
38         {
39                 delete i->second;
40                 i->second = uni;
41         }
42         else
43                 data[index] = uni;
44 }
45
46 void ProgramData::uniform(int index, int v)
47 {
48         if(index>=0)
49                 uniform(index, new Uniform1i(v));
50 }
51
52 void ProgramData::uniform(int index, float v)
53 {
54         if(index>=0)
55                 uniform(index, new Uniform1f(v));
56 }
57
58 void ProgramData::uniform(int index, float v0, float v1)
59 {
60         if(index>=0)
61                 uniform(index, new Uniform2f(v0, v1));
62 }
63
64 void ProgramData::uniform2(int index, const float *v)
65 {
66         uniform(index, v[0], v[1]);
67 }
68
69 void ProgramData::uniform(int index, float v0, float v1, float v2)
70 {
71         if(index>=0)
72                 uniform(index, new Uniform3f(v0, v1, v2));
73 }
74
75 void ProgramData::uniform(int index, const Vector3 &v)
76 {
77         uniform(index, v.x, v.y, v.z);
78 }
79
80 void ProgramData::uniform3(int index, const float *v)
81 {
82         uniform(index, v[0], v[1], v[2]);
83 }
84
85 void ProgramData::uniform(int index, float v0, float v1, float v2, float v3)
86 {
87         if(index>=0)
88                 uniform(index, new Uniform4f(v0, v1, v2, v3));
89 }
90
91 void ProgramData::uniform(int index, const Vector4 &v)
92 {
93         uniform(index, v.x, v.y, v.z, v.w);
94 }
95
96 void ProgramData::uniform(int index, const Color &c)
97 {
98         uniform(index, c.r, c.g, c.b, c.a);
99 }
100
101 void ProgramData::uniform4(int index, const float *v)
102 {
103         uniform(index, v[0], v[1], v[2], v[3]);
104 }
105
106 void ProgramData::uniform_matrix4(int index, const float *v)
107 {
108         if(index>=0)
109                 uniform(index, new UniformMatrix4x4f(v));
110 }
111
112 void ProgramData::uniform_matrix4(int index, const Matrix &m)
113 {
114         if(index>=0)
115         {
116                 float v[16];
117                 copy(m.data(), m.data()+16, v);
118                 uniform_matrix4(index, v);
119         }
120 }
121
122 void ProgramData::uniform(const string &name, int v)
123 {
124         uniform(program.get_uniform_location(name), v);
125 }
126
127 void ProgramData::uniform(const string &name, float v)
128 {
129         uniform(program.get_uniform_location(name), v);
130 }
131
132 void ProgramData::uniform(const string &name, float v0, float v1)
133 {
134         uniform(program.get_uniform_location(name), v0, v1);
135 }
136
137 void ProgramData::uniform2(const string &name, const float *v)
138 {
139         uniform2(program.get_uniform_location(name), v);
140 }
141
142 void ProgramData::uniform(const string &name, float v0, float v1, float v2)
143 {
144         uniform(program.get_uniform_location(name), v0, v1, v2);
145 }
146
147 void ProgramData::uniform(const string &name, const Vector3 &v)
148 {
149         uniform(program.get_uniform_location(name), v);
150 }
151
152 void ProgramData::uniform3(const string &name, const float *v)
153 {
154         uniform3(program.get_uniform_location(name), v);
155 }
156
157 void ProgramData::uniform(const string &name, float v0, float v1, float v2, float v3)
158 {
159         uniform(program.get_uniform_location(name), v0, v1, v2, v3);
160 }
161
162 void ProgramData::uniform(const string &name, const Vector4 &v)
163 {
164         uniform(program.get_uniform_location(name), v);
165 }
166
167 void ProgramData::uniform4(const string &name, const float *v)
168 {
169         uniform4(program.get_uniform_location(name), v);
170 }
171
172 void ProgramData::uniform_matrix4(const string &name, const float *v)
173 {
174         uniform_matrix4(program.get_uniform_location(name), v);
175 }
176
177 void ProgramData::uniform_matrix4(const string &name, const Matrix &m)
178 {
179         uniform_matrix4(program.get_uniform_location(name), m);
180 }
181
182 void ProgramData::apply() const
183 {
184         for(map<int, Uniform *>::const_iterator i=data.begin(); i!=data.end(); ++i)
185                 i->second->apply(i->first);
186 }
187
188
189 ProgramData::Loader::Loader(ProgramData &pd):
190         DataFile::ObjectLoader<ProgramData>(pd)
191 {
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);
197 }
198
199 void ProgramData::Loader::uniform1i(const string &n, int v)
200 {
201         obj.uniform(n, v);
202 }
203
204 void ProgramData::Loader::uniform1f(const string &n, float v)
205 {
206         obj.uniform(n, v);
207 }
208
209 void ProgramData::Loader::uniform2f(const string &n, float v0, float v1)
210 {
211         obj.uniform(n, v0, v1);
212 }
213
214 void ProgramData::Loader::uniform3f(const string &n, float v0, float v1, float v2)
215 {
216         obj.uniform(n, v0, v1, v2);
217 }
218
219 void ProgramData::Loader::uniform4f(const string &n, float v0, float v1, float v2, float v3)
220 {
221         obj.uniform(n, v0, v1, v2, v3);
222 }
223
224 } // namespace GL
225 } // namespace Msp