ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/shader.h
Revision: 1.19
Committed: Fri Oct 29 22:32:49 2004 UTC (19 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.18: +22 -17 lines
Log Message:
*** empty log message ***

File Contents

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