ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/shader.C
Revision: 1.2
Committed: Sat Oct 23 21:47:02 2004 UTC (19 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.1: +4 -4 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #include "shader.h"
2 #include "shader_vars.h"
3
4 namespace shader {
5
6 refcounted::~refcounted ()
7 {
8 #if 0
9 if (refcnt)
10 abort ();
11 #endif
12 }
13
14 const char str_float [] = "float";
15 const char str_vec2 [] = "vec2";
16 const char str_vec3 [] = "vec3";
17 const char str_vec4 [] = "vec4";
18 const char str_mat2 [] = "mat2";
19 const char str_mat3 [] = "mat3";
20 const char str_mat4 [] = "mat4";
21
22 const char str_sampler_1d [] = "sampler1D";
23 const char str_sampler_1d_shadow [] = "sampler1DShadow";
24 const char str_sampler_2d [] = "sampler2D";
25 const char str_sampler_2d_shadow [] = "sampler2DShadow";
26 const char str_sampler_2d_rect [] = "sampler2DRect";
27 const char str_sampler_2d_rect_shadow [] = "sampler2DRectShadow";
28 const char str_sampler_3d [] = "sampler3D";
29 const char str_sampler_3d_rect [] = "sampler3DRect";
30 const char str_sampler_cube [] = "samplerCube";
31
32 unsigned int var_i::next_id = 0;
33
34 var_i::var_i (const char *typestr)
35 : typestr (typestr)
36 {
37 //param = cgCreateParameter (cg_context, cgtype);
38 }
39
40 var_i::~var_i ()
41 {
42 //cgDestroyParameter (param);
43 }
44
45 temporary_i::temporary_i (const char *strtype)
46 : var_i (strtype)
47 {
48 sprintf (name, "T%lx_%d", ((long)this >> 4) & 0xfff, ++next_id);
49 }
50
51 uniform_i::uniform_i (const char *strtype)
52 : var_i (strtype), dirty (true)
53 {
54 sprintf (name, "U%lx_%d", ((long)this >> 4) & 0xfff, ++next_id);
55 }
56
57 fragment_string_i::~fragment_string_i ()
58 {
59 free (str);
60 }
61
62 ////////////////////////////////////////////////////////////////////////////
63
64 void var_i::build_decl (ostringstream &b)
65 {
66 b << typestr << ' ' << name;
67 }
68
69 void uniform_i::build_decl (ostringstream &b)
70 {
71 b << "uniform " << typestr << ' ' << name;
72 }
73
74 void stream_i::build_decl (ostringstream &b)
75 {
76 b << typestr << ' ' << name;
77 }
78
79 ////////////////////////////////////////////////////////////////////////////
80
81 void glvar_i::build (shader_builder &b)
82 {
83 b << name;
84 }
85
86 void var_i::build (shader_builder &b)
87 {
88 b << name;
89 }
90
91 void uniform_i::build (shader_builder &b)
92 {
93 var_i::build (b);
94
95 if (find (b.refs.begin (), b.refs.end (), uniform (*this)) == b.refs.end ())
96 b.refs.push_back (*this);
97 }
98
99 void stream_i::build (shader_builder &b)
100 {
101 var_i::build (b);
102
103 if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ())
104 b.streams.push_back (*this);
105 }
106
107 void temporary_i::build (shader_builder &b)
108 {
109 var_i::build (b);
110
111 if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ())
112 b.temps.push_back (*this);
113 }
114
115 void fragment_vector_i::build (shader_builder &b)
116 {
117 for (vector<fragment>::iterator i = begin (); i != end (); i++)
118 (*i)->build (b);
119 }
120
121 void fragment_const_string_i::build (shader_builder &b)
122 {
123 b << str;
124 }
125
126 void fragment_string_i::build (shader_builder &b)
127 {
128 b << str;
129 }
130
131 #if 0
132 void statement_i::build (shader_builder &b)
133 {
134 b << " ";
135 fragment_vector_i::build (b);
136 b << ";\n";
137 }
138 #endif
139
140 ////////////////////////////////////////////////////////////////////////////
141
142 shader_object_i *cur = 0;
143
144 shader_object_i::shader_object_i (GLenum type)
145 : type (type)
146 {
147 id = glCreateShaderObjectARB (type);
148 }
149
150 shader_object_i::~shader_object_i ()
151 {
152 glDeleteObjectARB (id);
153 }
154
155 void shader_object_i::start ()
156 {
157 clear ();
158 cur = this;
159 }
160
161 void shader_object_i::stop ()
162 {
163 cur = 0;
164 }
165
166 string shader_object_i::source ()
167 {
168 shader_builder b;
169 build (b);
170 ostringstream os;
171
172 for (vector<uniform>::iterator i = b.refs.begin (); i != b.refs.end (); i++)
173 {
174 (*i)->build_decl (os);
175 os << ";\n";
176 }
177
178 // not neccessary right now, as GLSL is rich on predefinitions
179 for (vector<var>::iterator i = b.streams.begin (); i != b.streams.end (); i++)
180 {
181 os << "attribute ";
182 (*i)->build_decl (os);
183 os << ";\n";
184 }
185
186 os << "\nvoid main (void)\n{\n";
187
188 for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++)
189 {
190 os << " ";
191 (*i)->build_decl (os);
192 os << ";\n";
193 }
194
195 os << "\n";
196 os << b.source.str ();
197 os << "}\n";
198
199 return os.str ();
200 }
201
202 void shader_object_i::compile ()
203 {
204 string src = source ();
205 const char *sptr = src.data ();
206 const int slen = src.size ();
207
208 printf ("SOURCE<%s>\n", src.c_str ());
209 abort ();
210 glShaderSourceARB (id, 1, &sptr, &slen);
211 glCompileShaderARB (id);
212
213 GLint compiled;
214 glGetObjectParameterivARB (id, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
215
216 if (!compiled)
217 {
218 char infolog[8192];
219 glGetInfoLogARB (id, 8192, NULL, infolog);
220 printf ("SOURCE<%s>\n", src.c_str ());
221 printf ("INFOLOG<%s>\n", infolog);
222 abort ();
223 }
224 }
225
226 template<typename T>
227 struct sl_append
228 {
229 T t;
230
231 sl_append (const T &t) : t(t) { }
232
233 void operator ()() const
234 {
235 cur->push_back (t);
236 }
237 };
238
239 template<int length>
240 struct sl_string
241 {
242 char str[length];
243
244 void operator ()() const
245 {
246 cur->push_back (*new fragment_string_i (str));
247 }
248 };
249
250 // only floats
251 struct sl_float
252 {
253 const GLfloat c;
254
255 sl_float (GLfloat c) : c(c) { }
256
257 void operator ()() const
258 {
259 char s[64];
260 sprintf (s, "%g", c);
261 cur->append_string (s);
262 }
263 };
264
265 template<class A, class B>
266 inline sl_expr< sl_concat2<A, B> >
267 concat (const A &a, const B &b)
268 {
269 typedef sl_concat2<A, B> expr;
270 return sl_expr<expr> (expr (a, b));
271 }
272
273 template<class A, class B, class C>
274 inline sl_expr< sl_concat3<A, B, C> >
275 concat (const A &a, const B &b, const C &c)
276 {
277 typedef sl_concat3<A, B, C> expr;
278 return sl_expr<expr> (expr (a, b, c));
279 }
280
281 template<class A, class B, class C, class D>
282 inline sl_expr< sl_concat4<A, B, C, D> >
283 concat (const A &a, const B &b, const C &c, const D &d)
284 {
285 typedef sl_concat4<A, B, C, D> expr;
286 return sl_expr<expr> (expr (a, b, c, d));
287 }
288
289 template<typename expr>
290 struct sl_convert
291 {
292 typedef sl_expr<expr> T;
293 static inline const T &convert (const T &e)
294 {
295 return e;
296 }
297 };
298
299 template<>
300 struct sl_convert<GLfloat>
301 {
302 typedef sl_expr<sl_float> T;
303 static inline const T convert (GLfloat f)
304 {
305 return sl_float (f);
306 }
307 };
308
309 template<>
310 struct sl_convert<vec3>
311 {
312 typedef sl_expr< sl_string<256> > T;
313 static inline const T convert (const vec3 &v)
314 {
315 sl_string<256> s;
316 sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z);
317 return s;
318 }
319 };
320
321 template<>
322 struct sl_convert<vec4>
323 {
324 typedef sl_expr< sl_string<256> > T;
325 static inline const T convert (const vec4 &v)
326 {
327 sl_string<256> s;
328 sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w);
329 return s;
330 }
331 };
332
333 template<>
334 template<class V>
335 struct sl_convert< var_ref<V> >
336 {
337 typedef sl_expr< sl_append< var_ref<V> > > T;
338 static inline const T convert (const var_ref<V> &v)
339 {
340 return sl_append< var_ref<V> > (v);
341 }
342 };
343
344 template<>
345 struct sl_convert<glvar>
346 {
347 typedef sl_expr< sl_append<glvar> > T;
348 static inline const T convert (const glvar &v)
349 {
350 return sl_append<glvar> (v);
351 }
352 };
353
354 template<>
355 template<const char *strtype>
356 struct sl_convert< temp_ref<strtype> >
357 {
358 typedef sl_expr< sl_append< temp_ref<strtype> > > T;
359 static inline const T convert (const temp_ref<strtype> &v)
360 {
361 return sl_expr< sl_append< temp_ref<strtype> > >(
362 sl_append< temp_ref<strtype> > (v)
363 );
364 }
365 };
366
367 template<class fragment, typename expr>
368 inline void sl_assign (const fragment &f, const expr &e)
369 {
370 cur->append_const (" ");
371 cur->append (f);
372 cur->append_const (" = ");
373 sl_convert<expr>::convert (e) ();
374 cur->append_const (";\n");
375 }
376
377 template<class type>
378 template<typename expr>
379 inline const auto_lvalue_ref0<type> &auto_lvalue_ref0<type>::operator =(const expr &e) const
380 {
381 sl_assign (*this, e);
382 return *this;
383 }
384
385 template<class type, typename arg1>
386 template<typename expr>
387 inline const auto_lvalue_ref1<type,arg1> &auto_lvalue_ref1<type,arg1>::operator =(const expr &e) const
388 {
389 sl_assign (*this, e);
390 return *this;
391 }
392
393 template<const char *strtype>
394 template<typename expr>
395 inline const temp_ref<strtype> &temp_ref<strtype>::operator =(const expr &e) const
396 {
397 sl_assign (*this, e);
398 return *this;
399 }
400
401 struct sl_append_const_string
402 {
403 fragment_const_string str;
404 sl_append_const_string (const char *s)
405 : str (s)
406 { }
407
408 void operator ()() const
409 {
410 cur->push_back (str);
411 }
412 };
413
414 # define SHADER_BINOP(op, str) \
415 extern const sl_append_const_string str_ ## str; \
416 template<typename A, typename B> \
417 inline const sl_expr< sl_concat3< typename sl_convert<A>::T, \
418 sl_append_const_string, \
419 typename sl_convert<B>::T > > \
420 operator op(const A &a, const B &b) \
421 { \
422 return concat (sl_convert<A>::convert (a), str_ ## str, sl_convert<B>::convert (b)); \
423 }
424
425 const sl_append_const_string str_plus (" + ");
426 const sl_append_const_string str_minus (" - ");
427 const sl_append_const_string str_mul (" * ");
428 const sl_append_const_string str_div (" / ");
429
430 SHADER_BINOP (+, plus);
431 SHADER_BINOP (-, minus);
432 SHADER_BINOP (*, mul);
433 SHADER_BINOP (/, div);
434
435 # undef SHADER_BINOP
436
437 const sl_append_const_string str_rpar (")");
438
439 void debdebdebdebug ()//D
440 {
441 vertex_shader vsh;
442 fragment_shader fsh;
443 temp_4f t1, t2;
444 sampler_2d s2d (1);
445
446 vsh->start ();
447
448 temp_4f lightpos;
449 temp_3f wpos;
450
451 lightpos = vec4 (10, -10, 0, 1);
452 wpos = gl.model_view_matrix_inverse_transpose * vin.normal;
453 vout.position = wpos;
454
455 vsh->end ();
456 vsh->compile ();
457 }
458
459 }
460