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.15 by greg, Wed Apr 27 20:03:25 2011 UTC vs.
Revision 3.24 by greg, Mon Sep 10 18:06:08 2012 UTC

# Line 11 | Line 11 | static const char RCSid[] = "$Id$";
11   *
12   */
13  
14 + #define _USE_MATH_DEFINES
15   #include "rtio.h"
16   #include <stdlib.h>
17   #include <math.h>
# Line 45 | Line 46 | typedef struct {
46   static ANGLE_BASIS      abase_list[MAXABASES] = {
47          {
48                  "LBNL/Klems Full", 145,
49 <                { {-5., 1},
49 >                { {0., 1},
50                  {5., 8},
51                  {15., 16},
52                  {25., 20},
# Line 57 | Line 58 | static ANGLE_BASIS     abase_list[MAXABASES] = {
58                  {90., 0} }
59          }, {
60                  "LBNL/Klems Half", 73,
61 <                { {-6.5, 1},
61 >                { {0., 1},
62                  {6.5, 8},
63                  {19.5, 12},
64                  {32.5, 16},
# Line 67 | Line 68 | static ANGLE_BASIS     abase_list[MAXABASES] = {
68                  {90., 0} }
69          }, {
70                  "LBNL/Klems Quarter", 41,
71 <                { {-9., 1},
71 >                { {0., 1},
72                  {9., 8},
73                  {27., 12},
74                  {46., 12},
# Line 86 | Line 87 | fequal(double a, double b)
87          return (a <= 1e-6) & (a >= -1e-6);
88   }
89  
89 /* Returns the name of the given tag */
90 #ifdef ezxml_name
91 #undef ezxml_name
92 static char *
93 ezxml_name(ezxml_t xml)
94 {
95        if (xml == NULL)
96                return NULL;
97        return xml->name;
98 }
99 #endif
100
90   /* Returns the given tag's character content or empty string if none */
91   #ifdef ezxml_txt
92   #undef ezxml_txt
# Line 189 | Line 178 | fo_getndx(const FVECT v, void *p)
178   {
179          ANGLE_BASIS     *ab = (ANGLE_BASIS *)p;
180          int     li, ndx;
181 <        double  pol, azi, d;
181 >        double  pol, azi;
182  
183          if (v == NULL)
184                  return -1;
# Line 229 | Line 218 | io_getohm(int ndx, void *p)
218          if (li == last_li)                      /* cached latitude? */
219                  return last_ohm;
220          last_li = li;
232        theta1 = M_PI/180. * ab->lat[li+1].tmin;
233        if (ab->lat[li].nphis == 1)             /* special case */
234                return last_ohm = M_PI*(1. - sq(cos(theta1)));
221          theta = M_PI/180. * ab->lat[li].tmin;
222 +        theta1 = M_PI/180. * ab->lat[li+1].tmin;
223          return last_ohm = M_PI*(sq(cos(theta)) - sq(cos(theta1))) /
224                                  (double)ab->lat[li].nphis;
225   }
# Line 346 | Line 333 | load_angle_basis(ezxml_t wab)
333                                  ezxml_child(ezxml_child(wbb,
334                                          "ThetaBounds"), "UpperTheta")));
335                  if (!i)
336 <                        abase_list[nabases].lat[i].tmin =
350 <                                        -abase_list[nabases].lat[i+1].tmin;
336 >                        abase_list[nabases].lat[0].tmin = 0;
337                  else if (!fequal(atof(ezxml_txt(ezxml_child(ezxml_child(wbb,
338                                          "ThetaBounds"), "LowerTheta"))),
339                                  abase_list[nabases].lat[i].tmin)) {
# Line 413 | Line 399 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
399          SDSpectralDF    *df;
400          SDMat           *dp;
401          char            *sdata;
416        int             tfront;
402          int             inbi, outbi;
403          int             i;
404                                          /* allocate BSDF component */
# Line 422 | Line 407 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
407                  return RC_FAIL;
408          /*
409           * Remember that front and back are reversed from WINDOW 6 orientations
425         * Favor their "Front" (incoming light) since that's more often valid
410           */
411 <        tfront = !strcasecmp(sdata, "Transmission Back");
412 <        if (!strcasecmp(sdata, "Transmission Front") ||
413 <                        tfront & (sd->tf == NULL)) {
411 >        if (!strcasecmp(sdata, "Transmission Front")) {
412 >                if (sd->tb != NULL)
413 >                        SDfreeSpectralDF(sd->tb);
414 >                if ((sd->tb = SDnewSpectralDF(1)) == NULL)
415 >                        return RC_MEMERR;
416 >                df = sd->tb;
417 >        } else if (!strcasecmp(sdata, "Transmission Back")) {
418                  if (sd->tf != NULL)
419                          SDfreeSpectralDF(sd->tf);
420                  if ((sd->tf = SDnewSpectralDF(1)) == NULL)
421                          return RC_MEMERR;
422                  df = sd->tf;
423          } else if (!strcasecmp(sdata, "Reflection Front")) {
424 <                if (sd->rb != NULL)     /* note back-front reversal */
424 >                if (sd->rb != NULL)
425                          SDfreeSpectralDF(sd->rb);
426                  if ((sd->rb = SDnewSpectralDF(1)) == NULL)
427                          return RC_MEMERR;
428                  df = sd->rb;
429          } else if (!strcasecmp(sdata, "Reflection Back")) {
430 <                if (sd->rf != NULL)     /* note front-back reversal */
430 >                if (sd->rf != NULL)
431                          SDfreeSpectralDF(sd->rf);
432                  if ((sd->rf = SDnewSpectralDF(1)) == NULL)
433                          return RC_MEMERR;
# Line 481 | Line 469 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
469          dp->ib_priv = &abase_list[inbi];
470          dp->ob_priv = &abase_list[outbi];
471          if (df == sd->tf) {
472 <                if (tfront) {
473 <                        dp->ib_vec = &fi_getvec;
474 <                        dp->ib_ndx = &fi_getndx;
475 <                        dp->ob_vec = &bo_getvec;
476 <                        dp->ob_ndx = &bo_getndx;
477 <                } else {
478 <                        dp->ib_vec = &bi_getvec;
479 <                        dp->ib_ndx = &bi_getndx;
480 <                        dp->ob_vec = &fo_getvec;
493 <                        dp->ob_ndx = &fo_getndx;
494 <                }
472 >                dp->ib_vec = &fi_getvec;
473 >                dp->ib_ndx = &fi_getndx;
474 >                dp->ob_vec = &bo_getvec;
475 >                dp->ob_ndx = &bo_getndx;
476 >        } else if (df == sd->tb) {
477 >                dp->ib_vec = &bi_getvec;
478 >                dp->ib_ndx = &bi_getndx;
479 >                dp->ob_vec = &fo_getvec;
480 >                dp->ob_ndx = &fo_getndx;
481          } else if (df == sd->rf) {
482                  dp->ib_vec = &fi_getvec;
483                  dp->ib_ndx = &fi_getndx;
# Line 528 | Line 514 | load_bsdf_data(SDData *sd, ezxml_t wdb, int rowinc)
514                  if (*sdnext == ',') sdnext++;
515                  if (rowinc) {
516                          int     r = i/dp->nout;
517 <                        int     c = i - c*dp->nout;
517 >                        int     c = i - r*dp->nout;
518                          mBSDF_value(dp,r,c) = atof(sdata);
519                  } else
520                          dp->bsdf[i] = atof(sdata);
# Line 609 | Line 595 | SDloadMtx(SDData *sd, ezxml_t wtl)
595                                  sd->name);
596                  return SDEsupport;
597          }
598 <                                        /* get angle basis */
599 <        rval = load_angle_basis(ezxml_child(ezxml_child(wtl,
600 <                                "DataDefinition"), "AngleBasis"));
601 <        if (rval < 0)
602 <                return convert_errcode(rval);
598 >                                        /* get angle bases */
599 >        for (wld = ezxml_child(ezxml_child(wtl, "DataDefinition"), "AngleBasis");
600 >                                wld != NULL; wld = wld->next) {
601 >                rval = load_angle_basis(wld);
602 >                if (rval < 0)
603 >                        return convert_errcode(rval);
604 >        }
605                                          /* load BSDF components */
606          for (wld = ezxml_child(wtl, "WavelengthData");
607                                  wld != NULL; wld = wld->next) {
# Line 628 | Line 616 | SDloadMtx(SDData *sd, ezxml_t wtl)
616                                          /* separate diffuse components */
617          extract_diffuse(&sd->rLambFront, sd->rf);
618          extract_diffuse(&sd->rLambBack, sd->rb);
619 <        extract_diffuse(&sd->tLamb, sd->tf);
619 >        extract_diffuse(&sd->tLamb, (sd->tf != NULL) ? sd->tf : sd->tb);
620                                          /* return success */
621          return SDEnone;
622   }
# Line 768 | Line 756 | SDgetMtxCDist(const FVECT inVec, SDComponent *sdc)
756          }
757          cdlast = NULL;                  /* check for it in cache list */
758          for (cd = (SDMatCDst *)sdc->cdList; cd != NULL;
759 <                                cdlast = cd, cd = (SDMatCDst *)cd->next)
759 >                                        cdlast = cd, cd = cd->next)
760                  if (cd->indx == myCD.indx && (cd->calen == myCD.calen) &
761                                          (cd->ob_priv == myCD.ob_priv) &
762                                          (cd->ob_vec == myCD.ob_vec))
# Line 787 | Line 775 | SDgetMtxCDist(const FVECT inVec, SDComponent *sdc)
775          }
776          if (cdlast != NULL) {           /* move entry to head of cache list */
777                  cdlast->next = cd->next;
778 <                cd->next = sdc->cdList;
778 >                cd->next = (SDMatCDst *)sdc->cdList;
779                  sdc->cdList = (SDCDst *)cd;
780          }
781          return (SDCDst *)cd;            /* ready to go */
# Line 807 | Line 795 | SDsampMtxCDist(FVECT ioVec, double randX, const SDCDst
795                                          /* binary search to find index */
796          ilower = 0; iupper = mcd->calen;
797          while ((i = (iupper + ilower) >> 1) != ilower)
798 <                if ((long)target >= (long)mcd->carr[i])
798 >                if (target >= mcd->carr[i])
799                          ilower = i;
800                  else
801                          iupper = i;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines