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

Comparing cvsroot/libgender/material.C (file contents):
Revision 1.29 by root, Tue Nov 2 02:59:33 2004 UTC vs.
Revision 1.65 by root, Tue Aug 9 23:58:43 2005 UTC

6#include "opengl.h" 6#include "opengl.h"
7#include "material.h" 7#include "material.h"
8#include "view.h" 8#include "view.h"
9#include "util.h" 9#include "util.h"
10 10
11material::~material ()
12{
13}
14
15void
16simple_material::enable (view &ctx)
17{
18 glMaterialfv (GL_FRONT, GL_DIFFUSE, (GLfloat *) & diffuse);
19 glMaterialfv (GL_FRONT, GL_SPECULAR, (GLfloat *) & specular);
20 glMaterialfv (GL_FRONT, GL_EMISSION, (GLfloat *) & emission);
21 glMaterialf (GL_FRONT, GL_SHININESS, shininess);
22}
23
24void
25simple_material::disable (view &ctx)
26{
27}
28
29GLuint 11GLuint
30texture::load_texture (SDL_Surface * surface, GLfloat * tex2oord) 12texture::load_texture (SDL_Surface * surface, GLfloat * tex2oord, int flags)
31{ 13{
32 GLuint name; 14 GLuint name;
33 SDL_Surface *image; 15 SDL_Surface *image;
34 SDL_Rect area; 16 SDL_Rect area;
35 Uint32 saved_flags; 17 Uint32 saved_flags;
71 53
72 /* Create an OpenGL texture for the image */ 54 /* Create an OpenGL texture for the image */
73 glGenTextures (1, &name); 55 glGenTextures (1, &name);
74 glBindTexture (GL_TEXTURE_2D, name); 56 glBindTexture (GL_TEXTURE_2D, name);
75 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 57 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
76 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 58 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, flags & DISABLE_MIPMAP ? GL_LINEAR : GL_LINEAR_MIPMAP_LINEAR);
77 glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 59 glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, flags & DISABLE_MIPMAP ? GL_FALSE : GL_TRUE);
78 glTexImage2D (GL_TEXTURE_2D,
79 0,
80 GL_RGBA, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); 60 glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
61
62 if (flags & CLAMP)
63 {
64 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
65 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
66 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
67 }
68
81 SDL_FreeSurface (image); /* No longer needed */ 69 SDL_FreeSurface (image); /* No longer needed */
82 70
83 return name; 71 return name;
72}
73
74material::~material ()
75{
76}
77
78void material::enable (view &ctx)
79{
80 pass_data::matmap_t &matmap = ctx.pass->matmap;
81
82 pass_data::matmap_t::iterator i = matmap.find (this);
83
84 if (i == matmap.end ())
85 {
86 string vsh_src, fsh_src;
87
88 shader::shader_builder::start ();
89
90 if (ctx.pass->l)
91 ctx.pass->l->vsh ();
92
93 vsh (ctx);
94
95 // compute logarithmic depth - see the frustum matrix in view.C
96 {
97 using namespace shader::compile;
98
99 temp_1f lz;
100
101 // TODO: negative z is not calculated in an a very acceptable way
102 lz = z (vout.position);
103 lz = sign (lz) * (log (abs (lz) + exp (1e0)) - 1e0) / log (1e30);
104 z (vout.position) = lz * w (vout.position);
105 }
106
107 vsh_src = shader::shader_builder::stop ();
108
109 shader::shader_builder::start ();
110
111 if (ctx.pass->l)
112 {
113 ctx.pass->l->fsh ();
114 fsh (ctx);
115 }
116 else
117 // many drivers need both vertex and fragment shader, 'caboom!' otherwise
118 shader::compile::fout.frag_color = shader::compile::float4 (0., 0., 0., 0.);
119
120 fsh_src = shader::shader_builder::stop ();
121
122 shader::program_object po = shader::get_program (vsh_src, fsh_src);
123 matmap.insert (pass_data::matmap_t::value_type (this, po));
124
125 po->enable ();
126 }
127 else
128 i->second->enable ();
129
130 if (ctx.pass->l)
131 ctx.pass->l->enable (ctx);
132}
133
134void material::disable (view &ctx)
135{
84} 136}
85 137
86test_material::test_material () 138test_material::test_material ()
87//: tex ("textures/osama.jpg"), texvar (tex.name) 139//: tex ("textures/osama.jpg"), texvar (tex.name)
88: tex ("textures/rockwall.jpg"), texvar (tex.name) 140: tex ("textures/rockwall.jpg"), texvar (tex.name)
89, norm ("textures/rockwall_height.jpg"), normvar (norm.name) 141, norm ("textures/rockwall_normal.jpg"), normvar (norm.name)
90{ 142{
91 using namespace shader::compile; 143}
92 144
93 p.vsh->start (); 145skybox_material::skybox_material ()
146: tex (0)
147{
148}
94 149
95 temp_4f wpos; 150void skybox_material::enable (view &ctx)
96 varying_1f camdist, zpos; 151{
97 varying_2f texcoord; 152 material::enable (ctx);
98 varying_3f lightvec, normal; 153}
99
100 wpos = model_view_matrix * vin.vertex;
101 154
102 temp_1f wz; 155void skybox_material::disable (view &ctx)
103 //wz = log2 (abs (wz)) * sign (wz); 156{
157 material::disable (ctx);
158}
104 159
105 vout.position = projection_matrix * wpos; 160static shader::varying_2f skybox_texcoord;
161
162void skybox_material::vsh (view &ctx)
163{
164 using namespace shader::compile;
165
166 std_vsh ();
106 texcoord = xy (vin.tex_coord[0]); 167 skybox_texcoord = xy (vin.tex_coord[0]);
168}
169
170void skybox_material::fsh (view &ctx)
171{
172 using namespace shader::compile;
173
174 xyz (fout.frag_color) = texture_2d (tex, skybox_texcoord);
175}
176
177void mat_timed::enable (view &ctx)
178{
179 material::enable (ctx);
180
181 time->set (timer::now);
182 sh_colour->set (vec3 (255, 0, 0) * (1.F / 255.F));
183}
184
185void mat_timed::disable (view &ctx)
186{
187 material::disable (ctx);
188}
189
190void mat_timed::vsh (view &ctx)
191{
192 using namespace shader::compile;
193 std_vsh ();
194
195 if (ctx.pass->l)
107 normal = normal_matrix * vin.normal; 196 f_normal = normal_matrix * vin.normal;
108 lightvec = xyz (lightpos - model_view_matrix * vin.vertex); 197}
109 camdist = 1 - max (length (lightvec) / 10000., 0);
110 198
111 p.vsh->stop (); 199void mat_timed::fsh (view &ctx)
200{
201 using namespace shader::compile;
112 202
113 p.fsh->start (); 203 if (ctx.pass->l)
114 204 {
115 temp_1f fac; 205 temp_1f fac;
116 temp_2f disp;
117 temp_1f dx, dy;
118 temp_1f bumpnormal; 206 temp_3f normal;
119 temp_1f dist;
120 207
208 normal = f_normal + 0.3 * pow (sin (f_normal * 3.14159 + time), 3);
209
121 fac = dot (normalize (normal), normalize (lightvec)); 210 fac = dot (normalize (normal), normalize (ctx.pass->l->sh_lightvec));
122 //fac = dot (shader::compile::vec3 (normalize (fin.tex_coord[1]) + normalize (fin.tex_coord[2])) * 0.5, bumpnormal); 211
123 //fac = dot (bumpnormal, normalize (fin.tex_coord[2])); 212 xyz (fout.frag_color) = fac * float3 (0.1,0.5,1);//ctx.pass->l->sh_colour * sh_colour * fac;
213 }
214}
215
216void mat_gouraud_shaded::enable (view &ctx)
217{
218 material::enable (ctx);
219
220 sh_colour->set (vec3 (c.r, c.g, c.b) * (1.F / 255.F));
221}
222
223void mat_gouraud_shaded::disable (view &ctx)
224{
225 material::disable (ctx);
226}
227
228void mat_gouraud_shaded::vsh (view &ctx)
229{
230 using namespace shader::compile;
231 std_vsh ();
232
233 if (ctx.pass->l)
234 f_normal = normal_matrix * vin.normal;
235}
236
237void mat_gouraud_shaded::fsh (view &ctx)
238{
239 using namespace shader::compile;
240
241 if (ctx.pass->l)
242 {
243 temp_1f fac;
244
245 fac = dot (normalize (f_normal), normalize (ctx.pass->l->sh_lightvec));
246
247 xyz (fout.frag_color) = ctx.pass->l->sh_colour * sh_colour * fac;
248 }
249}
250
251static shader::varying_3f f_normal;
252
253void mat_debug::enable (view &ctx)
254{
255 material::enable (ctx);
256
257 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
258 glEnable (GL_BLEND);
259 glDepthMask (1);
260}
261
262void mat_debug::disable (view &ctx)
263{
264 material::disable (ctx);
265
266 glDisable (GL_BLEND);
267 glDepthMask (0);
268}
269
270void mat_debug::vsh (view &ctx)
271{
272 using namespace shader::compile;
273 std_vsh ();
274
275 if (ctx.pass->l)
276 f_normal = normal_matrix * vin.normal;
277}
278
279void mat_debug::fsh (view &ctx)
280{
281 using namespace shader::compile;
282
283 if (ctx.pass->l)
284 {
285 temp_1f fac;
286
287 fac = dot (normalize (f_normal), normalize (ctx.pass->l->sh_lightvec));
288
289 xyz (fout.frag_color) = float3 (1.,0.,0.);
290 w (fout.frag_color) = 0.1;
291 }
292}
293
294static shader::varying_2f texcoord;
295static shader::varying_3f normal;
296
297void test_material::vsh (view &ctx)
298{
299 using namespace shader::compile;
300
301 std_vsh ();
302
303 if (ctx.pass->l)
304 {
305 texcoord = xy (vin.tex_coord[0]);
306 normal = normal_matrix * vin.normal;
307 }
308}
309
310void test_material::fsh (view &ctx)
311{
312 using namespace shader::compile;
313
314 if (ctx.pass->l)
315 {
316 temp_3f lc;
317 temp_1f fac;
318
319 temp_3f rot1, rot2, rot3;
320
321 yxz (rot1) = (texture_2d (normvar, texcoord) * 2.F - 1.F);
322
323 //rot1 = normal_matrix * rot1;
324
325 rot2 = float3 (x(rot1), z(rot1), -y(rot1));
326 rot3 = float3 (y(rot1), -x(rot1), z(rot1));
327
328 normal = mat3 (rot1, rot2, rot3) * normal;
329
330 fac = dot (normalize (normal), normalize (ctx.pass->l->sh_lightvec));
124 fac = pow (max (fac, 0.0), 2); 331 fac = max (pow (max (fac, 0.0), 6), 0.3);
125 xyz (fout.frag_color) = texture_2d (texvar, texcoord) * (fac + 0.4) * camdist; 332 xyz (fout.frag_color) = (texture_2d (texvar, texcoord) + 0.2F) * fac
126 333 * ctx.pass->l->sh_colour;
127 p.fsh->stop (); 334 //xyz (fout.frag_color) = lc * fac;
128 p.link (); 335 }
129} 336}
130 337
131void test_material::enable (view &ctx) 338void test_material::enable (view &ctx)
132{ 339{
133 p.enable (); 340 material::enable (ctx);
134 lightpos->set (vec3 (0, 0, 0));
135 texvar->enable (); 341 texvar->enable ();
136 normvar->enable (); 342 normvar->enable ();
137} 343}
138 344
139void test_material::disable (view &ctx) 345void test_material::disable (view &ctx)
140{ 346{
141 normvar->disable (); 347 normvar->disable ();
142 texvar->disable (); 348 texvar->disable ();
143 p.disable (); 349 material::disable (ctx);
144} 350}
145 351
352test_material *testmat;
353mat_gouraud_shaded *testmat2;
354mat_timed *testmat3;
355mat_debug *debugmat;
356

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines