… | |
… | |
80 | GLfloat extent2 = 0.5F * (GLfloat)extent; |
80 | GLfloat extent2 = 0.5F * (GLfloat)extent; |
81 | point center = point (orig + (extent >> 1) - ctx.orig); |
81 | point center = point (orig + (extent >> 1) - ctx.orig); |
82 | if (extent & 1) center = center + 0.5F; |
82 | if (extent & 1) center = center + 0.5F; |
83 | GLfloat rad = ctx.diagfact * extent2; |
83 | GLfloat rad = ctx.diagfact * extent2; |
84 | |
84 | |
85 | if (vs.generation + 1 < ctx.generation) |
85 | if (vs.generation + 1 != ctx.generation) |
86 | vs.visibility = visibility_state::UNKNOWN; |
86 | vs.visibility = visibility_state::UNKNOWN; |
87 | |
87 | |
88 | vs.generation = ctx.generation; |
88 | vs.generation = ctx.generation; |
89 | |
89 | |
90 | #if 0 |
|
|
91 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
90 | if (orig <= ctx.orig && ctx.orig <= orig + extent) |
92 | vs.visibility = visibility_state::PARTIAL; |
91 | vs.visibility = visibility_state::PARTIAL; |
93 | else |
92 | else |
94 | #endif |
|
|
95 | { |
93 | { |
96 | if (ctx.frustum.t.distance (center) < -rad) return; |
94 | if (ctx.frustum.t.distance (center) < -rad) return; |
97 | if (ctx.frustum.b.distance (center) < -rad) return; |
95 | if (ctx.frustum.b.distance (center) < -rad) return; |
98 | if (ctx.frustum.l.distance (center) < -rad) return; |
96 | if (ctx.frustum.l.distance (center) < -rad) return; |
99 | if (ctx.frustum.r.distance (center) < -rad) return; |
97 | if (ctx.frustum.r.distance (center) < -rad) return; |
… | |
… | |
112 | return; |
110 | return; |
113 | } |
111 | } |
114 | } |
112 | } |
115 | } |
113 | } |
116 | |
114 | |
|
|
115 | if (vs.visibility == visibility_state::OCCLUDED) |
|
|
116 | { |
|
|
117 | ctx.farlist.push_back (this); |
|
|
118 | return; |
|
|
119 | } |
|
|
120 | |
117 | if (vs.visibility == visibility_state::UNKNOWN) |
121 | if (vs.visibility == visibility_state::UNKNOWN) |
118 | vs.visibility = visibility_state::FULL; |
122 | vs.visibility = visibility_state::FULL; |
|
|
123 | |
|
|
124 | GLfloat z = ctx.z_near + ctx.frustum.n.distance (center) + rad; |
|
|
125 | |
|
|
126 | if (vs.visibility == visibility_state::FULL) |
|
|
127 | ctx.nc_far = max (ctx.nc_far, z); |
119 | |
128 | |
120 | if (size () |
129 | if (size () |
121 | && (vs.visibility == visibility_state::PARTIAL |
130 | && (vs.visibility == visibility_state::PARTIAL |
122 | || vs.visibility == visibility_state::FULL)) |
131 | || vs.visibility == visibility_state::FULL)) |
123 | { |
132 | { |
124 | ctx.nextfar = max (ctx.nextfar, ctx.near + ctx.frustum.n.distance (center) + extent); |
133 | ctx.nz_far = max (ctx.nz_far, z); |
125 | ctx.vislist.push_back (this); |
134 | ctx.vislist.push_back (this); |
126 | } |
|
|
127 | |
|
|
128 | if (vs.visibility == visibility_state::OCCLUDED) |
|
|
129 | { |
|
|
130 | ctx.farlist.push_back (this); |
|
|
131 | return; |
|
|
132 | } |
135 | } |
133 | |
136 | |
134 | // node to start with |
137 | // node to start with |
135 | unsigned char si = ctx.d.x < 0 ? 1 : 0 |
138 | unsigned char si = ctx.d.x < 0 ? 1 : 0 |
136 | | ctx.d.y < 0 ? 2 : 0 |
139 | | ctx.d.y < 0 ? 2 : 0 |