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

Comparing ray/src/gen/mkillum4.c (file contents):
Revision 2.2 by greg, Fri Sep 21 05:53:21 2007 UTC vs.
Revision 2.4 by greg, Wed Dec 5 05:02:58 2007 UTC

# Line 7 | Line 7 | static const char RCSid[] = "$Id$";
7  
8   #include "mkillum.h"
9   #include "paths.h"
10 + #include "random.h"
11   #include "ezxml.h"
12  
13  
# Line 213 | Line 214 | redistribute(          /* pass distarr ray sums through BSDF *
214   {
215          MAT4    mymat;
216          COLORV  *outarr;
216        float   *inpcoef;
217          COLORV  *cp, *csum;
218          uint16  *distcnt;
219          FVECT   dv;
220 <        double  oom, wt;
220 >        double  wt0, wt1;
221          int     i, j, o;
222          int     cnt;
223          COLOR   col;
224                                          /* allocate temporary memory */
225 <        outarr = (COLORV *)malloc(b->nout * sizeof(COLOR));
225 >        outarr = (COLORV *)calloc(b->nout, sizeof(COLOR));
226          distcnt = (uint16 *)calloc(nalt*nazi, sizeof(uint16));
227 <        inpcoef = (float *)malloc(b->ninc * sizeof(float));
228 <        if ((outarr == NULL) | (distcnt == NULL) | (inpcoef == NULL))
227 >        if ((outarr == NULL) | (distcnt == NULL))
228                  error(SYSTEM, "out of memory in redistribute");
229                                          /* compose matrix */
230          for (i = 3; i--; ) {
# Line 239 | Line 238 | redistribute(          /* pass distarr ray sums through BSDF *
238          if (xm != NULL)
239                  multmat4(mymat, xm, mymat);
240          for (i = 3; i--; ) {            /* make sure it's normalized */
241 <                wt = 1./sqrt(   mymat[0][i]*mymat[0][i] +
241 >                wt0 = 1./sqrt(  mymat[0][i]*mymat[0][i] +
242                                  mymat[1][i]*mymat[1][i] +
243                                  mymat[2][i]*mymat[2][i] );
244                  for (j = 3; j--; )
245 <                        mymat[j][i] *= wt;
245 >                        mymat[j][i] *= wt0;
246          }
247                                          /* pass through BSDF */
248 <        for (i = b->ninc; i--; ) {              /* get input coefficients */
248 >        for (i = b->ninc; i--; ) {
249                  getBSDF_incvec(dv, b, i);
250                  multv3(dv, dv, mymat);
251 <                wt = getBSDF_incrad(b, i);
252 <                inpcoef[i] = PI*wt*wt * dv[2];  /* solid_angle*cosine(theta) */
253 <        }
255 <        for (o = b->nout; o--; ) {
256 <                csum = &outarr[3*o];
257 <                setcolor(csum, 0., 0., 0.);
258 <                oom = getBSDF_outrad(b, o);
259 <                oom *= oom * PI;
260 <                for (i = b->ninc; i--; ) {
261 <                        wt = BSDF_data(b,i,o) * inpcoef[i] / oom;
251 >                wt0 = getBSDF_incrad(b, i);
252 >                wt0 *= PI*wt0 * dv[2];          /* solid_angle*cosine(theta) */
253 >                for (o = b->nout; o--; ) {
254                          cp = &distarr[3*i];
255 +                        csum = &outarr[3*o];
256 +                        wt1 = wt0 * BSDF_data(b,i,o);
257                          copycolor(col, cp);
258 <                        scalecolor(col, wt);
258 >                        scalecolor(col, wt1);
259                          addcolor(csum, col);
260                  }
267                wt = 1./b->ninc;
268                scalecolor(csum, wt);
261          }
270        free(inpcoef);
262          newdist(nalt*nazi);             /* resample distribution */
263          for (o = b->nout; o--; ) {
264                  getBSDF_outvec(dv, b, o);
# Line 308 | Line 299 | redistribute(          /* pass distarr ray sums through BSDF *
299                              cnt += distcnt[alt*nazi + azi];
300                          }
301                      }
302 <                wt = 1./cnt;
303 <                scalecolor(csum, wt);
302 >                wt0 = 1./cnt;
303 >                scalecolor(csum, wt0);
304              }
305                                          /* finish averages */
306          for (i = nalt; i--; )
# Line 317 | Line 308 | redistribute(          /* pass distarr ray sums through BSDF *
308                  if ((cnt = distcnt[i*nazi + j]) <= 1)
309                          continue;
310                  csum = &distarr[3*(i*nazi + j)];
311 <                wt = 1./cnt;
312 <                scalecolor(csum, wt);
311 >                wt0 = 1./cnt;
312 >                scalecolor(csum, wt0);
313              }
314          free(distcnt);
315   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines