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

Comparing ray/src/rt/aniso.c (file contents):
Revision 2.49 by greg, Sun Oct 10 22:31:45 2010 UTC vs.
Revision 2.50 by greg, Wed Oct 13 15:29:02 2010 UTC

# Line 349 | Line 349 | agaussamp(             /* sample anisotropic Gaussian specular */
349          double  rv[2];
350          double  d, sinp, cosp;
351          COLOR   scol;
352 <        int  niter, ns2go;
352 >        int  maxiter, ntrials, nstarget, nstaken;
353          register int  i;
354                                          /* compute reflection */
355          if ((np->specfl & (SP_REFL|SP_RBLT)) == SP_REFL &&
356                          rayorigin(&sr, SPECULAR, r, np->scolor) == 0) {
357 <                copycolor(scol, np->scolor);
358 <                ns2go = 1;
357 >                nstarget = 1;
358                  if (specjitter > 1.5) { /* multiple samples? */
359 <                        ns2go = specjitter*r->rweight + .5;
360 <                        if (sr.rweight <= minweight*ns2go)
361 <                                ns2go = sr.rweight/minweight;
362 <                        if (ns2go > 1) {
363 <                                d = 1./ns2go;
364 <                                scalecolor(scol, d);
359 >                        nstarget = specjitter*r->rweight + .5;
360 >                        if (sr.rweight <= minweight*nstarget)
361 >                                nstarget = sr.rweight/minweight;
362 >                        if (nstarget > 1) {
363 >                                d = 1./nstarget;
364 >                                scalecolor(sr.rcoef, d);
365                                  sr.rweight *= d;
366                          } else
367 <                                ns2go = 1;
367 >                                nstarget = 1;
368                  }
369 +                setcolor(scol, 0., 0., 0.);
370                  dimlist[ndims++] = (int)np->mp;
371 <                for (niter = ns2go*MAXITER; (ns2go > 0) & (niter > 0); niter--) {
372 <                        if (specjitter > 1.5)
371 >                maxiter = MAXITER*nstarget;
372 >                for (nstaken = ntrials = 0; nstaken < nstarget &&
373 >                                                ntrials < maxiter; ntrials++) {
374 >                        if (ntrials)
375                                  d = frandom();
376                          else
377                                  d = urand(ilhash(dimlist,ndims)+samplendx);
# Line 392 | Line 394 | agaussamp(             /* sample anisotropic Gaussian specular */
394                                  h[i] = np->pnorm[i] +
395                                          d*(cosp*np->u[i] + sinp*np->v[i]);
396                          d = -2.0 * DOT(h, r->rdir) / (1.0 + d*d);
395                        if (d <= np->pdot + FTINY)
396                                continue;
397                          VSUM(sr.rdir, r->rdir, h, d);
398 <                        if (DOT(sr.rdir, r->ron) <= FTINY)
398 >                                                /* sample rejection test */
399 >                        if ((d = DOT(sr.rdir, r->ron)) <= FTINY)
400                                  continue;
401                          checknorm(sr.rdir);
402 <                        if (specjitter > 1.5) { /* adjusted W-G-M-D weight */
403 <                                d = 2.*(1. - np->pdot/d);
404 <                                copycolor(sr.rcoef, scol);
405 <                                scalecolor(sr.rcoef, d);
406 <                                rayclear(&sr);
402 >                        if (nstarget > 1) {     /* W-G-M-D adjustment */
403 >                                if (nstaken) rayclear(&sr);
404 >                                rayvalue(&sr);
405 >                                d = 2./(1. + r->rod/d);
406 >                                scalecolor(sr.rcol, d);
407 >                                addcolor(scol, sr.rcol);
408 >                        } else {
409 >                                rayvalue(&sr);
410 >                                multcolor(sr.rcol, sr.rcoef);
411 >                                addcolor(r->rcol, sr.rcol);
412                          }
413 <                        rayvalue(&sr);
408 <                        multcolor(sr.rcol, sr.rcoef);
409 <                        addcolor(r->rcol, sr.rcol);
410 <                        --ns2go;
413 >                        ++nstaken;
414                  }
415 +                if (nstarget > 1) {             /* final W-G-M-D weighting */
416 +                        multcolor(scol, sr.rcoef);
417 +                        d = (double)nstarget/ntrials;
418 +                        scalecolor(scol, d);
419 +                        addcolor(r->rcol, scol);
420 +                }
421                  ndims--;
422          }
423                                          /* compute transmission */
# Line 416 | Line 425 | agaussamp(             /* sample anisotropic Gaussian specular */
425          scalecolor(sr.rcoef, np->tspec);
426          if ((np->specfl & (SP_TRAN|SP_TBLT)) == SP_TRAN &&
427                          rayorigin(&sr, SPECULAR, r, sr.rcoef) == 0) {
428 <                ns2go = 1;
428 >                nstarget = 1;
429                  if (specjitter > 1.5) { /* multiple samples? */
430 <                        ns2go = specjitter*r->rweight + .5;
431 <                        if (sr.rweight <= minweight*ns2go)
432 <                                ns2go = sr.rweight/minweight;
433 <                        if (ns2go > 1) {
434 <                                d = 1./ns2go;
430 >                        nstarget = specjitter*r->rweight + .5;
431 >                        if (sr.rweight <= minweight*nstarget)
432 >                                nstarget = sr.rweight/minweight;
433 >                        if (nstarget > 1) {
434 >                                d = 1./nstarget;
435                                  scalecolor(sr.rcoef, d);
436                                  sr.rweight *= d;
437                          } else
438 <                                ns2go = 1;
438 >                                nstarget = 1;
439                  }
440                  dimlist[ndims++] = (int)np->mp;
441 <                for (niter = ns2go*MAXITER; (ns2go > 0) & (niter > 0); niter--) {
442 <                        if (specjitter > 1.5)
441 >                maxiter = MAXITER*nstarget;
442 >                for (nstaken = ntrials = 0; nstaken < nstarget &&
443 >                                                ntrials < maxiter; ntrials++) {
444 >                        if (ntrials)
445                                  d = frandom();
446                          else
447                                  d = urand(ilhash(dimlist,ndims)+1823+samplendx);
# Line 455 | Line 466 | agaussamp(             /* sample anisotropic Gaussian specular */
466                          if (DOT(sr.rdir, r->ron) >= -FTINY)
467                                  continue;
468                          normalize(sr.rdir);     /* OK, normalize */
469 <                        if (specjitter > 1.5)   /* multi-sampling */
469 >                        if (nstaken)            /* multi-sampling */
470                                  rayclear(&sr);
471                          rayvalue(&sr);
472                          multcolor(sr.rcol, sr.rcoef);
473                          addcolor(r->rcol, sr.rcol);
474 <                        --ns2go;
474 >                        ++nstaken;
475                  }
476                  ndims--;
477          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines