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.12 by gregl, Fri Dec 5 16:22:49 1997 UTC vs.
Revision 3.14 by gregl, Mon Dec 29 17:31:45 1997 UTC

# Line 34 | 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  
37 #define ungetleaf(li)   (qtL.tl=(li))   /* dangerous if used improperly */
37  
39
38   static RTREE *
39   newtwig()                       /* allocate a twig */
40   {
# Line 89 | Line 87 | int    really;
87   }
88  
89  
92 static int
93 newleaf()                       /* allocate a leaf from our pile */
94 {
95        int     li;
96        
97        li = qtL.tl++;
98        if (qtL.tl >= qtL.nl)   /* get next leaf in ring */
99                qtL.tl = 0;
100        if (qtL.tl == qtL.bl)   /* need to shake some free */
101                qtCompost(LFREEPCT);
102        return(li);
103 }
104
105
90   #define LEAFSIZ         (3*sizeof(float)+sizeof(int4)+\
91                          sizeof(TMbright)+6*sizeof(BYTE))
92  
# Line 203 | Line 187 | int    pct;
187   }
188  
189  
206 #define DCSCALE         11585.2         /* (1<<13)*sqrt(2) */
207 #define FXNEG           01
208 #define FYNEG           02
209 #define FZNEG           04
210 #define F1X             010
211 #define F2Z             020
212 #define F1SFT           5
213 #define F2SFT           18
214 #define FMASK           0x1fff
215
216 static int4
217 encodedir(dv)           /* encode a normalized direction vector */
218 FVECT   dv;
219 {
220        register int4   dc = 0;
221        int     cd[3], cm;
222        register int    i;
223
224        for (i = 0; i < 3; i++)
225                if (dv[i] < 0.) {
226                        cd[i] = dv[i] * -DCSCALE;
227                        dc |= 1<<i;
228                } else
229                        cd[i] = dv[i] * DCSCALE;
230        if (cd[0] <= cd[1]) {
231                dc |= F1X | cd[0] << F1SFT;
232                cm = cd[1];
233        } else {
234                dc |= cd[1] << F1SFT;
235                cm = cd[0];
236        }
237        if (cd[2] <= cm)
238                dc |= F2Z | cd[2] << F2SFT;
239        else
240                dc |= cm << F2SFT;
241        return(dc);
242 }
243
244
245 static
246 decodedir(dv, dc)       /* decode a normalized direction vector */
247 register FVECT  dv;     /* returned */
248 register int4   dc;
249 {
250        double  d1, d2, der;
251
252        d1 = ((dc>>F1SFT & FMASK)+.5)/DCSCALE;
253        d2 = ((dc>>F2SFT & FMASK)+.5)/DCSCALE;
254        der = sqrt(1. - d1*d1 - d2*d2);
255        if (dc & F1X) {
256                dv[0] = d1;
257                if (dc & F2Z) { dv[1] = der; dv[2] = d2; }
258                else { dv[1] = d2; dv[2] = der; }
259        } else {
260                dv[1] = d1;
261                if (dc & F2Z) { dv[0] = der; dv[2] = d2; }
262                else { dv[0] = d2; dv[2] = der; }
263        }
264        if (dc & FXNEG) dv[0] = -dv[0];
265        if (dc & FYNEG) dv[1] = -dv[1];
266        if (dc & FZNEG) dv[2] = -dv[2];
267 }
268
269
270 static double
271 dir2diff(dc1, dc2)              /* relative radians^2 between directions */
272 int4    dc1, dc2;
273 {
274        FVECT   v1, v2;
275
276        decodedir(v1, dc1);
277        decodedir(v2, dc2);
278
279        return(2. - 2.*DOT(v1,v2));
280 }
281
282
283 static double
284 fdir2diff(dc1, v2)              /* relative radians^2 between directions */
285 int4    dc1;
286 register FVECT  v2;
287 {
288        FVECT   v1;
289
290        decodedir(v1, dc1);
291
292        return(2. - 2.*DOT(v1,v2));
293 }
294
295
190   int
191   qtFindLeaf(x, y)                /* find closest leaf to (x,y) */
192   int     x, y;
# Line 418 | 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