… | |
… | |
115 | sector centeri = orig + (extent >> 1) - ctx.orig; |
115 | sector centeri = orig + (extent >> 1) - ctx.orig; |
116 | point centerf = point (centeri) + ((extent & 1) ? 0.5F : 0.F); |
116 | point centerf = point (centeri) + ((extent & 1) ? 0.5F : 0.F); |
117 | |
117 | |
118 | GLfloat rad = ctx.diagfact * extent2; |
118 | GLfloat rad = ctx.diagfact * extent2; |
119 | |
119 | |
|
|
120 | if (!overlap (ctx.frustum.c, sphere (centerf, rad))) |
|
|
121 | return false; |
|
|
122 | |
120 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
123 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
121 | vs.state = PARTIAL; |
124 | vs.state = PARTIAL; |
122 | else |
125 | else |
123 | { |
126 | { |
124 | if (ctx.frustum.t.distance (centerf) < -rad) return false; |
127 | if (distance (ctx.frustum.t, centerf) < -rad) return false; |
125 | if (ctx.frustum.b.distance (centerf) < -rad) return false; |
128 | if (distance (ctx.frustum.b, centerf) < -rad) return false; |
126 | if (ctx.frustum.l.distance (centerf) < -rad) return false; |
129 | if (distance (ctx.frustum.l, centerf) < -rad) return false; |
127 | if (ctx.frustum.r.distance (centerf) < -rad) return false; |
130 | if (distance (ctx.frustum.r, centerf) < -rad) return false; |
128 | if (ctx.frustum.n.distance (centerf) < -rad) return false; |
131 | if (distance (ctx.frustum.n, centerf) < -rad) return false; |
129 | |
132 | |
|
|
133 | #if 0 |
130 | GLfloat fd = ctx.frustum.f.distance (centerf); |
134 | GLfloat fd = distance (ctx.frustum.f, centerf); |
131 | |
135 | |
132 | #if 0 |
|
|
133 | if (fd < -(ctx.c_far - ctx.z_far) -rad * 3.F) |
136 | if (fd < -(ctx.c_far - ctx.z_far) -rad * 3.F) |
134 | return false; |
137 | return false; |
135 | #endif |
138 | #endif |
136 | } |
139 | } |
137 | |
140 | |
138 | if (vs.state == OCCLUDED) |
141 | if (vs.state == OCCLUDED) |
139 | return false; |
142 | return false; |
140 | |
143 | |
141 | GLfloat z = ctx.z_near + ctx.frustum.n.distance (centerf) + rad; |
144 | GLfloat z = ctx.z_near + distance (ctx.frustum.n, centerf) + rad; |
142 | if (ctx.perspfact * extent / z < 1.) // very crude "too small to see" check |
145 | if (ctx.perspfact * extent / z < 1.) // very crude "too small to see" check |
143 | return false; |
146 | return false; |
144 | //printf ("z %f, perspfact %f, z*p %f\n", z, ctx.perspfact, ctx.perspfact / z); |
147 | //printf ("z %f, perspfact %f, z*p %f\n", z, ctx.perspfact, ctx.perspfact / z); |
145 | |
148 | |
|
|
149 | #if 0 |
146 | if (vs.state == PARTIAL || vs.state == FULL) |
150 | if (vs.state == PARTIAL || vs.state == FULL) |
147 | ctx.nc_far = max (ctx.nc_far, z); |
151 | ctx.nc_far = max (ctx.nc_far, z); |
|
|
152 | #endif |
148 | |
153 | |
149 | // node to start with |
154 | // node to start with |
150 | unsigned char si = centeri.x > 0 ? 1 : 0 |
155 | unsigned char si = centeri.x > 0 ? 1 : 0 |
151 | | centeri.y > 0 ? 2 : 0 |
156 | | centeri.y > 0 ? 2 : 0 |
152 | | centeri.z > 0 ? 4 : 0; |
157 | | centeri.z > 0 ? 4 : 0; |
… | |
… | |
168 | while (*++next); |
173 | while (*++next); |
169 | |
174 | |
170 | if (size () |
175 | if (size () |
171 | && (vs.state == PARTIAL || vs.state == FULL)) |
176 | && (vs.state == PARTIAL || vs.state == FULL)) |
172 | { |
177 | { |
173 | ctx.nz_far = max (ctx.nz_far, z); |
|
|
174 | display (ctx); |
178 | display (ctx); |
175 | ctx.vislist.push_back (this); |
179 | ctx.vislist.push_back (this); |
176 | } |
180 | } |
177 | |
181 | |
178 | return true; |
182 | return true; |
… | |
… | |
240 | else |
244 | else |
241 | { |
245 | { |
242 | if (evs.state != OCCLUDED) |
246 | if (evs.state != OCCLUDED) |
243 | { |
247 | { |
244 | sector center = ((e->a + e->b) >> 1) - ctx.orig; |
248 | sector center = ((e->a + e->b) >> 1) - ctx.orig; |
245 | GLfloat z = norm (vec3 (center)); |
249 | GLfloat z = length (vec3 (center)); |
246 | ctx.pixfact = ctx.perspfact / z; |
250 | ctx.pixfact = ctx.perspfact / z; |
|
|
251 | |
|
|
252 | ctx.nz_far = max (ctx.nz_far, z); |
247 | |
253 | |
248 | if (ctx.pass == view::DEPTH || evs.last + 1. > timer.now) |
254 | if (ctx.pass == view::DEPTH || evs.last + 1. > timer.now) |
249 | e->draw (ctx); |
255 | e->draw (ctx); |
250 | else |
256 | else |
251 | { |
257 | { |