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

Comparing libgender/view.C (file contents):
Revision 1.79 by root, Wed Nov 10 01:57:16 2004 UTC vs.
Revision 1.82 by root, Sat Nov 27 03:33:51 2004 UTC

104 { 104 {
105 vs = i->second; 105 vs = i->second;
106 106
107 if (vs->generation != ctx.generation) 107 if (vs->generation != ctx.generation)
108 { 108 {
109 if (vs->generation + 1 != ctx.generation) 109 if (ctx.generation - vs->generation > 2)
110 clear_visibility (vs); 110 clear_visibility (vs);
111 111
112 vs->generation = ctx.generation; 112 vs->generation = ctx.generation;
113 } 113 }
114 } 114 }
133 { 133 {
134 matrix &m = perspective; 134 matrix &m = perspective;
135 135
136 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;
137 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;
138 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) = 0;
139 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.F; m(3,3) = 0;
140 140
141 glLoadMatrixf (perspective); 141 glLoadMatrixf (perspective);
142 } 142 }
143 //glFrustum (-xmax, xmax, -ymax, ymax, z_near, z_far); 143 //glFrustum (-xmax, xmax, -ymax, ymax, z_near, z_far);
144 144
155 155
156 vec3 rz = -d; 156 vec3 rz = -d;
157 vec3 rx = cross (u, rz); 157 vec3 rx = cross (u, rz);
158 vec3 ry = cross (rz, rx); 158 vec3 ry = cross (rz, rx);
159 159
160 m(0,0) = rx.x; m(0,1) = rx.y; m(0,2) = rx.z; m(0,3) = 0; 160 m(0,0) = rx.x; m(0,1) = rx.y; m(0,2) = rx.z; m(0,3) = 0;
161 m(1,0) = ry.x; m(1,1) = ry.y; m(1,2) = ry.z; m(1,3) = 0; 161 m(1,0) = ry.x; m(1,1) = ry.y; m(1,2) = ry.z; m(1,3) = 0;
162 m(2,0) = rz.x; m(2,1) = rz.y; m(2,2) = rz.z; m(2,3) = 0; 162 m(2,0) = rz.x; m(2,1) = rz.y; m(2,2) = rz.z; m(2,3) = 0;
163 m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1; 163 m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1.F;
164 164
165 diagfact = abs (rz.x) + abs (rz.y) + abs (rz.z); 165 diagfact = abs (rz.x) + abs (rz.y) + abs (rz.z);
166 //printf ("diagfact = %f\n", diagfact); 166 //printf ("diagfact = %f\n", diagfact);
167 diagfact = sqrtf (3.);//D WHY??? 167 //diagfact = sqrtf (3.);//D WHY???
168 168
169 glMultMatrixf (m); 169 glMultMatrixf (m);
170
171 glTranslatef (-p.x, -p.y, -p.z);
170 172
171 glTranslatef (-p.x, -p.y, -p.z);
172
173 glGetFloatv (GL_MODELVIEW_MATRIX, m); 173 glGetFloatv (GL_MODELVIEW_MATRIX, m);
174 174
175 m = perspective * m; 175 m = perspective * m;
176 176
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) ); 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) );
194#endif 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));
200 } 200 }
201} 201}
202 202
203void view::begin () 203void view::begin ()
204{ 204{
205 generation++; 205 generation++;
206 206
207 vislist.clear (); 207 vislist.clear ();
208 postdepthlist.clear ();
208 209
209 z_near = max (nz_near, 1.F); 210 z_near = max (nz_near, 1.F);
210 z_far = max (nz_far, z_near * 2.F); 211 z_far = max (nz_far, z_near * 2.F);
211 c_far = nc_far; 212 c_far = nc_far;
212 213
251 glDisable (GL_MINMAX); 252 glDisable (GL_MINMAX);
252 glDepthRange (DEPTH_OFFSET, 1.); 253 glDepthRange (DEPTH_OFFSET, 1.);
253 glDepthFunc (GL_LESS); 254 glDepthFunc (GL_LESS);
254 glEnable (GL_DEPTH_TEST); 255 glEnable (GL_DEPTH_TEST);
255 glColorMask (0, 0, 0, 0); 256 glColorMask (0, 0, 0, 0);
256 glDisable (GL_DEPTH_CLAMP_NV);
257 257
258 world.detect_visibility (*this); 258 world.detect_visibility (*this);
259 259
260 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i) 260 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i)
261 (*i)->draw_depth (*this); 261 (*i)->draw_depth (*this);
269 case POSTDEPTH: 269 case POSTDEPTH:
270 glDepthRange (0., 1. - DEPTH_OFFSET); 270 glDepthRange (0., 1. - DEPTH_OFFSET);
271 glDepthFunc (GL_LESS); 271 glDepthFunc (GL_LESS);
272 glColorMask (0, 0, 0, 0); 272 glColorMask (0, 0, 0, 0);
273 glDepthMask (0); 273 glDepthMask (0);
274 glEnable (GL_DEPTH_CLAMP_NV);
275 glDisable (GL_STENCIL_TEST); 274 glDisable (GL_STENCIL_TEST);
276 glDisable (GL_CULL_FACE); 275 glDisable (GL_CULL_FACE);
276
277 glEnable (GL_DEPTH_CLAMP_NV);
277 278
278 occ_query_material.enable (*this); 279 occ_query_material.enable (*this);
279 280
280 // check occlusion queries 281 // check occlusion queries
281 for (vector<oq_data>::iterator i = occ_queries.begin (); i != occ_queries.end (); ++i) 282 for (vector<oq_data>::iterator i = occ_queries.begin (); i != occ_queries.end (); ++i)
286 287
287 occ_query_material.disable (*this); 288 occ_query_material.disable (*this);
288 289
289 occ_queries.clear (); 290 occ_queries.clear ();
290 291
291 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i) 292 for (vector<octant *>::iterator i = postdepthlist.begin (); i != postdepthlist.end (); ++i)
292 (*i)->draw_postdepth (*this); 293 (*i)->draw_postdepth (*this);
294
295 glDisable (GL_DEPTH_CLAMP_NV);
293 296
294 first_lighted = true; 297 first_lighted = true;
295 298
296 break; 299 break;
297 300
310 glEnable (GL_MINMAX); 313 glEnable (GL_MINMAX);
311 glDepthRange (0., 1. - DEPTH_OFFSET); 314 glDepthRange (0., 1. - DEPTH_OFFSET);
312 glDepthFunc (GL_LESS); 315 glDepthFunc (GL_LESS);
313 glColorMask (1, 1, 1, 1); 316 glColorMask (1, 1, 1, 1);
314 glDepthMask (0); 317 glDepthMask (0);
315 glDisable (GL_DEPTH_CLAMP_NV);
316 318
317 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i) 319 for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i)
318 (*i)->draw_lighted (*this); 320 (*i)->draw_lighted (*this);
319 321
320 first_lighted = false; 322 first_lighted = false;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines