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

Comparing ray/src/hd/rholo2.c (file contents):
Revision 3.16 by gwlarson, Tue Nov 24 17:05:36 1998 UTC vs.
Revision 3.18 by gwlarson, Wed Nov 25 17:20:25 1998 UTC

# Line 20 | Line 20 | packrays(rod, p)               /* pack ray origins and directions *
20   register float  *rod;
21   register PACKET *p;
22   {
23 <        short   packord[RPACKSIZ];
24 <        float   packdc[RPACKSIZ];
25 <        int     iterleft = 3*p->nr;
23 >        float   packdc2[RPACKSIZ];
24 >        int     iterleft = 3*p->nr + 9;
25          BYTE    rpos[2][2];
26          FVECT   ro, rd, rp1;
27          GCOORD  gc[2];
28 <        double  d, dc, meandist;
28 >        double  d, dc2, md2, td2, dc2worst = FHUGE;
29          int     i;
30          register int    ii;
31  
32          if (!hdbcoord(gc, hdlist[p->hd], p->bi))
33                  error(CONSISTENCY, "bad beam index in packrays");
34 <        for (i = 0, meandist = 0.; i < p->nr || meandist > myeye.rng+FTINY; ) {
34 >        td2 = myeye.rng + FTINY; td2 *= td2;
35 >        for (i = 0, md2 = 0.; i < p->nr || (md2 > td2 && iterleft--); ) {
36                  rpos[0][0] = frandom() * 256.;
37                  rpos[0][1] = frandom() * 256.;
38                  rpos[1][0] = frandom() * 256.;
# Line 42 | Line 42 | register PACKET        *p;
42                          register int    nexti;
43  
44                          VSUM(rp1, ro, rd, d);
45 <                        dc = sqrt(dist2line(myeye.vpt, ro, rp1)) / p->nr;
45 >                        dc2 = dist2line(myeye.vpt, ro, rp1) / p->nr;
46                          if (i == p->nr) {               /* packet full */
47 <                                nexti = packord[i-1];
48 <                                if (!iterleft--)
49 <                                        break;          /* tried enough! */
50 <                                if (dc >= packdc[nexti])
47 >                                if (dc2 >= dc2worst)    /* quick check */
48 >                                        continue;
49 >                                nexti = 0;              /* find worst */
50 >                                for (ii = i; --ii; )
51 >                                        if (packdc2[ii] > packdc2[nexti])
52 >                                                nexti = ii;
53 >                                if (dc2 >= (dc2worst = packdc2[nexti]))
54                                          continue;       /* worse than worst */
55 <                                meandist -= packdc[nexti];
55 >                                md2 -= dc2worst;
56                          } else
57                                  nexti = i++;
58 <                        meandist += packdc[nexti] = dc; /* new distance */
56 <                        for (ii = i; --ii; ) {          /* insertion sort */
57 <                                if (dc > packdc[packord[ii-1]])
58 <                                        break;
59 <                                packord[ii] = packord[ii-1];
60 <                        }
61 <                        packord[ii] = nexti;
58 >                        md2 += packdc2[nexti] = dc2;    /* new distance */
59                          ii = nexti;                     /* put it here */
60                  } else
61                          ii = i++;
# Line 76 | Line 73 | register PACKET        *p;
73                  VCOPY(rod+6*ii+3, rd);
74          }
75   #ifdef DEBUG
76 <        fprintf(stderr, "%f mean distance for target %f (%d iterations)\n",
77 <                        meandist, myeye.rng, 3*p->nr - iterleft);
76 >        fprintf(stderr, "%f mean distance for target %f (%d iterations left)\n",
77 >                        sqrt(md2), myeye.rng, iterleft);
78   #endif
79   }
80  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines