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

Comparing ray/src/rt/normal.c (file contents):
Revision 2.57 by greg, Sun Oct 10 22:31:46 2010 UTC vs.
Revision 2.58 by greg, Tue Oct 12 19:01:14 2010 UTC

# Line 374 | Line 374 | gaussamp(                      /* sample Gaussian specular */
374          double  rv[2];
375          double  d, sinp, cosp;
376          COLOR   scol;
377 <        int  niter, ns2go;
377 >        int  maxiter, ntrials, nstarget, nstaken;
378          register int  i;
379                                          /* quick test */
380          if ((np->specfl & (SP_REFL|SP_RBLT)) != SP_REFL &&
# Line 392 | Line 392 | gaussamp(                      /* sample Gaussian specular */
392                                          /* compute reflection */
393          if ((np->specfl & (SP_REFL|SP_RBLT)) == SP_REFL &&
394                          rayorigin(&sr, SPECULAR, r, np->scolor) == 0) {
395 <                copycolor(scol, np->scolor);
396 <                ns2go = 1;
395 >                nstarget = 1;
396                  if (specjitter > 1.5) { /* multiple samples? */
397 <                        ns2go = specjitter*r->rweight + .5;
398 <                        if (sr.rweight <= minweight*ns2go)
399 <                                ns2go = sr.rweight/minweight;
400 <                        if (ns2go > 1) {
401 <                                d = 1./ns2go;
402 <                                scalecolor(scol, d);
397 >                        nstarget = specjitter*r->rweight + .5;
398 >                        if (sr.rweight <= minweight*nstarget)
399 >                                nstarget = sr.rweight/minweight;
400 >                        if (nstarget > 1) {
401 >                                d = 1./nstarget;
402 >                                scalecolor(sr.rcoef, d);
403                                  sr.rweight *= d;
404                          } else
405 <                                ns2go = 1;
405 >                                nstarget = 1;
406                  }
407 +                setcolor(scol, 0., 0., 0.);
408                  dimlist[ndims++] = (int)np->mp;
409 <                for (niter = ns2go*MAXITER; (ns2go > 0) & (niter > 0); niter--) {
410 <                        if (specjitter > 1.5)
409 >                maxiter = MAXITER*nstarget;
410 >                for (nstaken = ntrials = 0; nstaken < nstarget &&
411 >                                                ntrials < maxiter; ntrials++) {
412 >                        if (ntrials)
413                                  d = frandom();
414                          else
415                                  d = urand(ilhash(dimlist,ndims)+samplendx);
# Line 424 | Line 426 | gaussamp(                      /* sample Gaussian specular */
426                          for (i = 0; i < 3; i++)
427                                  h[i] = np->pnorm[i] + d*(cosp*u[i] + sinp*v[i]);
428                          d = -2.0 * DOT(h, r->rdir) / (1.0 + d*d);
427                        if (d <= np->pdot + FTINY)
428                                continue;
429                          VSUM(sr.rdir, r->rdir, h, d);
430 <                        if (DOT(sr.rdir, r->ron) <= FTINY)
430 >                                                /* sample rejection test */
431 >                        if ((d = DOT(sr.rdir, r->ron)) <= FTINY)
432                                  continue;
433                          checknorm(sr.rdir);
434 <                        if (specjitter > 1.5) { /* adjusted W-G-M-D weight */
434 <                                d = 2.*(1. - np->pdot/d);
435 <                                copycolor(sr.rcoef, scol);
436 <                                scalecolor(sr.rcoef, d);
434 >                        if (nstarget > 1) {     /* W-G-M-D adjustment */
435                                  rayclear(&sr);
436 +                                rayvalue(&sr);
437 +                                d = 2./(1. + r->rod/d);
438 +                                scalecolor(sr.rcol, d);
439 +                                addcolor(scol, sr.rcol);
440 +                        } else {
441 +                                rayvalue(&sr);
442 +                                multcolor(sr.rcol, sr.rcoef);
443 +                                addcolor(r->rcol, sr.rcol);
444                          }
445 <                        rayvalue(&sr);
440 <                        multcolor(sr.rcol, sr.rcoef);
441 <                        addcolor(r->rcol, sr.rcol);
442 <                        --ns2go;
445 >                        ++nstaken;
446                  }
447 +                if (nstarget > 1) {             /* final W-G-M-D weighting */
448 +                        multcolor(scol, sr.rcoef);
449 +                        d = (double)nstarget/ntrials;
450 +                        scalecolor(scol, d);
451 +                        addcolor(r->rcol, scol);
452 +                }
453                  ndims--;
454          }
455                                          /* compute transmission */
# Line 448 | Line 457 | gaussamp(                      /* sample Gaussian specular */
457          scalecolor(sr.rcoef, np->tspec);
458          if ((np->specfl & (SP_TRAN|SP_TBLT)) == SP_TRAN &&
459                          rayorigin(&sr, SPECULAR, r, sr.rcoef) == 0) {
460 <                ns2go = 1;
460 >                nstarget = 1;
461                  if (specjitter > 1.5) { /* multiple samples? */
462 <                        ns2go = specjitter*r->rweight + .5;
463 <                        if (sr.rweight <= minweight*ns2go)
464 <                                ns2go = sr.rweight/minweight;
465 <                        if (ns2go > 1) {
466 <                                d = 1./ns2go;
462 >                        nstarget = specjitter*r->rweight + .5;
463 >                        if (sr.rweight <= minweight*nstarget)
464 >                                nstarget = sr.rweight/minweight;
465 >                        if (nstarget > 1) {
466 >                                d = 1./nstarget;
467                                  scalecolor(sr.rcoef, d);
468                                  sr.rweight *= d;
469                          } else
470 <                                ns2go = 1;
470 >                                nstarget = 1;
471                  }
472                  dimlist[ndims++] = (int)np->mp;
473 <                for (niter = ns2go*MAXITER; (ns2go > 0) & (niter > 0); niter--) {
474 <                        if (specjitter > 1.5)
473 >                maxiter = MAXITER*nstarget;
474 >                for (nstaken = ntrials = 0; nstaken < nstarget &&
475 >                                                ntrials < maxiter; ntrials++) {
476 >                        if (ntrials)
477                                  d = frandom();
478                          else
479 <                                d = urand(ilhash(dimlist,ndims)+1823+samplendx);
479 >                                d = urand(ilhash(dimlist,ndims)+samplendx);
480                          multisamp(rv, 2, d);
481                          d = 2.0*PI * rv[0];
482                          cosp = tcos(d);
# Line 478 | Line 489 | gaussamp(                      /* sample Gaussian specular */
489                                  d = sqrt( np->alpha2 * -log(rv[1]) );
490                          for (i = 0; i < 3; i++)
491                                  sr.rdir[i] = np->prdir[i] + d*(cosp*u[i] + sinp*v[i]);
492 +                                                /* sample rejection test */
493                          if (DOT(sr.rdir, r->ron) >= -FTINY)
494                                  continue;
495                          normalize(sr.rdir);     /* OK, normalize */
496 <                        if (specjitter > 1.5)   /* multi-sampling */
496 >                        if (nstarget > 1)       /* multi-sampling */
497                                  rayclear(&sr);
498                          rayvalue(&sr);
499                          multcolor(sr.rcol, sr.rcoef);
500                          addcolor(r->rcol, sr.rcol);
501 <                        --ns2go;
501 >                        ++nstaken;
502                  }
503                  ndims--;
504          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines