ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/shader.C
Revision: 1.20
Committed: Fri Oct 29 15:58:50 2004 UTC (19 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.19: +9 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.12 #include <cassert>
2    
3 root 1.1 #include "shader.h"
4     #include "shader_vars.h"
5    
6 root 1.17 #include <sstream>
7     #include <iomanip>
8    
9 root 1.18 namespace shader {
10 root 1.17
11 root 1.18 using namespace std;
12 root 1.1
13     refcounted::~refcounted ()
14     {
15     if (refcnt)
16     abort ();
17     }
18    
19 root 1.6 void refcounted::refcnt_dec () const
20     {
21     if (!--refcnt)
22     delete this; // quite a bit of code...
23     }
24    
25 root 1.1 const char str_float [] = "float";
26     const char str_vec2 [] = "vec2";
27     const char str_vec3 [] = "vec3";
28     const char str_vec4 [] = "vec4";
29     const char str_mat2 [] = "mat2";
30     const char str_mat3 [] = "mat3";
31     const char str_mat4 [] = "mat4";
32    
33     const char str_sampler_1d [] = "sampler1D";
34     const char str_sampler_1d_shadow [] = "sampler1DShadow";
35     const char str_sampler_2d [] = "sampler2D";
36     const char str_sampler_2d_shadow [] = "sampler2DShadow";
37     const char str_sampler_2d_rect [] = "sampler2DRect";
38     const char str_sampler_2d_rect_shadow [] = "sampler2DRectShadow";
39     const char str_sampler_3d [] = "sampler3D";
40     const char str_sampler_3d_rect [] = "sampler3DRect";
41     const char str_sampler_cube [] = "samplerCube";
42    
43     unsigned int var_i::next_id = 0;
44    
45     var_i::var_i (const char *typestr)
46     : typestr (typestr)
47     {
48     //param = cgCreateParameter (cg_context, cgtype);
49     }
50    
51     var_i::~var_i ()
52     {
53     //cgDestroyParameter (param);
54     }
55    
56 root 1.4 stream_i::stream_i (const char *strtype)
57     : var_i (strtype)
58     {
59 root 1.19 sprintf (name, "V%d", ++next_id);
60 root 1.4 }
61    
62 root 1.1 temporary_i::temporary_i (const char *strtype)
63     : var_i (strtype)
64     {
65 root 1.19 sprintf (name, "T%d", ++next_id);
66 root 1.1 }
67    
68     uniform_i::uniform_i (const char *strtype)
69 root 1.19 : var_i (strtype)
70 root 1.1 {
71 root 1.19 sprintf (name, "U%d", ++next_id);
72 root 1.1 }
73    
74     fragment_string_i::~fragment_string_i ()
75     {
76     free (str);
77     }
78    
79     ////////////////////////////////////////////////////////////////////////////
80    
81     void var_i::build_decl (ostringstream &b)
82     {
83     b << typestr << ' ' << name;
84     }
85    
86     void uniform_i::build_decl (ostringstream &b)
87     {
88     b << "uniform " << typestr << ' ' << name;
89     }
90    
91     void stream_i::build_decl (ostringstream &b)
92     {
93     b << typestr << ' ' << name;
94     }
95    
96     ////////////////////////////////////////////////////////////////////////////
97    
98 root 1.16 void gluvar_i::build (shader_builder &b)
99 root 1.1 {
100     b << name;
101     }
102    
103     void var_i::build (shader_builder &b)
104     {
105     b << name;
106     }
107    
108     void uniform_i::build (shader_builder &b)
109     {
110     var_i::build (b);
111    
112     if (find (b.refs.begin (), b.refs.end (), uniform (*this)) == b.refs.end ())
113     b.refs.push_back (*this);
114     }
115    
116     void stream_i::build (shader_builder &b)
117     {
118     var_i::build (b);
119    
120     if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ())
121     b.streams.push_back (*this);
122     }
123    
124     void temporary_i::build (shader_builder &b)
125     {
126     var_i::build (b);
127    
128     if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ())
129     b.temps.push_back (*this);
130     }
131    
132     void fragment_vector_i::build (shader_builder &b)
133     {
134     for (vector<fragment>::iterator i = begin (); i != end (); i++)
135     (*i)->build (b);
136     }
137    
138     void fragment_const_string_i::build (shader_builder &b)
139     {
140     b << str;
141     }
142    
143     void fragment_string_i::build (shader_builder &b)
144     {
145     b << str;
146     }
147    
148     #if 0
149     void statement_i::build (shader_builder &b)
150     {
151     b << " ";
152     fragment_vector_i::build (b);
153     b << ";\n";
154     }
155     #endif
156    
157     ////////////////////////////////////////////////////////////////////////////
158    
159 root 1.20 int texture_units::unit_count = 8;
160     GLenum texture_units::units[8] =
161     {
162     GL_TEXTURE7, GL_TEXTURE6, GL_TEXTURE5, GL_TEXTURE4,
163     GL_TEXTURE3, GL_TEXTURE2, GL_TEXTURE1, GL_TEXTURE0,
164     };
165    
166 root 1.1 shader_object_i *cur = 0;
167    
168     shader_object_i::shader_object_i (GLenum type)
169     : type (type)
170     {
171     id = glCreateShaderObjectARB (type);
172 root 1.12 assert (id);
173 root 1.1 }
174    
175     shader_object_i::~shader_object_i ()
176     {
177     glDeleteObjectARB (id);
178     }
179    
180     void shader_object_i::start ()
181     {
182     clear ();
183     cur = this;
184     }
185    
186     void shader_object_i::stop ()
187     {
188     cur = 0;
189     }
190    
191     string shader_object_i::source ()
192     {
193     shader_builder b;
194     build (b);
195     ostringstream os;
196    
197     for (vector<uniform>::iterator i = b.refs.begin (); i != b.refs.end (); i++)
198     {
199     (*i)->build_decl (os);
200     os << ";\n";
201     }
202    
203     // not neccessary right now, as GLSL is rich on predefinitions
204     for (vector<var>::iterator i = b.streams.begin (); i != b.streams.end (); i++)
205     {
206     os << "attribute ";
207     (*i)->build_decl (os);
208     os << ";\n";
209     }
210    
211     os << "\nvoid main (void)\n{\n";
212    
213     for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++)
214     {
215     os << " ";
216     (*i)->build_decl (os);
217     os << ";\n";
218     }
219    
220     os << "\n";
221     os << b.source.str ();
222     os << "}\n";
223    
224     return os.str ();
225     }
226    
227 root 1.17 static string linify (const string &s)
228     {
229     ostringstream o;
230    
231     int b = 0, e;
232     int l = 1;
233     do {
234     o << setw (3) << l << ": ";
235     e = s.find ('\n', b);
236     if (e == string::npos)
237     e = s.size ();
238    
239     o << s.substr (b, e - b + 1);
240     b = e + 1;
241     l++;
242     } while (b < s.size ());
243    
244     return o.str ();
245     }
246    
247 root 1.1 void shader_object_i::compile ()
248     {
249     string src = source ();
250     const char *sptr = src.data ();
251     const int slen = src.size ();
252    
253 root 1.17 printf ("%s\n", linify (src).c_str ());
254 root 1.1 glShaderSourceARB (id, 1, &sptr, &slen);
255     glCompileShaderARB (id);
256    
257     GLint compiled;
258     glGetObjectParameterivARB (id, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
259    
260     if (!compiled)
261     {
262     char infolog[8192];
263     glGetInfoLogARB (id, 8192, NULL, infolog);
264 root 1.17 printf ("%s\n", linify (src).c_str ());
265     printf ("%s\n", infolog);
266 root 1.12 abort ();
267     }
268     }
269    
270 root 1.19 ////////////////////////////////////////////////////////////////////////////
271    
272     program_object *program_object::cur = 0;
273    
274     GLint uniform_i::location ()
275     {
276     assert (program_object::cur);
277    
278     GLint &rid = program_object::cur->uloc[this];
279    
280     if (!rid)
281     rid = glGetUniformLocationARB (program_object::cur->id, name);
282    
283     return rid;
284     }
285    
286 root 1.12 program_object::program_object ()
287     {
288     id = glCreateProgramObjectARB ();
289     assert (id);
290 root 1.15
291     glAttachObjectARB (id, vsh->id);
292     glAttachObjectARB (id, fsh->id);
293 root 1.12 }
294    
295     program_object::~program_object ()
296     {
297     glDeleteProgramsARB (1, &id);
298     }
299    
300     void program_object::link ()
301     {
302     glLinkProgramARB (id);
303    
304     GLint linked;
305     glGetObjectParameterivARB (id, GL_OBJECT_LINK_STATUS_ARB, &linked);
306    
307     if (!linked)
308     {
309     char infolog[8192];
310     glGetInfoLogARB (id, 8192, NULL, infolog);
311     printf ("LINK-INFOLOG<%s>\n", infolog);
312 root 1.1 abort ();
313     }
314 root 1.19
315     uloc.clear ();
316 root 1.1 }
317    
318 root 1.7 void sl_func0::begin () const
319     {
320     cur->append_string (name_par);
321     }
322    
323 root 1.8 void sl_func0::comma () const
324     {
325     cur->append (str_comma);
326     }
327    
328 root 1.7 void sl_func0::end () const
329     {
330     str_rpar ();
331     }
332    
333 root 1.6 void sl_float::operator ()() const
334     {
335     char s[20];
336     sprintf (s, "%g", c);
337     cur->append_string (s);
338     }
339    
340 root 1.9 const sl_convert< ::vec2 >::T sl_convert< ::vec2 >::convert (const ::vec2 &v)
341 root 1.6 {
342     sl_string<60> s;
343     sprintf (s.str, "vec2 (%g, %g)", v.x, v.y);
344     return s;
345     }
346    
347 root 1.9 const sl_convert< ::vec3 >::T sl_convert< ::vec3 >::convert (const ::vec3 &v)
348 root 1.6 {
349     sl_string<80> s;
350     sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z);
351     return s;
352     }
353    
354 root 1.9 const sl_convert< ::vec4 >::T sl_convert< ::vec4 >::convert (const ::vec4 &v)
355 root 1.6 {
356     sl_string<100> s;
357     sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w);
358     return s;
359     }
360    
361 root 1.5 const fragment_const_string str_2sp (" ");
362     const fragment_const_string str_equal (" = ");
363 root 1.8 const fragment_const_string str_comma (", ");
364 root 1.5 const fragment_const_string str_endl (";\n");
365    
366 root 1.1 const sl_append_const_string str_plus (" + ");
367     const sl_append_const_string str_minus (" - ");
368     const sl_append_const_string str_mul (" * ");
369     const sl_append_const_string str_div (" / ");
370 root 1.9 const sl_append_const_string str_mod (" % ");
371 root 1.1
372 root 1.5 const sl_append_const_string str_lpar ("(");
373 root 1.1 const sl_append_const_string str_rpar (")");
374    
375 root 1.5 void swizzle_mask (sl_string<7> &s, int mask)
376     {
377     static const char channel[4] = { 'x', 'y', 'z', 'w' };
378    
379     char *str = s.str;
380    
381     *str++ = ')';
382     *str++ = '.';
383    
384     while (mask)
385     {
386     int c = mask % 5;
387     mask /= 5;
388    
389     if (c)
390     *str++ = channel[c - 1];
391     }
392    
393     *str++ = 0;
394     }
395    
396 root 1.7
397 root 1.1 void debdebdebdebug ()//D
398     {
399 root 1.20 return;
400    
401 root 1.1 vertex_shader vsh;
402    
403     vsh->start ();
404    
405     temp_4f lightpos;
406 root 1.18 temp_4f wpos;
407 root 1.1
408 root 1.13 lightpos = vec4 (0, 10, 0, 1);
409 root 1.18 wpos = gl.model_view_matrix * vin.vertex;
410 root 1.17 vout.position = vin.vertex * gl.model_view_matrix_inverse;
411 root 1.7 vout.tex_coord[0] = vin.tex_coord[0];
412 root 1.18 vout.tex_coord[1] = normalize (lightpos - wpos);
413     vout.tex_coord[2] = normalize (wpos);
414 root 1.14 //vout.tex_coord[3] = normalize (xyz (gl.model_view_matrix_inverse_transpose) * vin.normal);
415     //vout.tex_coord[4] = normalize (xyz (gl.projection_matrix_inverse_transpose) - wpos);
416 root 1.1
417     vsh->end ();
418 root 1.13 vsh->compile ();
419 root 1.10
420     fragment_shader fsh;
421    
422     fsh->start ();
423    
424 root 1.11 xyz (fout.frag_color) = noise3 (x (fin.frag_coord) * y (fin.frag_coord));
425    
426 root 1.10 temp_1f spec_expon;
427     spec_expon = 200;
428    
429     fsh->end ();
430     fsh->compile ();
431    
432 root 1.11 //abort ();
433 root 1.1 }
434    
435     }
436