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

Comparing libgender/oct.C (file contents):
Revision 1.53 by root, Sat Oct 16 14:48:48 2004 UTC vs.
Revision 1.54 by root, Sat Oct 16 23:23:21 2004 UTC

1#include <cstdlib> 1#include <cstdlib>
2 2
3#include <vector> 3#include <vector>
4
5using namespace std; 4using namespace std;
6 5
7#include "opengl.h" 6#include "opengl.h"
8 7
9#include "oct.h" 8#include "oct.h"
10#include "view.h" 9#include "view.h"
11#include "entity.h" 10#include "entity.h"
12 11
12struct evis {
13 enum { FULL, SMALL, OCCLUDED } state;
14 double last; // time of last check
15 evis () : last(0.), state(FULL) { };
16};
17
13struct oct_visibility : visibility_base 18struct oct_visibility : visibility_base
14{ 19{
15 struct visibility {
16 enum { UNKNOWN, OCCLUDED, PARTIAL, FULL } state;
17 double last; // time of last check
18 visibility () : last(0.), state(UNKNOWN) { };
19 };
20
21 typedef map<entity *, visibility> evismap; 20 typedef map<entity *, evis> evismap;
22 evismap vismap; 21 evismap vismap;
23 22
23 enum { FULL, PARTIAL, OCCLUDED } state;
24
24 oct_visibility (octant &oct) 25 oct_visibility (octant &oct)
26 : state(FULL)
25 { 27 {
26 } 28 }
27}; 29};
28 30
29octant world(0, sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN), MAXEXTENT); 31octant world(0, sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN), MAXEXTENT);
30 32
31octant::octant (octant *parent, const sector &orig, uoffs extent) 33octant::octant (octant *parent, const sector &orig, uoffs extent)
32: parent(parent), orig(orig), extent(extent) 34: parent(parent)
35, orig(orig)
36, extent(extent)
33{ 37{
34 for (fill = 8; fill--; ) 38 for (fill = 8; fill--; )
35 sub[fill] = 0; 39 sub[fill] = 0;
36} 40}
37 41
54{ 58{
55 ea /= 2; 59 ea /= 2;
56 60
57 sector center_1 = o1 + ea; 61 sector center_1 = o1 + ea;
58 sector size_2 = b - a; 62 sector size_2 = b - a;
59 sector center_2 = a + size_2 / 2; 63 sector center_2 = a + (size_2 >> 1);
60 64
61 return abs (center_1 - center_2) <= ea + size_2; 65 return abs (center_1 - center_2) <= ea + size_2;
62} 66}
63 67
64void octant::add (entity *e) 68void octant::add (entity *e)
66 const sector &a = e->a; 70 const sector &a = e->a;
67 const sector &b = e->b; 71 const sector &b = e->b;
68 72
69 if (overlap (orig, extent, a, b)) 73 if (overlap (orig, extent, a, b))
70 { 74 {
71 uoffs extent2 = extent / 2; 75 uoffs extent2 = extent >> 1;
72 uoffs size = max (abs (b - a)); 76 uoffs size = max (abs (b - a));
73 77
74 if (size >= extent2 / 2) 78 if (size >= extent2 >> 1)
75 { 79 {
76 push_back (e); 80 push_back (e);
77 e->o.push_back (this); 81 e->o.push_back (this);
78 return; 82 return;
79 } 83 }
208 } 212 }
209 } 213 }
210 214
211 glEnd (); 215 glEnd ();
212#endif 216#endif
217 oct_visibility &vs = *(oct_visibility *)get_visibility (ctx);
213 218
214 for (iterator i = end (); i != begin (); ) 219 for (iterator i = end (); i != begin (); )
215 { 220 {
216 entity *e = *--i; 221 entity *e = *--i;
222 evis &evs = vs.vismap[e];
217 223
218 sector diff = (e->a + e->b) / 2 - ctx.orig; 224 sector center = ((e->a + e->b) >> 1) - ctx.orig;
219 GLfloat z = norm (vec3 ((e->a + e->b) / 2 - ctx.orig)); 225 GLfloat z = norm (vec3 (center));
220 ctx.pixfact = ctx.perspfact / z; 226 ctx.pixfact = ctx.perspfact / z;
221 227
222 if (ctx.mode != view::POSTDEPTH) 228 if (ctx.mode == view::POSTDEPTH)
229 {
230 if (!vb_bbox)
231 {
232 sector s = orig - ctx.orig;
233 gl::gen_bbox (vb_bbox, s, s + extent);
234 }
235
236 //vb_bbox.draw (gl::bbox_mode, 0, gl::bbox_count);
237 }
238 else
223 e->display (ctx); 239 e->display (ctx);
224 } 240 }
225} 241}
226 242
227#if 0 243#if 0

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines