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

Comparing ray/src/rt/srcsamp.c (file contents):
Revision 1.4 by greg, Tue Oct 22 15:45:21 1991 UTC vs.
Revision 2.5 by greg, Mon Mar 8 12:37:39 1993 UTC

# Line 15 | Line 15 | static char SCCSid[] = "$SunId$ LBL";
15   #include  "random.h"
16  
17  
18 + static int  cyl_partit(), flt_partit();
19 +
20 +
21   double
22   nextssamp(r, si)                /* compute sample for source, rtn. distance */
23   register RAY  *r;               /* origin is read, direction is set */
# Line 24 | Line 27 | register SRCINDEX  *si;                /* source index (modified to
27          FVECT  vpos;
28          double  d;
29          register int  i;
30 < tryagain:
30 > nextsample:
31          while (++si->sp >= si->np) {    /* get next sample */
32                  if (++si->sn >= nsources)
33                          return(0.0);    /* no more */
34 <                if (srcsizerat <= FTINY)
34 >                if (source[si->sn].sflags & SSKIP)
35 >                        si->np = 0;
36 >                else if (srcsizerat <= FTINY)
37                          nopart(si, r);
38                  else {
39                          for (i = si->sn; source[i].sflags & SVIRTUAL;
# Line 74 | Line 79 | tryagain:
79                          r->rdir[i] -= r->rorg[i];
80                                          /* compute distance */
81          if ((d = normalize(r->rdir)) == 0.0)
82 <                goto tryagain;  /* at source! */
82 >                goto nextsample;                /* at source! */
83  
84                                          /* compute sample size */
85          si->dom  = source[si->sn].ss2;
86          if (source[si->sn].sflags & SFLAT) {
87                  si->dom *= sflatform(si->sn, r->rdir);
88 <                if (si->dom <= FTINY) {         /* behind source */
84 <                        si->np = 0;
85 <                        goto tryagain;
86 <                }
87 <                si->dom *= (double)(size[SU]*size[SV])/(MAXSPART*MAXSPART);
88 >                si->dom *= size[SU]*size[SV]/(MAXSPART*(double)MAXSPART);
89          } else if (source[si->sn].sflags & SCYL) {
90                  si->dom *= scylform(si->sn, r->rdir);
91 <                si->dom *= (double)size[SU]/MAXSPART;
91 >                si->dom *= size[SU]/(double)MAXSPART;
92          } else {
93 <                si->dom *= (double)(size[SU]*size[SV]*size[SW]) /
94 <                                (MAXSPART*MAXSPART*MAXSPART) ;
93 >                si->dom *= size[SU]*size[SV]*(double)size[SW] /
94 >                                (MAXSPART*MAXSPART*(double)MAXSPART) ;
95          }
96          if (source[si->sn].sflags & SDISTANT)
97                  return(FHUGE);
98 +        if (si->dom <= 1e-4)
99 +                goto nextsample;                /* behind source? */
100          si->dom /= d*d;
101          return(d);              /* sample OK, return distance */
102   }
# Line 165 | Line 168 | register RAY  *r;
168                  return;
169          }
170          safedist2 *= 4.*r->rweight*r->rweight/(srcsizerat*srcsizerat);
171 <        if (dist2 <= 4.*rad2 ||         /* point too close to subdivide? */
172 <                        dist2cent >= safedist2) {       /* too far? */
171 >        if (dist2 <= 4.*rad2 ||         /* point too close to subdivide */
172 >                        dist2cent >= safedist2) {       /* or too far */
173                  setpart(si->spt, 0, S0);
174                  si->np = 1;
175                  return;
# Line 218 | Line 221 | double  d2;
221  
222   flatpart(si, r)                         /* partition a flat source */
223   register SRCINDEX  *si;
224 < RAY  *r;
224 > register RAY  *r;
225   {
226 <        register double  *vp;
226 >        register FLOAT  *vp;
227 >        FVECT  v;
228          double  du2, dv2;
229          int  pi;
230  
231 +        clrpart(si->spt);
232 +        vp = source[si->sn].sloc;
233 +        v[0] = r->rorg[0] - vp[0];
234 +        v[1] = r->rorg[1] - vp[1];
235 +        v[2] = r->rorg[2] - vp[2];
236 +        vp = source[si->sn].snorm;
237 +        if (DOT(v,vp) <= FTINY) {       /* behind source */
238 +                si->np = 0;
239 +                return;
240 +        }
241          dv2 = 2.*r->rweight/srcsizerat;
242          dv2 *= dv2;
243          vp = source[si->sn].ss[SU];
244          du2 = dv2 * DOT(vp,vp);
245          vp = source[si->sn].ss[SV];
246          dv2 *= DOT(vp,vp);
233        clrpart(si->spt);
247          pi = 0;
248          si->np = flt_partit(r->rorg, si->spt, &pi, MAXSPART,
249                  source[si->sn].sloc,
# Line 294 | Line 307 | scylform(sn, dir)              /* compute cosine for cylinder's pr
307   int  sn;
308   register FVECT  dir;            /* assume normalized */
309   {
310 <        register double  *dv;
310 >        register FLOAT  *dv;
311          double  d;
312  
313          dv = source[sn].ss[SU];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines