ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/oct.C
Revision: 1.5
Committed: Sun Oct 3 20:14:33 2004 UTC (19 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.4: +12 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #include <cstdlib>
2    
3     #include "oct.h"
4 root 1.2 #include "entity.h"
5    
6 root 1.3 octant world(0, 0);
7 root 1.2
8 root 1.3 octant::octant (octant *parent, int subindex)
9 root 1.2 : parent(parent)
10     {
11     for (fill = 8; fill--; )
12     sub[fill] = 0;
13    
14 root 1.3 if (parent)
15     {
16     extent = (parent->extent + 1) >> 1;
17     orig = parent->orig;
18     orig.offset (subindex, extent);
19     }
20     else
21     {
22     extent = MAXEXTENT;
23     orig.x = orig.y = orig.z = SOFFS_MIN;
24     }
25 root 1.2 }
26    
27     octant::~octant ()
28     {
29     for (fill = 8; fill--; )
30     delete sub[fill];
31     }
32    
33 root 1.4 static bool overlap (const sector &o1, uoffs ea, const sector &o2, const box &bbox)
34     {
35     sector a2;
36    
37     ea /= 2;
38    
39     a2.x = o1.x + ea;
40     a2.y = o1.y + ea;
41     a2.z = o1.z + ea;
42    
43     sector b2;
44     sector eb;
45    
46     b2.x = o2.x + (soffs)bbox.a.x;
47     b2.y = o2.y + (soffs)bbox.a.y;
48     b2.z = o2.z + (soffs)bbox.a.z;
49    
50     eb.x = (soffs)(bbox.b.x - bbox.a.x) / 2;
51     eb.y = (soffs)(bbox.b.y - bbox.a.y) / 2;
52     eb.z = (soffs)(bbox.b.z - bbox.a.z) / 2;
53    
54     b2.x += eb.x;
55     b2.y += eb.y;
56     b2.z += eb.z;
57    
58     return abs (a2.x - b2.x) <= ea + eb.x
59     && abs (a2.y - b2.y) <= ea + eb.y
60     && abs (a2.z - b2.z) <= ea + eb.z;
61     }
62    
63 root 1.3 void octant::add (const sector &sec, entity_base *e)
64 root 1.2 {
65 root 1.4 printf ("OCTANT %d,%d,%d+%d\n", orig.x, orig.y, orig.z, extent);
66 root 1.3
67 root 1.4 if (overlap (orig, extent, sec, e->bbox))
68     {
69     printf ("overlap, add\n");
70     push_back (e);
71     e->o.push_back (this);
72 root 1.5
73     #if 0
74     uoffs extent2 = extent / 2;
75     for (int si = 8; i--; )
76     {
77     sector sub = orig;
78     sub.offset (si, extent2);
79     if (overlap (sub, extent2, sec, e->bbox))
80     {
81     }
82     #endif
83 root 1.4 }
84     else
85     printf ("no overlap\n");
86 root 1.2 }
87 root 1.1
88     void octant::remove (entity_base *e)
89     {
90     }
91    
92 root 1.4 void octant::draw (draw_context &ctx)
93 root 1.1 {
94 root 1.2 for (iterator i = end (); i-- != begin (); )
95 root 1.5 (*i)->display (ctx);
96 root 1.1 }
97 root 1.2