| 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]); |
| 517 |
|
sp->wmax = wid; |
| 518 |
|
if (sp->alen >= sp->nall) { /* need more space? */ |
| 519 |
|
struct outdir_s *ndarr; |
| 520 |
< |
sp->nall += 1024; |
| 520 |
> |
sp->nall = (int)(1.5*sp->nall) + 256; |
| 521 |
|
ndarr = (struct outdir_s *)realloc(sp->darr, |
| 522 |
|
sizeof(struct outdir_s)*sp->nall); |
| 523 |
|
if (ndarr == NULL) { |
| 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 |
< |
cd = &SDemptyCD; |
| 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 |
|
} |