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.10 by gregl, Fri Dec 5 09:40:05 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        (long)( MAXANG*MAXANG /90./90.*(1L<<15)*(1L<<15))
23
25   #define abs(i)          ((i) < 0 ? -(i) : (i))
26  
27   RTREE   qtrunk;                 /* our quadtree trunk */
# Line 102 | Line 103 | newleaf()                      /* allocate a leaf from our pile */
103   }
104  
105  
106 < #define LEAFSIZ         (3*sizeof(float)+2*sizeof(short)+\
106 > #define LEAFSIZ         (3*sizeof(float)+sizeof(int4)+\
107                          sizeof(TMbright)+6*sizeof(BYTE))
108  
109   int
# Line 129 | Line 130 | register int   n;
130                  return(0);
131                                  /* assign larger alignment types earlier */
132          qtL.wp = (float (*)[3])qtL.base;
133 <        qtL.wd = (short (*)[2])(qtL.wp + n);
133 >        qtL.wd = (int4 *)(qtL.wp + n);
134          qtL.brt = (TMbright *)(qtL.wd + n);
135          qtL.chr = (BYTE (*)[3])(qtL.brt + n);
136          qtL.rgb = (BYTE (*)[3])(qtL.chr + n);
# Line 202 | Line 203 | int    pct;
203   }
204  
205  
205 static
206 encodedir(pa, dv)               /* encode a normalized direction vector */
207 short   pa[2];
208 FVECT   dv;
209 {
210        pa[1] = 0;
211        if (dv[2] >= 1.)
212                pa[0] = (1L<<15)-1;
213        else if (dv[2] <= -1.)
214                pa[0] = -((1L<<15)-1);
215        else {
216                pa[0] = ((1L<<15)-1)/(PI/2.) * asin(dv[2]);
217                pa[1] = ((1L<<15)-1)/PI * atan2(dv[1], dv[0]);
218        }
219 }
220
221
222 #define ALTSHFT         5
223 #define NALT            (1<<ALTSHFT)
224 #define azisft(alt)     azisftab[abs(alt)>>(15-ALTSHFT)]
225
226 static unsigned short   azisftab[NALT];
227
228 static
229 azisftinit(alt)         /* initialize azimuth scale factor table */
230 int     alt;
231 {
232        register int    i;
233
234        for (i = NALT; i--; )
235                azisftab[i] = 2.*(1L<<15) * cos(PI/2.*(i+.5)/NALT);
236        return(azisft(alt));
237 }
238
239 #define azisf(alt)      (azisftab[0] ? azisft(alt) : azisftinit(alt)) >> 15
240
241 static long
242 dir2diff(pa1, pa2)              /* relative distance^2 between directions */
243 short   pa1[2], pa2[2];
244 {
245        long    altd2, azid2;
246        int     alt;
247
248        altd2 = pa1[0] - pa2[0];        /* get altitude difference^2 */
249        altd2 *= altd2;
250        if (altd2 > MAXDIFF2)
251                return(altd2);          /* too large already */
252        azid2 = pa1[1] - pa2[1];        /* get adjusted azimuth difference^2 */
253        if (azid2 < 0) azid2 = -azid2;
254        if (azid2 >= 1L<<15) {          /* wrap sphere */
255                azid2 -= 1L<<16;
256                if (azid2 < 0) azid2 = -azid2;
257        }
258        alt = (pa1[0]+pa2[0])/2;
259        azid2 = azid2*azisf(alt);       /* evaluation order is important */
260        azid2 *= azid2;
261        return(altd2 + azid2);
262 }
263
264
206   int
207   qtFindLeaf(x, y)                /* find closest leaf to (x,y) */
208   int     x, y;
# Line 306 | Line 247 | int    li;
247          register RTREE  *tp = &qtrunk;
248          int     x0=0, y0=0, x1=odev.hres, y1=odev.vres;
249          int     lo = -1;
250 <        long    d2;
310 <        short   dc[2];
250 >        double  d2;
251          int     x, y, mx, my;
252          double  z;
253 <        FVECT   ip, wp;
253 >        FVECT   ip, wp, vd;
254          register int    q;
255                                          /* compute leaf location in view */
256          VCOPY(wp, qtL.wp[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");
264   #endif
265          for (q = 0; q < 3; q++)
266 <                wp[q] = (wp[q] - odev.v.vp[q])/ip[2];
267 <        encodedir(dc, wp);              /* compute pixel direction */
268 <        d2 = dir2diff(dc, qtL.wd[li]);
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];
# Line 360 | Line 301 | int    li;
301                          if (z > (1.+qtDepthEps)*ip[2])
302                                  return(0);              /* old one closer */
303                          if (z >= (1.-qtDepthEps)*ip[2] &&
304 <                                        dir2diff(dc, qtL.wd[lo]) < d2)
304 >                                        fdir2diff(qtL.wd[lo], vd) < d2)
305                                  return(0);              /* old one better */
306                          tp->k[q].li = li;               /* else new one is */
307                          tp->flgs |= CHF(q);
# Line 374 | Line 315 | int    li;
315                  my = ip[1] * odev.vres;
316                  if (mx >= (x0 + x1) >> 1) q |= 01;
317                  if (my >= (y0 + y1) >> 1) q |= 02;
318 +                tp->flgs = CH_ANY|LFF(q);       /* all new */
319                  tp->k[q].li = lo;
378                tp->flgs |= LFF(q)|CH_ANY;      /* all new */
320          }
321          return(1);              /* done */
322   }
# Line 389 | Line 330 | FVECT  p, v;
330  
331          li = newleaf();
332          VCOPY(qtL.wp[li], p);
333 <        encodedir(qtL.wd[li], v);
333 >        qtL.wd[li] = encodedir(v);
334          tmCvColrs(&qtL.brt[li], qtL.chr[li], c, 1);
335          if (!addleaf(li))
336                  ungetleaf(li);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines