199 |
|
} |
200 |
|
wtl = ezxml_child(ezxml_child(fl, "Optical"), "Layer"); |
201 |
|
if (wtl == NULL) { |
202 |
< |
sprintf(SDerrorDetail, "BSDF \"%s\": no optical layers'", |
202 |
> |
sprintf(SDerrorDetail, "BSDF \"%s\": no optical layers", |
203 |
|
sd->name); |
204 |
|
ezxml_free(fl); |
205 |
|
return SDEformat; |
422 |
|
if (fname == NULL || !*fname) |
423 |
|
return NULL; |
424 |
|
SDerrorDetail[0] = '\0'; |
425 |
+ |
/* PLACE MUTEX LOCK HERE FOR THREAD-SAFE */ |
426 |
|
if ((sd = SDgetCache(fname)) == NULL) { |
427 |
|
SDreportError(SDEmemory, stderr); |
428 |
|
return NULL; |
430 |
|
if (!SDisLoaded(sd) && (ec = SDloadFile(sd, fname))) { |
431 |
|
SDreportError(ec, stderr); |
432 |
|
SDfreeCache(sd); |
433 |
< |
return NULL; |
433 |
> |
sd = NULL; |
434 |
|
} |
435 |
+ |
/* END MUTEX LOCK */ |
436 |
|
return sd; |
437 |
|
} |
438 |
|
|
496 |
|
sv->cieY = cd->cTotal; |
497 |
|
if (sv->cieY <= 1e-6) { /* nothing to sample? */ |
498 |
|
sv->spec = c_dfcolor; |
499 |
< |
memset(ioVec, 0, 3*sizeof(double)); |
499 |
> |
memset(ioVec, 0, sizeof(FVECT)); |
500 |
|
return SDEnone; |
501 |
|
} |
502 |
|
/* compute sample direction */ |
560 |
|
SDmultiSamp(outVec, 2, randX); |
561 |
|
SDsquare2disk(outVec, outVec[0], outVec[1]); |
562 |
|
outVec[2] = 1. - outVec[0]*outVec[0] - outVec[1]*outVec[1]; |
563 |
< |
if (outVec[2] > 0) /* a bit of paranoia */ |
562 |
< |
outVec[2] = sqrt(outVec[2]); |
563 |
> |
outVec[2] = sqrt(outVec[2]*(outVec[2]>0)); |
564 |
|
if (!outFront) /* going out back? */ |
565 |
|
outVec[2] = -outVec[2]; |
566 |
|
} |
597 |
|
rdf = sd->rb; |
598 |
|
tdf = (sd->tb != NULL) ? sd->tb : sd->tf; |
599 |
|
} |
600 |
< |
if (v2 != NULL) /* bidirectional? */ |
600 |
> |
if (v2 != NULL) { /* bidirectional? */ |
601 |
|
if (v1[2] > 0 ^ v2[2] > 0) |
602 |
|
rdf = NULL; |
603 |
|
else |
604 |
|
tdf = NULL; |
605 |
+ |
} |
606 |
|
ec = SDEdata; /* run through components */ |
607 |
|
for (i = (rdf==NULL) ? 0 : rdf->ncomp; i--; ) { |
608 |
|
ec = (*rdf->comp[i].func->queryProjSA)(projSA, v1, v2, |
646 |
|
} else if (!(inFront | outFront)) { |
647 |
|
*sv = sd->rLambBack; |
648 |
|
sdf = sd->rb; |
649 |
< |
} else if (inFront) { |
649 |
> |
} else if (outFront) { |
650 |
|
*sv = sd->tLamb; |
651 |
|
sdf = (sd->tf != NULL) ? sd->tf : sd->tb; |
652 |
< |
} else /* inBack */ { |
652 |
> |
} else /* inFront & !outFront */ { |
653 |
|
*sv = sd->tLamb; |
654 |
|
sdf = (sd->tb != NULL) ? sd->tb : sd->tf; |
655 |
|
} |
766 |
|
cdarr[i] = (*rdf->comp[i].func->getCDist)(inVec, &rdf->comp[i]); |
767 |
|
if (cdarr[i] == NULL) |
768 |
|
cdarr[i] = &SDemptyCD; |
769 |
< |
else |
768 |
< |
sv->cieY += cdarr[i]->cTotal; |
769 |
> |
sv->cieY += cdarr[i]->cTotal; |
770 |
|
} |
771 |
|
if (sv->cieY <= 1e-6) { /* anything to sample? */ |
772 |
|
sv->cieY = .0; |
773 |
< |
memset(ioVec, 0, 3*sizeof(double)); |
773 |
> |
memset(ioVec, 0, sizeof(FVECT)); |
774 |
|
return SDEnone; |
775 |
|
} |
776 |
|
/* scale random variable */ |