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

Comparing libgender/view.C (file contents):
Revision 1.76 by root, Sun Nov 7 03:28:20 2004 UTC vs.
Revision 1.79 by root, Wed Nov 10 01:57:16 2004 UTC

121 renormalize (orig, p); 121 renormalize (orig, p);
122 122
123 glViewport (0, 0, w, h); 123 glViewport (0, 0, w, h);
124 124
125 glMatrixMode (GL_PROJECTION); 125 glMatrixMode (GL_PROJECTION);
126 glLoadIdentity ();
127 126
128 GLdouble aspect = (GLdouble)w/h; 127 GLdouble aspect = (GLdouble)w/h;
129 GLdouble ftan = tan (fov * (.5 * M_PI / 180.)); 128 GLdouble ftan = tanf (fov * GLfloat (.5 * M_PI / 180.));
130 GLdouble ymax = z_near * ftan; 129 GLdouble ymax = ftan;
131 GLdouble xmax = ymax * aspect; 130 GLdouble xmax = ymax * aspect;
132 131
133 matrix perspective; 132 matrix perspective;
134#if 1
135 { 133 {
136 matrix &m = perspective; 134 matrix &m = perspective;
137 135
138 m(0,0) = 1.F / xmax; m(0,1) = 0; m(0,2) = 0; m(0,3) = 0; 136 m(0,0) = 1.F / xmax; m(0,1) = 0; m(0,2) = 0; m(0,3) = 0;
139 m(1,0) = 0; m(1,1) = 1.F / ymax; m(1,2) = 0; m(1,3) = 0; 137 m(1,0) = 0; m(1,1) = 1.F / ymax; m(1,2) = 0; m(1,3) = 0;
140 m(2,0) = 0; m(2,1) = 0; m(2,2) = -1e10F / z_far; m(2,3) = 1; 138 m(2,0) = 0; m(2,1) = 0; m(2,2) = -1e10F / z_far; m(2,3) = 1;
141 m(3,0) = 0; m(3,1) = 0; m(3,2) = -1; m(3,3) = 0; 139 m(3,0) = 0; m(3,1) = 0; m(3,2) = -1; m(3,3) = 0;
142 140
143 glLoadMatrixf (perspective); 141 glLoadMatrixf (perspective);
144 } 142 }
145#else
146 glFrustum (-xmax, xmax, -ymax, ymax, z_near, z_far); 143 //glFrustum (-xmax, xmax, -ymax, ymax, z_near, z_far);
147#endif
148 144
149 glGetFloatv (GL_PROJECTION_MATRIX, perspective); 145 glGetFloatv (GL_PROJECTION_MATRIX, perspective);
150 146
151 perspfact = z_near / ymax * 0.5F * h; 147 perspfact = z_near / ymax * 0.5F * h;
152 148
170 //printf ("diagfact = %f\n", diagfact); 166 //printf ("diagfact = %f\n", diagfact);
171 diagfact = sqrtf (3.);//D WHY??? 167 diagfact = sqrtf (3.);//D WHY???
172 168
173 glMultMatrixf (m); 169 glMultMatrixf (m);
174 170
171 glTranslatef (-p.x, -p.y, -p.z);
172
175 glGetFloatv (GL_MODELVIEW_MATRIX, m); 173 glGetFloatv (GL_MODELVIEW_MATRIX, m);
176 174
177 m = perspective * m; 175 m = perspective * m;
178 176
179 frustum.l = plane ( m(3,0) + m(0,0), m(3,1) + m(0,1), m(3,2) + m(0,2), m(3,3) + m(0,3) ); 177 frustum.l = plane ( m(3,0) + m(0,0), m(3,1) + m(0,1), m(3,2) + m(0,2), m(3,3) + m(0,3) );
181 frustum.b = plane ( m(3,0) + m(1,0), m(3,1) + m(1,1), m(3,2) + m(1,2), m(3,3) + m(1,3) ); 179 frustum.b = plane ( m(3,0) + m(1,0), m(3,1) + m(1,1), m(3,2) + m(1,2), m(3,3) + m(1,3) );
182 frustum.t = plane ( m(3,0) - m(1,0), m(3,1) - m(1,1), m(3,2) - m(1,2), m(3,3) - m(1,3) ); 180 frustum.t = plane ( m(3,0) - m(1,0), m(3,1) - m(1,1), m(3,2) - m(1,2), m(3,3) - m(1,3) );
183 frustum.n = plane ( m(3,0) + m(2,0), m(3,1) + m(2,1), m(3,2) + m(2,2), m(3,3) + m(2,3) ); 181 frustum.n = plane ( m(3,0) + m(2,0), m(3,1) + m(2,1), m(3,2) + m(2,2), m(3,3) + m(2,3) );
184 frustum.f = plane ( m(3,0) - m(2,0), m(3,1) - m(2,1), m(3,2) - m(2,2), m(3,3) - m(2,3) ); 182 frustum.f = plane ( m(3,0) - m(2,0), m(3,1) - m(2,1), m(3,2) - m(2,2), m(3,3) - m(2,3) );
185 183
184#if 0
186 { 185 {
187 GLdouble frustlen = z_far - z_near; 186 GLdouble frustlen = z_far - z_near;
188 GLdouble fheight = frustlen * ftan; 187 GLdouble fheight = frustlen * ftan;
189 GLdouble fwidth = fheight * w / h; 188 GLdouble fwidth = fheight * w / h;
190 point half (0, 0, z_near + frustlen * .5); 189 point half (0, 0, z_near + frustlen * .5);
191 point corner (fwidth, fheight, frustlen); 190 point corner (fwidth, fheight, frustlen);
192 191
193 frustum.s = sphere (p + d * (.5 * frustlen), length (corner - half)); 192 frustum.s = sphere (p + d * (.5 * frustlen), length (corner - half));
194 } 193 }
194#endif
195 195
196 { 196 {
197 GLdouble depth = h / ftan; 197 GLdouble depth = h / ftan;
198 198
199 frustum.c = cone (p, d, atan (sqrt (GLdouble (w * w + h * h)) * ftan / h)); 199 frustum.c = cone (p, d, atan (sqrt (GLdouble (w * w + h * h)) * ftan / h));
200 } 200 }
201
202 glTranslatef (-p.x, -p.y, -p.z);
203} 201}
204 202
205void view::begin () 203void view::begin ()
206{ 204{
207 generation++; 205 generation++;
214 212
215 reset_projection (); 213 reset_projection ();
216 214
217 nz_near = 100.; 215 nz_near = 100.;
218 nc_far = nz_far = 1.F; 216 nc_far = nz_far = 1.F;
217
218 first_lighted = false;
219} 219}
220 220
221void view::end () 221void view::end ()
222{ 222{
223 vislist.clear (); 223 vislist.clear ();
226#define DEPTH_OFFSET (1. / (GLdouble)(1L << 16)) 226#define DEPTH_OFFSET (1. / (GLdouble)(1L << 16))
227 227
228void view::render (pass_data &pass) 228void view::render (pass_data &pass)
229{ 229{
230 this->pass = &pass; 230 this->pass = &pass;
231
232 stat1 = stat2 = 0; //D
231 233
232 switch (pass.type) 234 switch (pass.type)
233 { 235 {
234 case DEPTH: 236 case DEPTH:
235 glColorMask (1, 1, 1, 1); 237 glColorMask (1, 1, 1, 1);
252 glEnable (GL_DEPTH_TEST); 254 glEnable (GL_DEPTH_TEST);
253 glColorMask (0, 0, 0, 0); 255 glColorMask (0, 0, 0, 0);
254 glDisable (GL_DEPTH_CLAMP_NV); 256 glDisable (GL_DEPTH_CLAMP_NV);
255 257
256 world.detect_visibility (*this); 258 world.detect_visibility (*this);
259
260 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i)
261 (*i)->draw_depth (*this);
262
263 if (pass.type == DEPTH)
264 printf ("fps %f NF %f:%f vis %d,%d (%d,%d) CAM (%ld,%ld,%ld)\n",
265 timer.fps, z_near, z_far, vislist.size (), drawn.size (), stat1, stat2, orig.x, orig.y, orig.z);//D
257 266
258 break; 267 break;
259 268
260 case POSTDEPTH: 269 case POSTDEPTH:
261 glDepthRange (0., 1. - DEPTH_OFFSET); 270 glDepthRange (0., 1. - DEPTH_OFFSET);
277 286
278 occ_query_material.disable (*this); 287 occ_query_material.disable (*this);
279 288
280 occ_queries.clear (); 289 occ_queries.clear ();
281 290
291 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i)
292 (*i)->draw_postdepth (*this);
293
294 first_lighted = true;
295
282 break; 296 break;
283 297
284 case LIGHTED: 298 case LIGHTED:
285 glEnable (GL_CULL_FACE); 299 if (first_lighted)
286 //glEnable (GL_BLEND);//TODO, only when not first lighted pass 300 glDisable (GL_BLEND);
301 else
302 {
287 glBlendFunc (GL_ONE, GL_ONE); 303 glBlendFunc (GL_ONE, GL_ONE);
304 glEnable (GL_BLEND);
305 }
306
288 //glClear (GL_STENCIL_BUFFER_BIT); 307 //glClear (GL_STENCIL_BUFFER_BIT);
289 //glEnable (GL_STENCIL_TEST); 308 //glEnable (GL_STENCIL_TEST);
309 glEnable (GL_CULL_FACE);
290 glEnable (GL_MINMAX); 310 glEnable (GL_MINMAX);
291 glDepthRange (0., 1. - DEPTH_OFFSET); 311 glDepthRange (0., 1. - DEPTH_OFFSET);
292 glDepthFunc (GL_LESS); 312 glDepthFunc (GL_LESS);
293 glColorMask (1, 1, 1, 1); 313 glColorMask (1, 1, 1, 1);
294 glDepthMask (0); 314 glDepthMask (0);
295 glDisable (GL_DEPTH_CLAMP_NV); 315 glDisable (GL_DEPTH_CLAMP_NV);
296 316
317 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i)
318 (*i)->draw_lighted (*this);
319
320 first_lighted = false;
321
297 break; 322 break;
298 } 323 }
299 324
300 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i)
301 (*i)->display (*this);
302
303 if (pass.type == DEPTH)
304 printf ("fps %f NF %f:%f vis %d CAM (%d,%d,%d)\n", timer.fps, z_near, z_far, drawn.size (), orig.x, orig.y, orig.z);//D
305
306 drawn.clear (); 325 drawn.clear ();
307
308#if 0
309 if (pass == view::DEPTH)
310 {
311 glEnable (GL_DEPTH_CLAMP_NV);
312 glDepthMask (0);
313 glDepthFunc (GL_LESS);
314
315 for (vector<octant *>::iterator i = farlist.begin (); i != farlist.end (); ++i)
316 {
317 begin_occ_query (**i);
318 (*i)->draw_bbox (*this);
319 end_occ_query ();
320 }
321
322 glDisable (GL_DEPTH_CLAMP_NV);
323 }
324#endif
325} 326}
326 327
327void light::enable () 328void light::enable ()
328{ 329{
329 lightpos->set (p); 330 lightpos->set (p);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines