… | |
… | |
14 | { |
14 | { |
15 | if (refcnt) |
15 | if (refcnt) |
16 | abort (); |
16 | abort (); |
17 | } |
17 | } |
18 | |
18 | |
19 | void refcounted::refcnt_dec () const |
19 | void refcounted::refcnt_destroy () const |
20 | { |
20 | { |
21 | if (!--refcnt) |
21 | if (!--refcnt) |
22 | delete this; // quite a bit of code... |
22 | delete this; // quite a bit of code... |
23 | } |
23 | } |
24 | |
24 | |
… | |
… | |
40 | const char str_sampler_3d_rect [] = "sampler3DRect"; |
40 | const char str_sampler_3d_rect [] = "sampler3DRect"; |
41 | const char str_sampler_cube [] = "samplerCube"; |
41 | const char str_sampler_cube [] = "samplerCube"; |
42 | |
42 | |
43 | unsigned int var_i::next_id = 0; |
43 | unsigned int var_i::next_id = 0; |
44 | |
44 | |
45 | var_i::var_i (const char *typestr) |
45 | var_i::var_i (const char *domainstr, const char *typestr) |
46 | : typestr (typestr) |
46 | : domainstr (domainstr), typestr (typestr) |
47 | { |
47 | { |
48 | } |
48 | } |
49 | |
49 | |
50 | var_i::~var_i () |
50 | var_i::~var_i () |
51 | { |
51 | { |
… | |
… | |
58 | sprintf (name, "V%d", ++next_id); |
58 | sprintf (name, "V%d", ++next_id); |
59 | } |
59 | } |
60 | #endif |
60 | #endif |
61 | |
61 | |
62 | temporary_i::temporary_i (const char *strtype) |
62 | temporary_i::temporary_i (const char *strtype) |
63 | : var_i (strtype) |
63 | : var_i (0, strtype) |
64 | { |
64 | { |
65 | sprintf (name, "T%d", ++next_id); |
65 | sprintf (name, "T%d", ++next_id); |
66 | } |
66 | } |
67 | |
67 | |
68 | varying_i::varying_i (const char *strtype) |
68 | varying_i::varying_i (const char *strtype) |
69 | : var_i (strtype) |
69 | : var_i ("varying", strtype) |
70 | { |
70 | { |
71 | sprintf (name, "V%d", ++next_id); |
71 | sprintf (name, "V%d", ++next_id); |
72 | } |
72 | } |
73 | |
73 | |
74 | uniform_i::uniform_i (const char *strtype) |
74 | uniform_i::uniform_i (const char *strtype) |
75 | : var_i (strtype) |
75 | : var_i ("uniform", strtype) |
76 | { |
76 | { |
77 | sprintf (name, "U%d", ++next_id); |
77 | sprintf (name, "U%d", ++next_id); |
78 | } |
78 | } |
79 | |
79 | |
80 | fragment_string_i::~fragment_string_i () |
|
|
81 | { |
|
|
82 | free (str); |
|
|
83 | } |
|
|
84 | |
|
|
85 | //////////////////////////////////////////////////////////////////////////// |
80 | //////////////////////////////////////////////////////////////////////////// |
86 | |
81 | |
87 | void var_i::build_decl (ostringstream &b) |
82 | void var_i::operator ()() const |
88 | { |
83 | { |
89 | b << typestr << ' ' << name; |
84 | compile::cur->code << name; |
90 | } |
|
|
91 | |
85 | |
92 | void uniform_i::build_decl (ostringstream &b) |
86 | if (compile::cur->first (this)) |
93 | { |
87 | { |
94 | b << "uniform " << typestr << ' ' << name; |
88 | if (domainstr) |
|
|
89 | compile::cur->global << domainstr << ' ' << typestr << ' ' << name << ";\n"; |
|
|
90 | else |
|
|
91 | compile::cur->local << " " << typestr << ' ' << name << ";\n"; |
|
|
92 | } |
95 | } |
93 | } |
96 | |
|
|
97 | void varying_i::build_decl (ostringstream &b) |
|
|
98 | { |
|
|
99 | b << "varying " << typestr << ' ' << name; |
|
|
100 | } |
|
|
101 | |
|
|
102 | //////////////////////////////////////////////////////////////////////////// |
|
|
103 | |
|
|
104 | void gluvar_i::build (shader_builder &b) |
|
|
105 | { |
|
|
106 | b << name; |
|
|
107 | } |
|
|
108 | |
|
|
109 | void var_i::build (shader_builder &b) |
|
|
110 | { |
|
|
111 | b << name; |
|
|
112 | } |
|
|
113 | |
|
|
114 | void uniform_i::build (shader_builder &b) |
|
|
115 | { |
|
|
116 | var_i::build (b); |
|
|
117 | |
|
|
118 | if (find (b.refs.begin (), b.refs.end (), uniform (*this)) == b.refs.end ()) |
|
|
119 | b.refs.push_back (*this); |
|
|
120 | } |
|
|
121 | |
|
|
122 | #if 0 |
|
|
123 | void stream_i::build (shader_builder &b) |
|
|
124 | { |
|
|
125 | var_i::build (b); |
|
|
126 | |
|
|
127 | #if 0 |
|
|
128 | if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ()) |
|
|
129 | b.streams.push_back (*this); |
|
|
130 | #endif |
|
|
131 | } |
|
|
132 | #endif |
|
|
133 | |
|
|
134 | void temporary_i::build (shader_builder &b) |
|
|
135 | { |
|
|
136 | var_i::build (b); |
|
|
137 | |
|
|
138 | if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ()) |
|
|
139 | b.temps.push_back (*this); |
|
|
140 | } |
|
|
141 | |
|
|
142 | void varying_i::build (shader_builder &b) |
|
|
143 | { |
|
|
144 | var_i::build (b); |
|
|
145 | |
|
|
146 | if (find (b.refs.begin (), b.refs.end (), var (*this)) == b.refs.end ()) |
|
|
147 | b.refs.push_back (*this); |
|
|
148 | } |
|
|
149 | |
|
|
150 | void fragment_vector_i::build (shader_builder &b) |
|
|
151 | { |
|
|
152 | for (vector<fragment>::iterator i = begin (); i != end (); i++) |
|
|
153 | (*i)->build (b); |
|
|
154 | } |
|
|
155 | |
|
|
156 | void fragment_const_string_i::build (shader_builder &b) |
|
|
157 | { |
|
|
158 | b << str; |
|
|
159 | } |
|
|
160 | |
|
|
161 | void fragment_string_i::build (shader_builder &b) |
|
|
162 | { |
|
|
163 | b << str; |
|
|
164 | } |
|
|
165 | |
|
|
166 | #if 0 |
|
|
167 | void statement_i::build (shader_builder &b) |
|
|
168 | { |
|
|
169 | b << " "; |
|
|
170 | fragment_vector_i::build (b); |
|
|
171 | b << ";\n"; |
|
|
172 | } |
|
|
173 | #endif |
|
|
174 | |
94 | |
175 | //////////////////////////////////////////////////////////////////////////// |
95 | //////////////////////////////////////////////////////////////////////////// |
176 | |
96 | |
177 | int texture_units::unit_count = 8; |
97 | int texture_units::unit_count = 8; |
178 | int texture_units::units[8] = { 7, 6, 5, 4, 3, 2, 1, 0 }; |
98 | int texture_units::units[8] = { 7, 6, 5, 4, 3, 2, 1, 0 }; |
… | |
… | |
187 | } |
107 | } |
188 | |
108 | |
189 | shader_object_i::~shader_object_i () |
109 | shader_object_i::~shader_object_i () |
190 | { |
110 | { |
191 | glDeleteObjectARB (id); |
111 | glDeleteObjectARB (id); |
192 | } |
|
|
193 | |
|
|
194 | void shader_object_i::start () |
|
|
195 | { |
|
|
196 | clear (); |
|
|
197 | cur = this; |
|
|
198 | } |
|
|
199 | |
|
|
200 | void shader_object_i::stop () |
|
|
201 | { |
|
|
202 | cur = 0; |
|
|
203 | } |
|
|
204 | |
|
|
205 | string shader_object_i::source () |
|
|
206 | { |
|
|
207 | shader_builder b; |
|
|
208 | build (b); |
|
|
209 | ostringstream os; |
|
|
210 | |
|
|
211 | for (vector<var>::iterator i = b.refs.begin (); i != b.refs.end (); i++) |
|
|
212 | { |
|
|
213 | (*i)->build_decl (os); |
|
|
214 | os << ";\n"; |
|
|
215 | } |
|
|
216 | |
|
|
217 | #if 0 |
|
|
218 | // not neccessary right now, as GLSL is rich on predefinitions |
|
|
219 | for (vector<var>::iterator i = b.streams.begin (); i != b.streams.end (); i++) |
|
|
220 | { |
|
|
221 | os << "attribute "; |
|
|
222 | (*i)->build_decl (os); |
|
|
223 | os << ";\n"; |
|
|
224 | } |
|
|
225 | #endif |
|
|
226 | |
|
|
227 | os << "\nvoid main (void)\n{\n"; |
|
|
228 | |
|
|
229 | for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++) |
|
|
230 | { |
|
|
231 | os << " "; |
|
|
232 | (*i)->build_decl (os); |
|
|
233 | os << ";\n"; |
|
|
234 | } |
|
|
235 | |
|
|
236 | os << "\n"; |
|
|
237 | os << b.source.str (); |
|
|
238 | os << "}\n"; |
|
|
239 | |
|
|
240 | return os.str (); |
|
|
241 | } |
112 | } |
242 | |
113 | |
243 | static string linify (const string &s) |
114 | static string linify (const string &s) |
244 | { |
115 | { |
245 | ostringstream o; |
116 | ostringstream o; |
… | |
… | |
258 | } while (b < s.size ()); |
129 | } while (b < s.size ()); |
259 | |
130 | |
260 | return o.str (); |
131 | return o.str (); |
261 | } |
132 | } |
262 | |
133 | |
|
|
134 | void shader_object_i::start () |
|
|
135 | { |
|
|
136 | compile::cur = new compile::shader_builder; |
|
|
137 | } |
|
|
138 | |
263 | void shader_object_i::compile () |
139 | void shader_object_i::stop () |
264 | { |
140 | { |
|
|
141 | compile::shader_builder &b = *compile::cur; |
|
|
142 | |
|
|
143 | ostringstream os; |
|
|
144 | |
|
|
145 | os << b.global.str () |
|
|
146 | << "\nvoid main (void)\n" |
|
|
147 | << "{\n" |
|
|
148 | << b.local.str () |
|
|
149 | << "\n" |
|
|
150 | << b.code.str () |
|
|
151 | << "}\n"; |
|
|
152 | |
|
|
153 | delete cur; |
|
|
154 | cur = 0; |
|
|
155 | |
265 | string src = source (); |
156 | string src = os.str (); |
266 | const char *sptr = src.data (); |
157 | const char *sptr = src.data (); |
267 | const int slen = src.size (); |
158 | const int slen = src.size (); |
268 | |
159 | |
269 | printf ("%s\n", linify (src).c_str ()); |
160 | printf ("%s\n", linify (src).c_str ()); |
270 | glShaderSourceARB (id, 1, &sptr, &slen); |
161 | glShaderSourceARB (id, 1, &sptr, &slen); |
… | |
… | |
343 | //TODO: clear samplers here |
234 | //TODO: clear samplers here |
344 | glUseProgramObjectARB (0); |
235 | glUseProgramObjectARB (0); |
345 | cur = 0; |
236 | cur = 0; |
346 | } |
237 | } |
347 | |
238 | |
348 | void sl_func0::begin () const |
239 | const sl_expr< sl_string<60> > sl_convert< ::vec2 >::convert (const ::vec2 &v) |
349 | { |
|
|
350 | cur->append_string (name_par); |
|
|
351 | } |
|
|
352 | |
|
|
353 | void sl_func0::comma () const |
|
|
354 | { |
|
|
355 | cur->append (compile::str_comma); |
|
|
356 | } |
|
|
357 | |
|
|
358 | void sl_func0::end () const |
|
|
359 | { |
|
|
360 | cur->append_const (")"); |
|
|
361 | } |
|
|
362 | |
|
|
363 | void sl_float::operator ()() const |
|
|
364 | { |
|
|
365 | char s[20]; |
|
|
366 | sprintf (s, "%g", c); |
|
|
367 | cur->append_string (s); |
|
|
368 | } |
|
|
369 | |
|
|
370 | const sl_convert< ::vec2 >::T sl_convert< ::vec2 >::convert (const ::vec2 &v) |
|
|
371 | { |
240 | { |
372 | sl_string<60> s; |
241 | sl_string<60> s; |
373 | sprintf (s.str, "vec2 (%g, %g)", v.x, v.y); |
242 | sprintf (s.str, "vec2 (%g, %g)", v.x, v.y); |
374 | return s; |
243 | return s; |
375 | } |
244 | } |
376 | |
245 | |
377 | const sl_convert< ::vec3 >::T sl_convert< ::vec3 >::convert (const ::vec3 &v) |
246 | const sl_expr< sl_string<80> > sl_convert< ::vec3 >::convert (const ::vec3 &v) |
378 | { |
247 | { |
379 | sl_string<80> s; |
248 | sl_string<80> s; |
380 | sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z); |
249 | sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z); |
381 | return s; |
250 | return s; |
382 | } |
251 | } |
383 | |
252 | |
384 | const sl_convert< ::vec4 >::T sl_convert< ::vec4 >::convert (const ::vec4 &v) |
253 | const sl_expr< sl_string<100> > sl_convert< ::vec4 >::convert (const ::vec4 &v) |
385 | { |
254 | { |
386 | sl_string<100> s; |
255 | sl_string<100> s; |
387 | sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w); |
256 | sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w); |
388 | return s; |
257 | return s; |
389 | } |
258 | } |
390 | |
259 | |
391 | namespace compile { |
260 | namespace compile { |
392 | |
261 | |
393 | const fragment_const_string str_2sp (" "); |
262 | shader_builder *cur = 0; |
394 | const fragment_const_string str_equal (" = "); |
263 | |
395 | const fragment_const_string str_comma (", "); |
264 | bool shader_builder::first (const void *p) |
396 | const fragment_const_string str_endl (";\n"); |
265 | { |
|
|
266 | if (seen.find (p) == seen.end ()) |
|
|
267 | { |
|
|
268 | seen.insert (p); |
|
|
269 | return true; |
|
|
270 | } |
|
|
271 | |
|
|
272 | return false; |
|
|
273 | } |
397 | } |
274 | } |
398 | |
275 | |
399 | void debdebdebdebug ()//D |
276 | void debdebdebdebug ()//D |
400 | { |
277 | { |
401 | return; |
278 | return; |
… | |
… | |
416 | vout.tex_coord[1] = normalize (lightpos - wpos); |
293 | vout.tex_coord[1] = normalize (lightpos - wpos); |
417 | vout.tex_coord[2] = normalize (wpos); |
294 | vout.tex_coord[2] = normalize (wpos); |
418 | //vout.tex_coord[3] = normalize (xyz (model_view_matrix_inverse_transpose) * vin.normal); |
295 | //vout.tex_coord[3] = normalize (xyz (model_view_matrix_inverse_transpose) * vin.normal); |
419 | //vout.tex_coord[4] = normalize (xyz (projection_matrix_inverse_transpose) - wpos); |
296 | //vout.tex_coord[4] = normalize (xyz (projection_matrix_inverse_transpose) - wpos); |
420 | |
297 | |
421 | vsh->end (); |
|
|
422 | vsh->compile (); |
298 | vsh->stop (); |
423 | |
299 | |
424 | fragment_shader fsh; |
300 | fragment_shader fsh; |
425 | |
301 | |
426 | fsh->start (); |
302 | fsh->start (); |
427 | |
303 | |
428 | xyz (fout.frag_color) = noise3 (x (fin.frag_coord) * y (fin.frag_coord)); |
304 | xyz (fout.frag_color) = noise3 (x (fin.frag_coord) * y (fin.frag_coord)); |
429 | |
305 | |
430 | temp_1f spec_expon; |
306 | temp_1f spec_expon; |
431 | spec_expon = 200; |
307 | spec_expon = 200; |
432 | |
308 | |
433 | fsh->end (); |
|
|
434 | fsh->compile (); |
309 | fsh->stop (); |
435 | |
310 | |
436 | //abort (); |
311 | //abort (); |
437 | } |
312 | } |
438 | |
313 | |
439 | } |
314 | } |