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 2.93 by greg, Tue Apr 16 23:32:20 2024 UTC vs.
Revision 2.94 by greg, Wed Apr 17 17:34:11 2024 UTC

# Line 100 | Line 100 | ambsample(                             /* initial ambient division sample */
100          AMBSAMP *ap = &ambsam(hp,i,j);
101          RAY     ar;
102          int     hlist[3], ii;
103 +        double  ss[2];
104          RREAL   spt[2];
105          double  zd;
106                                          /* generate hemispherical sample */
# Line 115 | Line 116 | ambsample(                             /* initial ambient division sample */
116                  scalescolor(ar.rcoef, 1./AVGREFL);
117          }
118          hlist[0] = hp->rp->rno;
119 <        hlist[1] = j;
120 <        hlist[2] = i;
121 <        multisamp(spt, 2, urand(ilhash(hlist,3)+n));
119 >        hlist[1] = AI(hp,i,j);
120 >        hlist[2] = samplendx;
121 >        multisamp(ss, 2, urand(ilhash(hlist,3)+n));
122   resample:
123 <        square2disk(spt, (j+spt[1])/hp->ns, (i+spt[0])/hp->ns);
123 >        square2disk(spt, (j+ss[1])/hp->ns, (i+ss[0])/hp->ns);
124          zd = sqrt(1. - spt[0]*spt[0] - spt[1]*spt[1]);
125          for (ii = 3; ii--; )
126                  ar.rdir[ii] =   spt[0]*hp->ux[ii] +
# Line 127 | Line 128 | resample:
128                                  zd*hp->onrm[ii];
129          checknorm(ar.rdir);
130                                          /* avoid coincident samples */
131 <        if (!n && ambcollision(hp, i, j, ar.rdir)) {
132 <                spt[0] = frandom(); spt[1] = frandom();
131 >        if (!n && hp->ns >= 4 && ambcollision(hp, i, j, ar.rdir)) {
132 >                ss[0] = frandom(); ss[1] = frandom();
133                  goto resample;          /* reject this sample */
134          }
135          dimlist[ndims++] = AI(hp,i,j) + 90171;
# Line 163 | Line 164 | static float *
164   getambdiffs(AMBHEMI *hp)
165   {
166          const double    normf = 1./(pbright(hp->acoef) + FTINY);
167 <        float   *earr = (float *)calloc(hp->ns*hp->ns, sizeof(float));
168 <        float   *ep, *earr2;
167 >        float   *earr = (float *)calloc(2*hp->ns*hp->ns, sizeof(float));
168 >        float   *ep;
169          AMBSAMP *ap;
170          double  b, b1, d2;
171          int     i, j;
# Line 210 | Line 211 | getambdiffs(AMBHEMI *hp)
211                  earr[j] *= 6./5.;
212                  earr[(hp->ns-1)*hp->ns + j] *= 6./5.;
213          }
214 <                                        /* preen map to avoid cliffs */
215 <        earr2 = (float *)malloc(hp->ns*hp->ns*sizeof(float));
215 <        if (earr2 == NULL)
216 <                return(earr);
217 <        memcpy(earr2, earr, hp->ns*hp->ns*sizeof(float));
214 >                                        /* blur map to reduce bias */
215 >        memcpy(earr+hp->ns*hp->ns, earr, hp->ns*hp->ns*sizeof(float));
216          for (i = 0; i < hp->ns-1; i++) {
217 <            float  *ep2 = earr2 + i*hp->ns;
217 >            float  *ep2;
218              ep = earr + i*hp->ns;
219 <            for (j = 0; j < hp->ns-1; j++, ep2++, ep++) {
220 <                if (ep2[1] < .5*ep2[0]) {
221 <                        ep[0] -= .125*ep2[0];
222 <                        ep[1] += .125*ep2[0];
223 <                } else if (ep2[1] > 2.*ep2[0]) {
226 <                        ep[1] -= .125*ep2[1];
227 <                        ep[0] += .125*ep2[1];
228 <                }
229 <                if (ep2[hp->ns] < .5*ep2[0]) {
230 <                        ep[0] -= .125*ep2[0];
231 <                        ep[hp->ns] += .125*ep2[0];
232 <                } else if (ep2[hp->ns] > 2.*ep2[0]) {
233 <                        ep[hp->ns] -= .125*ep2[hp->ns];
234 <                        ep[0] += .125*ep2[hp->ns];
235 <                }
219 >            ep2 = ep + hp->ns*hp->ns;
220 >            for (j = 0; j < hp->ns-1; j++, ep++, ep2++) {
221 >                ep[0] += .125*(ep2[1] + ep2[hp->ns]) - .5*ep2[0];
222 >                ep[1] += .125*ep2[0];
223 >                ep[hp->ns] += .125*ep2[0];
224              }
225          }
238        free(earr2);
226          return(earr);
227   }
228  
# Line 287 | Line 274 | samp_hemi(                             /* sample indirect hemisphere */
274                                          /* set number of divisions */
275          if (backside) wt = -wt;
276          if (ambacc <= FTINY &&
277 <                        wt > (d *= 0.8*r->rweight/(ambdiv*minweight)))
277 >                        wt > (d *= 0.8*r->rweight/(ambdiv*minweight + 1e-20)))
278                  wt = d;                 /* avoid ray termination */
279          n = sqrt(ambdiv * wt) + 0.5;
280          i = 1 + (MINADIV-1)*(ambacc > FTINY);
# Line 336 | Line 323 | samp_hemi(                             /* sample indirect hemisphere */
323          if (hp->sampOK <= MINADIV*MINADIV)
324                  return(hp);             /* don't bother super-sampling */
325          n = ambssamp*wt + 0.5;
326 <        if (n > 8) {                    /* perform super-sampling? */
326 >        if (n >= 4*hp->ns) {            /* perform super-sampling? */
327                  ambsupersamp(hp, n);
328                  copyscolor(rcol, hp->acol);
329          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines