1 | #include <cstdlib> |
1 | #include <cstdlib> |
2 | |
2 | |
3 | #include <vector> |
3 | #include <vector> |
4 | |
|
|
5 | using namespace std; |
4 | using 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 | |
|
|
12 | struct evis { |
|
|
13 | enum { FULL, SMALL, OCCLUDED } state; |
|
|
14 | double last; // time of last check |
|
|
15 | evis () : last(0.), state(FULL) { }; |
|
|
16 | }; |
|
|
17 | |
13 | struct oct_visibility : visibility_base |
18 | struct 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 | |
29 | octant world(0, sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN), MAXEXTENT); |
31 | octant world(0, sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN), MAXEXTENT); |
30 | |
32 | |
31 | octant::octant (octant *parent, const sector &orig, uoffs extent) |
33 | octant::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 | |
64 | void octant::add (entity *e) |
68 | void 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 |