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.22 by greg, Tue Apr 19 21:31:22 2011 UTC vs.
Revision 2.23 by greg, Wed Apr 20 14:44:05 2011 UTC

# Line 99 | Line 99 | SDloadGeometry(SDData *sd, ezxml_t wdb)
99          if ((geom = ezxml_child(wdb, "Thickness")) != NULL)
100                  sd->dim[2] = atof(ezxml_txt(geom)) *
101                                  to_meters(ezxml_attr(geom, "unit"));
102 <        if ((sd->dim[0] < .0) | (sd->dim[1] < .0) | (sd->dim[2] < .0)) {
102 >        if ((sd->dim[0] < 0) | (sd->dim[1] < 0) | (sd->dim[2] < 0)) {
103                  sprintf(SDerrorDetail, "Negative size in \"%s\"", sd->name);
104                  return SDEdata;
105          }
# Line 480 | Line 480 | SDdiffuseSamp(FVECT outVec, int outFront, double randX
480          SDmultiSamp(outVec, 2, randX);
481          SDsquare2disk(outVec, outVec[0], outVec[1]);
482          outVec[2] = 1. - outVec[0]*outVec[0] - outVec[1]*outVec[1];
483 <        if (outVec[2] > .0)             /* a bit of paranoia */
483 >        if (outVec[2] > 0)              /* a bit of paranoia */
484                  outVec[2] = sqrt(outVec[2]);
485          if (!outFront)                  /* going out back? */
486                  outVec[2] = -outVec[2];
# Line 491 | Line 491 | SDError
491   SDsizeBSDF(double *projSA, const FVECT v1, const RREAL *v2,
492                                  int qflags, const SDData *sd)
493   {
494 <        SDSpectralDF    *rdf;
494 >        SDSpectralDF    *rdf, *tdf;
495          SDError         ec;
496          int             i;
497                                          /* check arguments */
# Line 511 | Line 511 | SDsizeBSDF(double *projSA, const FVECT v1, const RREAL
511          case 0:
512                  return SDEargument;
513          }
514 <        if (v1[2] > .0)                 /* front surface query? */
514 >        if (v1[2] > 0)                  /* front surface query? */
515                  rdf = sd->rf;
516          else
517                  rdf = sd->rb;
518 +        tdf = NULL;                     /* transmitted component? */
519 +        if (v2 != NULL && v1[2] > 0 ^ v2[2] > 0) {
520 +                rdf = NULL;
521 +                tdf = sd->tf;
522 +        }
523          ec = SDEdata;                   /* run through components */
524          for (i = (rdf==NULL) ? 0 : rdf->ncomp; i--; ) {
525                  ec = (*rdf->comp[i].func->queryProjSA)(projSA, v1, v2,
# Line 522 | Line 527 | SDsizeBSDF(double *projSA, const FVECT v1, const RREAL
527                  if (ec)
528                          return ec;
529          }
530 <        for (i = (sd->tf==NULL) ? 0 : sd->tf->ncomp; i--; ) {
531 <                ec = (*sd->tf->comp[i].func->queryProjSA)(projSA, v1, v2,
532 <                                                qflags, sd->tf->comp[i].dist);
530 >        for (i = (tdf==NULL) ? 0 : tdf->ncomp; i--; ) {
531 >                ec = (*tdf->comp[i].func->queryProjSA)(projSA, v1, v2,
532 >                                                qflags, tdf->comp[i].dist);
533                  if (ec)
534                          return ec;
535          }
# Line 548 | Line 553 | SDevalBSDF(SDValue *sv, const FVECT outVec, const FVEC
553          if ((sv == NULL) | (outVec == NULL) | (inVec == NULL) | (sd == NULL))
554                  return SDEargument;
555                                          /* whose side are we on? */
556 <        inFront = (inVec[2] > .0);
557 <        outFront = (outVec[2] > .0);
556 >        inFront = (inVec[2] > 0);
557 >        outFront = (outVec[2] > 0);
558                                          /* start with diffuse portion */
559          if (inFront & outFront) {
560                  *sv = sd->rLambFront;
# Line 590 | Line 595 | SDdirectHemi(const FVECT inVec, int sflags, const SDDa
595          if ((inVec == NULL) | (sd == NULL))
596                  return .0;
597                                          /* gather diffuse components */
598 <        if (inVec[2] > .0) {
598 >        if (inVec[2] > 0) {
599                  hsum = sd->rLambFront.cieY;
600                  rdf = sd->rf;
601          } else /* !inFront */ {
# Line 634 | Line 639 | SDsampBSDF(SDValue *sv, FVECT outVec, const FVECT inVe
639          const SDCDst    **cdarr = NULL;
640                                          /* check arguments */
641          if ((sv == NULL) | (outVec == NULL) | (inVec == NULL) | (sd == NULL) |
642 <                        (randX < .0) | (randX >= 1.))
642 >                        (randX < 0) | (randX >= 1.))
643                  return SDEargument;
644                                          /* whose side are we on? */
645 <        inFront = (inVec[2] > .0);
645 >        inFront = (inVec[2] > 0);
646                                          /* remember diffuse portions */
647          if (inFront) {
648                  *sv = sd->rLambFront;
# Line 735 | Line 740 | SDcompXform(RREAL vMtx[3][3], const FVECT sNrm, const
740          if ((vMtx == NULL) | (sNrm == NULL) | (uVec == NULL))
741                  return SDEargument;
742          VCOPY(vMtx[2], sNrm);
743 <        if (normalize(vMtx[2]) == .0)
743 >        if (normalize(vMtx[2]) == 0)
744                  return SDEargument;
745          fcross(vMtx[0], uVec, vMtx[2]);
746 <        if (normalize(vMtx[0]) == .0)
746 >        if (normalize(vMtx[0]) == 0)
747                  return SDEargument;
748          fcross(vMtx[1], vMtx[2], vMtx[0]);
749          return SDEnone;
# Line 758 | Line 763 | SDinvXform(RREAL iMtx[3][3], RREAL vMtx[3][3])
763          mTmp[0][1] = vMtx[2][1]*vMtx[0][2] - vMtx[2][2]*vMtx[0][1];
764          mTmp[0][2] = vMtx[1][2]*vMtx[0][1] - vMtx[1][1]*vMtx[0][2];
765          d = vMtx[0][0]*mTmp[0][0] + vMtx[1][0]*mTmp[0][1] + vMtx[2][0]*mTmp[0][2];
766 <        if (d == .0) {
766 >        if (d == 0) {
767                  strcpy(SDerrorDetail, "Zero determinant in matrix inversion");
768                  return SDEargument;
769          }
# Line 785 | Line 790 | SDmapDir(FVECT resVec, RREAL vMtx[3][3], const FVECT i
790          if (vMtx == NULL) {             /* assume they just want to normalize */
791                  if (resVec != inpVec)
792                          VCOPY(resVec, inpVec);
793 <                return (normalize(resVec) > .0) ? SDEnone : SDEargument;
793 >                return (normalize(resVec) > 0) ? SDEnone : SDEargument;
794          }
795          vTmp[0] = DOT(vMtx[0], inpVec);
796          vTmp[1] = DOT(vMtx[1], inpVec);
797          vTmp[2] = DOT(vMtx[2], inpVec);
798 <        if (normalize(vTmp) == .0)
798 >        if (normalize(vTmp) == 0)
799                  return SDEargument;
800          VCOPY(resVec, vTmp);
801          return SDEnone;
# Line 862 | Line 867 | static int     nabases = 3;    /* current number of defined b
867   static int
868   fequal(double a, double b)
869   {
870 <        if (b != .0)
870 >        if (b != 0)
871                  a = a/b - 1.;
872          return((a <= 1e-6) & (a >= -1e-6));
873   }
# Line 1180 | Line 1185 | check_bsdf_data(       /* check that BSDF data is sane */
1185          hemi_total = .0;
1186          for (i = dp->ninc; i--; ) {
1187                  dom = getBSDF_incohm(dp,i);
1188 <                if (dom <= .0) {
1188 >                if (dom <= 0) {
1189                          error(WARNING, "zero/negative incoming solid angle");
1190                          continue;
1191                  }
# Line 1203 | Line 1208 | check_bsdf_data(       /* check that BSDF data is sane */
1208          hemi_total = .0;
1209          for (o = dp->nout; o--; ) {
1210                  dom = getBSDF_outohm(dp,o);
1211 <                if (dom <= .0) {
1211 >                if (dom <= 0) {
1212                          error(WARNING, "zero/negative outgoing solid angle");
1213                          continue;
1214                  }
# Line 1227 | Line 1232 | check_bsdf_data(       /* check that BSDF data is sane */
1232                  hemi_total = .0;
1233                  for (o = dp->nout; o--; ) {
1234                          double  f = BSDF_value(dp,i,o);
1235 <                        if (f >= .0)
1235 >                        if (f >= 0)
1236                                  hemi_total += f*omega_oarr[o];
1237                          else {
1238                                  nneg += (f < -FTINY);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines