ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/bsdf.c
(Generate patch)

Comparing ray/src/common/bsdf.c (file contents):
Revision 2.45 by greg, Wed Jul 3 18:56:19 2013 UTC vs.
Revision 2.56 by greg, Fri Dec 7 07:38:15 2018 UTC

# Line 199 | Line 199 | SDloadFile(SDData *sd, const char *fname)
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;
# Line 422 | Line 422 | SDcacheFile(const char *fname)
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;
# Line 429 | Line 430 | SDcacheFile(const char *fname)
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  
# Line 494 | Line 496 | SDsampComponent(SDValue *sv, FVECT ioVec, double randX
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 */
# Line 513 | Line 515 | SDsampComponent(SDValue *sv, FVECT ioVec, double randX
515                  c_cmix(&sv->spec, d, &sv->spec, coef[n], &sdc->cspec[n]);
516                  d += coef[n];
517          }
518 <                                        /* make sure everything is set */
517 <        c_ccvt(&sv->spec, C_CSXY+C_CSSPEC);
518 >        c_ccvt(&sv->spec, C_CSXY);      /* make sure (x,y) is set */
519          return SDEnone;
520   }
521  
# Line 558 | Line 559 | SDdiffuseSamp(FVECT outVec, int outFront, double randX
559          SDmultiSamp(outVec, 2, randX);
560          SDsquare2disk(outVec, outVec[0], outVec[1]);
561          outVec[2] = 1. - outVec[0]*outVec[0] - outVec[1]*outVec[1];
562 <        if (outVec[2] > 0)              /* a bit of paranoia */
562 <                outVec[2] = sqrt(outVec[2]);
562 >        outVec[2] = sqrt(outVec[2]*(outVec[2]>0));
563          if (!outFront)                  /* going out back? */
564                  outVec[2] = -outVec[2];
565   }
# Line 596 | Line 596 | SDsizeBSDF(double *projSA, const FVECT v1, const RREAL
596                  rdf = sd->rb;
597                  tdf = (sd->tb != NULL) ? sd->tb : sd->tf;
598          }
599 <        if (v2 != NULL)                 /* bidirectional? */
599 >        if (v2 != NULL) {               /* bidirectional? */
600                  if (v1[2] > 0 ^ v2[2] > 0)
601                          rdf = NULL;
602                  else
603                          tdf = NULL;
604 +        }
605          ec = SDEdata;                   /* run through components */
606          for (i = (rdf==NULL) ? 0 : rdf->ncomp; i--; ) {
607                  ec = (*rdf->comp[i].func->queryProjSA)(projSA, v1, v2,
# Line 618 | Line 619 | SDsizeBSDF(double *projSA, const FVECT v1, const RREAL
619                  projSA[0] = M_PI;
620                  if (qflags == SDqueryMin+SDqueryMax)
621                          projSA[1] = M_PI;
622 <        }
622 >        } else if (qflags == SDqueryMin+SDqueryMax && projSA[0] > projSA[1])
623 >                projSA[0] = projSA[1];
624          return SDEnone;
625   }
626  
# Line 643 | Line 645 | SDevalBSDF(SDValue *sv, const FVECT outVec, const FVEC
645          } else if (!(inFront | outFront)) {
646                  *sv = sd->rLambBack;
647                  sdf = sd->rb;
648 <        } else if (inFront) {
648 >        } else if (outFront) {
649                  *sv = sd->tLamb;
650                  sdf = (sd->tf != NULL) ? sd->tf : sd->tb;
651 <        } else /* inBack */ {
651 >        } else /* inFront & !outFront */ {
652                  *sv = sd->tLamb;
653                  sdf = (sd->tb != NULL) ? sd->tb : sd->tf;
654          }
# Line 662 | Line 664 | SDevalBSDF(SDValue *sv, const FVECT outVec, const FVEC
664                          sv->cieY += coef[nch];
665                  }
666          }
667 <                                        /* make sure everything is set */
666 <        c_ccvt(&sv->spec, C_CSXY+C_CSSPEC);
667 >        c_ccvt(&sv->spec, C_CSXY);      /* make sure (x,y) is set */
668          return SDEnone;
669   }
670  
# Line 763 | Line 764 | SDsampBSDF(SDValue *sv, FVECT ioVec, double randX, int
764                  cdarr[i] = (*rdf->comp[i].func->getCDist)(inVec, &rdf->comp[i]);
765                  if (cdarr[i] == NULL)
766                          cdarr[i] = &SDemptyCD;
767 <                else
767 <                        sv->cieY += cdarr[i]->cTotal;
767 >                sv->cieY += cdarr[i]->cTotal;
768          }
769          if (sv->cieY <= 1e-6) {         /* anything to sample? */
770                  sv->cieY = .0;
771 <                memset(ioVec, 0, 3*sizeof(double));
771 >                memset(ioVec, 0, sizeof(FVECT));
772                  return SDEnone;
773          }
774                                          /* scale random variable */
# Line 789 | Line 789 | SDsampBSDF(SDValue *sv, FVECT ioVec, double randX, int
789                  randX -= sd->tLamb.cieY;
790          }
791                                          /* else one of cumulative dist. */
792 <        for (i = 0; i < n && randX < cdarr[i]->cTotal; i++)
792 >        for (i = 0; i < n && randX >= cdarr[i]->cTotal; i++)
793                  randX -= cdarr[i]->cTotal;
794          if (i >= n)
795                  return SDEinternal;
# Line 814 | Line 814 | SDsampBSDF(SDValue *sv, FVECT ioVec, double randX, int
814   done:
815          if (cdarr != NULL)
816                  free(cdarr);
817 <                                        /* make sure everything is set */
818 <        c_ccvt(&sv->spec, C_CSXY+C_CSSPEC);
817 >        c_ccvt(&sv->spec, C_CSXY);      /* make sure (x,y) is set */
818          return SDEnone;
819   }
820  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines