… | |
… | |
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 | |
205 | void view::begin () |
203 | void 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 | |
221 | void view::end () |
221 | void 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 | |
228 | void view::render (pass_data &pass) |
228 | void 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 | |
327 | void light::enable () |
328 | void light::enable () |
328 | { |
329 | { |
329 | lightpos->set (p); |
330 | lightpos->set (p); |