214 |
|
{ |
215 |
|
MAT4 mymat; |
216 |
|
COLORV *outarr; |
217 |
– |
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)); |
229 |
< |
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--; ) { |
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 |
< |
} |
256 |
< |
for (o = b->nout; o--; ) { |
257 |
< |
csum = &outarr[3*o]; |
258 |
< |
setcolor(csum, 0., 0., 0.); |
259 |
< |
oom = getBSDF_outrad(b, o); |
260 |
< |
oom *= oom * PI; |
261 |
< |
for (i = b->ninc; i--; ) { |
262 |
< |
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 |
|
} |
268 |
– |
wt = 1./b->ninc; |
269 |
– |
scalecolor(csum, wt); |
261 |
|
} |
271 |
– |
free(inpcoef); |
262 |
|
newdist(nalt*nazi); /* resample distribution */ |
263 |
|
for (o = b->nout; o--; ) { |
264 |
|
getBSDF_outvec(dv, b, o); |
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--; ) |
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 |
|
} |