284 |
|
unsigned skipmask = 0; |
285 |
|
csiz *= .5; |
286 |
|
for (i = st->ndim; i--; ) |
287 |
< |
if (1<<i & cmask) |
287 |
> |
if (1<<i & cmask) { |
288 |
|
if (pos[i] < cmin[i] + csiz) |
289 |
|
for (n = 1 << st->ndim; n--; ) { |
290 |
|
if (n & 1<<i) |
295 |
|
if (!(n & 1<<i)) |
296 |
|
skipmask |= 1<<n; |
297 |
|
} |
298 |
+ |
} |
299 |
|
for (n = 1 << st->ndim; n--; ) { |
300 |
|
if (1<<n & skipmask) |
301 |
|
continue; |
469 |
|
/* convert vector coordinates */ |
470 |
|
if (sdt->st->ndim == 3) { |
471 |
|
spinvector(rOutVec, outVec, zvec, -atan2(-inVec[1],-inVec[0])); |
472 |
< |
gridPos[0] = .5 - .5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); |
472 |
> |
gridPos[0] = (.5-FTINY) - |
473 |
> |
.5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); |
474 |
|
SDdisk2square(gridPos+1, rOutVec[0], rOutVec[1]); |
475 |
|
} else if (sdt->st->ndim == 4) { |
476 |
|
SDdisk2square(gridPos, -inVec[0], -inVec[1]); |
605 |
|
/* record input range */ |
606 |
|
scale = myScaffold.wmin / (double)iwmax; |
607 |
|
for (i = myScaffold.nic; i--; ) { |
608 |
< |
cd->clim[i][0] = floor(pos[i]/scale) * scale; |
608 |
> |
cd->clim[i][0] = floor(pos[i+2*rev]/scale) * scale; |
609 |
|
cd->clim[i][1] = cd->clim[i][0] + scale; |
610 |
|
} |
611 |
|
if (cd->isodist) { /* avoid issue in SDqueryTreProjSA() */ |
674 |
|
if (sdt->st->ndim == 3) { /* isotropic BSDF? */ |
675 |
|
if (mode != sdt->sidef) /* XXX unhandled reciprocity */ |
676 |
|
return &SDemptyCD; |
677 |
< |
inCoord[0] = .5 - .5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); |
677 |
> |
inCoord[0] = (.5-FTINY) - |
678 |
> |
.5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); |
679 |
|
} else if (sdt->st->ndim == 4) { |
680 |
|
if (mode != sdt->sidef) /* use reciprocity? */ |
681 |
|
SDdisk2square(inCoord, inVec[0], inVec[1]); |
731 |
|
} else { |
732 |
|
const SDTreCDst *cd = (const SDTreCDst *)SDgetTreCDist(v1, sdc); |
733 |
|
if (cd == NULL) |
734 |
< |
return SDEmemory; |
735 |
< |
myPSA[0] = M_PI * (cd->clim[0][1] - cd->clim[0][0]) * |
736 |
< |
(cd->clim[1][1] - cd->clim[1][0]); |
737 |
< |
myPSA[1] = cd->max_psa; |
734 |
> |
myPSA[0] = myPSA[1] = 0; |
735 |
> |
else { |
736 |
> |
myPSA[0] = M_PI * (cd->clim[0][1] - cd->clim[0][0]) * |
737 |
> |
(cd->clim[1][1] - cd->clim[1][0]); |
738 |
> |
myPSA[1] = cd->max_psa; |
739 |
> |
} |
740 |
|
} |
741 |
|
switch (qflags) { /* record based on flag settings */ |
742 |
|
case SDqueryVal: |
751 |
|
psa[1] = myPSA[1]; |
752 |
|
/* fall through */ |
753 |
|
case SDqueryMin: |
754 |
< |
if (myPSA[0] < psa[0]) |
754 |
> |
if ((myPSA[0] > 0) & (myPSA[0] < psa[0])) |
755 |
|
psa[0] = myPSA[0]; |
756 |
|
break; |
757 |
|
} |
800 |
|
SDsquare2disk(gpos, gpos[0], gpos[1]); |
801 |
|
/* compute Z-coordinate */ |
802 |
|
gpos[2] = 1. - gpos[0]*gpos[0] - gpos[1]*gpos[1]; |
803 |
< |
if (gpos[2] > 0) /* paranoia, I hope */ |
799 |
< |
gpos[2] = sqrt(gpos[2]); |
803 |
> |
gpos[2] = sqrt(gpos[2]*(gpos[2]>0)); |
804 |
|
/* emit from back? */ |
805 |
|
if ((cd->sidef == SD_BREFL) | (cd->sidef == SD_FXMIT)) |
806 |
|
gpos[2] = -gpos[2]; |
807 |
< |
if (cd->isodist) { /* rotate isotropic result */ |
807 |
> |
if (cd->isodist) { /* rotate isotropic sample */ |
808 |
|
rotangle = atan2(-ioVec[1],-ioVec[0]); |
809 |
< |
VCOPY(ioVec, gpos); |
806 |
< |
spinvector(ioVec, ioVec, zvec, rotangle); |
809 |
> |
spinvector(ioVec, gpos, zvec, rotangle); |
810 |
|
} else |
811 |
|
VCOPY(ioVec, gpos); |
812 |
|
return SDEnone; |
848 |
|
char *svnext; |
849 |
|
|
850 |
|
while (n-- > 0 && (svnext = fskip(*spp)) != NULL) { |
851 |
< |
*v++ = atof(*spp); |
851 |
> |
if ((*v++ = atof(*spp)) < 0) |
852 |
> |
v[-1] = 0; |
853 |
|
*spp = svnext; |
854 |
|
eat_token(spp, ','); |
855 |
|
} |
1167 |
|
/* separate diffuse components */ |
1168 |
|
extract_diffuse(&sd->rLambFront, sd->rf); |
1169 |
|
extract_diffuse(&sd->rLambBack, sd->rb); |
1170 |
< |
extract_diffuse(&sd->tLamb, (sd->tf != NULL) ? sd->tf : sd->tb); |
1170 |
> |
if (sd->tf != NULL) |
1171 |
> |
extract_diffuse(&sd->tLamb, sd->tf); |
1172 |
> |
if (sd->tb != NULL) |
1173 |
> |
extract_diffuse(&sd->tLamb, sd->tb); |
1174 |
|
/* return success */ |
1175 |
|
return SDEnone; |
1176 |
|
} |