ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/oct.C
(Generate patch)

Comparing libgender/oct.C (file contents):
Revision 1.51 by root, Thu Oct 14 19:54:14 2004 UTC vs.
Revision 1.52 by root, Sat Oct 16 12:33:46 2004 UTC

7#include "opengl.h" 7#include "opengl.h"
8 8
9#include "oct.h" 9#include "oct.h"
10#include "view.h" 10#include "view.h"
11#include "entity.h" 11#include "entity.h"
12
13struct oct_visibility : visibility_base
14{
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;
22 evismap vismap;
23
24 oct_visibility (octant &oct)
25 {
26 }
27};
12 28
13octant world(0, sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN), MAXEXTENT); 29octant world(0, sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN), MAXEXTENT);
14 30
15octant::octant (octant *parent, const sector &orig, uoffs extent) 31octant::octant (octant *parent, const sector &orig, uoffs extent)
16: parent(parent), orig(orig), extent(extent) 32: parent(parent), orig(orig), extent(extent)
74 90
75void octant::remove (entity *e) 91void octant::remove (entity *e)
76{ 92{
77} 93}
78 94
79void octant::detect_visibility (view &ctx) 95bool octant::detect_visibility (view &ctx)
80{ 96{
81 visibility_state &vs = ctx.vismap[this]; 97 oct_visibility &vs = *(oct_visibility *)get_visibility (ctx);
82
83 if (vs.generation + 1 != ctx.generation)
84 vs.visibility = visibility_state::UNKNOWN;
85
86 vs.generation = ctx.generation;
87 98
88 GLfloat extent2 = 0.5F * (GLfloat)extent; 99 GLfloat extent2 = 0.5F * (GLfloat)extent;
89 sector centeri = orig + (extent >> 1) - ctx.orig; 100 sector centeri = orig + (extent >> 1) - ctx.orig;
90 point centerf = point (centeri) + ((extent & 1) ? 0.5F : 0.F); 101 point centerf = point (centeri) + ((extent & 1) ? 0.5F : 0.F);
91 102
92 GLfloat rad = ctx.diagfact * extent2; 103 GLfloat rad = ctx.diagfact * extent2;
93 104
94 if (orig <= ctx.orig && ctx.orig <= orig + extent) 105 if (orig <= ctx.orig && ctx.orig <= orig + extent)
95 vs.visibility = visibility_state::PARTIAL; 106 ;//vs.visibility = visibility_state::PARTIAL;
96 else 107 else
97 { 108 {
98 if (ctx.frustum.t.distance (centerf) < -rad) return; 109 if (ctx.frustum.t.distance (centerf) < -rad) return false;
99 if (ctx.frustum.b.distance (centerf) < -rad) return; 110 if (ctx.frustum.b.distance (centerf) < -rad) return false;
100 if (ctx.frustum.l.distance (centerf) < -rad) return; 111 if (ctx.frustum.l.distance (centerf) < -rad) return false;
101 if (ctx.frustum.r.distance (centerf) < -rad) return; 112 if (ctx.frustum.r.distance (centerf) < -rad) return false;
102 if (ctx.frustum.n.distance (centerf) < -rad) return; 113 if (ctx.frustum.n.distance (centerf) < -rad) return false;
103 114
104 GLfloat fd = ctx.frustum.f.distance (centerf); 115 GLfloat fd = ctx.frustum.f.distance (centerf);
105 116
106 if (fd < -(ctx.c_far - ctx.z_far) -rad * 3.F) 117 if (fd < -(ctx.c_far - ctx.z_far) -rad * 3.F)
107 return; 118 return false;
108 } 119 }
109 120
121#if 0
110 if (vs.visibility == visibility_state::OCCLUDED 122 if (vs.visibility == visibility_state::OCCLUDED
111 || vs.visibility == visibility_state::UNKNOWN) 123 || vs.visibility == visibility_state::UNKNOWN)
112 { 124 {
113 ctx.farlist.push_back (this); 125 ctx.farlist.push_back (this);
114 return; 126 return;
115 } 127 }
128#endif
116 129
117#if 0 130#if 0
118 if (vs.visibility == visibility_state::UNKNOWN) 131 if (vs.visibility == visibility_state::UNKNOWN)
119 vs.visibility = visibility_state::FULL; 132 vs.visibility = visibility_state::FULL;
120#endif 133#endif
121 134
122 GLfloat z = ctx.z_near + ctx.frustum.n.distance (centerf) + rad; 135 GLfloat z = ctx.z_near + ctx.frustum.n.distance (centerf) + rad;
123 //printf ("z %f, perspfact %f, z*p %f\n", z, ctx.perspfact, ctx.perspfact / z); 136 //printf ("z %f, perspfact %f, z*p %f\n", z, ctx.perspfact, ctx.perspfact / z);
124 137
138#if 0
125 if (vs.visibility == visibility_state::FULL) 139 if (vs.visibility == visibility_state::FULL)
140#endif
126 ctx.nc_far = max (ctx.nc_far, z); 141 ctx.nc_far = max (ctx.nc_far, z);
127 142
128 // node to start with 143 // node to start with
129 unsigned char si = centeri.x > 0 ? 1 : 0 144 unsigned char si = centeri.x > 0 ? 1 : 0
130 | centeri.y > 0 ? 2 : 0 145 | centeri.y > 0 ? 2 : 0
145 sub[si]->detect_visibility (ctx); 160 sub[si]->detect_visibility (ctx);
146 } 161 }
147 while (*++next); 162 while (*++next);
148 163
149 if (size () 164 if (size ()
165#if 0
150 && (vs.visibility == visibility_state::PARTIAL 166 && (vs.visibility == visibility_state::PARTIAL
151 || vs.visibility == visibility_state::FULL)) 167 || vs.visibility == visibility_state::FULL)
168#endif
169 )
152 { 170 {
153 ctx.nz_far = max (ctx.nz_far, z); 171 ctx.nz_far = max (ctx.nz_far, z);
154 ctx.vislist.push_back (this); 172 ctx.vislist.push_back (this);
155 } 173 }
174
175 return true;
156} 176}
157 177
158void octant::display (view &ctx) 178void octant::display (view &ctx)
159{ 179{
160#if 0 180#if 0
201 gl::draw_bbox (ctx, s, s + extent); 221 gl::draw_bbox (ctx, s, s + extent);
202} 222}
203 223
204void octant::event (occ_query &ev) 224void octant::event (occ_query &ev)
205{ 225{
226#if 0
206 visibility_state &vs = ev.v.vismap[this]; 227 visibility_state &vs = ev.v.vismap[this];
207 228
208 vs.last = timer.now; 229 vs.last = timer.now;
209 vs.visibility = ev.r <= 0 230 vs.visibility = ev.r <= 0
210 ? visibility_state::OCCLUDED 231 ? visibility_state::OCCLUDED
211 : visibility_state::FULL; 232 : visibility_state::FULL;
233#endif
212} 234}
213 235
236visibility_base *octant::new_visibility ()
237{
238 return new oct_visibility (*this);
239}
240
241void octant::clear_visibility (visibility_base *vs)
242{
243 ((oct_visibility *)vs)->vismap.clear ();
244}
245

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines