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

Comparing ray/src/common/bsdf_m.c (file contents):
Revision 3.13 by greg, Sun Apr 24 20:16:52 2011 UTC vs.
Revision 3.15 by greg, Wed Apr 27 20:03:25 2011 UTC

# Line 418 | Line 418 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
418          int             i;
419                                          /* allocate BSDF component */
420          sdata = ezxml_txt(ezxml_child(wdb, "WavelengthDataDirection"));
421 +        if (!sdata)
422 +                return RC_FAIL;
423          /*
424           * Remember that front and back are reversed from WINDOW 6 orientations
425           * Favor their "Front" (incoming light) since that's more often valid
# Line 507 | Line 509 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
509          df->comp[0].dist = dp;
510          df->comp[0].func = &SDhandleMtx;
511                                          /* read BSDF data */
512 <        sdata = ezxml_txt(ezxml_child(wdb,"ScatteringData"));
512 >        sdata = ezxml_txt(ezxml_child(wdb, "ScatteringData"));
513          if (!sdata || !*sdata) {
514                  sprintf(SDerrorDetail, "Missing BSDF ScatteringData in '%s'",
515                                  sd->name);
# Line 521 | Line 523 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
523                                          sd->name);
524                          return RC_FORMERR;
525                  }
526 <                while (*sdnext && isspace(*sdnext))
526 >                while (isspace(*sdnext))
527                          sdnext++;
528                  if (*sdnext == ',') sdnext++;
529                  if (rowinc) {
# Line 546 | Line 548 | subtract_min(SDMat *sm)
548          for (i = n; --i; )
549                  if (sm->bsdf[i] < minv)
550                          minv = sm->bsdf[i];
551 +        
552 +        if (minv <= FTINY)
553 +                return .0;
554 +
555          for (i = n; i--; )
556                  sm->bsdf[i] -= minv;
557  
# Line 571 | Line 577 | extract_diffuse(SDValue *dv, SDSpectralDF *df)
577                  c_cmix(&dv->spec, dv->cieY, &dv->spec, ymin, &df->comp[n].cspec[0]);
578                  dv->cieY += ymin;
579          }
580 <        df->maxHemi -= dv->cieY;        /* adjust minimum hemispherical */
580 >        df->maxHemi -= dv->cieY;        /* adjust maximum hemispherical */
581                                          /* make sure everything is set */
582          c_ccvt(&dv->spec, C_CSXY+C_CSSPEC);
583   }
# Line 580 | Line 586 | extract_diffuse(SDValue *dv, SDSpectralDF *df)
586   SDError
587   SDloadMtx(SDData *sd, ezxml_t wtl)
588   {
589 <        ezxml_t                 wld, wdb;
590 <        int                     rowIn;
591 <        struct BSDF_data        *dp;
592 <        char                    *txt;
593 <        int                     rval;
588 <        
589 >        ezxml_t         wld, wdb;
590 >        int             rowIn;
591 >        char            *txt;
592 >        int             rval;
593 >                                        /* basic checks and data ordering */
594          txt = ezxml_txt(ezxml_child(ezxml_child(wtl,
595                          "DataDefinition"), "IncidentDataStructure"));
596          if (txt == NULL || !*txt) {
# Line 604 | Line 609 | SDloadMtx(SDData *sd, ezxml_t wtl)
609                                  sd->name);
610                  return SDEsupport;
611          }
612 <                                /* get angle basis */
612 >                                        /* get angle basis */
613          rval = load_angle_basis(ezxml_child(ezxml_child(wtl,
614                                  "DataDefinition"), "AngleBasis"));
615          if (rval < 0)
616                  return convert_errcode(rval);
617 <                                /* load BSDF components */
617 >                                        /* load BSDF components */
618          for (wld = ezxml_child(wtl, "WavelengthData");
619                                  wld != NULL; wld = wld->next) {
620                  if (strcasecmp(ezxml_txt(ezxml_child(wld,"Wavelength")),
# Line 620 | Line 625 | SDloadMtx(SDData *sd, ezxml_t wtl)
625                          if ((rval = load_bsdf_data(sd, wdb, rowIn)) < 0)
626                                  return convert_errcode(rval);
627          }
628 <                                /* separate diffuse components */
628 >                                        /* separate diffuse components */
629          extract_diffuse(&sd->rLambFront, sd->rf);
630          extract_diffuse(&sd->rLambBack, sd->rb);
631          extract_diffuse(&sd->tLamb, sd->tf);
632 <                                /* return success */
632 >                                        /* return success */
633          return SDEnone;
634   }
635  
# Line 687 | Line 692 | SDqueryMtxProjSA(double *psa, const FVECT v1, const RR
692                  if (out_psa > psa[1])
693                          psa[1] = out_psa;
694                  /* fall through */
690        case SDqueryMin:
695          case SDqueryVal:
696                  if (qflags == SDqueryVal)
697                          psa[0] = M_PI;
698 +                /* fall through */
699 +        case SDqueryMin:
700                  if ((inc_psa > 0) & (inc_psa < psa[0]))
701                          psa[0] = inc_psa;
702                  if ((out_psa > 0) & (out_psa < psa[0]))
# Line 761 | Line 767 | SDgetMtxCDist(const FVECT inVec, SDComponent *sdc)
767                  reverse = 1;
768          }
769          cdlast = NULL;                  /* check for it in cache list */
770 <        for (cd = (SDMatCDst *)sdc->cdList;
771 <                                cd != NULL; cd = (SDMatCDst *)cd->next) {
770 >        for (cd = (SDMatCDst *)sdc->cdList; cd != NULL;
771 >                                cdlast = cd, cd = (SDMatCDst *)cd->next)
772                  if (cd->indx == myCD.indx && (cd->calen == myCD.calen) &
773                                          (cd->ob_priv == myCD.ob_priv) &
774                                          (cd->ob_vec == myCD.ob_vec))
775                          break;
770                cdlast = cd;
771        }
776          if (cd == NULL) {               /* need to allocate new entry */
777                  cd = (SDMatCDst *)malloc(sizeof(SDMatCDst) +
778 <                                        myCD.calen*sizeof(myCD.carr[0]));
778 >                                        sizeof(myCD.carr[0])*myCD.calen);
779                  if (cd == NULL)
780                          return NULL;
781                  *cd = myCD;             /* compute cumulative distribution */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines