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

Comparing libgender/shader.C (file contents):
Revision 1.27 by root, Wed Nov 3 01:12:34 2004 UTC vs.
Revision 1.31 by root, Fri Nov 5 19:55:15 2004 UTC

79 79
80 //////////////////////////////////////////////////////////////////////////// 80 ////////////////////////////////////////////////////////////////////////////
81 81
82 void var_i::operator ()() const 82 void var_i::operator ()() const
83 { 83 {
84 compile::cur->code << name; 84 shader_builder::cur->code << name;
85 85
86 if (compile::cur->first (this)) 86 if (shader_builder::cur->first (this))
87 { 87 {
88 if (domainstr) 88 if (domainstr)
89 compile::cur->global << domainstr << ' ' << typestr << ' ' << name << ";\n"; 89 shader_builder::cur->global << domainstr << ' ' << typestr << ' ' << name << ";\n";
90 else 90 else
91 compile::cur->local << " " << typestr << ' ' << name << ";\n"; 91 shader_builder::cur->local << " " << typestr << ' ' << name << ";\n";
92 } 92 }
93 } 93 }
94 94
95 //////////////////////////////////////////////////////////////////////////// 95 ////////////////////////////////////////////////////////////////////////////
96 96
129 } while (b < s.size ()); 129 } while (b < s.size ());
130 130
131 return o.str (); 131 return o.str ();
132 } 132 }
133 133
134 void shader_object_i::start ()
135 {
136 compile::cur = new compile::shader_builder;
137 }
138
139 void shader_object_i::stop ()
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
156 string src = os.str ();
157 const char *sptr = src.data ();
158 const int slen = src.size ();
159
160 printf ("%s\n", linify (src).c_str ());
161 glShaderSourceARB (id, 1, &sptr, &slen);
162 glCompileShaderARB (id);
163
164 GLint compiled;
165 glGetObjectParameterivARB (id, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
166
167 if (!compiled)
168 {
169 char infolog[8192];
170 glGetInfoLogARB (id, 8192, NULL, infolog);
171 printf ("%s\n", linify (src).c_str ());
172 printf ("%s\n", infolog);
173 abort ();
174 }
175 }
176
177 //////////////////////////////////////////////////////////////////////////// 134 ////////////////////////////////////////////////////////////////////////////
178 135
179 GLint uniform_i::location () 136 GLint uniform_i::location ()
180 { 137 {
181 assert (program_object_i::cur); 138 assert (program_object_i::cur);
186 rid = glGetUniformLocationARB (program_object_i::cur->id, name); 143 rid = glGetUniformLocationARB (program_object_i::cur->id, name);
187 144
188 return rid; 145 return rid;
189 } 146 }
190 147
191 program_object_i *program_object_i::cur; // currently bound program 148 program_object_i *program_object_i::cur;
192 149
193 program_object_i::program_object_i () 150 program_object_i::program_object_i ()
194 { 151 {
195 id = glCreateProgramObjectARB (); 152 id = glCreateProgramObjectARB ();
196 assert (id); 153 assert (id);
197
198 glAttachObjectARB (id, vsh->id);
199 glAttachObjectARB (id, fsh->id);
200 } 154 }
201 155
202 program_object_i::~program_object_i () 156 program_object_i::~program_object_i ()
203 { 157 {
204 glDeleteProgramsARB (1, &id); 158 glDeleteProgramsARB (1, &id);
222 uloc.clear (); 176 uloc.clear ();
223 } 177 }
224 178
225 void program_object_i::enable () 179 void program_object_i::enable ()
226 { 180 {
181 if (this != cur)
182 {
227 glUseProgramObjectARB (id); 183 glUseProgramObjectARB (id);
228 //TODO: set samplers here 184 //TODO: set samplers here?
229 cur = this; 185 cur = this;
186 }
230 } 187 }
231 188
232 void program_object_i::disable () 189 void program_object_i::disable ()
233 { 190 {
234 //TODO: clear samplers here 191 //TODO: clear samplers here?
235 glUseProgramObjectARB (0); 192 glUseProgramObjectARB (0);
236 cur = 0; 193 cur = 0;
194 }
195
196 static map<string, program_object> progcache;
197
198 program_object get_program (const string &vsh, const string &fsh)
199 {
200 string idx = vsh + "\0" + fsh;
201
202 map<string, program_object>::iterator i = progcache.find (idx);
203
204 if (i != progcache.end ())
205 return i->second;
206
207 program_object p;
208
209 if (vsh.size ())
210 {
211 vertex_shader sh;
212 p->attach (sh);
213 sh->compile (vsh);
214 }
215
216 if (fsh.size ())
217 {
218 fragment_shader sh;
219 p->attach (sh);
220 sh->compile (fsh);
221 }
222
223 p->link ();
224
225 progcache.insert (pair<string, program_object> (idx, p));
226
227 return p;
237 } 228 }
238 229
239 const sl_expr< sl_string<60> > sl_convert< ::vec2 >::convert (const ::vec2 &v) 230 const sl_expr< sl_string<60> > sl_convert< ::vec2 >::convert (const ::vec2 &v)
240 { 231 {
241 sl_string<60> s; 232 sl_string<60> s;
255 sl_string<100> s; 246 sl_string<100> s;
256 sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w); 247 sprintf (s.str, "vec4 (%g, %g, %g, %g)", v.x, v.y, v.z, v.w);
257 return s; 248 return s;
258 } 249 }
259 250
260 namespace compile { 251 shader_builder *shader_builder::cur = 0;
261 252
262 shader_builder *cur = 0;
263
264 bool shader_builder::first (const void *p) 253 bool shader_builder::first (const void *p)
265 { 254 {
266 if (seen.find (p) == seen.end ()) 255 if (seen.find (p) == seen.end ())
267 { 256 {
268 seen.insert (p); 257 seen.insert (p);
269 return true; 258 return true;
270 } 259 }
271 260
272 return false; 261 return false;
262 }
263
264 void shader_builder::start ()
265 {
266 cur = new shader_builder;
267 }
268
269 string shader_builder::stop ()
270 {
271 ostringstream os;
272
273 os << cur->global.str ()
274 << "\nvoid main (void)\n"
275 << "{\n"
276 << cur->local.str ()
277 << "\n"
278 << cur->code.str ()
279 << "}\n";
280
281 delete cur;
282 cur = 0;
283
284 return os.str ();
285 }
286
287 void shader_object_i::compile (const string &source)
288 {
289 const char *sptr = source.data ();
290 const int slen = source.size ();
291
292 printf ("%s\n", linify (source).c_str ());
293 glShaderSourceARB (id, 1, &sptr, &slen);
294 glCompileShaderARB (id);
295
296 GLint compiled;
297 glGetObjectParameterivARB (id, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
298
299 if (!compiled)
300 {
301 char infolog[8192];
302 glGetInfoLogARB (id, 8192, NULL, infolog);
303 printf ("%s\n", linify (source).c_str ());
304 printf ("%s\n", infolog);
305 abort ();
273 } 306 }
274 }
275
276 void debdebdebdebug ()//D
277 {
278 return;
279
280 using namespace compile;
281
282 vertex_shader vsh;
283
284 vsh->start ();
285
286 temp_4f lightpos;
287 temp_4f wpos;
288
289 lightpos = vec4 (0, 10, 0, 1);
290 wpos = model_view_matrix * vin.vertex;
291 vout.position = vin.vertex * model_view_matrix_inverse;
292 vout.tex_coord[0] = vin.tex_coord[0];
293 vout.tex_coord[1] = normalize (lightpos - wpos);
294 vout.tex_coord[2] = normalize (wpos);
295 //vout.tex_coord[3] = normalize (xyz (model_view_matrix_inverse_transpose) * vin.normal);
296 //vout.tex_coord[4] = normalize (xyz (projection_matrix_inverse_transpose) - wpos);
297
298 vsh->stop ();
299
300 fragment_shader fsh;
301
302 fsh->start ();
303
304 xyz (fout.frag_color) = noise3 (x (fin.frag_coord) * y (fin.frag_coord));
305
306 temp_1f spec_expon;
307 spec_expon = 200;
308
309 fsh->stop ();
310
311 //abort ();
312 } 307 }
313 308
314} 309}
315 310

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines