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

Comparing ray/src/rt/ambient.c (file contents):
Revision 2.72 by greg, Fri Apr 11 22:54:34 2014 UTC vs.
Revision 2.82 by greg, Sat Apr 26 02:59:16 2014 UTC

# Line 51 | Line 51 | static int  nunflshed = 0;     /* number of unflushed ambi
51   #define MAX_SORT_INTVL  (SORT_INTVL<<6)
52   #endif
53  
54 +
55 + static double  qambacc = 0.;            /* ambient accuracy to the 1/4 power */
56   static double  avsum = 0.;              /* computed ambient value sum (log) */
57   static unsigned int  navsum = 0;        /* number of values in avsum */
58   static unsigned int  nambvals = 0;      /* total number of indirect values */
# Line 127 | Line 129 | setambacc(                             /* set ambient accuracy */
129          double  newa
130   )
131   {
132 <        double  ambdiff;
133 <
134 <        if (newa < 0.0)
135 <                newa = 0.0;
136 <        ambdiff = fabs(newa - ambacc);
137 <        if (ambdiff >= .01 && (ambacc = newa) > FTINY && nambvals > 0)
138 <                sortambvals(1);                 /* rebuild tree */
132 >        double  olda = qambacc*qambacc*qambacc*qambacc;
133 >        
134 >        newa *= (newa > 0);
135 >        if (fabs(newa - olda) >= .05*(newa + olda)) {
136 >                qambacc = sqrt(sqrt(ambacc = newa));
137 >                if (nambvals > 0)
138 >                        sortambvals(1);         /* rebuild tree */
139 >        }
140   }
141  
142  
# Line 320 | Line 323 | multambient(           /* compute ambient component & multiply
323          ok = makeambient(acol, r, nrm, rdepth-1);
324          rdepth--;
325          if (ok) {
326 <                multcolor(aval, acol);          /* got new value */
326 >                multcolor(aval, acol);          /* computed new value */
327                  return;
328          }
329   dumbamb:                                        /* return global value */
# Line 352 | Line 355 | sumambient(            /* get interpolated ambient value */
355          FVECT  c0,
356          double  s
357   )
358 < {                                       /* initial limit is ambacc radians */
359 <        const double    maxangle = (ambacc-PI/2.)*pow(r->rweight,0.13) + PI/2.;
358 > {                       /* initial limit is 10 degrees plus ambacc radians */
359 >        const double    minangle = 10.0 * PI/180.;
360 >        const double    maxangle = (minangle+ambacc-PI/2.)*pow(r->rweight,0.13)
361 >                                        + PI/2.;
362          double          wsum = 0.0;
363          FVECT           ck0;
364          int             i, j;
# Line 384 | Line 389 | sumambient(            /* get interpolated ambient value */
389                  if (delta_r2 >= maxangle*maxangle)
390                          continue;
391                  /*
392 +                 *  Modified ray behind test
393 +                 */
394 +                VSUB(ck0, av->pos, r->rop);
395 +                d = DOT(ck0, uvw[2]);
396 +                if (d < -minarad*qambacc-.001)
397 +                        continue;
398 +                d /= av->rad[0];
399 +                delta_t2 = d*d;
400 +                if (delta_t2 >= qambacc*qambacc)
401 +                        continue;
402 +                /*
403                   *  Elliptical radii test based on Hessian
404                   */
405                  decodedir(uvw[0], av->udir);
406                  VCROSS(uvw[1], uvw[2], uvw[0]);
391                VSUB(ck0, av->pos, r->rop);
407                  d = DOT(ck0, uvw[0]) / av->rad[0];
408 <                delta_t2 = d*d;
408 >                delta_t2 += d*d;
409                  d = DOT(ck0, uvw[1]) / av->rad[1];
410                  delta_t2 += d*d;
411 <                if (delta_t2 >= ambacc*ambacc)
411 >                if (delta_t2 >= qambacc*qambacc)
412                          continue;
413                  /*
399                 *  Intersection behind test
400                 */
401                d = 0.0;
402                for (j = 0; j < 3; j++)
403                        d += (r->rop[j] - av->pos[j])*(uvw[2][j] + r->ron[j]);
404                if (d*0.5 < -minarad*ambacc-.001)
405                        continue;
406                /*
414                   *  Extrapolate value and compute final weight (hat function)
415                   */
416                  extambient(ct, av, r->rop, rn, uvw);
417                  d = tfunc(maxangle, sqrt(delta_r2), 0.0) *
418 <                        tfunc(ambacc, sqrt(delta_t2), 0.0);
418 >                        tfunc(qambacc, sqrt(delta_t2), 0.0);
419                  scalecolor(ct, d);
420                  addcolor(acol, ct);
421                  wsum += d;
# Line 454 | Line 461 | makeambient(           /* make a new ambient value for storage
461                  amb.weight = 1.25*r->rweight;
462          setcolor(acol, AVGREFL, AVGREFL, AVGREFL);
463                                                  /* compute ambient */
464 <        if (!doambient(acol, r, amb.weight, uvw, amb.rad, amb.gpos, amb.gdir)) {
458 <                setcolor(acol, 0.0, 0.0, 0.0);
459 <                return(0);
460 <        }
464 >        i = doambient(acol, r, amb.weight, uvw, amb.rad, amb.gpos, amb.gdir);
465          scalecolor(acol, 1./AVGREFL);           /* undo assumed reflectance */
466 +        if (i <= 0 || amb.rad[0] <= FTINY)      /* no Hessian or zero radius */
467 +                return(i);
468                                                  /* store value */
469          VCOPY(amb.pos, r->rop);
470          amb.ndir = encodedir(r->ron);
# Line 530 | Line 536 | avinsert(                              /* insert ambient value in our tree */
536          at = &atrunk;
537          VCOPY(ck0, thescene.cuorg);
538          s = thescene.cusize;
539 <        while (s*(OCTSCALE/2) > av->rad[1]*ambacc) {
539 >        while (s*(OCTSCALE/2) > av->rad[1]*qambacc) {
540                  if (at->kid == NULL)
541                          if ((at->kid = newambtree()) == NULL)
542                                  error(SYSTEM, "out of memory in avinsert");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines