ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/shader.h
Revision: 1.15
Committed: Thu Oct 28 17:07:47 2004 UTC (19 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.14: +19 -19 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #ifndef SHADER_H
2     #define SHADER_H
3    
4     #include <sstream>
5    
6     #include "opengl.h"
7     #include "util.h"
8    
9     namespace shader {
10    
11     using namespace std;
12    
13     const int NAMELEN = 32;
14    
15     template<class T>
16     struct sl_expr {
17     const T t;
18     sl_expr (const T &t) : t(t) { }
19     void operator ()() const { t (); }
20 root 1.5 template<typename expr>
21     const sl_expr &operator =(const expr &e) const;
22 root 1.1 };
23    
24     template<class A, class B>
25     struct sl_concat2
26     {
27     const A a; const B b;
28     sl_concat2 (const A &a, const B &b) : a(a), b(b) { }
29     void operator ()() const { a (); b (); }
30     };
31    
32     template<class A, class B, class C>
33     struct sl_concat3
34     {
35     const A a; const B b; const C c;
36     sl_concat3 (const A &a, const B &b, const C &c) : a(a), b(b), c(c) { }
37     void operator ()() const { a (); b (); c (); }
38     };
39    
40     template<class A, class B, class C, class D>
41     struct sl_concat4
42     {
43     const A a; const B b; const C c; const D d;
44     sl_concat4 (const A &a, const B &b, const C &c, const D &d) : a(a), b(b), c(c), d(d) { }
45     void operator ()() const { a (); b (); c (); d(); }
46     };
47    
48 root 1.7 struct sl_func0
49     {
50     const char *name_par;
51     sl_func0 (const char *name_par) : name_par(name_par) { }
52     void begin () const;
53 root 1.8 void comma () const;
54 root 1.7 void end () const;
55     void operator ()() const
56     {
57     begin ();
58     end ();
59     }
60     };
61    
62     template<class A>
63     struct sl_func1 : sl_func0
64     {
65     const A a;
66     sl_func1 (const char *name, const A &a) : sl_func0(name), a(a) { }
67     void operator ()() const { begin (); a (); end (); }
68     };
69    
70     template<class A, class B>
71     struct sl_func2 : sl_func0
72     {
73     const A a; const B b;
74     sl_func2 (const char *name, const A &a, const B &b) : sl_func0(name), a(a), b(b) { }
75 root 1.8 void operator ()() const { begin (); a (); comma (); b (); end (); }
76 root 1.7 };
77    
78     template<class A, class B, class C>
79     struct sl_func3 : sl_func0
80     {
81     const A a; const B b; const C c;
82     sl_func3 (const char *name, const A &a, const B &b, const C &c) : sl_func0(name), a(a), b(b), c(c) { }
83 root 1.8 void operator ()() const { begin (); a (); comma (); b (); comma (); c (); end (); }
84 root 1.7 };
85    
86     template<class A, class B, class C, class D>
87     struct sl_func4 : sl_func0
88     {
89     const A a; const B b; const C c; const D d;
90     sl_func4 (const char *name, const A &a, const B &b, const C &c, const D &d) : sl_func0(name), a(a), b(b), c(c), d(d) { }
91 root 1.8 void operator ()() const { begin (); a (); comma (); b (); comma (); c (); comma (); d(); end (); }
92 root 1.7 };
93    
94 root 1.1 class refcounted
95     {
96     template<class type> friend class ref;
97     mutable int refcnt;
98     void refcnt_inc () const { refcnt++; }
99 root 1.6 void refcnt_dec () const;
100 root 1.1 public:
101     refcounted () : refcnt(0) { }
102     virtual ~refcounted ();
103     };
104    
105     template<class type>
106     struct ref
107     {
108     type *p;
109    
110     ref ()
111     {
112     p = new type;
113     p->refcnt_inc ();
114     }
115    
116     ref (type &d)
117     {
118     d.refcnt_inc ();
119     p = &d;
120     }
121    
122     ref (const ref &r)
123     {
124     r.p->refcnt_inc ();
125     p = r.p;
126     }
127    
128     template<class type2>
129     ref (const ref<type2> &r)
130     {
131     r.p->refcnt_inc ();
132     p = r.p;
133     }
134    
135     ~ref ()
136     {
137     p->refcnt_dec ();
138     }
139    
140     ref &operator =(type &d)
141     {
142     d.refcnt_inc ();
143     p->refcnt_dec ();
144     p = &d;
145     return *this;
146     }
147    
148     type *operator ->() const { return p; }
149    
150     operator type &() const { return *p; }
151    
152     template<class type2>
153     bool operator ==(const ref<type2> b) const
154     {
155     return (void *)p == (void *)b.p;
156     }
157     };
158    
159     // ref with auto-construct
160     template<class type>
161     struct auto_ref0 : ref<type>
162     {
163     auto_ref0 () : ref<type> (*new type ()) { }
164     };
165    
166     template<class type, typename arg1>
167     struct auto_ref1 : ref<type>
168     {
169     auto_ref1 (arg1 a) : ref<type> (*new type (a)) { }
170     };
171    
172     template<class type>
173     struct auto_lvalue_ref0 : ref<type>
174     {
175     auto_lvalue_ref0 () : ref<type> (*new type ()) { }
176     template<typename expr>
177     const auto_lvalue_ref0 &operator =(const expr &e) const;
178     };
179    
180     template<class type, typename arg1>
181     struct auto_lvalue_ref1 : ref<type>
182     {
183     auto_lvalue_ref1 (arg1 a) : ref<type> (*new type (a)) { }
184     template<class expr>
185     const auto_lvalue_ref1 &operator =(const expr &e) const;
186     };
187    
188     extern const char str_float [];
189     extern const char str_vec2 [];
190     extern const char str_vec3 [];
191     extern const char str_vec4 [];
192     extern const char str_mat2 [];
193     extern const char str_mat3 [];
194     extern const char str_mat4 [];
195    
196     extern const char str_sampler_1d [];
197     extern const char str_sampler_1d_shadow [];
198     extern const char str_sampler_2d [];
199     extern const char str_sampler_2d_shadow [];
200     extern const char str_sampler_2d_rect [];
201     extern const char str_sampler_2d_rect_shadow [];
202     extern const char str_sampler_3d [];
203     extern const char str_sampler_3d_rect [];
204     extern const char str_sampler_cube [];
205    
206     typedef ref<struct var_i> var;
207     typedef ref<struct uniform_i> uniform;
208    
209     struct shader_builder
210     {
211     vector<uniform> refs; // uniform parameters
212     vector<var> temps; // temporary variables
213     vector<var> streams; // varying inputs & outputs
214    
215     ostringstream source;
216    
217     template<typename type>
218     shader_builder &operator <<(const type &t)
219     {
220     source << t;
221     return *this;
222     }
223     };
224    
225     struct fragment_i : refcounted
226     {
227     virtual void build (shader_builder &b) = 0;
228     };
229    
230     typedef ref<fragment_i> fragment;
231    
232     struct lvalue_i : fragment_i
233     {
234     };
235    
236     // a simple predeclared variable with unspecified type
237 root 1.14 struct gluvar_i : lvalue_i
238 root 1.1 {
239     const char *name;
240     void build (shader_builder &b);
241 root 1.14 gluvar_i (const char *name) : name (name) { }
242 root 1.1 };
243    
244 root 1.14 typedef auto_lvalue_ref1<gluvar_i, const char *> gluvar;
245 root 1.1
246     struct var_i : lvalue_i
247     {
248     static unsigned int next_id;
249    
250     char name[NAMELEN];
251     const char *typestr;
252    
253     void build (shader_builder &b);
254     virtual void build_decl (ostringstream &b);
255    
256     var_i (const char *typestr);
257     ~var_i ();
258     };
259    
260     struct uniform_i : var_i
261     {
262     bool dirty;
263 root 1.13 GLint location;
264 root 1.1
265     virtual void update () = 0;
266    
267     void build (shader_builder &b);
268     void build_decl (ostringstream &b);
269 root 1.13
270     void update_location (GLint program)
271     {
272     location = glGetUniformLocationARB (program, name);
273     }
274    
275 root 1.1 uniform_i (const char *strtype);
276     };
277    
278 root 1.13 template<int dimension, typename gltype, const char *strtype, void (*upd)(GLint, GLsizei, const gltype *)>
279 root 1.1 struct uniform2_i : uniform_i
280     {
281     gltype data[dimension];
282    
283     void update ()
284     {
285     if (dirty)
286     {
287 root 1.13 if (location >= 0)
288     upd (location, dimension, data);
289    
290 root 1.1 dirty = false;
291     }
292     }
293    
294     uniform2_i () : uniform_i (strtype) { }
295     };
296    
297 root 1.13 template<int dimension, const char *strtype, void (*update)(GLint, GLsizei, const GLfloat *)>
298 root 1.1 struct uniform_f_i : uniform2_i<dimension, GLfloat, strtype, update>
299     {
300     };
301    
302 root 1.13 struct uniform_1f_i : uniform_f_i<1, str_float, glUniform1fvARB> {
303 root 1.1 void operator =(GLfloat v)
304     {
305     data[0] = v;
306     dirty = true;
307     }
308     };
309    
310 root 1.13 struct uniform_2f_i : uniform_f_i<2, str_vec2, glUniform2fvARB> { };
311 root 1.1
312 root 1.13 struct uniform_3f_i : uniform_f_i<3, str_vec3, glUniform3fvARB> {
313 root 1.1 void operator =(const vec3 &v)
314     {
315     data[0] = v.x;
316     data[1] = v.y;
317     data[2] = v.z;
318     dirty = true;
319     }
320     };
321    
322 root 1.13 struct uniform_4f_i : uniform_f_i<4, str_vec4, glUniform4fvARB> {
323 root 1.1 #if 0
324     void operator =(const gl::matrix &m)
325     {
326     memcpy (data, m.data, 16 * sizeof (GLfloat));
327     dirty = true;
328     }
329     #endif
330     };
331    
332 root 1.13 inline void UniformMatrix2fv (GLint l, GLsizei s, const GLfloat *m) { glUniformMatrix2fvARB (l, s, 0, m); }
333     inline void UniformMatrix3fv (GLint l, GLsizei s, const GLfloat *m) { glUniformMatrix3fvARB (l, s, 0, m); }
334     inline void UniformMatrix4fv (GLint l, GLsizei s, const GLfloat *m) { glUniformMatrix4fvARB (l, s, 0, m); }
335    
336     struct uniform_matrix_2f_i : uniform_f_i< 4, str_mat2, UniformMatrix2fv> { };
337     struct uniform_matrix_3f_i : uniform_f_i< 9, str_mat3, UniformMatrix3fv> { };
338     struct uniform_matrix_4f_i : uniform_f_i<16, str_mat4, UniformMatrix4fv> { };
339 root 1.1
340 root 1.2 template<class var_i>
341     struct var_ref : ref<var_i>
342 root 1.1 {
343 root 1.2 var_ref (const char *glname = 0)
344     : ref<var_i> (*new var_i)
345 root 1.1 {
346     if (glname)
347     strcpy ((*this)->name, glname);
348     }
349     };
350    
351 root 1.2 typedef var_ref<uniform_1f_i> uniform_1f;
352     typedef var_ref<uniform_2f_i> uniform_2f;
353     typedef var_ref<uniform_3f_i> uniform_3f;
354     typedef var_ref<uniform_4f_i> uniform_4f;
355     typedef var_ref<uniform_matrix_2f_i> uniform_matrix_2f;
356     typedef var_ref<uniform_matrix_3f_i> uniform_matrix_3f;
357     typedef var_ref<uniform_matrix_4f_i> uniform_matrix_4f;
358 root 1.1
359     struct stream_i : var_i
360     {
361     void build (shader_builder &b);
362     void build_decl (ostringstream &b);
363 root 1.4 stream_i (const char *strtype);
364 root 1.1 };
365    
366     template<int dimension, GLenum gltype, const char *strtype>
367     struct varying_i : stream_i
368     {
369 root 1.4 varying_i () : stream_i (strtype) { }
370 root 1.1
371     void set (GLsizei stride, GLvoid *ptr)
372     {
373     //cgGLSetParameterPointer (param, dimension, gltype, stride, ptr);
374     }
375     };
376    
377     template<int dimension, const char *strtype>
378     struct varying_f_i : varying_i<dimension, GL_FLOAT, strtype>
379     {
380     void set (const gl::vertex_buffer_object &vb, GLint offset)
381     {
382     varying_i<dimension, GL_FLOAT, strtype>::set (gl::format_stride (vb.format), (GLvoid *)(long)offset);
383     }
384     };
385    
386     struct varying_1f_i : varying_f_i<1, str_float>
387     {
388     };
389    
390     struct varying_2f_i : varying_f_i<2, str_vec2>
391     {
392     void set_t (const gl::vertex_buffer_object &vb)
393     {
394     set (vb, gl::format_offset_t (vb.format));
395     }
396     };
397    
398     struct varying_3f_i : varying_f_i<3, str_vec3>
399     {
400     void set_p (const gl::vertex_buffer_object &vb)
401     {
402     set (vb, gl::format_offset_p (vb.format));
403     }
404    
405     void set_n (const gl::vertex_buffer_object &vb)
406     {
407     set (vb, gl::format_offset_n (vb.format));
408     }
409     };
410    
411     struct varying_4f_i : varying_f_i<4, str_vec4>
412     {
413     };
414    
415 root 1.2 typedef var_ref<varying_1f_i> varying_1f;
416     typedef var_ref<varying_2f_i> varying_2f;
417     typedef var_ref<varying_3f_i> varying_3f;
418     typedef var_ref<varying_4f_i> varying_4f;
419 root 1.1
420     struct temporary_i : var_i
421     {
422     void build (shader_builder &b);
423    
424     temporary_i (const char *strtype);
425     };
426    
427     template<const char *strtype>
428     struct temp_ref : ref<temporary_i>
429     {
430     temp_ref ()
431     : ref<temporary_i> (*new temporary_i (strtype))
432     {
433     }
434    
435 root 1.10 #if 0
436     template<typename expr>
437     temp_ref (const expr &e)
438     : ref<temporary_i> (*new temporary_i (strtype))
439     {
440     (*this) = e;
441     }
442     #endif
443    
444 root 1.1 template<typename expr>
445     const temp_ref &operator =(const expr &e) const;
446     };
447    
448     typedef temp_ref<str_float> temp_1f;
449     typedef temp_ref<str_vec2> temp_2f;
450     typedef temp_ref<str_vec3> temp_3f;
451     typedef temp_ref<str_vec4> temp_4f;
452     typedef temp_ref<str_mat2> temp_matrix_2f;
453     typedef temp_ref<str_mat3> temp_matrix_3f;
454     typedef temp_ref<str_mat4> temp_matrix_4f;
455    
456     template<GLenum gltype, const char *strtype>
457     struct sampler_i : uniform_i
458     {
459 root 1.13 GLuint unit;
460 root 1.1
461     void update ()
462     {
463     if (dirty)
464     {
465     //cgGLSetTextureParameter (param, texture);
466     dirty = false;
467     }
468     }
469    
470     void begin ()
471     {
472 root 1.15 //cgGLEnableTextureParameter (unit);
473 root 1.1 }
474    
475 root 1.13 sampler_i (GLuint textureunit) : uniform_i (strtype), unit (textureunit) { }
476 root 1.1 };
477    
478 root 1.15 struct sampler_1d_i : sampler_i<GL_SAMPLER_1D_ARB, str_sampler_1d>
479 root 1.1 {
480 root 1.15 sampler_1d_i (GLuint textureunit) : sampler_i<GL_SAMPLER_1D_ARB, str_sampler_1d> (textureunit) { }
481 root 1.1 };
482    
483 root 1.15 struct sampler_1d_shadow_i : sampler_i<GL_SAMPLER_1D_SHADOW_ARB, str_sampler_1d_shadow>
484 root 1.1 {
485 root 1.15 sampler_1d_shadow_i (GLuint textureunit) : sampler_i<GL_SAMPLER_1D_SHADOW_ARB, str_sampler_1d_shadow> (textureunit) { }
486 root 1.1 };
487    
488 root 1.15 struct sampler_2d_i : sampler_i<GL_SAMPLER_2D_ARB, str_sampler_2d>
489 root 1.1 {
490 root 1.15 sampler_2d_i (GLuint textureunit) : sampler_i<GL_SAMPLER_2D_ARB, str_sampler_2d> (textureunit) { }
491 root 1.1 };
492    
493 root 1.15 struct sampler_2d_shadow_i : sampler_i<GL_SAMPLER_2D_SHADOW_ARB, str_sampler_2d_shadow>
494 root 1.1 {
495 root 1.15 sampler_2d_shadow_i (GLuint textureunit) : sampler_i<GL_SAMPLER_2D_SHADOW_ARB, str_sampler_2d_shadow> (textureunit) { }
496 root 1.1 };
497    
498 root 1.15 struct sampler_2d_rect_i : sampler_i<GL_SAMPLER_2D_RECT_ARB, str_sampler_2d_rect>
499 root 1.1 {
500 root 1.15 sampler_2d_rect_i (GLuint textureunit) : sampler_i<GL_SAMPLER_2D_RECT_ARB, str_sampler_2d_rect> (textureunit) { }
501 root 1.1 };
502    
503 root 1.15 struct sampler_2d_rect_shadow_i : sampler_i<GL_SAMPLER_2D_RECT_SHADOW_ARB, str_sampler_2d_rect_shadow>
504 root 1.1 {
505 root 1.15 sampler_2d_rect_shadow_i (GLuint textureunit) : sampler_i<GL_SAMPLER_2D_RECT_SHADOW_ARB, str_sampler_2d_rect_shadow> (textureunit) { }
506 root 1.1 };
507    
508 root 1.15 struct sampler_3d_i : sampler_i<GL_SAMPLER_3D_ARB, str_sampler_3d>
509 root 1.1 {
510 root 1.15 sampler_3d_i (GLuint textureunit) : sampler_i<GL_SAMPLER_3D_ARB, str_sampler_3d> (textureunit) { }
511 root 1.1 };
512    
513 root 1.15 struct sampler_3d_rect_i : sampler_i<GL_SAMPLER_3D_ARB, str_sampler_3d_rect>
514 root 1.1 {
515 root 1.15 sampler_3d_rect_i (GLuint textureunit) : sampler_i<GL_SAMPLER_3D_ARB, str_sampler_3d_rect> (textureunit) { }
516 root 1.1 };
517    
518 root 1.15 struct sampler_cube_i : sampler_i<GL_SAMPLER_CUBE_ARB, str_sampler_cube>
519 root 1.1 {
520 root 1.15 sampler_cube_i (GLuint textureunit) : sampler_i<GL_SAMPLER_CUBE_ARB, str_sampler_cube> (textureunit) { }
521 root 1.1 };
522    
523     typedef auto_ref1<sampler_1d_i, GLuint> sampler_1d;
524     typedef auto_ref1<sampler_1d_shadow_i, GLuint> sampler_1d_shadow;
525     typedef auto_ref1<sampler_2d_i, GLuint> sampler_2d;
526     typedef auto_ref1<sampler_2d_shadow_i, GLuint> sampler_2d_shadow;
527     typedef auto_ref1<sampler_2d_rect_i, GLuint> sampler_2d_rect;
528     typedef auto_ref1<sampler_2d_rect_shadow_i, GLuint> sampler_2d_rect_shadow;
529     typedef auto_ref1<sampler_3d_i, GLuint> sampler_3d;
530     typedef auto_ref1<sampler_3d_rect_i, GLuint> sampler_3d_rect;
531     typedef auto_ref1<sampler_cube_i, GLuint> sampler_cube;
532    
533     struct fragment_const_string_i : fragment_i
534     {
535     const char *str;
536    
537     void build (shader_builder &b);
538    
539     fragment_const_string_i (const char *str) : str(str) { }
540     };
541    
542     typedef auto_ref1<fragment_const_string_i, const char *> fragment_const_string;
543    
544     struct fragment_string_i : fragment_i
545     {
546     char *str;
547    
548     void build (shader_builder &b);
549    
550     fragment_string_i (const char *str) : str (strdup (str)) { }
551     ~fragment_string_i ();
552     };
553    
554     struct fragment_vector_i : fragment_i, vector<fragment>
555     {
556     void build (shader_builder &b);
557    
558     template<class fragment_i>
559     void append (const ref<fragment_i> &f)
560     {
561     push_back (f);
562     }
563    
564 root 1.5 template<class expr>
565     void append (const sl_expr<expr> &e)
566     {
567     e ();
568     }
569    
570 root 1.1 void append_const (const char *s)
571     {
572     push_back (*new fragment_const_string_i (s));
573     }
574    
575     void append_string (const char *s)
576     {
577     push_back (*new fragment_string_i (s));
578     }
579     };
580    
581     typedef ref<fragment_vector_i> fragment_vector;
582    
583     struct shader_object_i : fragment_vector_i
584     {
585     GLenum type;
586     GLuint id; // GLhandleARB, but 2.0 will use uint
587    
588     string source ();
589     void compile ();
590     void start ();
591     void stop ();
592    
593     shader_object_i (GLenum type);
594     ~shader_object_i ();
595     };
596    
597     extern shader_object_i *cur; // record actions to this shader
598    
599     template<GLenum type>
600     struct shader_object : ref<shader_object_i>
601     {
602     shader_object ()
603     : ref<shader_object_i> (*new shader_object_i (type))
604     {
605     }
606     };
607    
608     typedef shader_object<GL_VERTEX_SHADER_ARB> vertex_shader;
609     typedef shader_object<GL_FRAGMENT_SHADER_ARB> fragment_shader;
610    
611 root 1.11 struct program_object
612     {
613     GLuint id;
614    
615     vertex_shader vsh;
616     fragment_shader fsh;
617    
618     program_object ();
619     ~program_object ();
620    
621     void link ();
622     };
623    
624 root 1.3 template<typename T>
625     struct sl_append
626     {
627     T t;
628    
629     sl_append (const T &t) : t(t) { }
630    
631     void operator ()() const
632     {
633     cur->push_back (t);
634     }
635     };
636    
637     template<int length>
638     struct sl_string
639     {
640     char str[length];
641    
642     void operator ()() const
643     {
644     cur->push_back (*new fragment_string_i (str));
645     }
646     };
647    
648     struct sl_float
649     {
650     const GLfloat c;
651    
652     sl_float (GLfloat c) : c(c) { }
653    
654 root 1.6 void operator ()() const;
655 root 1.3 };
656    
657     template<class A, class B>
658     inline sl_expr< sl_concat2<A, B> >
659     concat (const A &a, const B &b)
660     {
661     typedef sl_concat2<A, B> expr;
662     return sl_expr<expr> (expr (a, b));
663     }
664    
665     template<class A, class B, class C>
666     inline sl_expr< sl_concat3<A, B, C> >
667     concat (const A &a, const B &b, const C &c)
668     {
669     typedef sl_concat3<A, B, C> expr;
670     return sl_expr<expr> (expr (a, b, c));
671     }
672    
673     template<class A, class B, class C, class D>
674     inline sl_expr< sl_concat4<A, B, C, D> >
675     concat (const A &a, const B &b, const C &c, const D &d)
676     {
677     typedef sl_concat4<A, B, C, D> expr;
678     return sl_expr<expr> (expr (a, b, c, d));
679     }
680    
681     template<typename expr>
682     struct sl_convert
683     {
684     typedef sl_expr<expr> T;
685     static inline const T &convert (const T &e)
686     {
687     return e;
688     }
689     };
690    
691     template<>
692     struct sl_convert<GLfloat>
693     {
694     typedef sl_expr<sl_float> T;
695     static inline const T convert (GLfloat f)
696     {
697     return sl_float (f);
698     }
699     };
700    
701     template<>
702 root 1.5 struct sl_convert<GLdouble>
703     {
704     typedef sl_expr<sl_float> T;
705     static inline const T convert (GLdouble d)
706     {
707     return sl_float (d);
708     }
709     };
710    
711     template<>
712     struct sl_convert<GLint>
713     {
714     typedef sl_expr<sl_float> T;
715     static inline const T convert (GLint i)
716     {
717     return sl_float (i);
718     }
719     };
720    
721     template<>
722 root 1.6 struct sl_convert<vec2>
723     {
724     typedef sl_expr< sl_string<60> > T;
725     static const T convert (const vec2 &v);
726     };
727    
728     template<>
729 root 1.3 struct sl_convert<vec3>
730     {
731 root 1.6 typedef sl_expr< sl_string<80> > T;
732     static const T convert (const vec3 &v);
733 root 1.3 };
734    
735     template<>
736     struct sl_convert<vec4>
737     {
738 root 1.6 typedef sl_expr< sl_string<100> > T;
739     static const T convert (const vec4 &v);
740 root 1.3 };
741    
742     template<>
743     template<class V>
744     struct sl_convert< var_ref<V> >
745     {
746     typedef sl_expr< sl_append< var_ref<V> > > T;
747     static inline const T convert (const var_ref<V> &v)
748     {
749     return sl_append< var_ref<V> > (v);
750     }
751     };
752    
753     template<>
754 root 1.14 struct sl_convert<gluvar>
755 root 1.3 {
756 root 1.14 typedef sl_expr< sl_append<gluvar> > T;
757     static inline const T convert (const gluvar &v)
758 root 1.3 {
759 root 1.14 return sl_append<gluvar> (v);
760 root 1.3 }
761     };
762    
763     template<>
764     template<const char *strtype>
765     struct sl_convert< temp_ref<strtype> >
766     {
767     typedef sl_expr< sl_append< temp_ref<strtype> > > T;
768     static inline const T convert (const temp_ref<strtype> &v)
769     {
770     return sl_expr< sl_append< temp_ref<strtype> > >(
771     sl_append< temp_ref<strtype> > (v)
772     );
773     }
774     };
775    
776 root 1.5 extern const fragment_const_string str_2sp;
777     extern const fragment_const_string str_equal;
778 root 1.8 extern const fragment_const_string str_comma;
779 root 1.5 extern const fragment_const_string str_endl;
780    
781 root 1.3 template<class fragment, typename expr>
782     inline void sl_assign (const fragment &f, const expr &e)
783     {
784 root 1.5 cur->append (str_2sp);
785 root 1.3 cur->append (f);
786 root 1.5 cur->append (str_equal);
787 root 1.3 sl_convert<expr>::convert (e) ();
788 root 1.5 cur->append (str_endl);
789 root 1.3 }
790    
791     template<class type>
792     template<typename expr>
793     inline const auto_lvalue_ref0<type> &auto_lvalue_ref0<type>::operator =(const expr &e) const
794     {
795     sl_assign (*this, e);
796     return *this;
797     }
798    
799     template<class type, typename arg1>
800     template<typename expr>
801     inline const auto_lvalue_ref1<type,arg1> &auto_lvalue_ref1<type,arg1>::operator =(const expr &e) const
802     {
803     sl_assign (*this, e);
804     return *this;
805     }
806    
807 root 1.5 template<class T>
808     template<typename expr>
809     inline const sl_expr<T> &sl_expr<T>::operator =(const expr &e) const
810     {
811     sl_assign (*this, e);
812     return *this;
813     }
814    
815 root 1.3 template<const char *strtype>
816     template<typename expr>
817     inline const temp_ref<strtype> &temp_ref<strtype>::operator =(const expr &e) const
818     {
819     sl_assign (*this, e);
820     return *this;
821     }
822    
823     struct sl_append_const_string
824     {
825     fragment_const_string str;
826     sl_append_const_string (const char *s)
827     : str (s)
828     { }
829    
830     void operator ()() const
831     {
832     cur->push_back (str);
833     }
834     };
835    
836 root 1.12 extern const sl_append_const_string str_lpar;
837     extern const sl_append_const_string str_rpar;
838    
839     template<class A, class B, class C>
840     struct sl_binop
841     {
842     const A a; const B b; const C c;
843     sl_binop (const A &a, const B &b, const C &c) : a(a), b(b), c(c) { }
844     void operator ()() const { str_lpar (); a (); b (); c (); str_rpar (); }
845     };
846    
847 root 1.3 # define SHADER_BINOP(op, str) \
848     extern const sl_append_const_string str_ ## str; \
849     template<typename A, typename B> \
850 root 1.12 inline const sl_expr< sl_binop< typename sl_convert<A>::T, \
851     sl_append_const_string, \
852     typename sl_convert<B>::T > > \
853 root 1.3 operator op(const A &a, const B &b) \
854     { \
855 root 1.12 return sl_binop< typename sl_convert<A>::T, sl_append_const_string, typename sl_convert<B>::T > \
856     (sl_convert<A>::convert (a), str_ ## str, sl_convert<B>::convert (b)); \
857 root 1.3 }
858    
859     SHADER_BINOP (+, plus);
860     SHADER_BINOP (-, minus);
861     SHADER_BINOP (*, mul);
862     SHADER_BINOP (/, div);
863 root 1.12 SHADER_BINOP (%, mod);
864 root 1.3
865     # undef SHADER_BINOP
866    
867 root 1.5 void swizzle_mask (sl_string<7> &s, int mask);
868 root 1.6
869     template<typename T>
870     inline const sl_expr< sl_concat3< sl_append_const_string,
871     typename sl_convert<T>::T,
872     sl_string<7>
873     > >
874     swizzle (const T &t, int a, int b = 0, int c = 0, int d = 0)
875     {
876     sl_string<7> s;
877     swizzle_mask (s, ((d * 5 + c) * 5 + b) * 5 + a);
878     return concat (str_lpar, sl_convert<T>::convert (t), s);
879     }
880    
881     # define SHADER_SWIZZLE_OP(abcd,type) \
882     template<typename T> \
883     inline const sl_expr< sl_concat3< sl_append_const_string, \
884     typename sl_convert<T>::T, \
885     sl_string<7> \
886     > > \
887     type (const T &t) \
888     { \
889     return swizzle (t, (abcd / 1000) % 5, (abcd / 100) % 5, (abcd / 10) % 5, (abcd / 1) % 5); \
890     }
891    
892     // brute force is lovely, ain't it?
893     SHADER_SWIZZLE_OP (1 , x ) SHADER_SWIZZLE_OP (11 , xx ) SHADER_SWIZZLE_OP (111 , xxx ) SHADER_SWIZZLE_OP (1111, xxxx)
894     SHADER_SWIZZLE_OP (1112, xxxy) SHADER_SWIZZLE_OP (1113, xxxz) SHADER_SWIZZLE_OP (1114, xxxw) SHADER_SWIZZLE_OP (112 , xxy )
895     SHADER_SWIZZLE_OP (1121, xxyx) SHADER_SWIZZLE_OP (1122, xxyy) SHADER_SWIZZLE_OP (1123, xxyz) SHADER_SWIZZLE_OP (1124, xxyw)
896     SHADER_SWIZZLE_OP (113 , xxz ) SHADER_SWIZZLE_OP (1131, xxzx) SHADER_SWIZZLE_OP (1132, xxzy) SHADER_SWIZZLE_OP (1133, xxzz)
897     SHADER_SWIZZLE_OP (1134, xxzw) SHADER_SWIZZLE_OP (114 , xxw ) SHADER_SWIZZLE_OP (1141, xxwx) SHADER_SWIZZLE_OP (1142, xxwy)
898     SHADER_SWIZZLE_OP (1143, xxwz) SHADER_SWIZZLE_OP (1144, xxww) SHADER_SWIZZLE_OP (12 , xy ) SHADER_SWIZZLE_OP (121 , xyx )
899     SHADER_SWIZZLE_OP (1211, xyxx) SHADER_SWIZZLE_OP (1212, xyxy) SHADER_SWIZZLE_OP (1213, xyxz) SHADER_SWIZZLE_OP (1214, xyxw)
900     SHADER_SWIZZLE_OP (122 , xyy ) SHADER_SWIZZLE_OP (1221, xyyx) SHADER_SWIZZLE_OP (1222, xyyy) SHADER_SWIZZLE_OP (1223, xyyz)
901     SHADER_SWIZZLE_OP (1224, xyyw) SHADER_SWIZZLE_OP (123 , xyz ) SHADER_SWIZZLE_OP (1231, xyzx) SHADER_SWIZZLE_OP (1232, xyzy)
902     SHADER_SWIZZLE_OP (1233, xyzz) SHADER_SWIZZLE_OP (1234, xyzw) SHADER_SWIZZLE_OP (124 , xyw ) SHADER_SWIZZLE_OP (1241, xywx)
903     SHADER_SWIZZLE_OP (1242, xywy) SHADER_SWIZZLE_OP (1243, xywz) SHADER_SWIZZLE_OP (1244, xyww) SHADER_SWIZZLE_OP (13 , xz )
904     SHADER_SWIZZLE_OP (131 , xzx ) SHADER_SWIZZLE_OP (1311, xzxx) SHADER_SWIZZLE_OP (1312, xzxy) SHADER_SWIZZLE_OP (1313, xzxz)
905     SHADER_SWIZZLE_OP (1314, xzxw) SHADER_SWIZZLE_OP (132 , xzy ) SHADER_SWIZZLE_OP (1321, xzyx) SHADER_SWIZZLE_OP (1322, xzyy)
906     SHADER_SWIZZLE_OP (1323, xzyz) SHADER_SWIZZLE_OP (1324, xzyw) SHADER_SWIZZLE_OP (133 , xzz ) SHADER_SWIZZLE_OP (1331, xzzx)
907     SHADER_SWIZZLE_OP (1332, xzzy) SHADER_SWIZZLE_OP (1333, xzzz) SHADER_SWIZZLE_OP (1334, xzzw) SHADER_SWIZZLE_OP (134 , xzw )
908     SHADER_SWIZZLE_OP (1341, xzwx) SHADER_SWIZZLE_OP (1342, xzwy) SHADER_SWIZZLE_OP (1343, xzwz) SHADER_SWIZZLE_OP (1344, xzww)
909     SHADER_SWIZZLE_OP (14 , xw ) SHADER_SWIZZLE_OP (141 , xwx ) SHADER_SWIZZLE_OP (1411, xwxx) SHADER_SWIZZLE_OP (1412, xwxy)
910     SHADER_SWIZZLE_OP (1413, xwxz) SHADER_SWIZZLE_OP (1414, xwxw) SHADER_SWIZZLE_OP (142 , xwy ) SHADER_SWIZZLE_OP (1421, xwyx)
911     SHADER_SWIZZLE_OP (1422, xwyy) SHADER_SWIZZLE_OP (1423, xwyz) SHADER_SWIZZLE_OP (1424, xwyw) SHADER_SWIZZLE_OP (143 , xwz )
912     SHADER_SWIZZLE_OP (1431, xwzx) SHADER_SWIZZLE_OP (1432, xwzy) SHADER_SWIZZLE_OP (1433, xwzz) SHADER_SWIZZLE_OP (1434, xwzw)
913     SHADER_SWIZZLE_OP (144 , xww ) SHADER_SWIZZLE_OP (1441, xwwx) SHADER_SWIZZLE_OP (1442, xwwy) SHADER_SWIZZLE_OP (1443, xwwz)
914     SHADER_SWIZZLE_OP (1444, xwww) SHADER_SWIZZLE_OP (2 , y ) SHADER_SWIZZLE_OP (21 , yx ) SHADER_SWIZZLE_OP (211 , yxx )
915     SHADER_SWIZZLE_OP (2111, yxxx) SHADER_SWIZZLE_OP (2112, yxxy) SHADER_SWIZZLE_OP (2113, yxxz) SHADER_SWIZZLE_OP (2114, yxxw)
916     SHADER_SWIZZLE_OP (212 , yxy ) SHADER_SWIZZLE_OP (2121, yxyx) SHADER_SWIZZLE_OP (2122, yxyy) SHADER_SWIZZLE_OP (2123, yxyz)
917     SHADER_SWIZZLE_OP (2124, yxyw) SHADER_SWIZZLE_OP (213 , yxz ) SHADER_SWIZZLE_OP (2131, yxzx) SHADER_SWIZZLE_OP (2132, yxzy)
918     SHADER_SWIZZLE_OP (2133, yxzz) SHADER_SWIZZLE_OP (2134, yxzw) SHADER_SWIZZLE_OP (214 , yxw ) SHADER_SWIZZLE_OP (2141, yxwx)
919     SHADER_SWIZZLE_OP (2142, yxwy) SHADER_SWIZZLE_OP (2143, yxwz) SHADER_SWIZZLE_OP (2144, yxww) SHADER_SWIZZLE_OP (22 , yy )
920     SHADER_SWIZZLE_OP (221 , yyx ) SHADER_SWIZZLE_OP (2211, yyxx) SHADER_SWIZZLE_OP (2212, yyxy) SHADER_SWIZZLE_OP (2213, yyxz)
921     SHADER_SWIZZLE_OP (2214, yyxw) SHADER_SWIZZLE_OP (222 , yyy ) SHADER_SWIZZLE_OP (2221, yyyx) SHADER_SWIZZLE_OP (2222, yyyy)
922     SHADER_SWIZZLE_OP (2223, yyyz) SHADER_SWIZZLE_OP (2224, yyyw) SHADER_SWIZZLE_OP (223 , yyz ) SHADER_SWIZZLE_OP (2231, yyzx)
923     SHADER_SWIZZLE_OP (2232, yyzy) SHADER_SWIZZLE_OP (2233, yyzz) SHADER_SWIZZLE_OP (2234, yyzw) SHADER_SWIZZLE_OP (224 , yyw )
924     SHADER_SWIZZLE_OP (2241, yywx) SHADER_SWIZZLE_OP (2242, yywy) SHADER_SWIZZLE_OP (2243, yywz) SHADER_SWIZZLE_OP (2244, yyww)
925     SHADER_SWIZZLE_OP (23 , yz ) SHADER_SWIZZLE_OP (231 , yzx ) SHADER_SWIZZLE_OP (2311, yzxx) SHADER_SWIZZLE_OP (2312, yzxy)
926     SHADER_SWIZZLE_OP (2313, yzxz) SHADER_SWIZZLE_OP (2314, yzxw) SHADER_SWIZZLE_OP (232 , yzy ) SHADER_SWIZZLE_OP (2321, yzyx)
927     SHADER_SWIZZLE_OP (2322, yzyy) SHADER_SWIZZLE_OP (2323, yzyz) SHADER_SWIZZLE_OP (2324, yzyw) SHADER_SWIZZLE_OP (233 , yzz )
928     SHADER_SWIZZLE_OP (2331, yzzx) SHADER_SWIZZLE_OP (2332, yzzy) SHADER_SWIZZLE_OP (2333, yzzz) SHADER_SWIZZLE_OP (2334, yzzw)
929     SHADER_SWIZZLE_OP (234 , yzw ) SHADER_SWIZZLE_OP (2341, yzwx) SHADER_SWIZZLE_OP (2342, yzwy) SHADER_SWIZZLE_OP (2343, yzwz)
930     SHADER_SWIZZLE_OP (2344, yzww) SHADER_SWIZZLE_OP (24 , yw ) SHADER_SWIZZLE_OP (241 , ywx ) SHADER_SWIZZLE_OP (2411, ywxx)
931     SHADER_SWIZZLE_OP (2412, ywxy) SHADER_SWIZZLE_OP (2413, ywxz) SHADER_SWIZZLE_OP (2414, ywxw) SHADER_SWIZZLE_OP (242 , ywy )
932     SHADER_SWIZZLE_OP (2421, ywyx) SHADER_SWIZZLE_OP (2422, ywyy) SHADER_SWIZZLE_OP (2423, ywyz) SHADER_SWIZZLE_OP (2424, ywyw)
933     SHADER_SWIZZLE_OP (243 , ywz ) SHADER_SWIZZLE_OP (2431, ywzx) SHADER_SWIZZLE_OP (2432, ywzy) SHADER_SWIZZLE_OP (2433, ywzz)
934     SHADER_SWIZZLE_OP (2434, ywzw) SHADER_SWIZZLE_OP (244 , yww ) SHADER_SWIZZLE_OP (2441, ywwx) SHADER_SWIZZLE_OP (2442, ywwy)
935     SHADER_SWIZZLE_OP (2443, ywwz) SHADER_SWIZZLE_OP (2444, ywww) SHADER_SWIZZLE_OP (3 , z ) SHADER_SWIZZLE_OP (31 , zx )
936     SHADER_SWIZZLE_OP (311 , zxx ) SHADER_SWIZZLE_OP (3111, zxxx) SHADER_SWIZZLE_OP (3112, zxxy) SHADER_SWIZZLE_OP (3113, zxxz)
937     SHADER_SWIZZLE_OP (3114, zxxw) SHADER_SWIZZLE_OP (312 , zxy ) SHADER_SWIZZLE_OP (3121, zxyx) SHADER_SWIZZLE_OP (3122, zxyy)
938     SHADER_SWIZZLE_OP (3123, zxyz) SHADER_SWIZZLE_OP (3124, zxyw) SHADER_SWIZZLE_OP (313 , zxz ) SHADER_SWIZZLE_OP (3131, zxzx)
939     SHADER_SWIZZLE_OP (3132, zxzy) SHADER_SWIZZLE_OP (3133, zxzz) SHADER_SWIZZLE_OP (3134, zxzw) SHADER_SWIZZLE_OP (314 , zxw )
940     SHADER_SWIZZLE_OP (3141, zxwx) SHADER_SWIZZLE_OP (3142, zxwy) SHADER_SWIZZLE_OP (3143, zxwz) SHADER_SWIZZLE_OP (3144, zxww)
941     SHADER_SWIZZLE_OP (32 , zy ) SHADER_SWIZZLE_OP (321 , zyx ) SHADER_SWIZZLE_OP (3211, zyxx) SHADER_SWIZZLE_OP (3212, zyxy)
942     SHADER_SWIZZLE_OP (3213, zyxz) SHADER_SWIZZLE_OP (3214, zyxw) SHADER_SWIZZLE_OP (322 , zyy ) SHADER_SWIZZLE_OP (3221, zyyx)
943     SHADER_SWIZZLE_OP (3222, zyyy) SHADER_SWIZZLE_OP (3223, zyyz) SHADER_SWIZZLE_OP (3224, zyyw) SHADER_SWIZZLE_OP (323 , zyz )
944     SHADER_SWIZZLE_OP (3231, zyzx) SHADER_SWIZZLE_OP (3232, zyzy) SHADER_SWIZZLE_OP (3233, zyzz) SHADER_SWIZZLE_OP (3234, zyzw)
945     SHADER_SWIZZLE_OP (324 , zyw ) SHADER_SWIZZLE_OP (3241, zywx) SHADER_SWIZZLE_OP (3242, zywy) SHADER_SWIZZLE_OP (3243, zywz)
946     SHADER_SWIZZLE_OP (3244, zyww) SHADER_SWIZZLE_OP (33 , zz ) SHADER_SWIZZLE_OP (331 , zzx ) SHADER_SWIZZLE_OP (3311, zzxx)
947     SHADER_SWIZZLE_OP (3312, zzxy) SHADER_SWIZZLE_OP (3313, zzxz) SHADER_SWIZZLE_OP (3314, zzxw) SHADER_SWIZZLE_OP (332 , zzy )
948     SHADER_SWIZZLE_OP (3321, zzyx) SHADER_SWIZZLE_OP (3322, zzyy) SHADER_SWIZZLE_OP (3323, zzyz) SHADER_SWIZZLE_OP (3324, zzyw)
949     SHADER_SWIZZLE_OP (333 , zzz ) SHADER_SWIZZLE_OP (3331, zzzx) SHADER_SWIZZLE_OP (3332, zzzy) SHADER_SWIZZLE_OP (3333, zzzz)
950     SHADER_SWIZZLE_OP (3334, zzzw) SHADER_SWIZZLE_OP (334 , zzw ) SHADER_SWIZZLE_OP (3341, zzwx) SHADER_SWIZZLE_OP (3342, zzwy)
951     SHADER_SWIZZLE_OP (3343, zzwz) SHADER_SWIZZLE_OP (3344, zzww) SHADER_SWIZZLE_OP (34 , zw ) SHADER_SWIZZLE_OP (341 , zwx )
952     SHADER_SWIZZLE_OP (3411, zwxx) SHADER_SWIZZLE_OP (3412, zwxy) SHADER_SWIZZLE_OP (3413, zwxz) SHADER_SWIZZLE_OP (3414, zwxw)
953     SHADER_SWIZZLE_OP (342 , zwy ) SHADER_SWIZZLE_OP (3421, zwyx) SHADER_SWIZZLE_OP (3422, zwyy) SHADER_SWIZZLE_OP (3423, zwyz)
954     SHADER_SWIZZLE_OP (3424, zwyw) SHADER_SWIZZLE_OP (343 , zwz ) SHADER_SWIZZLE_OP (3431, zwzx) SHADER_SWIZZLE_OP (3432, zwzy)
955     SHADER_SWIZZLE_OP (3433, zwzz) SHADER_SWIZZLE_OP (3434, zwzw) SHADER_SWIZZLE_OP (344 , zww ) SHADER_SWIZZLE_OP (3441, zwwx)
956     SHADER_SWIZZLE_OP (3442, zwwy) SHADER_SWIZZLE_OP (3443, zwwz) SHADER_SWIZZLE_OP (3444, zwww) SHADER_SWIZZLE_OP (4 , w )
957     SHADER_SWIZZLE_OP (41 , wx ) SHADER_SWIZZLE_OP (411 , wxx ) SHADER_SWIZZLE_OP (4111, wxxx) SHADER_SWIZZLE_OP (4112, wxxy)
958     SHADER_SWIZZLE_OP (4113, wxxz) SHADER_SWIZZLE_OP (4114, wxxw) SHADER_SWIZZLE_OP (412 , wxy ) SHADER_SWIZZLE_OP (4121, wxyx)
959     SHADER_SWIZZLE_OP (4122, wxyy) SHADER_SWIZZLE_OP (4123, wxyz) SHADER_SWIZZLE_OP (4124, wxyw) SHADER_SWIZZLE_OP (413 , wxz )
960     SHADER_SWIZZLE_OP (4131, wxzx) SHADER_SWIZZLE_OP (4132, wxzy) SHADER_SWIZZLE_OP (4133, wxzz) SHADER_SWIZZLE_OP (4134, wxzw)
961     SHADER_SWIZZLE_OP (414 , wxw ) SHADER_SWIZZLE_OP (4141, wxwx) SHADER_SWIZZLE_OP (4142, wxwy) SHADER_SWIZZLE_OP (4143, wxwz)
962     SHADER_SWIZZLE_OP (4144, wxww) SHADER_SWIZZLE_OP (42 , wy ) SHADER_SWIZZLE_OP (421 , wyx ) SHADER_SWIZZLE_OP (4211, wyxx)
963     SHADER_SWIZZLE_OP (4212, wyxy) SHADER_SWIZZLE_OP (4213, wyxz) SHADER_SWIZZLE_OP (4214, wyxw) SHADER_SWIZZLE_OP (422 , wyy )
964     SHADER_SWIZZLE_OP (4221, wyyx) SHADER_SWIZZLE_OP (4222, wyyy) SHADER_SWIZZLE_OP (4223, wyyz) SHADER_SWIZZLE_OP (4224, wyyw)
965     SHADER_SWIZZLE_OP (423 , wyz ) SHADER_SWIZZLE_OP (4231, wyzx) SHADER_SWIZZLE_OP (4232, wyzy) SHADER_SWIZZLE_OP (4233, wyzz)
966     SHADER_SWIZZLE_OP (4234, wyzw) SHADER_SWIZZLE_OP (424 , wyw ) SHADER_SWIZZLE_OP (4241, wywx) SHADER_SWIZZLE_OP (4242, wywy)
967     SHADER_SWIZZLE_OP (4243, wywz) SHADER_SWIZZLE_OP (4244, wyww) SHADER_SWIZZLE_OP (43 , wz ) SHADER_SWIZZLE_OP (431 , wzx )
968     SHADER_SWIZZLE_OP (4311, wzxx) SHADER_SWIZZLE_OP (4312, wzxy) SHADER_SWIZZLE_OP (4313, wzxz) SHADER_SWIZZLE_OP (4314, wzxw)
969     SHADER_SWIZZLE_OP (432 , wzy ) SHADER_SWIZZLE_OP (4321, wzyx) SHADER_SWIZZLE_OP (4322, wzyy) SHADER_SWIZZLE_OP (4323, wzyz)
970     SHADER_SWIZZLE_OP (4324, wzyw) SHADER_SWIZZLE_OP (433 , wzz ) SHADER_SWIZZLE_OP (4331, wzzx) SHADER_SWIZZLE_OP (4332, wzzy)
971     SHADER_SWIZZLE_OP (4333, wzzz) SHADER_SWIZZLE_OP (4334, wzzw) SHADER_SWIZZLE_OP (434 , wzw ) SHADER_SWIZZLE_OP (4341, wzwx)
972     SHADER_SWIZZLE_OP (4342, wzwy) SHADER_SWIZZLE_OP (4343, wzwz) SHADER_SWIZZLE_OP (4344, wzww) SHADER_SWIZZLE_OP (44 , ww )
973     SHADER_SWIZZLE_OP (441 , wwx ) SHADER_SWIZZLE_OP (4411, wwxx) SHADER_SWIZZLE_OP (4412, wwxy) SHADER_SWIZZLE_OP (4413, wwxz)
974     SHADER_SWIZZLE_OP (4414, wwxw) SHADER_SWIZZLE_OP (442 , wwy ) SHADER_SWIZZLE_OP (4421, wwyx) SHADER_SWIZZLE_OP (4422, wwyy)
975     SHADER_SWIZZLE_OP (4423, wwyz) SHADER_SWIZZLE_OP (4424, wwyw) SHADER_SWIZZLE_OP (443 , wwz ) SHADER_SWIZZLE_OP (4431, wwzx)
976     SHADER_SWIZZLE_OP (4432, wwzy) SHADER_SWIZZLE_OP (4433, wwzz) SHADER_SWIZZLE_OP (4434, wwzw) SHADER_SWIZZLE_OP (444 , www )
977     SHADER_SWIZZLE_OP (4441, wwwx) SHADER_SWIZZLE_OP (4442, wwwy) SHADER_SWIZZLE_OP (4443, wwwz) SHADER_SWIZZLE_OP (4444, wwww)
978    
979     # undef SHADER_SWIZZLE_OP
980 root 1.9
981     # define SHADER_FUNC0_(name, glname) \
982     template<typename A> \
983     inline const sl_expr<sl_func0> \
984     name () \
985     { \
986     return sl_func0 (#glname " ("); \
987     }
988    
989     # define SHADER_FUNC0(name) SHADER_FUNC0_(name,name)
990    
991     # define SHADER_FUNC1_(name, glname) \
992     template<typename A> \
993     inline const sl_expr< sl_func1<typename sl_convert<A>::T> > \
994     name (const A &a) \
995     { \
996     return sl_func1<typename sl_convert<A>::T> (#glname " (", sl_convert<A>::convert (a));\
997     }
998    
999     # define SHADER_FUNC1(name) SHADER_FUNC1_(name,name)
1000    
1001     # define SHADER_FUNC2_(name, glname) \
1002     template<typename A, typename B> \
1003     inline const sl_expr< sl_func2<typename sl_convert<A>::T, typename sl_convert<B>::T> > \
1004     name (const A &a, const B &b) \
1005     { \
1006     return sl_func2<typename sl_convert<A>::T, typename sl_convert<B>::T> (#glname " (", sl_convert<A>::convert (a), sl_convert<B>::convert (b));\
1007     }
1008    
1009     # define SHADER_FUNC2(name) SHADER_FUNC2_(name,name)
1010    
1011     # define SHADER_FUNC3_(name, glname) \
1012     template<typename A, typename B, typename C> \
1013     inline const sl_expr< sl_func3<typename sl_convert<A>::T, typename sl_convert<B>::T, typename sl_convert<C>::T> > \
1014     name (const A &a, const B &b, const C &c) \
1015     { \
1016     return sl_func3<typename sl_convert<A>::T, typename sl_convert<B>::T, typename sl_convert<C>::T> (#glname " (", sl_convert<A>::convert (a), sl_convert<B>::convert (b), sl_convert<C>::convert (c));\
1017     }
1018    
1019     # define SHADER_FUNC3(name) SHADER_FUNC3_(name,name)
1020    
1021     # define SHADER_FUNC4_(name, glname) \
1022     template<typename A, typename B, typename C, typename D> \
1023     inline const sl_expr< sl_func4<typename sl_convert<A>::T, typename sl_convert<B>::T, typename sl_convert<C>::T, typename sl_convert<D>::T > > \
1024     name (const A &a, const B &b, const C &c, const D &d) \
1025     { \
1026     return sl_func4<typename sl_convert<A>::T, typename sl_convert<B>::T, typename sl_convert<C>::T, typename sl_convert<D>::T> (#glname " (", sl_convert<A>::convert (a), sl_convert<B>::convert (b), sl_convert<C>::convert (c), sl_convert<D>::convert (d));\
1027     }
1028    
1029     # define SHADER_FUNC4(name) SHADER_FUNC4_(name,name)
1030    
1031     SHADER_FUNC1 (abs)
1032     SHADER_FUNC1 (acos)
1033     SHADER_FUNC1 (all)
1034     SHADER_FUNC1 (any)
1035     SHADER_FUNC1 (asin)
1036     SHADER_FUNC1 (atan)
1037     SHADER_FUNC2 (atan)
1038     SHADER_FUNC1 (ceil)
1039     SHADER_FUNC3 (clamp)
1040     SHADER_FUNC1 (cos)
1041     SHADER_FUNC2 (cross)
1042     SHADER_FUNC1 (dFdx)
1043     SHADER_FUNC1 (dFdy)
1044     SHADER_FUNC1 (degrees)
1045     SHADER_FUNC2 (distance)
1046     SHADER_FUNC2 (dot)
1047     SHADER_FUNC2_(equal, equal)
1048     SHADER_FUNC1 (exp)
1049     SHADER_FUNC1 (exp2)
1050     SHADER_FUNC3 (faceforward)
1051     SHADER_FUNC1 (floor)
1052     SHADER_FUNC1 (fract)
1053     SHADER_FUNC0 (ftransform)
1054     SHADER_FUNC1 (fwidth)
1055     SHADER_FUNC2_(greater_than_equal, greaterThanEqual)
1056     SHADER_FUNC2_(greater_then, greaterThan)
1057     SHADER_FUNC1 (inversesqrt)
1058     SHADER_FUNC1 (length)
1059     SHADER_FUNC2_(less_than, lessThan)
1060     SHADER_FUNC2_(less_than_equal, lessThanEqual)
1061     SHADER_FUNC1 (log)
1062     SHADER_FUNC1 (log2)
1063     SHADER_FUNC2_(matrix_comp_mult, matrixCompMult)
1064     SHADER_FUNC2 (max)
1065     SHADER_FUNC2 (min)
1066     SHADER_FUNC3 (mix)
1067     SHADER_FUNC2 (mod)
1068     SHADER_FUNC1 (noise1)
1069     SHADER_FUNC1 (noise2)
1070     SHADER_FUNC1 (noise3)
1071     SHADER_FUNC1 (noise4)
1072     SHADER_FUNC1 (normalize)
1073     SHADER_FUNC1 (gl_not) // TODO
1074     SHADER_FUNC2_(notequal, notEqual)
1075     SHADER_FUNC2 (pow)
1076     SHADER_FUNC1 (radians)
1077     SHADER_FUNC2 (reflect)
1078     SHADER_FUNC3 (refract)
1079     SHADER_FUNC2_(shadow_1d, shadow1D)
1080     SHADER_FUNC3_(shadow_1d, shadow1D)
1081     SHADER_FUNC3_(shadow_1d_lod, shadow1DLod)
1082     SHADER_FUNC2_(shadow_1d_proj, shadow1DProj)
1083     SHADER_FUNC3_(shadow_1d_proj, shadow1DProj)
1084     SHADER_FUNC3_(shadow_1d_proj_lod, shadow1DProjLod)
1085     SHADER_FUNC2_(shadow_2d, shadow2D)
1086     SHADER_FUNC3_(shadow_2d, shadow2D)
1087     SHADER_FUNC3_(shadow_2d_lod, shadow2DLod)
1088     SHADER_FUNC2_(shadow_2d_proj, shadow2DProj)
1089     SHADER_FUNC3_(shadow_2d_proj, shadow2DProj)
1090     SHADER_FUNC3_(shadow_2d_proj_lod, shadow2DProjLod)
1091     SHADER_FUNC1 (sign)
1092     SHADER_FUNC1 (sin)
1093     SHADER_FUNC3 (smoothstep)
1094     SHADER_FUNC1 (sqrt)
1095     SHADER_FUNC2 (step)
1096     SHADER_FUNC1 (tan)
1097     SHADER_FUNC2_(texture_1d, texture1D)
1098     SHADER_FUNC3_(texture_1d, texture1D)
1099     SHADER_FUNC3_(texture_1d_lod, texture1DLod)
1100     SHADER_FUNC2_(texture_1d_proj, texture1DProj)
1101     SHADER_FUNC3_(texture_1d_proj, texture1DProj)
1102     SHADER_FUNC3_(texture_1d_proj_lod, texture1DProjLod)
1103     SHADER_FUNC2_(texture_2d, texture2D)
1104     SHADER_FUNC3_(texture_2d, texture2D)
1105     SHADER_FUNC3_(texture_2d_lod, texture2DLod)
1106     SHADER_FUNC2_(texture_2d_proj, texture2DProj)
1107     SHADER_FUNC3_(texture_2d_proj, texture2DProj)
1108     SHADER_FUNC3_(texture_2d_proj_lod, texture2DProjLod)
1109     SHADER_FUNC2_(texture_3d, texture3D)
1110     SHADER_FUNC3_(texture_3d, texture3D)
1111     SHADER_FUNC3_(texture_3d_lod, texture3DLod)
1112     SHADER_FUNC2_(texture_3d_proj, texture3DProj)
1113     SHADER_FUNC3_(texture_3d_proj, texture3DProj)
1114     SHADER_FUNC3_(texture_3d_proj_lod, texture3DProjLod)
1115     SHADER_FUNC2_(texture_cube, textureCube)
1116     SHADER_FUNC3_(texture_cube, textureCube)
1117     SHADER_FUNC3_(texture_cude_lod, textureCubeLod)
1118     SHADER_FUNC1 (vec2) SHADER_FUNC2 (vec2)
1119     SHADER_FUNC1 (vec3) SHADER_FUNC2 (vec3) SHADER_FUNC3 (vec3)
1120     SHADER_FUNC1 (vec4) SHADER_FUNC2 (vec4) SHADER_FUNC3 (vec4) SHADER_FUNC4 (vec4)
1121     SHADER_FUNC1 (mat2) SHADER_FUNC2 (mat2)
1122     SHADER_FUNC1 (mat3) SHADER_FUNC2 (mat3) SHADER_FUNC3 (mat3)
1123     SHADER_FUNC1 (mat4) SHADER_FUNC2 (mat4) SHADER_FUNC3 (mat4) SHADER_FUNC4 (mat4)
1124    
1125     # undef SHADER_FUNC0
1126     # undef SHADER_FUNC0_
1127     # undef SHADER_FUNC1
1128     # undef SHADER_FUNC1_
1129     # undef SHADER_FUNC2
1130     # undef SHADER_FUNC2_
1131     # undef SHADER_FUNC3
1132     # undef SHADER_FUNC3_
1133     # undef SHADER_FUNC4
1134     # undef SHADER_FUNC5_
1135 root 1.6
1136 root 1.1 void debdebdebdebug ();//D
1137     }
1138    
1139     #endif
1140