| 25 |  |  | 
| 26 |  | #include "fvect.h" | 
| 27 |  | #include "ccolor.h" | 
| 28 | + | #include "platform.h" | 
| 29 |  |  | 
| 30 |  | #ifdef __cplusplus | 
| 31 |  | extern "C" { | 
| 32 |  | #endif | 
| 33 |  |  | 
| 33 | – | #ifdef _WIN32 | 
| 34 | – | #define strcasecmp      stricmp | 
| 35 | – | #endif | 
| 36 | – |  | 
| 34 |  | #define SDnameLn        128             /* maximum BSDF name length */ | 
| 35 |  | #define SDmaxCh         3               /* maximum # spectral channels */ | 
| 36 |  |  | 
| 55 |  | typedef enum {SDEnone=0, SDEmemory, SDEfile, SDEformat, SDEargument, | 
| 56 |  | SDEdata, SDEsupport, SDEinternal, SDEunknown} SDError; | 
| 57 |  |  | 
| 58 | < | /* English ASCII strings corresponding to ennumerated errors */ | 
| 58 | > | /* English strings corresponding to ennumerated errors */ | 
| 59 |  | extern const char       *SDerrorEnglish[]; | 
| 60 |  |  | 
| 61 | < | /* Additional information on last error (ASCII English) */ | 
| 61 | > | /* Pointer to error list in preferred language */ | 
| 62 | > | extern const char       **SDerrorList; | 
| 63 | > |  | 
| 64 | > | /* Additional information on last error (generally in English) */ | 
| 65 |  | extern char             SDerrorDetail[]; | 
| 66 |  |  | 
| 67 |  | /* Holder for BSDF value and spectral color */ | 
| 78 |  | /* ...encoded distribution extends struct */ | 
| 79 |  | } SDCDst; | 
| 80 |  |  | 
| 81 | + | extern const SDCDst     SDemptyCD;      /* empty distribution */ | 
| 82 | + |  | 
| 83 |  | /* Forward declaration of BSDF component */ | 
| 84 |  | typedef struct SDComp_s SDComponent; | 
| 85 |  |  | 
| 86 |  | /* Methods needed to handle BSDF components (nothing is optional) */ | 
| 87 | < | typedef const struct { | 
| 87 | > | typedef struct { | 
| 88 |  | /* return non-diffuse BSDF */ | 
| 89 |  | int             (*getBSDFs)(float coef[SDmaxCh], const FVECT outVec, | 
| 90 |  | const FVECT inVec, SDComponent *sdc); | 
| 104 |  | /* Structure to hold a spectral BSDF component (typedef SDComponent above) */ | 
| 105 |  | struct SDComp_s { | 
| 106 |  | C_COLOR         cspec[SDmaxCh]; /* component spectral bases */ | 
| 107 | < | SDFunc          *func;          /* methods for this component */ | 
| 107 | > | const SDFunc    *func;          /* methods for this component */ | 
| 108 |  | void            *dist;          /* loaded distribution data */ | 
| 109 |  | SDCDst          *cdList;        /* cumulative distribution cache */ | 
| 110 |  | }; | 
| 123 |  | char            matn[SDnameLn]; /* material name */ | 
| 124 |  | char            makr[SDnameLn]; /* manufacturer */ | 
| 125 |  | char            *mgf;           /* geometric description (if any) */ | 
| 126 | < | float           dim[3];         /* width, height, thickness (meters) */ | 
| 126 | > | double          dim[3];         /* width, height, thickness (meters) */ | 
| 127 |  | SDValue         rLambFront;     /* diffuse front reflectance */ | 
| 128 |  | SDValue         rLambBack;      /* diffuse rear reflectance */ | 
| 129 |  | SDValue         tLamb;          /* diffuse transmission */ | 
| 130 | < | SDSpectralDF    *rf, *rb, *tf;  /* non-diffuse BSDF components */ | 
| 130 | > | SDSpectralDF    *rf, *rb;       /* non-diffuse BRDF components */ | 
| 131 | > | SDSpectralDF    *tf, *tb;       /* non-diffuse BTDF components */ | 
| 132 |  | } SDData; | 
| 133 |  |  | 
| 134 |  | /* List of loaded BSDFs */ | 
| 152 |  |  | 
| 153 |  | #define SDisLoaded(sd)  ((sd)->rLambFront.spec.flags != 0) | 
| 154 |  |  | 
| 155 | < | /* Report an error to the indicated stream (in English) */ | 
| 156 | < | extern SDError          SDreportEnglish(SDError ec, FILE *fp); | 
| 155 | > | /* Report an error to the indicated stream */ | 
| 156 | > | extern SDError          SDreportError(SDError ec, FILE *fp); | 
| 157 |  |  | 
| 158 |  | /* Shorten file path to useable BSDF name, removing suffix */ | 
| 159 |  | extern void             SDclipName(char res[SDnameLn], const char *fname); | 
| 190 |  | extern void             SDmultiSamp(double t[], int n, double randX); | 
| 191 |  |  | 
| 192 |  | /* Map a [0,1]^2 square to a unit radius disk */ | 
| 193 | < | void                    SDsquare2disk(double ds[2], double seedx, double seedy); | 
| 193 | > | extern void             SDsquare2disk(double ds[2], double seedx, double seedy); | 
| 194 |  |  | 
| 195 |  | /* Map point on unit disk to a unit square in [0,1]^2 range */ | 
| 196 | < | void                    SDdisk2square(double sq[2], double diskx, double disky); | 
| 196 | > | extern void             SDdisk2square(double sq[2], double diskx, double disky); | 
| 197 |  |  | 
| 198 |  | /***************************************************************** | 
| 199 |  | * The calls below are the ones most applications require. | 
| 201 |  | */ | 
| 202 |  |  | 
| 203 |  | /* Get BSDF from cache (or load and cache it on first call) */ | 
| 204 | < | /* Report any problems to stderr (in English), return NULL on failure */ | 
| 204 | > | /* Report any problems to stderr, return NULL on failure */ | 
| 205 |  | extern const SDData     *SDcacheFile(const char *fname); | 
| 206 |  |  | 
| 207 |  | /* Free a BSDF from our cache (clear all if sd==NULL) */ | 
| 245 |  |  | 
| 246 |  | /* Application-specific BSDF error translator (not part of our library) */ | 
| 247 |  | extern char             *transSDError(SDError ec); | 
| 245 | – |  | 
| 246 | – | /*################################################################*/ | 
| 247 | – | /*######### DEPRECATED DEFINITIONS AWAITING PERMANENT REMOVAL #######*/ | 
| 248 | – | /* | 
| 249 | – | * Header for BSDF i/o and access routines | 
| 250 | – | */ | 
| 251 | – |  | 
| 252 | – | #include "mat4.h" | 
| 253 | – | /* up directions */ | 
| 254 | – | typedef enum { | 
| 255 | – | UDzneg=-3, | 
| 256 | – | UDyneg=-2, | 
| 257 | – | UDxneg=-1, | 
| 258 | – | UDunknown=0, | 
| 259 | – | UDxpos=1, | 
| 260 | – | UDypos=2, | 
| 261 | – | UDzpos=3 | 
| 262 | – | } UpDir; | 
| 263 | – | /* BSDF coordinate calculation routines */ | 
| 264 | – | /* vectors always point away from surface */ | 
| 265 | – |  | 
| 266 | – | typedef int     b_vecf2(FVECT v, int n, void *cd); | 
| 267 | – | typedef int     b_ndxf2(FVECT v, void *cd); | 
| 268 | – | typedef double  b_radf2(int n, void *cd); | 
| 269 | – |  | 
| 270 | – | /* Bidirectional Scattering Distribution Function */ | 
| 271 | – | struct BSDF_data { | 
| 272 | – | int     ninc;                   /* number of incoming directions */ | 
| 273 | – | int     nout;                   /* number of outgoing directions */ | 
| 274 | – | float   dim[3];                 /* width, height, thickness (meters) */ | 
| 275 | – | char    *mgf;                   /* geometric description (if any) */ | 
| 276 | – | void    *ib_priv;               /* input basis private data */ | 
| 277 | – | b_vecf2 *ib_vec;                /* get input vector from index */ | 
| 278 | – | b_ndxf2 *ib_ndx;                /* get input index from vector */ | 
| 279 | – | b_radf2 *ib_ohm;                /* get input radius for index */ | 
| 280 | – | void    *ob_priv;               /* output basis private data */ | 
| 281 | – | b_vecf2 *ob_vec;                /* get output vector from index */ | 
| 282 | – | b_ndxf2 *ob_ndx;                /* get output index from vector */ | 
| 283 | – | b_radf2 *ob_ohm;                /* get output radius for index */ | 
| 284 | – | float   *bsdf;                  /* scattering distribution data */ | 
| 285 | – | };                              /* bidirectional scattering distrib. func. */ | 
| 286 | – |  | 
| 287 | – | #define getBSDF_incvec(v,b,i)   (*(b)->ib_vec)(v,i,(b)->ib_priv) | 
| 288 | – | #define getBSDF_incndx(b,v)     (*(b)->ib_ndx)(v,(b)->ib_priv) | 
| 289 | – | #define getBSDF_incohm(b,i)     (*(b)->ib_ohm)(i,(b)->ib_priv) | 
| 290 | – | #define getBSDF_outvec(v,b,o)   (*(b)->ob_vec)(v,o,(b)->ob_priv) | 
| 291 | – | #define getBSDF_outndx(b,v)     (*(b)->ob_ndx)(v,(b)->ob_priv) | 
| 292 | – | #define getBSDF_outohm(b,o)     (*(b)->ob_ohm)(o,(b)->ob_priv) | 
| 293 | – | #define BSDF_value(b,i,o)       (b)->bsdf[(o)*(b)->ninc + (i)] | 
| 294 | – |  | 
| 295 | – | extern struct BSDF_data *load_BSDF(char *fname); | 
| 296 | – | extern void free_BSDF(struct BSDF_data *b); | 
| 297 | – | extern int r_BSDF_incvec(FVECT v, struct BSDF_data *b, int i, | 
| 298 | – | double rv, MAT4 xm); | 
| 299 | – | extern int r_BSDF_outvec(FVECT v, struct BSDF_data *b, int o, | 
| 300 | – | double rv, MAT4 xm); | 
| 301 | – | extern int getBSDF_xfm(MAT4 xm, FVECT nrm, UpDir ud, char *xfbuf); | 
| 302 | – |  | 
| 303 | – | /*######### END DEPRECATED DEFINITIONS #######*/ | 
| 304 | – | /*################################################################*/ | 
| 248 |  |  | 
| 249 |  | #ifdef __cplusplus | 
| 250 |  | } |