ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/shader.h
(Generate patch)

Comparing libgender/shader.h (file contents):
Revision 1.1 by root, Sat Oct 23 21:43:27 2004 UTC vs.
Revision 1.5 by root, Sat Oct 23 23:01:18 2004 UTC

15 template<class T> 15 template<class T>
16 struct sl_expr { 16 struct sl_expr {
17 const T t; 17 const T t;
18 sl_expr (const T &t) : t(t) { } 18 sl_expr (const T &t) : t(t) { }
19 void operator ()() const { t (); } 19 void operator ()() const { t (); }
20 template<typename expr>
21 const sl_expr &operator =(const expr &e) const;
20 }; 22 };
21 23
22 template<class A, class B> 24 template<class A, class B>
23 struct sl_concat2 25 struct sl_concat2
24 { 26 {
274 276
275 struct uniform_matrix_2f_i : uniform_f_i< 4, str_mat2, cgGLSetMatrixParameterfc> { }; 277 struct uniform_matrix_2f_i : uniform_f_i< 4, str_mat2, cgGLSetMatrixParameterfc> { };
276 struct uniform_matrix_3f_i : uniform_f_i< 9, str_mat3, cgGLSetMatrixParameterfc> { }; 278 struct uniform_matrix_3f_i : uniform_f_i< 9, str_mat3, cgGLSetMatrixParameterfc> { };
277 struct uniform_matrix_4f_i : uniform_f_i<16, str_mat4, cgGLSetMatrixParameterfc> { }; 279 struct uniform_matrix_4f_i : uniform_f_i<16, str_mat4, cgGLSetMatrixParameterfc> { };
278 280
279 template<class uniform_i> 281 template<class var_i>
280 struct uniform_ref : ref<uniform_i> 282 struct var_ref : ref<var_i>
281 { 283 {
282 uniform_ref (const char *glname = 0) 284 var_ref (const char *glname = 0)
283 : ref<uniform_i> (*new uniform_i) 285 : ref<var_i> (*new var_i)
284 { 286 {
285 if (glname) 287 if (glname)
286 strcpy ((*this)->name, glname); 288 strcpy ((*this)->name, glname);
287 } 289 }
288 }; 290 };
289 291
290 typedef uniform_ref<uniform_1f_i> uniform_1f; 292 typedef var_ref<uniform_1f_i> uniform_1f;
291 typedef uniform_ref<uniform_2f_i> uniform_2f; 293 typedef var_ref<uniform_2f_i> uniform_2f;
292 typedef uniform_ref<uniform_3f_i> uniform_3f; 294 typedef var_ref<uniform_3f_i> uniform_3f;
293 typedef uniform_ref<uniform_4f_i> uniform_4f; 295 typedef var_ref<uniform_4f_i> uniform_4f;
294 typedef uniform_ref<uniform_matrix_2f_i> uniform_matrix_2f; 296 typedef var_ref<uniform_matrix_2f_i> uniform_matrix_2f;
295 typedef uniform_ref<uniform_matrix_3f_i> uniform_matrix_3f; 297 typedef var_ref<uniform_matrix_3f_i> uniform_matrix_3f;
296 typedef uniform_ref<uniform_matrix_4f_i> uniform_matrix_4f; 298 typedef var_ref<uniform_matrix_4f_i> uniform_matrix_4f;
297 299
298 struct stream_i : var_i 300 struct stream_i : var_i
299 { 301 {
300 void build (shader_builder &b); 302 void build (shader_builder &b);
301 void build_decl (ostringstream &b); 303 void build_decl (ostringstream &b);
302 stream_i (const char *strtype) : var_i (strtype) { } 304 stream_i (const char *strtype);
303 }; 305 };
304 306
305 template<int dimension, GLenum gltype, const char *strtype> 307 template<int dimension, GLenum gltype, const char *strtype>
306 struct varying_i : stream_i 308 struct varying_i : stream_i
307 { 309 {
308 varying_i (const char *glname) 310 varying_i () : stream_i (strtype) { }
309 : stream_i (strtype)
310 {
311 strcpy (name, glname);
312 }
313 311
314 void set (GLsizei stride, GLvoid *ptr) 312 void set (GLsizei stride, GLvoid *ptr)
315 { 313 {
316 //cgGLSetParameterPointer (param, dimension, gltype, stride, ptr); 314 //cgGLSetParameterPointer (param, dimension, gltype, stride, ptr);
317 } 315 }
318 }; 316 };
319 317
320 template<int dimension, const char *strtype> 318 template<int dimension, const char *strtype>
321 struct varying_f_i : varying_i<dimension, GL_FLOAT, strtype> 319 struct varying_f_i : varying_i<dimension, GL_FLOAT, strtype>
322 { 320 {
323 varying_f_i (const char *glname) : varying_i<dimension, GL_FLOAT, strtype> (glname) { }
324
325 void set (const gl::vertex_buffer_object &vb, GLint offset) 321 void set (const gl::vertex_buffer_object &vb, GLint offset)
326 { 322 {
327 varying_i<dimension, GL_FLOAT, strtype>::set (gl::format_stride (vb.format), (GLvoid *)(long)offset); 323 varying_i<dimension, GL_FLOAT, strtype>::set (gl::format_stride (vb.format), (GLvoid *)(long)offset);
328 } 324 }
329 }; 325 };
330 326
331 struct varying_1f_i : varying_f_i<1, str_float> 327 struct varying_1f_i : varying_f_i<1, str_float>
332 { 328 {
333 varying_1f_i (const char *glname) : varying_f_i<1, str_float> (glname) { }
334 }; 329 };
335 330
336 struct varying_2f_i : varying_f_i<2, str_vec2> 331 struct varying_2f_i : varying_f_i<2, str_vec2>
337 { 332 {
338 varying_2f_i (const char *glname) : varying_f_i<2, str_vec2> (glname) { }
339
340 void set_t (const gl::vertex_buffer_object &vb) 333 void set_t (const gl::vertex_buffer_object &vb)
341 { 334 {
342 set (vb, gl::format_offset_t (vb.format)); 335 set (vb, gl::format_offset_t (vb.format));
343 } 336 }
344 }; 337 };
345 338
346 struct varying_3f_i : varying_f_i<3, str_vec3> 339 struct varying_3f_i : varying_f_i<3, str_vec3>
347 { 340 {
348 varying_3f_i (const char *glname) : varying_f_i<3, str_vec3> (glname) { }
349
350 void set_p (const gl::vertex_buffer_object &vb) 341 void set_p (const gl::vertex_buffer_object &vb)
351 { 342 {
352 set (vb, gl::format_offset_p (vb.format)); 343 set (vb, gl::format_offset_p (vb.format));
353 } 344 }
354 345
358 } 349 }
359 }; 350 };
360 351
361 struct varying_4f_i : varying_f_i<4, str_vec4> 352 struct varying_4f_i : varying_f_i<4, str_vec4>
362 { 353 {
363 varying_4f_i (const char *glname) : varying_f_i<4, str_vec4> (glname) { }
364 }; 354 };
365 355
366 typedef auto_lvalue_ref1<varying_1f_i, const char *> varying_1f; 356 typedef var_ref<varying_1f_i> varying_1f;
367 typedef auto_lvalue_ref1<varying_2f_i, const char *> varying_2f; 357 typedef var_ref<varying_2f_i> varying_2f;
368 typedef auto_lvalue_ref1<varying_3f_i, const char *> varying_3f; 358 typedef var_ref<varying_3f_i> varying_3f;
369 typedef auto_lvalue_ref1<varying_4f_i, const char *> varying_4f; 359 typedef var_ref<varying_4f_i> varying_4f;
370 360
371 struct temporary_i : var_i 361 struct temporary_i : var_i
372 { 362 {
373 void build (shader_builder &b); 363 void build (shader_builder &b);
374 364
501 void append (const ref<fragment_i> &f) 491 void append (const ref<fragment_i> &f)
502 { 492 {
503 push_back (f); 493 push_back (f);
504 } 494 }
505 495
496 template<class expr>
497 void append (const sl_expr<expr> &e)
498 {
499 e ();
500 }
501
506 void append_const (const char *s) 502 void append_const (const char *s)
507 { 503 {
508 push_back (*new fragment_const_string_i (s)); 504 push_back (*new fragment_const_string_i (s));
509 } 505 }
510 506
555 }; 551 };
556 552
557 typedef shader_object<GL_VERTEX_SHADER_ARB> vertex_shader; 553 typedef shader_object<GL_VERTEX_SHADER_ARB> vertex_shader;
558 typedef shader_object<GL_FRAGMENT_SHADER_ARB> fragment_shader; 554 typedef shader_object<GL_FRAGMENT_SHADER_ARB> fragment_shader;
559 555
556 template<typename T>
557 struct sl_append
558 {
559 T t;
560
561 sl_append (const T &t) : t(t) { }
562
563 void operator ()() const
564 {
565 cur->push_back (t);
566 }
567 };
568
569 template<int length>
570 struct sl_string
571 {
572 char str[length];
573
574 void operator ()() const
575 {
576 cur->push_back (*new fragment_string_i (str));
577 }
578 };
579
580 // only floats
581 struct sl_float
582 {
583 const GLfloat c;
584
585 sl_float (GLfloat c) : c(c) { }
586
587 void operator ()() const
588 {
589 char s[64];
590 sprintf (s, "%g", c);
591 cur->append_string (s);
592 }
593 };
594
595 template<class A, class B>
596 inline sl_expr< sl_concat2<A, B> >
597 concat (const A &a, const B &b)
598 {
599 typedef sl_concat2<A, B> expr;
600 return sl_expr<expr> (expr (a, b));
601 }
602
603 template<class A, class B, class C>
604 inline sl_expr< sl_concat3<A, B, C> >
605 concat (const A &a, const B &b, const C &c)
606 {
607 typedef sl_concat3<A, B, C> expr;
608 return sl_expr<expr> (expr (a, b, c));
609 }
610
611 template<class A, class B, class C, class D>
612 inline sl_expr< sl_concat4<A, B, C, D> >
613 concat (const A &a, const B &b, const C &c, const D &d)
614 {
615 typedef sl_concat4<A, B, C, D> expr;
616 return sl_expr<expr> (expr (a, b, c, d));
617 }
618
619 template<typename expr>
620 struct sl_convert
621 {
622 typedef sl_expr<expr> T;
623 static inline const T &convert (const T &e)
624 {
625 return e;
626 }
627 };
628
629 template<>
630 struct sl_convert<GLfloat>
631 {
632 typedef sl_expr<sl_float> T;
633 static inline const T convert (GLfloat f)
634 {
635 return sl_float (f);
636 }
637 };
638
639 template<>
640 struct sl_convert<GLdouble>
641 {
642 typedef sl_expr<sl_float> T;
643 static inline const T convert (GLdouble d)
644 {
645 return sl_float (d);
646 }
647 };
648
649 template<>
650 struct sl_convert<GLint>
651 {
652 typedef sl_expr<sl_float> T;
653 static inline const T convert (GLint i)
654 {
655 return sl_float (i);
656 }
657 };
658
659 template<>
660 struct sl_convert<vec3>
661 {
662 typedef sl_expr< sl_string<256> > T;
663 static inline const T convert (const vec3 &v)
664 {
665 sl_string<256> s;
666 sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z);
667 return s;
668 }
669 };
670
671 template<>
672 struct sl_convert<vec4>
673 {
674 typedef sl_expr< sl_string<256> > T;
675 static inline const T convert (const vec4 &v)
676 {
677 sl_string<256> s;
678 sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w);
679 return s;
680 }
681 };
682
683 template<>
684 template<class V>
685 struct sl_convert< var_ref<V> >
686 {
687 typedef sl_expr< sl_append< var_ref<V> > > T;
688 static inline const T convert (const var_ref<V> &v)
689 {
690 return sl_append< var_ref<V> > (v);
691 }
692 };
693
694 template<>
695 struct sl_convert<glvar>
696 {
697 typedef sl_expr< sl_append<glvar> > T;
698 static inline const T convert (const glvar &v)
699 {
700 return sl_append<glvar> (v);
701 }
702 };
703
704 template<>
705 template<const char *strtype>
706 struct sl_convert< temp_ref<strtype> >
707 {
708 typedef sl_expr< sl_append< temp_ref<strtype> > > T;
709 static inline const T convert (const temp_ref<strtype> &v)
710 {
711 return sl_expr< sl_append< temp_ref<strtype> > >(
712 sl_append< temp_ref<strtype> > (v)
713 );
714 }
715 };
716
717 extern const fragment_const_string str_2sp;
718 extern const fragment_const_string str_equal;
719 extern const fragment_const_string str_endl;
720
721 template<class fragment, typename expr>
722 inline void sl_assign (const fragment &f, const expr &e)
723 {
724 cur->append (str_2sp);
725 cur->append (f);
726 cur->append (str_equal);
727 sl_convert<expr>::convert (e) ();
728 cur->append (str_endl);
729 }
730
731 template<class type>
732 template<typename expr>
733 inline const auto_lvalue_ref0<type> &auto_lvalue_ref0<type>::operator =(const expr &e) const
734 {
735 sl_assign (*this, e);
736 return *this;
737 }
738
739 template<class type, typename arg1>
740 template<typename expr>
741 inline const auto_lvalue_ref1<type,arg1> &auto_lvalue_ref1<type,arg1>::operator =(const expr &e) const
742 {
743 sl_assign (*this, e);
744 return *this;
745 }
746
747 template<class T>
748 template<typename expr>
749 inline const sl_expr<T> &sl_expr<T>::operator =(const expr &e) const
750 {
751 sl_assign (*this, e);
752 return *this;
753 }
754
755 template<const char *strtype>
756 template<typename expr>
757 inline const temp_ref<strtype> &temp_ref<strtype>::operator =(const expr &e) const
758 {
759 sl_assign (*this, e);
760 return *this;
761 }
762
763 struct sl_append_const_string
764 {
765 fragment_const_string str;
766 sl_append_const_string (const char *s)
767 : str (s)
768 { }
769
770 void operator ()() const
771 {
772 cur->push_back (str);
773 }
774 };
775
776# define SHADER_BINOP(op, str) \
777 extern const sl_append_const_string str_ ## str; \
778 template<typename A, typename B> \
779 inline const sl_expr< sl_concat3< typename sl_convert<A>::T, \
780 sl_append_const_string, \
781 typename sl_convert<B>::T > > \
782 operator op(const A &a, const B &b) \
783 { \
784 return concat (sl_convert<A>::convert (a), str_ ## str, sl_convert<B>::convert (b)); \
785 }
786
787 SHADER_BINOP (+, plus);
788 SHADER_BINOP (-, minus);
789 SHADER_BINOP (*, mul);
790 SHADER_BINOP (/, div);
791
792# undef SHADER_BINOP
793
794 void swizzle_mask (sl_string<7> &s, int mask);
560 void debdebdebdebug ();//D 795 void debdebdebdebug ();//D
561} 796}
562 797
563#endif 798#endif
564 799

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines