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

Comparing libgender/shader.C (file contents):
Revision 1.25 by root, Mon Nov 1 22:23:38 2004 UTC vs.
Revision 1.26 by root, Tue Nov 2 02:59:33 2004 UTC

14 { 14 {
15 if (refcnt) 15 if (refcnt)
16 abort (); 16 abort ();
17 } 17 }
18 18
19 void refcounted::refcnt_dec () const 19 void refcounted::refcnt_destroy () const
20 { 20 {
21 if (!--refcnt) 21 if (!--refcnt)
22 delete this; // quite a bit of code... 22 delete this; // quite a bit of code...
23 } 23 }
24 24
40 const char str_sampler_3d_rect [] = "sampler3DRect"; 40 const char str_sampler_3d_rect [] = "sampler3DRect";
41 const char str_sampler_cube [] = "samplerCube"; 41 const char str_sampler_cube [] = "samplerCube";
42 42
43 unsigned int var_i::next_id = 0; 43 unsigned int var_i::next_id = 0;
44 44
45 var_i::var_i (const char *typestr) 45 var_i::var_i (const char *domainstr, const char *typestr)
46 : typestr (typestr) 46 : domainstr (domainstr), typestr (typestr)
47 { 47 {
48 } 48 }
49 49
50 var_i::~var_i () 50 var_i::~var_i ()
51 { 51 {
58 sprintf (name, "V%d", ++next_id); 58 sprintf (name, "V%d", ++next_id);
59 } 59 }
60#endif 60#endif
61 61
62 temporary_i::temporary_i (const char *strtype) 62 temporary_i::temporary_i (const char *strtype)
63 : var_i (strtype) 63 : var_i (0, strtype)
64 { 64 {
65 sprintf (name, "T%d", ++next_id); 65 sprintf (name, "T%d", ++next_id);
66 } 66 }
67 67
68 varying_i::varying_i (const char *strtype) 68 varying_i::varying_i (const char *strtype)
69 : var_i (strtype) 69 : var_i ("varying", strtype)
70 { 70 {
71 sprintf (name, "V%d", ++next_id); 71 sprintf (name, "V%d", ++next_id);
72 } 72 }
73 73
74 uniform_i::uniform_i (const char *strtype) 74 uniform_i::uniform_i (const char *strtype)
75 : var_i (strtype) 75 : var_i ("uniform", strtype)
76 { 76 {
77 sprintf (name, "U%d", ++next_id); 77 sprintf (name, "U%d", ++next_id);
78 } 78 }
79 79
80 fragment_string_i::~fragment_string_i ()
81 {
82 free (str);
83 }
84
85 //////////////////////////////////////////////////////////////////////////// 80 ////////////////////////////////////////////////////////////////////////////
86 81
87 void var_i::build_decl (ostringstream &b) 82 void var_i::operator ()() const
88 { 83 {
89 b << typestr << ' ' << name; 84 compile::cur->code << name;
90 }
91 85
92 void uniform_i::build_decl (ostringstream &b) 86 if (compile::cur->first (this))
93 { 87 {
94 b << "uniform " << typestr << ' ' << name; 88 if (domainstr)
89 compile::cur->global << domainstr << ' ' << typestr << ' ' << name << ";\n";
90 else
91 compile::cur->local << " " << typestr << ' ' << name << ";\n";
92 }
95 } 93 }
96
97 void varying_i::build_decl (ostringstream &b)
98 {
99 b << "varying " << typestr << ' ' << name;
100 }
101
102 ////////////////////////////////////////////////////////////////////////////
103
104 void gluvar_i::build (shader_builder &b)
105 {
106 b << name;
107 }
108
109 void var_i::build (shader_builder &b)
110 {
111 b << name;
112 }
113
114 void uniform_i::build (shader_builder &b)
115 {
116 var_i::build (b);
117
118 if (find (b.refs.begin (), b.refs.end (), uniform (*this)) == b.refs.end ())
119 b.refs.push_back (*this);
120 }
121
122#if 0
123 void stream_i::build (shader_builder &b)
124 {
125 var_i::build (b);
126
127#if 0
128 if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ())
129 b.streams.push_back (*this);
130#endif
131 }
132#endif
133
134 void temporary_i::build (shader_builder &b)
135 {
136 var_i::build (b);
137
138 if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ())
139 b.temps.push_back (*this);
140 }
141
142 void varying_i::build (shader_builder &b)
143 {
144 var_i::build (b);
145
146 if (find (b.refs.begin (), b.refs.end (), var (*this)) == b.refs.end ())
147 b.refs.push_back (*this);
148 }
149
150 void fragment_vector_i::build (shader_builder &b)
151 {
152 for (vector<fragment>::iterator i = begin (); i != end (); i++)
153 (*i)->build (b);
154 }
155
156 void fragment_const_string_i::build (shader_builder &b)
157 {
158 b << str;
159 }
160
161 void fragment_string_i::build (shader_builder &b)
162 {
163 b << str;
164 }
165
166#if 0
167 void statement_i::build (shader_builder &b)
168 {
169 b << " ";
170 fragment_vector_i::build (b);
171 b << ";\n";
172 }
173#endif
174 94
175 //////////////////////////////////////////////////////////////////////////// 95 ////////////////////////////////////////////////////////////////////////////
176 96
177 int texture_units::unit_count = 8; 97 int texture_units::unit_count = 8;
178 int texture_units::units[8] = { 7, 6, 5, 4, 3, 2, 1, 0 }; 98 int texture_units::units[8] = { 7, 6, 5, 4, 3, 2, 1, 0 };
187 } 107 }
188 108
189 shader_object_i::~shader_object_i () 109 shader_object_i::~shader_object_i ()
190 { 110 {
191 glDeleteObjectARB (id); 111 glDeleteObjectARB (id);
192 }
193
194 void shader_object_i::start ()
195 {
196 clear ();
197 cur = this;
198 }
199
200 void shader_object_i::stop ()
201 {
202 cur = 0;
203 }
204
205 string shader_object_i::source ()
206 {
207 shader_builder b;
208 build (b);
209 ostringstream os;
210
211 for (vector<var>::iterator i = b.refs.begin (); i != b.refs.end (); i++)
212 {
213 (*i)->build_decl (os);
214 os << ";\n";
215 }
216
217#if 0
218 // not neccessary right now, as GLSL is rich on predefinitions
219 for (vector<var>::iterator i = b.streams.begin (); i != b.streams.end (); i++)
220 {
221 os << "attribute ";
222 (*i)->build_decl (os);
223 os << ";\n";
224 }
225#endif
226
227 os << "\nvoid main (void)\n{\n";
228
229 for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++)
230 {
231 os << " ";
232 (*i)->build_decl (os);
233 os << ";\n";
234 }
235
236 os << "\n";
237 os << b.source.str ();
238 os << "}\n";
239
240 return os.str ();
241 } 112 }
242 113
243 static string linify (const string &s) 114 static string linify (const string &s)
244 { 115 {
245 ostringstream o; 116 ostringstream o;
258 } while (b < s.size ()); 129 } while (b < s.size ());
259 130
260 return o.str (); 131 return o.str ();
261 } 132 }
262 133
134 void shader_object_i::start ()
135 {
136 compile::cur = new compile::shader_builder;
137 }
138
263 void shader_object_i::compile () 139 void shader_object_i::stop ()
264 { 140 {
141 compile::shader_builder &b = *compile::cur;
142
143 ostringstream os;
144
145 os << b.global.str ()
146 << "\nvoid main (void)\n"
147 << "{\n"
148 << b.local.str ()
149 << "\n"
150 << b.code.str ()
151 << "}\n";
152
153 delete cur;
154 cur = 0;
155
265 string src = source (); 156 string src = os.str ();
266 const char *sptr = src.data (); 157 const char *sptr = src.data ();
267 const int slen = src.size (); 158 const int slen = src.size ();
268 159
269 printf ("%s\n", linify (src).c_str ()); 160 printf ("%s\n", linify (src).c_str ());
270 glShaderSourceARB (id, 1, &sptr, &slen); 161 glShaderSourceARB (id, 1, &sptr, &slen);
343 //TODO: clear samplers here 234 //TODO: clear samplers here
344 glUseProgramObjectARB (0); 235 glUseProgramObjectARB (0);
345 cur = 0; 236 cur = 0;
346 } 237 }
347 238
348 void sl_func0::begin () const 239 const sl_expr< sl_string<60> > sl_convert< ::vec2 >::convert (const ::vec2 &v)
349 {
350 cur->append_string (name_par);
351 }
352
353 void sl_func0::comma () const
354 {
355 cur->append (compile::str_comma);
356 }
357
358 void sl_func0::end () const
359 {
360 cur->append_const (")");
361 }
362
363 void sl_float::operator ()() const
364 {
365 char s[20];
366 sprintf (s, "%g", c);
367 cur->append_string (s);
368 }
369
370 const sl_convert< ::vec2 >::T sl_convert< ::vec2 >::convert (const ::vec2 &v)
371 { 240 {
372 sl_string<60> s; 241 sl_string<60> s;
373 sprintf (s.str, "vec2 (%g, %g)", v.x, v.y); 242 sprintf (s.str, "vec2 (%g, %g)", v.x, v.y);
374 return s; 243 return s;
375 } 244 }
376 245
377 const sl_convert< ::vec3 >::T sl_convert< ::vec3 >::convert (const ::vec3 &v) 246 const sl_expr< sl_string<80> > sl_convert< ::vec3 >::convert (const ::vec3 &v)
378 { 247 {
379 sl_string<80> s; 248 sl_string<80> s;
380 sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z); 249 sprintf (s.str, "vec3 (%g, %g, %g)", v.x, v.y, v.z);
381 return s; 250 return s;
382 } 251 }
383 252
384 const sl_convert< ::vec4 >::T sl_convert< ::vec4 >::convert (const ::vec4 &v) 253 const sl_expr< sl_string<100> > sl_convert< ::vec4 >::convert (const ::vec4 &v)
385 { 254 {
386 sl_string<100> s; 255 sl_string<100> s;
387 sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w); 256 sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w);
388 return s; 257 return s;
389 } 258 }
390 259
391 namespace compile { 260 namespace compile {
392 261
393 const fragment_const_string str_2sp (" "); 262 shader_builder *cur = 0;
394 const fragment_const_string str_equal (" = "); 263
395 const fragment_const_string str_comma (", "); 264 bool shader_builder::first (const void *p)
396 const fragment_const_string str_endl (";\n"); 265 {
266 if (seen.find (p) == seen.end ())
267 {
268 seen.insert (p);
269 return true;
270 }
271
272 return false;
273 }
397 } 274 }
398 275
399 void debdebdebdebug ()//D 276 void debdebdebdebug ()//D
400 { 277 {
401 return; 278 return;
416 vout.tex_coord[1] = normalize (lightpos - wpos); 293 vout.tex_coord[1] = normalize (lightpos - wpos);
417 vout.tex_coord[2] = normalize (wpos); 294 vout.tex_coord[2] = normalize (wpos);
418 //vout.tex_coord[3] = normalize (xyz (model_view_matrix_inverse_transpose) * vin.normal); 295 //vout.tex_coord[3] = normalize (xyz (model_view_matrix_inverse_transpose) * vin.normal);
419 //vout.tex_coord[4] = normalize (xyz (projection_matrix_inverse_transpose) - wpos); 296 //vout.tex_coord[4] = normalize (xyz (projection_matrix_inverse_transpose) - wpos);
420 297
421 vsh->end ();
422 vsh->compile (); 298 vsh->stop ();
423 299
424 fragment_shader fsh; 300 fragment_shader fsh;
425 301
426 fsh->start (); 302 fsh->start ();
427 303
428 xyz (fout.frag_color) = noise3 (x (fin.frag_coord) * y (fin.frag_coord)); 304 xyz (fout.frag_color) = noise3 (x (fin.frag_coord) * y (fin.frag_coord));
429 305
430 temp_1f spec_expon; 306 temp_1f spec_expon;
431 spec_expon = 200; 307 spec_expon = 200;
432 308
433 fsh->end ();
434 fsh->compile (); 309 fsh->stop ();
435 310
436 //abort (); 311 //abort ();
437 } 312 }
438 313
439} 314}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines