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

# Content
1 #include <cstdlib>
2
3 #include "oct.h"
4 #include "entity.h"
5
6 octant world(0, 0);
7
8 octant::octant (octant *parent, int subindex)
9 : parent(parent)
10 {
11 for (fill = 8; fill--; )
12 sub[fill] = 0;
13
14 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 }
26
27 octant::~octant ()
28 {
29 for (fill = 8; fill--; )
30 delete sub[fill];
31 }
32
33 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 void octant::add (const sector &sec, entity_base *e)
64 {
65 printf ("OCTANT %d,%d,%d+%d\n", orig.x, orig.y, orig.z, extent);
66
67 if (overlap (orig, extent, sec, e->bbox))
68 {
69 printf ("overlap, add\n");
70 push_back (e);
71 e->o.push_back (this);
72
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 }
84 else
85 printf ("no overlap\n");
86 }
87
88 void octant::remove (entity_base *e)
89 {
90 }
91
92 void octant::draw (draw_context &ctx)
93 {
94 for (iterator i = end (); i-- != begin (); )
95 (*i)->display (ctx);
96 }
97