ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/oct.C
(Generate patch)

Comparing libgender/oct.C (file contents):
Revision 1.78 by root, Wed Nov 10 01:57:15 2004 UTC vs.
Revision 1.79 by root, Tue Nov 23 18:32:39 2004 UTC

10#include "entity.h" 10#include "entity.h"
11 11
12enum visibility_state { FULL, PARTIAL, SMALL, OCCLUDED, SUBTREE_OCCLUDED }; 12enum visibility_state { FULL, PARTIAL, SMALL, OCCLUDED, SUBTREE_OCCLUDED };
13 13
14struct evis { 14struct 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
20struct oct_visibility : visibility_base 31struct 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
49void octant::clear_visibility (visibility_base *vs) 72void 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
55octant::~octant () 79octant::~octant ()
56{ 80{
57 for (fill = 8; fill--; ) 81 for (fill = 8; fill--; )
196 220
197void octant::draw_depth (view &ctx) 221void 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines