--- ray/src/common/bsdf_t.c 2013/07/04 01:22:47 3.28 +++ ray/src/common/bsdf_t.c 2014/03/24 04:00:45 3.35 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: bsdf_t.c,v 3.28 2013/07/04 01:22:47 greg Exp $"; +static const char RCSid[] = "$Id: bsdf_t.c,v 3.35 2014/03/24 04:00:45 greg Exp $"; #endif /* * bsdf_t.c @@ -284,7 +284,7 @@ SDdotravTre(const SDNode *st, const double *pos, int c unsigned skipmask = 0; csiz *= .5; for (i = st->ndim; i--; ) - if (1<ndim; n--; ) { if (n & 1<ndim; n--; ) { if (1<st->ndim == 3) { spinvector(rOutVec, outVec, zvec, -atan2(-inVec[1],-inVec[0])); - gridPos[0] = .5 - .5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); + gridPos[0] = (.5-FTINY) - + .5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); SDdisk2square(gridPos+1, rOutVec[0], rOutVec[1]); } else if (sdt->st->ndim == 4) { SDdisk2square(gridPos, -inVec[0], -inVec[1]); @@ -515,7 +517,7 @@ build_scaffold(float val, const double *cmin, double c sp->wmax = wid; if (sp->alen >= sp->nall) { /* need more space? */ struct outdir_s *ndarr; - sp->nall += 1024; + sp->nall = (int)(1.5*sp->nall) + 256; ndarr = (struct outdir_s *)realloc(sp->darr, sizeof(struct outdir_s)*sp->nall); if (ndarr == NULL) { @@ -672,7 +674,8 @@ SDgetTreCDist(const FVECT inVec, SDComponent *sdc) if (sdt->st->ndim == 3) { /* isotropic BSDF? */ if (mode != sdt->sidef) /* XXX unhandled reciprocity */ return &SDemptyCD; - inCoord[0] = .5 - .5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); + inCoord[0] = (.5-FTINY) - + .5*sqrt(inVec[0]*inVec[0] + inVec[1]*inVec[1]); } else if (sdt->st->ndim == 4) { if (mode != sdt->sidef) /* use reciprocity? */ SDdisk2square(inCoord, inVec[0], inVec[1]); @@ -728,10 +731,12 @@ SDqueryTreProjSA(double *psa, const FVECT v1, const RR } else { const SDTreCDst *cd = (const SDTreCDst *)SDgetTreCDist(v1, sdc); if (cd == NULL) - cd = &SDemptyCD; - myPSA[0] = M_PI * (cd->clim[0][1] - cd->clim[0][0]) * - (cd->clim[1][1] - cd->clim[1][0]); - myPSA[1] = cd->max_psa; + myPSA[0] = myPSA[1] = 0; + else { + myPSA[0] = M_PI * (cd->clim[0][1] - cd->clim[0][0]) * + (cd->clim[1][1] - cd->clim[1][0]); + myPSA[1] = cd->max_psa; + } } switch (qflags) { /* record based on flag settings */ case SDqueryVal: @@ -746,7 +751,7 @@ SDqueryTreProjSA(double *psa, const FVECT v1, const RR psa[1] = myPSA[1]; /* fall through */ case SDqueryMin: - if (myPSA[0] < psa[0]) + if ((myPSA[0] > 0) & (myPSA[0] < psa[0])) psa[0] = myPSA[0]; break; } @@ -795,15 +800,13 @@ SDsampTreCDist(FVECT ioVec, double randX, const SDCDst SDsquare2disk(gpos, gpos[0], gpos[1]); /* compute Z-coordinate */ gpos[2] = 1. - gpos[0]*gpos[0] - gpos[1]*gpos[1]; - if (gpos[2] > 0) /* paranoia, I hope */ - gpos[2] = sqrt(gpos[2]); + gpos[2] = sqrt(gpos[2]*(gpos[2]>0)); /* emit from back? */ if ((cd->sidef == SD_BREFL) | (cd->sidef == SD_FXMIT)) gpos[2] = -gpos[2]; - if (cd->isodist) { /* rotate isotropic result */ + if (cd->isodist) { /* rotate isotropic sample */ rotangle = atan2(-ioVec[1],-ioVec[0]); - VCOPY(ioVec, gpos); - spinvector(ioVec, ioVec, zvec, rotangle); + spinvector(ioVec, gpos, zvec, rotangle); } else VCOPY(ioVec, gpos); return SDEnone; @@ -845,7 +848,8 @@ load_values(char **spp, float *va, int n) char *svnext; while (n-- > 0 && (svnext = fskip(*spp)) != NULL) { - *v++ = atof(*spp); + if ((*v++ = atof(*spp)) < 0) + v[-1] = 0; *spp = svnext; eat_token(spp, ','); }