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

Comparing ray/src/rt/m_bsdf.c (file contents):
Revision 2.10 by greg, Sun Apr 24 19:39:21 2011 UTC vs.
Revision 2.11 by greg, Wed Jun 8 15:37:46 2011 UTC

# Line 287 | Line 287 | static int
287   sample_sdcomp(BSDFDAT *ndp, SDComponent *dcp, int usepat)
288   {
289          int     nstarget = 1;
290 <        int     nsent = 0;
290 >        int     nsent;
291          SDError ec;
292          SDValue bsv;
293 <        double  sthick;
293 >        double  xrand;
294          FVECT   vsmp;
295          RAY     sr;
296        int     ntrials;
296                                                  /* multiple samples? */
297          if (specjitter > 1.5) {
298                  nstarget = specjitter*ndp->pr->rweight + .5;
299                  if (nstarget < 1)
300                          nstarget = 1;
301          }
302 <                                                /* run through our trials */
303 <        for (ntrials = 0; nsent < nstarget && ntrials < 9*nstarget; ntrials++) {
304 <                SDerrorDetail[0] = '\0';
305 <                                                /* sample direction & coef. */
302 >                                                /* run through our samples */
303 >        for (nsent = 0; nsent < nstarget; nsent++) {
304 >                if (nstarget == 1)              /* stratify random variable */
305 >                        xrand = urand(ilhash(dimlist,ndims)+samplendx);
306 >                else
307 >                        xrand = (nsent + frandom())/(double)nstarget;
308 >                SDerrorDetail[0] = '\0';        /* sample direction & coef. */
309                  bsdf_jitter(vsmp, ndp, 0);
310 <                ec = SDsampComponent(&bsv, vsmp, ntrials ? frandom()
309 <                                : urand(ilhash(dimlist,ndims)+samplendx), dcp);
310 >                ec = SDsampComponent(&bsv, vsmp, xrand, dcp);
311                  if (ec)
312                          objerror(ndp->mp, USER, transSDError(ec));
313 <                                                /* zero component? */
313 <                if (bsv.cieY <= FTINY)
313 >                if (bsv.cieY <= FTINY)          /* zero component? */
314                          break;
315                                                  /* map vector to world */
316                  if (SDmapDir(sr.rdir, ndp->fromloc, vsmp) != SDEnone)
317                          break;
318                                                /* unintentional penetration? */
319                if (DOT(sr.rdir, ndp->pr->ron) > 0 ^ vsmp[2] > 0)
320                        continue;
318                                                  /* spawn a specular ray */
319                  if (nstarget > 1)
320                          bsv.cieY /= (double)nstarget;
321 <                cvt_sdcolor(sr.rcoef, &bsv);    /* use color */
322 <                if (usepat)                     /* pattern on transmission */
321 >                cvt_sdcolor(sr.rcoef, &bsv);    /* use sample color */
322 >                if (usepat)                     /* apply pattern? */
323                          multcolor(sr.rcoef, ndp->pr->pcol);
324                  if (rayorigin(&sr, SPECULAR, ndp->pr, sr.rcoef) < 0) {
325 <                        if (maxdepth  > 0)
325 >                        if (maxdepth > 0)
326                                  break;
327 <                        ++nsent;                /* Russian roulette victim */
331 <                        continue;
327 >                        continue;               /* Russian roulette victim */
328                  }
329                                                  /* need to offset origin? */
330                  if (ndp->thick != 0 && ndp->pr->rod > 0 ^ vsmp[2] > 0)
# Line 336 | Line 332 | sample_sdcomp(BSDFDAT *ndp, SDComponent *dcp, int usep
332                  rayvalue(&sr);                  /* send & evaluate sample */
333                  multcolor(sr.rcol, sr.rcoef);
334                  addcolor(ndp->pr->rcol, sr.rcol);
339                ++nsent;
335          }
336          return(nsent);
337   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines