… | |
… | |
57 | delete sub[fill]; |
57 | delete sub[fill]; |
58 | } |
58 | } |
59 | |
59 | |
60 | static bool overlap (const sector &o1, uoffs ea, const sector &a, const sector &b) |
60 | static bool overlap (const sector &o1, uoffs ea, const sector &a, const sector &b) |
61 | { |
61 | { |
62 | sector a2, b2; |
|
|
63 | |
|
|
64 | ea /= 2; |
62 | ea /= 2; |
65 | |
63 | |
66 | a2 = o1 + ea; |
64 | sector center_1 = o1 + ea; |
67 | b2 = (a + b) / 2; |
65 | sector size_2 = b - a; |
|
|
66 | sector center_2 = a + size_2 / 2; |
68 | |
67 | |
69 | return abs (a2 - b2) <= ea + (b - a); |
68 | return abs (center_1 - center_2) <= ea + size_2; |
70 | } |
69 | } |
71 | |
70 | |
72 | void octant::add (entity *e) |
71 | void octant::add (entity *e) |
73 | { |
72 | { |
74 | const sector &a = e->a; |
73 | const sector &a = e->a; |
75 | const sector &b = e->b; |
74 | const sector &b = e->b; |
76 | |
75 | |
77 | if (overlap (orig, extent, a, b)) |
76 | if (overlap (orig, extent, a, b)) |
78 | { |
77 | { |
79 | uoffs extent2 = extent / 2; |
78 | uoffs extent2 = extent / 2; |
80 | |
|
|
81 | uoffs size = max (abs (b.x - a.x), |
79 | uoffs size = max (abs (b - a)); |
82 | max (abs (b.y - a.y), |
|
|
83 | abs (b.z - a.z))); |
|
|
84 | |
80 | |
85 | if (size > extent2 || !extent2) |
81 | if (size > extent2 || !extent2) |
86 | { |
82 | { |
87 | push_back (e); |
83 | push_back (e); |
88 | e->o.push_back (this); |
84 | e->o.push_back (this); |
… | |
… | |
114 | visibility_state &vs = ctx.vismap[this]; |
110 | visibility_state &vs = ctx.vismap[this]; |
115 | |
111 | |
116 | if (vs.generation != ctx.generation) |
112 | if (vs.generation != ctx.generation) |
117 | vs.visibility = visibility_state::UNKNOWN; |
113 | vs.visibility = visibility_state::UNKNOWN; |
118 | |
114 | |
119 | const sector &cam = ctx.orig; |
115 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
120 | #if 1 |
|
|
121 | if (orig <= cam && cam <= orig + extent) |
|
|
122 | { |
116 | { |
123 | vs.visibility = visibility_state::PARTIAL; |
117 | vs.visibility = visibility_state::PARTIAL; |
124 | vs.generation = ctx.generation; |
118 | vs.generation = ctx.generation; |
125 | } |
119 | } |
126 | else |
120 | else |
127 | #endif |
|
|
128 | { |
121 | { |
129 | point center ( |
122 | sector center_s (orig + extent / 2 - ctx.orig); |
130 | orig.x + (soffs)extent / 2 - cam.x, |
123 | point center (center_s.x, center_s.y, center_s.z); |
131 | orig.y + (soffs)extent / 2 - cam.y, |
|
|
132 | orig.z + (soffs)extent / 2 - cam.z |
|
|
133 | ); |
|
|
134 | |
124 | |
135 | GLfloat dia = (2. * sqrtf (3))*(GLfloat)extent; |
125 | GLfloat dia = (2. * sqrtf (3))*(GLfloat)extent; |
136 | |
126 | |
137 | if (ctx.frustum.t.distance (center) < -dia) return; |
127 | if (ctx.frustum.t.distance (center) < -dia) return; |
138 | if (ctx.frustum.b.distance (center) < -dia) return; |
128 | if (ctx.frustum.b.distance (center) < -dia) return; |