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.60 by greg, Sat May 28 22:27:54 2005 UTC vs.
Revision 2.61 by greg, Tue May 31 18:01:09 2005 UTC

# Line 275 | Line 275 | multambient(           /* compute ambient component & multiply
275                  goto dumbamb;
276  
277          if (ambacc <= FTINY) {                  /* no ambient storage */
278 +                copycolor(acol, aval);
279                  rdepth++;
280 <                d = doambient(acol, r, aval, intens(aval)*r->rweight,
280 <                                                        NULL, NULL);
280 >                d = doambient(acol, r, r->rweight, NULL, NULL);
281                  rdepth--;
282                  if (d <= FTINY)
283                          goto dumbamb;
284 <                multcolor(aval, acol);
284 >                copycolor(aval, acol);
285                  return;
286          }
287  
288          if (tracktime)                          /* sort to minimize thrashing */
289                  sortambvals(0);
290 <                                                /* get ambient value */
290 >                                                /* interpolate ambient value */
291          setcolor(acol, 0.0, 0.0, 0.0);
292 <        d = sumambient(acol, r, intens(aval)*r->rweight, nrm, rdepth,
292 >        d = sumambient(acol, r, nrm, rdepth,
293                          &atrunk, thescene.cuorg, thescene.cusize);
294          if (d > FTINY) {
295 <                scalecolor(acol, 1.0/d);
295 >                d = 1.0/d;
296 >                scalecolor(acol, d);
297                  multcolor(aval, acol);
298                  return;
299          }
300          rdepth++;                               /* need to cache new value */
301 <        d = makeambient(acol, r, aval, nrm, rdepth-1);
301 >        d = makeambient(acol, r, nrm, rdepth-1);
302          rdepth--;
303          if (d > FTINY) {
304                  multcolor(aval, acol);          /* got new value */
# Line 326 | Line 327 | extern double
327   sumambient(     /* get interpolated ambient value */
328          COLOR  acol,
329          register RAY  *r,
329        double  aw,
330          FVECT  rn,
331          int  al,
332          AMBTREE  *at,
# Line 352 | Line 352 | sumambient(    /* get interpolated ambient value */
352                   */
353                  if (av->lvl > al)       /* list sorted, so this works */
354                          break;
355 <                if (av->weight < 0.85*aw)
355 >                if (av->weight < 0.9*r->rweight)
356                          continue;
357                  /*
358                   *  Ambient radius test.
# Line 431 | Line 431 | sumambient(    /* get interpolated ambient value */
431                                  break;
432                  }
433                  if (j == 3)
434 <                        wsum += sumambient(acol, r, aw, rn, al,
434 >                        wsum += sumambient(acol, r, rn, al,
435                                                  at->kid+i, ck0, s);
436          }
437          return(wsum);
# Line 439 | Line 439 | sumambient(    /* get interpolated ambient value */
439  
440  
441   extern double
442 < makeambient(            /* make a new ambient value */
442 > makeambient(            /* make a new ambient value for storage */
443          COLOR  acol,
444          RAY  *r,
445        COLOR  ac,
445          FVECT  rn,
446          int  al
447   )
448   {
449          AMBVAL  amb;
451        double  awt;
450          FVECT   gp, gd;
451          int     i;
452  
453 <        amb.weight = AVGREFL;                   /* compute weight */
454 <        for (i = al; i-- >= 0; )
453 >        amb.weight = 1.0;                       /* compute weight */
454 >        for (i = al; i-- > 0; )
455                  amb.weight *= AVGREFL;
456 <        awt = intens(ac)*r->rweight;
457 <        if (awt < 0.07*amb.weight)              /* heuristic override */
458 <                amb.weight = 1.2*awt;
456 >        if (r->rweight < 0.1*amb.weight)        /* heuristic override */
457 >                amb.weight = r->rweight;
458 >        setcolor(acol, AVGREFL, AVGREFL, AVGREFL);
459                                                  /* compute ambient */
460 <        amb.rad = doambient(acol, r, ac, amb.weight, gp, gd);
461 <        if (amb.rad <= FTINY)
460 >        amb.rad = doambient(acol, r, amb.weight, gp, gd);
461 >        if (amb.rad <= FTINY) {
462 >                setcolor(acol, 0.0, 0.0, 0.0);
463                  return(0.0);
464 <                                                /* store it */
464 >        }
465 >        scalecolor(acol, 1./AVGREFL);           /* undo assumed reflectance */
466 >                                                /* store value */
467          VCOPY(amb.pos, r->rop);
468          VCOPY(amb.dir, r->ron);
469          amb.lvl = al;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines