… | |
… | |
10 | #include "entity.h" |
10 | #include "entity.h" |
11 | |
11 | |
12 | enum visibility_state { FULL, PARTIAL, SMALL, OCCLUDED, SUBTREE_OCCLUDED }; |
12 | enum visibility_state { FULL, PARTIAL, SMALL, OCCLUDED, SUBTREE_OCCLUDED }; |
13 | |
13 | |
14 | struct evis { |
14 | struct evis { |
|
|
15 | entity *e; |
15 | visibility_state state; |
16 | visibility_state state; |
16 | double last; // time of last check |
17 | double last; // time of last check |
17 | evis () : last(0.), state(FULL) { }; |
18 | |
|
|
19 | void clear () |
|
|
20 | { |
|
|
21 | last = 0.; |
|
|
22 | state = FULL; |
|
|
23 | } |
|
|
24 | |
|
|
25 | evis () |
|
|
26 | { |
|
|
27 | clear (); |
|
|
28 | } |
18 | }; |
29 | }; |
19 | |
30 | |
20 | struct oct_visibility : visibility_base |
31 | struct oct_visibility : visibility_base |
21 | { |
32 | { |
22 | typedef map<entity *, evis> evismap; |
33 | vector<evis> vismap; |
23 | evismap vismap; |
|
|
24 | |
34 | |
25 | visibility_state state; |
35 | visibility_state state; |
|
|
36 | |
|
|
37 | evis &get_visibility (int i, entity *e) |
|
|
38 | { |
|
|
39 | evis &evs = vismap [i]; |
|
|
40 | |
|
|
41 | if (evs.e != e) |
|
|
42 | { |
|
|
43 | evs.clear (); |
|
|
44 | evs.e = e; |
|
|
45 | } |
|
|
46 | |
|
|
47 | return evs; |
|
|
48 | } |
26 | |
49 | |
27 | oct_visibility (octant &oct) |
50 | oct_visibility (octant &oct) |
28 | : state(FULL) |
51 | : state(FULL) |
29 | { |
52 | { |
30 | } |
53 | } |
… | |
… | |
48 | |
71 | |
49 | void octant::clear_visibility (visibility_base *vs) |
72 | void octant::clear_visibility (visibility_base *vs) |
50 | { |
73 | { |
51 | ((oct_visibility *)vs)->vismap.clear (); |
74 | ((oct_visibility *)vs)->vismap.clear (); |
52 | ((oct_visibility *)vs)->state = FULL; |
75 | ((oct_visibility *)vs)->state = FULL; |
|
|
76 | ((oct_visibility *)vs)->state = OCCLUDED;//D |
53 | } |
77 | } |
54 | |
78 | |
55 | octant::~octant () |
79 | octant::~octant () |
56 | { |
80 | { |
57 | for (fill = 8; fill--; ) |
81 | for (fill = 8; fill--; ) |
… | |
… | |
196 | |
220 | |
197 | void octant::draw_depth (view &ctx) |
221 | void octant::draw_depth (view &ctx) |
198 | { |
222 | { |
199 | oct_visibility &vs = *(oct_visibility *)get_visibility (ctx); |
223 | oct_visibility &vs = *(oct_visibility *)get_visibility (ctx); |
200 | |
224 | |
|
|
225 | vs.vismap.resize (size ()); |
|
|
226 | |
201 | if (vs.state == OCCLUDED || vs.state == SUBTREE_OCCLUDED) |
227 | if (vs.state == OCCLUDED || vs.state == SUBTREE_OCCLUDED) |
202 | return; |
228 | return; |
203 | |
229 | |
204 | for (iterator i = begin (); i != end (); ) |
230 | for (int i = 0; i < size (); ++i) |
205 | { |
231 | { |
206 | entity *e = *i++; |
232 | entity *e = (*this)[i]; |
207 | |
233 | const evis &evs = vs.get_visibility (i, e); |
208 | evis &evs = vs.vismap[e]; |
|
|
209 | |
234 | |
210 | if (evs.state != OCCLUDED) |
235 | if (evs.state != OCCLUDED) |
211 | { |
236 | { |
212 | if (!ctx.may_draw (e)) |
237 | if (!ctx.may_draw (e)) |
213 | continue; |
238 | continue; |
… | |
… | |
237 | } |
262 | } |
238 | else |
263 | else |
239 | { |
264 | { |
240 | int nvis = 0; |
265 | int nvis = 0; |
241 | |
266 | |
242 | for (iterator i = begin (); i != end (); ) |
267 | for (int i = 0; i < size (); ++i) |
243 | { |
268 | { |
244 | entity *e = *i++; |
269 | entity *e = (*this)[i]; |
245 | |
270 | const evis &evs = vs.get_visibility (i, e); |
246 | evis &evs = vs.vismap[e]; |
|
|
247 | |
271 | |
248 | if (evs.state == OCCLUDED) |
272 | if (evs.state == OCCLUDED) |
249 | { |
273 | { |
250 | if (!ctx.may_draw (e)) |
274 | if (!ctx.may_draw (e)) |
251 | continue; |
275 | continue; |
… | |
… | |
268 | oct_visibility &vs = *(oct_visibility *)get_visibility (ctx); |
292 | oct_visibility &vs = *(oct_visibility *)get_visibility (ctx); |
269 | |
293 | |
270 | if (vs.state == OCCLUDED || vs.state == SUBTREE_OCCLUDED) |
294 | if (vs.state == OCCLUDED || vs.state == SUBTREE_OCCLUDED) |
271 | return; |
295 | return; |
272 | |
296 | |
273 | for (iterator i = begin (); i != end (); ) |
297 | for (int i = 0; i < size (); ++i) |
274 | { |
298 | { |
275 | entity *e = *i++; |
299 | entity *e = (*this)[i]; |
276 | |
300 | evis &evs = vs.get_visibility (i, e); |
277 | evis &evs = vs.vismap[e]; |
|
|
278 | |
301 | |
279 | if (evs.state != OCCLUDED) |
302 | if (evs.state != OCCLUDED) |
280 | { |
303 | { |
281 | if (!ctx.may_draw (e)) |
304 | if (!ctx.may_draw (e)) |
282 | continue; |
305 | continue; |
… | |
… | |
305 | oct_visibility &vs = *(oct_visibility *)get_visibility (ev.ctx); |
328 | oct_visibility &vs = *(oct_visibility *)get_visibility (ev.ctx); |
306 | entity *e = (entity *)ev.id; |
329 | entity *e = (entity *)ev.id; |
307 | |
330 | |
308 | if (e) |
331 | if (e) |
309 | { |
332 | { |
310 | evis &evs = vs.vismap[e]; |
333 | for (vector<evis>::iterator i = vs.vismap.begin (); |
|
|
334 | i != vs.vismap.end (); |
|
|
335 | ++i) |
|
|
336 | if (i->e == e) |
|
|
337 | { |
311 | evs.state = ev.count ? FULL : OCCLUDED; |
338 | i->state = ev.count ? FULL : OCCLUDED; |
|
|
339 | return; |
|
|
340 | } |
312 | } |
341 | } |
313 | else |
342 | else |
314 | vs.state = ev.count ? FULL : OCCLUDED; |
343 | vs.state = ev.count ? FULL : OCCLUDED; |
315 | } |
344 | } |
316 | |
345 | |