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.13 by gregl, Wed Dec 24 10:50:49 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 202 | Line 203 | int    pct;
203   }
204  
205  
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
206   int
207   qtFindLeaf(x, y)                /* find closest leaf to (x,y) */
208   int     x, y;
# Line 346 | Line 257 | int    li;
257          viewloc(ip, &odev.v, wp);
258          if (ip[2] <= 0. || ip[0] < 0. || ip[0] >= 1.
259                          || ip[1] < 0. || ip[1] >= 1.)
260 <                return(0);                      /* behind or outside view */
260 >                return(-1);                     /* behind or outside view */
261   #ifdef DEBUG
262          if (odev.v.type == VT_PAR | odev.v.vfore > FTINY)
263                  error(INTERNAL, "bad view assumption in addleaf");
# Line 354 | Line 265 | int    li;
265          for (q = 0; q < 3; q++)
266                  vd[q] = (wp[q] - odev.v.vp[q])/ip[2];
267          d2 = fdir2diff(qtL.wd[li], vd);
268 + #ifdef MAXDIFF2
269          if (d2 > MAXDIFF2)
270                  return(0);                      /* leaf dir. too far off */
271 + #endif
272          x = ip[0] * odev.hres;
273          y = ip[1] * odev.vres;
274          z = ip[2];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines