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

Comparing ray/src/rt/ambcomp.c (file contents):
Revision 1.12 by greg, Tue Aug 20 13:32:51 1991 UTC vs.
Revision 1.16 by greg, Mon Nov 4 11:14:46 1991 UTC

# Line 72 | Line 72 | RAY  *r;
72          hlist[0] = r->rno;
73          hlist[1] = dp->t;
74          hlist[2] = dp->p;
75 <        peano(spt, 2, urand(ilhash(hlist,3)+dp->n), .01);
75 >        multisamp(spt, 2, urand(ilhash(hlist,3)+dp->n));
76          zd = sqrt((dp->t + spt[0])/h->nt);
77          phi = 2.0*PI * (dp->p + spt[1])/h->np;
78          xd = cos(phi) * zd;
# Line 206 | Line 206 | FVECT  pg, dg;
206          b = 1.0/ndivs;
207          scalecolor(acol, b);
208          if (arad <= FTINY)
209                arad = FHUGE;
210        else
211                arad = (ndivs+ns)/arad;
212        if (arad > maxarad)
209                  arad = maxarad;
210 <        else if (arad < minarad)
210 >        else {
211 >                arad = (ndivs+ns)/arad;
212 >                if (arad > maxarad)
213 >                        arad = maxarad;
214 >        }
215 >        if (pg != NULL) {               /* reduce radius if gradient large */
216 >                d = DOT(pg,pg);
217 >                if (d*arad*arad > 1.0)
218 >                        arad = 1.0/sqrt(d);
219 >        }
220 >        if (arad < minarad) {
221                  arad = minarad;
222 <        arad /= sqrt(wt);
223 <        if (pg != NULL) {               /* clip pos. gradient if too large */
218 <                d = 4.0*DOT(pg,pg)*arad*arad;
219 <                if (d > 1.0) {
220 <                        d = 1.0/sqrt(d);
222 >                if (pg != NULL && d*arad*arad > 1.0) {  /* cap gradient */
223 >                        d = 1.0/arad/sqrt(d);
224                          for (i = 0; i < 3; i++)
225                                  pg[i] *= d;
226                  }
227          }
228 <        return(arad);
228 >        return(arad/sqrt(wt));
229   oopsy:
230          if (div != NULL)
231                  free((char *)div);
# Line 237 | Line 240 | double  wt;
240   {
241          register int  i;
242                                          /* set number of divisions */
243 +        if (wt < (.25*PI)/ambdiv+FTINY) {
244 +                hp->nt = hp->np = 0;
245 +                return;                 /* zero samples */
246 +        }
247          hp->nt = sqrt(ambdiv * wt / PI) + 0.5;
248 <        hp->np = PI * hp->nt;
248 >        hp->np = PI * hp->nt + 0.5;
249                                          /* make axes */
250          VCOPY(hp->uz, r->ron);
251          hp->uy[0] = hp->uy[1] = hp->uy[2] = 0.0;
# Line 329 | Line 336 | AMBHEMI  *hp;
336                          if (i > 0) {
337                                  d = dp[-hp->np].r;
338                                  if (dp[0].r > d) d = dp[0].r;
339 <                                d *= 1.0 - sqrt((double)i/hp->nt);
339 >                                d *= 1.0 - (double)i/hp->nt;    /* cos(t)^2 */
340                                  mag0 += d*(b - bright(dp[-hp->np].v));
341                          }
342                          if (j > 0) {
# Line 377 | Line 384 | AMBHEMI  *hp;
384                                  error(CONSISTENCY,
385                                          "division order in dirgradient");
386   #endif
387 <                        mag += sqrt((i+.5)/hp->nt)*bright(dp->v);
387 >                        mag += sqrt((i+.5)/hp->nt)*bright(dp->v);  /* sin(t) */
388                          dp += hp->np;
389                  }
390                  phi = 2.0*PI * (j+.5)/hp->np + PI/2.0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines