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

Comparing ray/src/common/bsdf.h (file contents):
Revision 2.11 by greg, Tue Apr 19 21:31:22 2011 UTC vs.
Revision 2.29 by greg, Tue Dec 7 23:49:50 2021 UTC

# Line 14 | Line 14
14   *      in the +Z direction, towards the interior of the space rather
15   *      than the exterior.
16   *
17 < *  BSDF vectors always oriented away from surface, even when "incident."
17 > *  BSDF incident & exiting vectors are always oriented away from surface.
18   *
19   *  Created by Greg Ward on 1/10/11.
20   *
# Line 25 | Line 25
25  
26   #include "fvect.h"
27   #include "ccolor.h"
28 + #include "platform.h"
29  
30   #ifdef __cplusplus
31   extern "C" {
# Line 54 | Line 55 | extern "C" {
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 */
# Line 67 | Line 71 | typedef struct {
71   } SDValue;
72  
73   /* Cached, encoded, cumulative distribution for one incident (solid) angle */
74 < #define SD_CDIST_BASE   double          cTotal; \
75 <                        struct SDCDst_s *next
74 > #define SD_CDIST_BASE(styp)     double          cTotal; \
75 >                                struct styp     *next
76   typedef struct SDCDst_s {
77 <        SD_CDIST_BASE;                  /* base fields first */
77 >        SD_CDIST_BASE(SDCDst_s);        /* base fields first */
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, const void *dist);
89 >        int             (*getBSDFs)(float coef[SDmaxCh], const FVECT inVec,
90 >                                    const FVECT outVec, SDComponent *sdc);
91                                          /* query non-diffuse PSA for vector */
92          SDError         (*queryProjSA)(double *psa, const FVECT v1,
93                                                  const RREAL *v2, int qflags,
94 <                                                const void *dist);
94 >                                                SDComponent *sdc);
95                                          /* get cumulative distribution */
96          const SDCDst    *(*getCDist)(const FVECT inVec, SDComponent *sdc);
97                                          /* sample cumulative distribution */
98 <        SDError         (*sampCDist)(FVECT outVec, double randX,
98 >        SDError         (*sampCDist)(FVECT ioVec, double randX,
99                                                  const SDCDst *cdp);
100                                          /* free a spectral BSDF component */
101          void            (*freeSC)(void *dist);
# Line 98 | Line 104 | typedef const struct {
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   };
# Line 113 | Line 119 | typedef struct {
119  
120   /* Loaded BSDF data */
121   typedef struct {
122 <        char            name[SDnameLn]; /* BSDF name (derived from file) */
122 >        char            name[SDnameLn]; /* BSDF name (usu. derived from file) */
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 */
129 >        SDValue         tLambFront;     /* diffuse front transmittance */
130 >        SDValue         tLambBack;      /* diffuse back transmittance */
131 >        SDSpectralDF    *rf, *rb;       /* non-diffuse BRDF components */
132 >        SDSpectralDF    *tf, *tb;       /* non-diffuse BTDF components */
133   } SDData;
134  
135   /* List of loaded BSDFs */
# Line 130 | Line 140 | extern struct SDCache_s {
140                          *next;
141   } *SDcacheList;         /* Global BSDF cache */
142  
143 < /* BSDF cache retention preference */
144 < #define SDretainNone    0               /* free unreferenced data (default) */
145 < #define SDretainBSDFs   1               /* keep loaded BSDFs in cache */
143 > /* BSDF cache retention policies */
144 > #define SDretainNone    0               /* free unreferenced BSDF data */
145 > #define SDretainBSDFs   1               /* keep loaded BSDFs in memory */
146   #define SDretainAll     2               /* also keep cumulative cache data */
147  
148 < extern int              SDretainSet;    /* set to SDretainNone by default */
148 > extern int              SDretainSet;    /* =SDretainNone by default */
149 > extern unsigned long    SDmaxCache;     /* =0 (unlimited) by default */
150  
151   /*****************************************************************
152   * The following routines are less commonly used by applications.
# Line 143 | Line 154 | extern int             SDretainSet;    /* set to SDretainNone by def
154  
155   #define SDisLoaded(sd)  ((sd)->rLambFront.spec.flags != 0)
156  
157 < /* Report an error to the indicated stream (in English) */
158 < extern SDError          SDreportEnglish(SDError ec, FILE *fp);
157 > /* Report an error to the indicated stream */
158 > extern SDError          SDreportError(SDError ec, FILE *fp);
159  
160   /* Shorten file path to useable BSDF name, removing suffix */
161   extern void             SDclipName(char res[SDnameLn], const char *fname);
# Line 152 | Line 163 | extern void            SDclipName(char res[SDnameLn], const char
163   /* Allocate new spectral distribution function */
164   extern SDSpectralDF     *SDnewSpectralDF(int nc);
165  
166 + /* Add component(s) to spectral distribution function */
167 + extern SDSpectralDF     *SDaddComponent(SDSpectralDF *odf, int nadd);
168 +
169   /* Free a spectral distribution function */
170   extern void             SDfreeSpectralDF(SDSpectralDF *df);
171  
# Line 171 | Line 185 | extern SDData          *SDgetCache(const char *bname);
185   extern void             SDfreeCumulativeCache(SDSpectralDF *df);
186  
187   /* Sample an individual BSDF component */
188 < extern SDError          SDsampComponent(SDValue *sv, FVECT outVec,
189 <                                        const FVECT inVec, double randX,
176 <                                        SDComponent *sdc);
188 > extern SDError          SDsampComponent(SDValue *sv, FVECT ioVec,
189 >                                        double randX, SDComponent *sdc);
190  
191   /* Convert 1-dimensional random variable to N-dimensional */
192   extern void             SDmultiSamp(double t[], int n, double randX);
193  
194   /* Map a [0,1]^2 square to a unit radius disk */
195 < void                    SDsquare2disk(double ds[2], double seedx, double seedy);
195 > extern void             SDsquare2disk(double ds[2], double seedx, double seedy);
196  
197   /* Map point on unit disk to a unit square in [0,1]^2 range */
198 < void                    SDdisk2square(double sq[2], double diskx, double disky);
198 > extern void             SDdisk2square(double sq[2], double diskx, double disky);
199  
200   /*****************************************************************
201   * The calls below are the ones most applications require.
# Line 190 | Line 203 | void                   SDdisk2square(double sq[2], double diskx, doubl
203   */
204  
205   /* Get BSDF from cache (or load and cache it on first call) */
206 < /* Report any problems to stderr and return NULL on failure */
206 > /* Report any problems to stderr, return NULL on failure */
207   extern const SDData     *SDcacheFile(const char *fname);
208  
209 < /* Free a BSDF from our cache (clear all if NULL) */
209 > /* Free a BSDF from our cache (clear all if sd==NULL) */
210   extern void             SDfreeCache(const SDData *sd);
211  
212   /* Query projected solid angle resolution for non-diffuse BSDF direction(s) */
# Line 202 | Line 215 | extern SDError         SDsizeBSDF(double *projSA, const FVECT
215                                          const SDData *sd);
216  
217   /* Return BSDF for the given incident and scattered ray vectors */
218 < extern SDError          SDevalBSDF(SDValue *sv, const FVECT outVec,
219 <                                        const FVECT inVec, const SDData *sd);
218 > extern SDError          SDevalBSDF(SDValue *sv, const FVECT inVec,
219 >                                        const FVECT outVec, const SDData *sd);
220  
221   /* Compute directional hemispherical scattering at given incident angle */
222   extern double           SDdirectHemi(const FVECT inVec,
223                                          int sflags, const SDData *sd);
224  
225   /* Sample BSDF direction based on the given random variable */
226 < extern SDError          SDsampBSDF(SDValue *sv, FVECT outVec,
214 <                                        const FVECT inVec, double randX,
226 > extern SDError          SDsampBSDF(SDValue *sv, FVECT ioVec, double randX,
227                                          int sflags, const SDData *sd);
228  
229   /*****************************************************************
# Line 219 | Line 231 | extern SDError         SDsampBSDF(SDValue *sv, FVECT outVec,
231   * Directions may be passed unnormalized to these routines.
232   */
233  
234 < /* Compute World->BSDF transform from surface normal and up (Y) vector */
234 > /* Compute World->BSDF transform from surface normal and BSDF up vector */
235   extern SDError          SDcompXform(RREAL vMtx[3][3], const FVECT sNrm,
236                                          const FVECT uVec);
237  
# Line 230 | Line 242 | extern SDError         SDinvXform(RREAL iMtx[3][3], RREAL vMt
242   extern SDError          SDmapDir(FVECT resVec, RREAL vMtx[3][3],
243                                          const FVECT inpVec);
244  
245 < /* System-specific BSDF loading routine (not part of our library) */
245 > /* Application-specific BSDF loading routine (not part of our library) */
246   extern SDData           *loadBSDF(char *name);
247  
248 < /* System-specific BSDF error translator (not part of our library) */
248 > /* Application-specific BSDF error translator (not part of our library) */
249   extern char             *transSDError(SDError ec);
238
239 /*################################################################*/
240 /*######### DEPRECATED DEFINITIONS AWAITING PERMANENT REMOVAL #######*/
241 /*
242 * Header for BSDF i/o and access routines
243 */
244
245 #include "mat4.h"
246                                /* up directions */
247 typedef enum {
248        UDzneg=-3,
249        UDyneg=-2,
250        UDxneg=-1,
251        UDunknown=0,
252        UDxpos=1,
253        UDypos=2,
254        UDzpos=3
255 } UpDir;
256                                /* BSDF coordinate calculation routines */
257                                /* vectors always point away from surface */
258
259 typedef int     b_vecf2(FVECT v, int n, void *cd);
260 typedef int     b_ndxf2(FVECT v, void *cd);
261 typedef double  b_radf2(int n, void *cd);
262
263 /* Bidirectional Scattering Distribution Function */
264 struct BSDF_data {
265        int     ninc;                   /* number of incoming directions */
266        int     nout;                   /* number of outgoing directions */
267        float   dim[3];                 /* width, height, thickness (meters) */
268        char    *mgf;                   /* geometric description (if any) */
269        void    *ib_priv;               /* input basis private data */
270        b_vecf2 *ib_vec;                /* get input vector from index */
271        b_ndxf2 *ib_ndx;                /* get input index from vector */
272        b_radf2 *ib_ohm;                /* get input radius for index */
273        void    *ob_priv;               /* output basis private data */
274        b_vecf2 *ob_vec;                /* get output vector from index */
275        b_ndxf2 *ob_ndx;                /* get output index from vector */
276        b_radf2 *ob_ohm;                /* get output radius for index */
277        float   *bsdf;                  /* scattering distribution data */
278 };                              /* bidirectional scattering distrib. func. */
279
280 #define getBSDF_incvec(v,b,i)   (*(b)->ib_vec)(v,i,(b)->ib_priv)
281 #define getBSDF_incndx(b,v)     (*(b)->ib_ndx)(v,(b)->ib_priv)
282 #define getBSDF_incohm(b,i)     (*(b)->ib_ohm)(i,(b)->ib_priv)
283 #define getBSDF_outvec(v,b,o)   (*(b)->ob_vec)(v,o,(b)->ob_priv)
284 #define getBSDF_outndx(b,v)     (*(b)->ob_ndx)(v,(b)->ob_priv)
285 #define getBSDF_outohm(b,o)     (*(b)->ob_ohm)(o,(b)->ob_priv)
286 #define BSDF_value(b,i,o)       (b)->bsdf[(o)*(b)->ninc + (i)]
287
288 extern struct BSDF_data *load_BSDF(char *fname);
289 extern void free_BSDF(struct BSDF_data *b);
290 extern int r_BSDF_incvec(FVECT v, struct BSDF_data *b, int i,
291                                double rv, MAT4 xm);
292 extern int r_BSDF_outvec(FVECT v, struct BSDF_data *b, int o,
293                                double rv, MAT4 xm);
294 extern int getBSDF_xfm(MAT4 xm, FVECT nrm, UpDir ud, char *xfbuf);
295
296 /*######### END DEPRECATED DEFINITIONS #######*/
297 /*################################################################*/
250  
251   #ifdef __cplusplus
252   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines