… | |
… | |
48 | |
48 | |
49 | void octant::clear_visibility (visibility_base *vs) |
49 | void octant::clear_visibility (visibility_base *vs) |
50 | { |
50 | { |
51 | ((oct_visibility *)vs)->vismap.clear (); |
51 | ((oct_visibility *)vs)->vismap.clear (); |
52 | } |
52 | } |
|
|
53 | |
53 | octant::~octant () |
54 | octant::~octant () |
54 | { |
55 | { |
55 | for (fill = 8; fill--; ) |
56 | for (fill = 8; fill--; ) |
56 | delete sub[fill]; |
57 | delete sub[fill]; |
57 | } |
58 | } |
… | |
… | |
107 | { |
108 | { |
108 | } |
109 | } |
109 | |
110 | |
110 | bool octant::detect_visibility (view &ctx) |
111 | bool octant::detect_visibility (view &ctx) |
111 | { |
112 | { |
112 | oct_visibility &vs = *(oct_visibility *)get_visibility (ctx); |
|
|
113 | |
|
|
114 | GLfloat extent2 = 0.5F * (GLfloat)extent; |
113 | GLfloat extent2 = 0.5F * (GLfloat)extent; |
115 | sector centeri = orig + (extent >> 1) - ctx.orig; |
114 | sector centeri = orig + (extent >> 1) - ctx.orig; |
116 | point centerf = point (centeri) + ((extent & 1) ? 0.5F : 0.F); |
115 | point centerf = point (centeri) + ((extent & 1) ? 0.5F : 0.F); |
117 | |
116 | |
118 | GLfloat rad = ctx.diagfact * extent2; |
117 | GLfloat rad = ctx.diagfact * extent2; |
119 | |
118 | |
120 | if (!overlap (ctx.frustum.c, sphere (centerf, rad))) |
119 | if (!overlap (ctx.frustum.c, sphere (centerf, rad))) |
121 | return false; |
120 | return false; |
|
|
121 | |
|
|
122 | oct_visibility &vs = *(oct_visibility *)get_visibility (ctx); |
122 | |
123 | |
123 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
124 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
124 | vs.state = PARTIAL; |
125 | vs.state = PARTIAL; |
125 | else |
126 | else |
126 | { |
127 | { |