--- ray/src/common/bsdf.c 2011/02/19 23:42:09 2.17 +++ ray/src/common/bsdf.c 2011/04/19 21:31:22 2.22 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: bsdf.c,v 2.17 2011/02/19 23:42:09 greg Exp $"; +static const char RCSid[] = "$Id: bsdf.c,v 2.22 2011/04/19 21:31:22 greg Exp $"; #endif /* * bsdf.c @@ -45,10 +45,14 @@ int SDretainSet = SDretainNone; SDError SDreportEnglish(SDError ec, FILE *fp) { - if (fp == NULL) - return ec; if (!ec) return SDEnone; + if ((ec < SDEnone) | (ec > SDEunknown)) { + SDerrorDetail[0] = '\0'; + ec = SDEunknown; + } + if (fp == NULL) + return ec; fputs(SDerrorEnglish[ec], fp); if (SDerrorDetail[0]) { fputs(": ", fp); @@ -269,10 +273,14 @@ SDclipName(char *res, const char *fname) /* Initialize an unused BSDF struct (simply clears to zeroes) */ void -SDclearBSDF(SDData *sd) +SDclearBSDF(SDData *sd, const char *fname) { - if (sd != NULL) - memset(sd, 0, sizeof(SDData)); + if (sd == NULL) + return; + memset(sd, 0, sizeof(SDData)); + if (fname == NULL) + return; + SDclipName(sd->name, fname); } /* Free data associated with BSDF struct */ @@ -330,7 +338,7 @@ SDgetCache(const char *bname) sdl->next = SDcacheList; SDcacheList = sdl; - sdl->refcnt++; + sdl->refcnt = 1; return &sdl->bsdf; } @@ -374,7 +382,7 @@ SDfreeCache(const SDData *sd) for (sdl = SDcacheList; sdl != NULL; sdl = (sdLast=sdl)->next) if (&sdl->bsdf == sd) break; - if (sdl == NULL || --sdl->refcnt) + if (sdl == NULL || (sdl->refcnt -= (sdl->refcnt > 0))) return; /* missing or still in use */ /* keep unreferenced data? */ if (SDisLoaded(sd) && SDretainSet) { @@ -451,7 +459,7 @@ SDmultiSamp(double t[], int n, double randX) bitmask_t ndx, coord[MS_MAXDIM]; while (n > MS_MAXDIM) /* punt for higher dimensions */ - t[--n] = drand48(); + t[--n] = rand()*(1./(RAND_MAX+.5)); nBits = (8*sizeof(bitmask_t) - 1) / n; ndx = randX * (double)((bitmask_t)1 << (nBits*n)); /* get coordinate on Hilbert curve */ @@ -459,7 +467,7 @@ SDmultiSamp(double t[], int n, double randX) /* convert back to [0,1) range */ scale = 1. / (double)((bitmask_t)1 << nBits); while (n--) - t[n] = scale * ((double)coord[n] + drand48()); + t[n] = scale * ((double)coord[n] + rand()*(1./(RAND_MAX+.5))); } #undef MS_MAXDIM @@ -480,13 +488,14 @@ SDdiffuseSamp(FVECT outVec, int outFront, double randX /* Query projected solid angle coverage for non-diffuse BSDF direction */ SDError -SDsizeBSDF(double *projSA, const FVECT vec, int qflags, const SDData *sd) +SDsizeBSDF(double *projSA, const FVECT v1, const RREAL *v2, + int qflags, const SDData *sd) { SDSpectralDF *rdf; SDError ec; int i; /* check arguments */ - if ((projSA == NULL) | (vec == NULL) | (sd == NULL)) + if ((projSA == NULL) | (v1 == NULL)) return SDEargument; /* initialize extrema */ switch (qflags) { @@ -502,20 +511,20 @@ SDsizeBSDF(double *projSA, const FVECT vec, int qflags case 0: return SDEargument; } - if (vec[2] > .0) /* front surface query? */ + if (v1[2] > .0) /* front surface query? */ rdf = sd->rf; else rdf = sd->rb; ec = SDEdata; /* run through components */ for (i = (rdf==NULL) ? 0 : rdf->ncomp; i--; ) { - ec = (*rdf->comp[i].func->queryProjSA)(projSA, vec, qflags, - rdf->comp[i].dist); + ec = (*rdf->comp[i].func->queryProjSA)(projSA, v1, v2, + qflags, rdf->comp[i].dist); if (ec) return ec; } for (i = (sd->tf==NULL) ? 0 : sd->tf->ncomp; i--; ) { - ec = (*sd->tf->comp[i].func->queryProjSA)(projSA, vec, qflags, - sd->tf->comp[i].dist); + ec = (*sd->tf->comp[i].func->queryProjSA)(projSA, v1, v2, + qflags, sd->tf->comp[i].dist); if (ec) return ec; }