… | |
… | |
90 | vs->generation = ctx.generation; |
90 | vs->generation = ctx.generation; |
91 | } |
91 | } |
92 | } |
92 | } |
93 | |
93 | |
94 | return vs; |
94 | return vs; |
95 | |
|
|
96 | } |
95 | } |
97 | |
96 | |
98 | void view::reset_projection () |
97 | void view::reset_projection () |
99 | { |
98 | { |
100 | renormalize (orig, p); |
99 | renormalize (orig, p); |
… | |
… | |
130 | //printf ("diagfact = %f\n", diagfact); |
129 | //printf ("diagfact = %f\n", diagfact); |
131 | diagfact = sqrtf (3.);//D WHY??? |
130 | diagfact = sqrtf (3.);//D WHY??? |
132 | |
131 | |
133 | glMultMatrixf (m); |
132 | glMultMatrixf (m); |
134 | glTranslatef (-p.x, -p.y, -p.z); |
133 | glTranslatef (-p.x, -p.y, -p.z); |
135 | |
134 | |
136 | glGetFloatv (GL_PROJECTION_MATRIX, m); |
135 | glGetFloatv (GL_PROJECTION_MATRIX, m); |
137 | |
136 | |
138 | 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) ); |
137 | 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) ); |
139 | frustum.r = 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) ); |
138 | frustum.r = 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) ); |
140 | 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) ); |
139 | 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) ); |
… | |
… | |
164 | |
163 | |
165 | void view::begin () |
164 | void view::begin () |
166 | { |
165 | { |
167 | generation++; |
166 | generation++; |
168 | |
167 | |
169 | glColorMask (1, 1, 1, 1); |
|
|
170 | glDepthMask (1); |
|
|
171 | glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
|
|
172 | |
|
|
173 | vislist.clear (); |
168 | vislist.clear (); |
174 | |
169 | |
175 | z_near = max (nz_near, 1.F); |
170 | z_near = max (nz_near, 1.F); |
176 | z_far = max (nz_far, z_near * 2.F); |
171 | z_far = max (nz_far, z_near * 2.F); |
177 | c_far = nc_far; |
172 | c_far = nc_far; |
… | |
… | |
194 | pass = p; |
189 | pass = p; |
195 | |
190 | |
196 | switch (pass) |
191 | switch (pass) |
197 | { |
192 | { |
198 | case DEPTH: |
193 | case DEPTH: |
|
|
194 | glColorMask (1, 1, 1, 1); |
|
|
195 | glDepthMask (1); |
|
|
196 | |
|
|
197 | glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); |
|
|
198 | |
|
|
199 | //glEnable (GL_STENCIL_TEST); // for depth-passes |
|
|
200 | //glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); |
|
|
201 | //glStencilFunc (GL_LESS, 1, 255); |
|
|
202 | |
199 | //glEnable (GL_POLYGON_OFFSET_FILL); |
203 | //glEnable (GL_POLYGON_OFFSET_FILL); |
200 | //glPolygonOffset (0, 5); |
204 | //glPolygonOffset (0, 5); |
201 | glDisable (GL_MINMAX); |
205 | glDisable (GL_MINMAX); |
202 | glDepthRange (DEPTH_OFFSET, 1.); |
206 | glDepthRange (DEPTH_OFFSET, 1.); |
203 | glDepthFunc (GL_LESS); |
207 | glDepthFunc (GL_LESS); |
204 | glEnable (GL_DEPTH_TEST); |
208 | glEnable (GL_DEPTH_TEST); |
205 | glColorMask (0, 0, 0, 0); |
209 | glColorMask (0, 0, 0, 0); |
206 | glDepthMask (1); |
|
|
207 | glDisable (GL_DEPTH_CLAMP_NV); |
210 | glDisable (GL_DEPTH_CLAMP_NV); |
208 | |
211 | |
209 | world.depth_pass (*this); |
212 | world.detect_visibility (*this); |
210 | |
213 | |
211 | 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 |
|
|
212 | break; |
214 | break; |
213 | |
215 | |
214 | case POSTDEPTH: |
216 | case POSTDEPTH: |
215 | glDepthRange (0., 1. - DEPTH_OFFSET); |
217 | glDepthRange (0., 1. - DEPTH_OFFSET); |
216 | glDepthFunc (GL_LESS); |
218 | glDepthFunc (GL_LESS); |
217 | glColorMask (0, 0, 0, 0); |
219 | glColorMask (0, 0, 0, 0); |
218 | glDepthMask (0); |
220 | glDepthMask (0); |
219 | glEnable (GL_DEPTH_CLAMP_NV); |
221 | glEnable (GL_DEPTH_CLAMP_NV); |
|
|
222 | glDisable (GL_STENCIL_TEST); |
220 | |
223 | |
221 | // check occlusion queries |
224 | // check occlusion queries |
222 | for (vector<oq_data>::iterator i = occ_queries.begin (); i != occ_queries.end (); ++i) |
225 | for (vector<oq_data>::iterator i = occ_queries.begin (); i != occ_queries.end (); ++i) |
223 | { |
226 | { |
224 | occ_query oq(*this, i->data, ::occ_query_result (i->id)); |
227 | occ_query oq(*this, i->data, ::occ_query_result (i->id)); |
225 | i->recv->event (oq); |
228 | i->recv->event (oq); |
226 | } |
229 | } |
227 | |
230 | |
228 | occ_queries.clear (); |
231 | occ_queries.clear (); |
229 | |
232 | |
230 | for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i) |
|
|
231 | (*i)->display (*this); |
|
|
232 | |
|
|
233 | break; |
233 | break; |
234 | |
234 | |
235 | case LIGHTED: |
235 | case LIGHTED: |
|
|
236 | glClear (GL_STENCIL_BUFFER_BIT); |
|
|
237 | //glEnable (GL_STENCIL_TEST); |
236 | glEnable (GL_MINMAX); |
238 | glEnable (GL_MINMAX); |
237 | glDepthRange (0., 1. - DEPTH_OFFSET); |
239 | glDepthRange (0., 1. - DEPTH_OFFSET); |
238 | glDepthFunc (GL_LESS); |
240 | glDepthFunc (GL_LESS); |
239 | glColorMask (1, 1, 1, 1); |
241 | glColorMask (1, 1, 1, 1); |
240 | glDepthMask (0); |
242 | glDepthMask (0); |
241 | glDisable (GL_DEPTH_CLAMP_NV); |
243 | glDisable (GL_DEPTH_CLAMP_NV); |
242 | |
244 | |
243 | for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i) |
|
|
244 | (*i)->display (*this); |
|
|
245 | |
|
|
246 | break; |
245 | break; |
247 | } |
246 | } |
248 | |
247 | |
|
|
248 | for (vector<octant *>::iterator i = vislist.begin (); i != vislist.end (); ++i) |
|
|
249 | (*i)->display (*this); |
|
|
250 | |
|
|
251 | if (pass == LIGHTED) |
|
|
252 | 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 |
|
|
253 | |
249 | drawn.clear (); |
254 | drawn.clear (); |
250 | |
255 | |
251 | #if 0 |
256 | #if 0 |
252 | if (pass == view::DEPTH) |
257 | if (pass == view::DEPTH) |
253 | { |
258 | { |