--- ray/src/common/bsdf.c 2013/07/03 18:56:19 2.45 +++ ray/src/common/bsdf.c 2018/12/07 07:38:15 2.56 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: bsdf.c,v 2.45 2013/07/03 18:56:19 greg Exp $"; +static const char RCSid[] = "$Id: bsdf.c,v 2.56 2018/12/07 07:38:15 greg Exp $"; #endif /* * bsdf.c @@ -199,7 +199,7 @@ SDloadFile(SDData *sd, const char *fname) } wtl = ezxml_child(ezxml_child(fl, "Optical"), "Layer"); if (wtl == NULL) { - sprintf(SDerrorDetail, "BSDF \"%s\": no optical layers'", + sprintf(SDerrorDetail, "BSDF \"%s\": no optical layers", sd->name); ezxml_free(fl); return SDEformat; @@ -422,6 +422,7 @@ SDcacheFile(const char *fname) if (fname == NULL || !*fname) return NULL; SDerrorDetail[0] = '\0'; + /* PLACE MUTEX LOCK HERE FOR THREAD-SAFE */ if ((sd = SDgetCache(fname)) == NULL) { SDreportError(SDEmemory, stderr); return NULL; @@ -429,8 +430,9 @@ SDcacheFile(const char *fname) if (!SDisLoaded(sd) && (ec = SDloadFile(sd, fname))) { SDreportError(ec, stderr); SDfreeCache(sd); - return NULL; + sd = NULL; } + /* END MUTEX LOCK */ return sd; } @@ -494,7 +496,7 @@ SDsampComponent(SDValue *sv, FVECT ioVec, double randX sv->cieY = cd->cTotal; if (sv->cieY <= 1e-6) { /* nothing to sample? */ sv->spec = c_dfcolor; - memset(ioVec, 0, 3*sizeof(double)); + memset(ioVec, 0, sizeof(FVECT)); return SDEnone; } /* compute sample direction */ @@ -513,8 +515,7 @@ SDsampComponent(SDValue *sv, FVECT ioVec, double randX c_cmix(&sv->spec, d, &sv->spec, coef[n], &sdc->cspec[n]); d += coef[n]; } - /* make sure everything is set */ - c_ccvt(&sv->spec, C_CSXY+C_CSSPEC); + c_ccvt(&sv->spec, C_CSXY); /* make sure (x,y) is set */ return SDEnone; } @@ -558,8 +559,7 @@ SDdiffuseSamp(FVECT outVec, int outFront, double randX SDmultiSamp(outVec, 2, randX); SDsquare2disk(outVec, outVec[0], outVec[1]); outVec[2] = 1. - outVec[0]*outVec[0] - outVec[1]*outVec[1]; - if (outVec[2] > 0) /* a bit of paranoia */ - outVec[2] = sqrt(outVec[2]); + outVec[2] = sqrt(outVec[2]*(outVec[2]>0)); if (!outFront) /* going out back? */ outVec[2] = -outVec[2]; } @@ -596,11 +596,12 @@ SDsizeBSDF(double *projSA, const FVECT v1, const RREAL rdf = sd->rb; tdf = (sd->tb != NULL) ? sd->tb : sd->tf; } - if (v2 != NULL) /* bidirectional? */ + if (v2 != NULL) { /* bidirectional? */ if (v1[2] > 0 ^ v2[2] > 0) rdf = NULL; else tdf = NULL; + } ec = SDEdata; /* run through components */ for (i = (rdf==NULL) ? 0 : rdf->ncomp; i--; ) { ec = (*rdf->comp[i].func->queryProjSA)(projSA, v1, v2, @@ -618,7 +619,8 @@ SDsizeBSDF(double *projSA, const FVECT v1, const RREAL projSA[0] = M_PI; if (qflags == SDqueryMin+SDqueryMax) projSA[1] = M_PI; - } + } else if (qflags == SDqueryMin+SDqueryMax && projSA[0] > projSA[1]) + projSA[0] = projSA[1]; return SDEnone; } @@ -643,10 +645,10 @@ SDevalBSDF(SDValue *sv, const FVECT outVec, const FVEC } else if (!(inFront | outFront)) { *sv = sd->rLambBack; sdf = sd->rb; - } else if (inFront) { + } else if (outFront) { *sv = sd->tLamb; sdf = (sd->tf != NULL) ? sd->tf : sd->tb; - } else /* inBack */ { + } else /* inFront & !outFront */ { *sv = sd->tLamb; sdf = (sd->tb != NULL) ? sd->tb : sd->tf; } @@ -662,8 +664,7 @@ SDevalBSDF(SDValue *sv, const FVECT outVec, const FVEC sv->cieY += coef[nch]; } } - /* make sure everything is set */ - c_ccvt(&sv->spec, C_CSXY+C_CSSPEC); + c_ccvt(&sv->spec, C_CSXY); /* make sure (x,y) is set */ return SDEnone; } @@ -763,12 +764,11 @@ SDsampBSDF(SDValue *sv, FVECT ioVec, double randX, int cdarr[i] = (*rdf->comp[i].func->getCDist)(inVec, &rdf->comp[i]); if (cdarr[i] == NULL) cdarr[i] = &SDemptyCD; - else - sv->cieY += cdarr[i]->cTotal; + sv->cieY += cdarr[i]->cTotal; } if (sv->cieY <= 1e-6) { /* anything to sample? */ sv->cieY = .0; - memset(ioVec, 0, 3*sizeof(double)); + memset(ioVec, 0, sizeof(FVECT)); return SDEnone; } /* scale random variable */ @@ -789,7 +789,7 @@ SDsampBSDF(SDValue *sv, FVECT ioVec, double randX, int randX -= sd->tLamb.cieY; } /* else one of cumulative dist. */ - for (i = 0; i < n && randX < cdarr[i]->cTotal; i++) + for (i = 0; i < n && randX >= cdarr[i]->cTotal; i++) randX -= cdarr[i]->cTotal; if (i >= n) return SDEinternal; @@ -814,8 +814,7 @@ SDsampBSDF(SDValue *sv, FVECT ioVec, double randX, int done: if (cdarr != NULL) free(cdarr); - /* make sure everything is set */ - c_ccvt(&sv->spec, C_CSXY+C_CSSPEC); + c_ccvt(&sv->spec, C_CSXY); /* make sure (x,y) is set */ return SDEnone; }