ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rhd_qtree.c
(Generate patch)

Comparing ray/src/hd/rhd_qtree.c (file contents):
Revision 3.11 by gregl, Fri Dec 5 15:40:54 1997 UTC vs.
Revision 3.14 by gregl, Mon Dec 29 17:31:45 1997 UTC

# Line 16 | Line 16 | static char SCCSid[] = "$SunId$ SGI";
16   #endif
17                                  /* maximum allowed angle difference (deg.) */
18   #ifndef MAXANG
19 < #define MAXANG          20.
19 > #define MAXANG          20
20   #endif
21 + #if MAXANG>0
22 + #define MAXDIFF2        ( MAXANG*MAXANG * (PI*PI/180./180.))
23 + #endif
24  
22 #define MAXDIFF2        (PI*PI/180./180.* MAXANG*MAXANG )
23
25   #define abs(i)          ((i) < 0 ? -(i) : (i))
26  
27   RTREE   qtrunk;                 /* our quadtree trunk */
# Line 33 | Line 34 | struct rleaves qtL;            /* our pile of leaves */
34   static RTREE    **twigbundle;   /* free twig blocks (NULL term.) */
35   static int      nexttwig;       /* next free twig */
36  
36 #define ungetleaf(li)   (qtL.tl=(li))   /* dangerous if used improperly */
37  
38
38   static RTREE *
39   newtwig()                       /* allocate a twig */
40   {
# Line 88 | Line 87 | int    really;
87   }
88  
89  
91 static int
92 newleaf()                       /* allocate a leaf from our pile */
93 {
94        int     li;
95        
96        li = qtL.tl++;
97        if (qtL.tl >= qtL.nl)   /* get next leaf in ring */
98                qtL.tl = 0;
99        if (qtL.tl == qtL.bl)   /* need to shake some free */
100                qtCompost(LFREEPCT);
101        return(li);
102 }
103
104
90   #define LEAFSIZ         (3*sizeof(float)+sizeof(int4)+\
91                          sizeof(TMbright)+6*sizeof(BYTE))
92  
# Line 202 | Line 187 | int    pct;
187   }
188  
189  
205 #define DCSCALE         11585.2         /* (1<<13)*sqrt(2) */
206 #define FXNEG           01
207 #define FYNEG           02
208 #define FZNEG           04
209 #define FXACT           010
210 #define FZACT           020
211 #define F1SFT           5
212 #define F2SFT           18
213 #define FMASK           0x1fff
214
215 static int4
216 encodedir(dv)           /* encode a normalized direction vector */
217 FVECT   dv;
218 {
219        register int4   dc = 0;
220        int     cd[3], cm;
221        register int    i;
222
223        for (i = 0; i < 3; i++)
224                if (dv[i] < 0.) {
225                        cd[i] = dv[i] * -DCSCALE;
226                        dc |= 1<<i;
227                } else
228                        cd[i] = dv[i] * DCSCALE;
229        if (cd[0] <= cd[1]) {
230                dc |= FXACT | cd[0] << F1SFT;
231                cm = cd[1];
232        } else {
233                dc |= cd[1] << F1SFT;
234                cm = cd[0];
235        }
236        if (cd[2] <= cm)
237                dc |= FZACT | cd[2] << F2SFT;
238        else
239                dc |= cm << F2SFT;
240        return(dc);
241 }
242
243
244 static
245 decodedir(dv, dc)       /* decode a normalized direction vector */
246 FVECT   dv;     /* returned */
247 register int4   dc;
248 {
249        double  d1, d2, der;
250
251        d1 = ((dc>>F1SFT & FMASK)+.5)/DCSCALE;
252        d2 = ((dc>>F2SFT & FMASK)+.5)/DCSCALE;
253        der = sqrt(1. - d1*d1 - d2*d2);
254        if (dc & FXACT) {
255                dv[0] = d1;
256                if (dc & FZACT) { dv[1] = der; dv[2] = d2; }
257                else { dv[1] = d2; dv[2] = der; }
258        } else {
259                dv[1] = d1;
260                if (dc & FZACT) { dv[0] = der; dv[2] = d2; }
261                else { dv[0] = d2; dv[2] = der; }
262        }
263        if (dc & FXNEG) dv[0] = -dv[0];
264        if (dc & FYNEG) dv[1] = -dv[1];
265        if (dc & FZNEG) dv[2] = -dv[2];
266 }
267
268
269 static double
270 dir2diff(dc1, dc2)              /* relative radians^2 between directions */
271 int4    dc1, dc2;
272 {
273        FVECT   v1, v2;
274
275        decodedir(v1, dc1);
276        decodedir(v2, dc2);
277
278        return(2. - 2.*DOT(v1,v2));
279 }
280
281
282 static double
283 fdir2diff(dc1, v2)              /* relative radians^2 between directions */
284 int4    dc1;
285 register FVECT  v2;
286 {
287        FVECT   v1;
288
289        decodedir(v1, dc1);
290
291        return(2. - 2.*DOT(v1,v2));
292 }
293
294
190   int
191   qtFindLeaf(x, y)                /* find closest leaf to (x,y) */
192   int     x, y;
# Line 346 | Line 241 | int    li;
241          viewloc(ip, &odev.v, wp);
242          if (ip[2] <= 0. || ip[0] < 0. || ip[0] >= 1.
243                          || ip[1] < 0. || ip[1] >= 1.)
244 <                return(0);                      /* behind or outside view */
244 >                return(-1);                     /* behind or outside view */
245   #ifdef DEBUG
246          if (odev.v.type == VT_PAR | odev.v.vfore > FTINY)
247                  error(INTERNAL, "bad view assumption in addleaf");
# Line 354 | Line 249 | int    li;
249          for (q = 0; q < 3; q++)
250                  vd[q] = (wp[q] - odev.v.vp[q])/ip[2];
251          d2 = fdir2diff(qtL.wd[li], vd);
252 + #ifdef MAXDIFF2
253          if (d2 > MAXDIFF2)
254                  return(0);                      /* leaf dir. too far off */
255 + #endif
256          x = ip[0] * odev.hres;
257          y = ip[1] * odev.vres;
258          z = ip[2];
# Line 415 | Line 312 | FVECT  p, v;
312   {
313          register int    li;
314  
315 <        li = newleaf();
315 >        li = qtL.tl++;
316 >        if (qtL.tl >= qtL.nl)   /* advance to next leaf in ring */
317 >                qtL.tl = 0;
318 >        if (qtL.tl == qtL.bl)   /* need to shake some free */
319 >                qtCompost(LFREEPCT);
320          VCOPY(qtL.wp[li], p);
321          qtL.wd[li] = encodedir(v);
322          tmCvColrs(&qtL.brt[li], qtL.chr[li], c, 1);
323          if (!addleaf(li))
324 <                ungetleaf(li);
324 >                qtL.tl = li;    /* unget this leaf */
325   }
326  
327  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines