--- ray/src/rt/ambcomp.c 1991/06/13 10:54:00 1.6 +++ ray/src/rt/ambcomp.c 1991/07/24 10:36:13 1.10 @@ -72,9 +72,9 @@ RAY *r; hlist[1] = dp->t; hlist[2] = dp->p; hlist[3] = 0; - zd = sqrt((dp->t+urand(ilhash(hlist,4)+dp->n))/h->nt); + zd = sqrt((dp->t+urand(urind(ilhash(hlist,4),dp->n)))/h->nt); hlist[3] = 1; - phi = 2.0*PI * (dp->p+urand(ilhash(hlist,4)+dp->n))/h->np; + phi = 2.0*PI * (dp->p+urand(urind(ilhash(hlist,4),dp->n)))/h->np; xd = cos(phi) * zd; yd = sin(phi) * zd; zd = sqrt(1.0 - zd*zd); @@ -86,7 +86,7 @@ RAY *r; rayvalue(&ar); ndims--; addcolor(dp->v, ar.rcol); - if (ar.rt < FHUGE) + if (ar.rt > FTINY && ar.rt < FHUGE) dp->r += 1.0/ar.rt; /* (re)initialize error */ if (dp->n++) { @@ -213,6 +213,14 @@ FVECT pg, dg; else if (arad < minarad) arad = minarad; arad /= sqrt(r->rweight); + if (pg != NULL) { /* clip pos. gradient if too large */ + d = 4.0*DOT(pg,pg)*arad*arad; + if (d > 1.0) { + d = 1.0/sqrt(d); + for (i = 0; i < 3; i++) + pg[i] *= d; + } + } return(arad); oopsy: if (div != NULL) @@ -227,8 +235,8 @@ RAY *r; { register int i; /* set number of divisions */ - hp->nt = sqrt(ambdiv * r->rweight * 0.5) + 0.5; - hp->np = 2 * hp->nt; + hp->nt = sqrt(ambdiv * r->rweight / PI) + 0.5; + hp->np = PI * hp->nt; /* make axes */ VCOPY(hp->uz, r->ron); hp->uy[0] = hp->uy[1] = hp->uy[2] = 0.0;