… | |
… | |
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 | |
203 | void view::begin () |
203 | void 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; |