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.2 by greg, Mon Jun 14 22:02:22 2010 UTC vs.
Revision 2.19 by greg, Sun Sep 2 15:33:15 2012 UTC

# Line 1 | Line 1
1   /* RCSid $Id$ */
2   /*
3 + *  bsdf.h
4 + *  
5 + *  Declarations for bidirectional scattering distribution functions.
6 + *  Assumes <stdio.h> already included.
7 + *
8 + *  A material is oriented in right-hand coordinate system with X-axis
9 + *      in the surface plane pointed to the right as seen from the front.
10 + *      This means the Y-axis is "up" and the Z-axis is the surface normal.
11 + *
12 + *  Note that we reverse the identification of "front" and "back" from
13 + *      the conventions used in WINDOW 6.  "Front" in our library points
14 + *      in the +Z direction, towards the interior of the space rather
15 + *      than the exterior.
16 + *
17 + *  BSDF incident & exiting vectors are always oriented away from surface.
18 + *
19 + *  Created by Greg Ward on 1/10/11.
20 + *
21 + */
22 +
23 + #ifndef _BSDF_H_
24 + #define _BSDF_H_
25 +
26 + #include "fvect.h"
27 + #include "ccolor.h"
28 +
29 + #ifdef __cplusplus
30 + extern "C" {
31 + #endif
32 +
33 + #ifdef _WIN32
34 + #define strcasecmp      stricmp
35 + #endif
36 +
37 + #define SDnameLn        128             /* maximum BSDF name length */
38 + #define SDmaxCh         3               /* maximum # spectral channels */
39 +
40 + /* Component flags for SDsampBSDF() and SDdirectHemi() */
41 + #define SDsampR         0x1             /* include reflection */
42 + #define SDsampT         0x2             /* include transmission */
43 + #define SDsampS         0x3             /* include scattering (R+T) */
44 + #define SDsampSp        0x4             /* include non-diffuse portion */
45 + #define SDsampDf        0x8             /* include diffuse portion */
46 + #define SDsampSpR       0x5             /* include non-diffuse reflection */
47 + #define SDsampSpT       0x6             /* include non-diffuse transmission */
48 + #define SDsampSpS       0x7             /* include non-diffuse scattering */
49 + #define SDsampAll       0xF             /* include everything */
50 +
51 + /* Projected solid angle query flags for SDsizeBSDF() */
52 + #define SDqueryVal      0x0             /* query single value */
53 + #define SDqueryMin      0x1             /* query minimum proj. solid angle */
54 + #define SDqueryMax      0x2             /* query maximum proj. solid angle */
55 +
56 + /* Error codes: normal return, out of memory, file i/o, file format, bad argument,
57 +                 bad data, unsupported feature, internal error, unknown error */
58 + typedef enum {SDEnone=0, SDEmemory, SDEfile, SDEformat, SDEargument,
59 +                SDEdata, SDEsupport, SDEinternal, SDEunknown} SDError;
60 +
61 + /* English ASCII strings corresponding to ennumerated errors */
62 + extern const char       *SDerrorEnglish[];
63 +
64 + /* Additional information on last error (ASCII English) */
65 + extern char             SDerrorDetail[];
66 +
67 + /* Holder for BSDF value and spectral color */
68 + typedef struct {
69 +        double          cieY;           /* photopic BSDF (Y) value */
70 +        C_COLOR         spec;           /* spectral and (x,y) color */
71 + } SDValue;
72 +
73 + /* Cached, encoded, cumulative distribution for one incident (solid) angle */
74 + #define SD_CDIST_BASE(styp)     double          cTotal; \
75 +                                struct styp     *next
76 + typedef struct SDCDst_s {
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 {
88 +                                        /* return non-diffuse BSDF */
89 +        int             (*getBSDFs)(float coef[SDmaxCh], const FVECT outVec,
90 +                                    const FVECT inVec, SDComponent *sdc);
91 +                                        /* query non-diffuse PSA for vector */
92 +        SDError         (*queryProjSA)(double *psa, const FVECT v1,
93 +                                                const RREAL *v2, int qflags,
94 +                                                SDComponent *sdc);
95 +                                        /* get cumulative distribution */
96 +        const SDCDst    *(*getCDist)(const FVECT inVec, SDComponent *sdc);
97 +                                        /* sample cumulative distribution */
98 +        SDError         (*sampCDist)(FVECT ioVec, double randX,
99 +                                                const SDCDst *cdp);
100 +                                        /* free a spectral BSDF component */
101 +        void            (*freeSC)(void *dist);
102 + } SDFunc;
103 +
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 */
108 +        void            *dist;          /* loaded distribution data */
109 +        SDCDst          *cdList;        /* cumulative distribution cache */
110 + };
111 +
112 + /* Container for non-diffuse BSDF components */
113 + typedef struct {
114 +        double          minProjSA;      /* minimum projected solid angle */
115 +        double          maxHemi;        /* maximum directional hemispherical */
116 +        int             ncomp;          /* number of separate components */
117 +        SDComponent     comp[1];        /* BSDF components (extends struct) */
118 + } SDSpectralDF;
119 +
120 + /* Loaded BSDF data */
121 + typedef struct {
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) */
127 +        SDValue         rLambFront;     /* diffuse front reflectance */
128 +        SDValue         rLambBack;      /* diffuse rear reflectance */
129 +        SDValue         tLamb;          /* diffuse transmission */
130 +        SDSpectralDF    *rf, *rb;       /* non-diffuse BRDF components */
131 +        SDSpectralDF    *tf, *tb;       /* non-diffuse BTDF components */
132 + } SDData;
133 +
134 + /* List of loaded BSDFs */
135 + extern struct SDCache_s {
136 +        SDData          bsdf;           /* BSDF data */
137 +        unsigned        refcnt;         /* how many callers are using us? */
138 +        struct SDCache_s                /* next in cache list */
139 +                        *next;
140 + } *SDcacheList;         /* Global BSDF cache */
141 +
142 + /* BSDF cache retention policies */
143 + #define SDretainNone    0               /* free unreferenced BSDF data */
144 + #define SDretainBSDFs   1               /* keep loaded BSDFs in memory */
145 + #define SDretainAll     2               /* also keep cumulative cache data */
146 +
147 + extern int              SDretainSet;    /* =SDretainNone by default */
148 +
149 + /*****************************************************************
150 + * The following routines are less commonly used by applications.
151 + */
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);
157 +
158 + /* Shorten file path to useable BSDF name, removing suffix */
159 + extern void             SDclipName(char res[SDnameLn], const char *fname);
160 +
161 + /* Allocate new spectral distribution function */
162 + extern SDSpectralDF     *SDnewSpectralDF(int nc);
163 +
164 + /* Add component(s) to spectral distribution function */
165 + extern SDSpectralDF     *SDaddComponent(SDSpectralDF *odf, int nadd);
166 +
167 + /* Free a spectral distribution function */
168 + extern void             SDfreeSpectralDF(SDSpectralDF *df);
169 +
170 + /* Initialize an unused BSDF struct and assign name (calls SDclipName) */
171 + extern void             SDclearBSDF(SDData *sd, const char *fname);
172 +
173 + /* Load a BSDF struct from the given file (keeps name unchanged) */
174 + extern SDError          SDloadFile(SDData *sd, const char *fname);
175 +
176 + /* Free data associated with BSDF struct */
177 + extern void             SDfreeBSDF(SDData *sd);
178 +
179 + /* Find writeable BSDF by name, or allocate new cache entry if absent */
180 + extern SDData           *SDgetCache(const char *bname);
181 +
182 + /* Free cached cumulative distributions for BSDF component */
183 + extern void             SDfreeCumulativeCache(SDSpectralDF *df);
184 +
185 + /* Sample an individual BSDF component */
186 + extern SDError          SDsampComponent(SDValue *sv, FVECT ioVec,
187 +                                        double randX, SDComponent *sdc);
188 +
189 + /* Convert 1-dimensional random variable to N-dimensional */
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);
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);
197 +
198 + /*****************************************************************
199 + * The calls below are the ones most applications require.
200 + * All directions are assumed to be unit vectors.
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 */
205 + extern const SDData     *SDcacheFile(const char *fname);
206 +
207 + /* Free a BSDF from our cache (clear all if sd==NULL) */
208 + extern void             SDfreeCache(const SDData *sd);
209 +
210 + /* Query projected solid angle resolution for non-diffuse BSDF direction(s) */
211 + extern SDError          SDsizeBSDF(double *projSA, const FVECT v1,
212 +                                        const RREAL *v2, int qflags,
213 +                                        const SDData *sd);
214 +
215 + /* Return BSDF for the given incident and scattered ray vectors */
216 + extern SDError          SDevalBSDF(SDValue *sv, const FVECT outVec,
217 +                                        const FVECT inVec, const SDData *sd);
218 +
219 + /* Compute directional hemispherical scattering at given incident angle */
220 + extern double           SDdirectHemi(const FVECT inVec,
221 +                                        int sflags, const SDData *sd);
222 +
223 + /* Sample BSDF direction based on the given random variable */
224 + extern SDError          SDsampBSDF(SDValue *sv, FVECT ioVec, double randX,
225 +                                        int sflags, const SDData *sd);
226 +
227 + /*****************************************************************
228 + * Vector math for getting between world and local BSDF coordinates.
229 + * Directions may be passed unnormalized to these routines.
230 + */
231 +
232 + /* Compute World->BSDF transform from surface normal and BSDF up vector */
233 + extern SDError          SDcompXform(RREAL vMtx[3][3], const FVECT sNrm,
234 +                                        const FVECT uVec);
235 +
236 + /* Compute inverse transform */
237 + extern SDError          SDinvXform(RREAL iMtx[3][3], RREAL vMtx[3][3]);
238 +
239 + /* Transform and normalize direction (column) vector */
240 + extern SDError          SDmapDir(FVECT resVec, RREAL vMtx[3][3],
241 +                                        const FVECT inpVec);
242 +
243 + /* Application-specific BSDF loading routine (not part of our library) */
244 + extern SDData           *loadBSDF(char *name);
245 +
246 + /* Application-specific BSDF error translator (not part of our library) */
247 + extern char             *transSDError(SDError ec);
248 +
249 + /*################################################################*/
250 + /*######### DEPRECATED DEFINITIONS AWAITING PERMANENT REMOVAL #######*/
251 + /*
252   * Header for BSDF i/o and access routines
253   */
254  
255 < #ifndef _RAD_BSDF_H_
7 < #define _RAD_BSDF_H_
255 > #include "mat4.h"
256                                  /* up directions */
257   typedef enum {
258          UDzneg=-3,
# Line 17 | Line 265 | typedef enum {
265   } UpDir;
266                                  /* BSDF coordinate calculation routines */
267                                  /* vectors always point away from surface */
20 typedef int     b_vecf(FVECT, int, void *);
21 typedef int     b_ndxf(FVECT, void *);
22 typedef double  b_radf(int, void *);
268  
269 + typedef int     b_vecf2(FVECT v, int n, void *cd);
270 + typedef int     b_ndxf2(FVECT v, void *cd);
271 + typedef double  b_radf2(int n, void *cd);
272 +
273   /* Bidirectional Scattering Distribution Function */
274   struct BSDF_data {
275          int     ninc;                   /* number of incoming directions */
276          int     nout;                   /* number of outgoing directions */
277 +        float   dim[3];                 /* width, height, thickness (meters) */
278 +        char    *mgf;                   /* geometric description (if any) */
279          void    *ib_priv;               /* input basis private data */
280 <        b_vecf  *ib_vec;                /* get input vector from index */
281 <        b_ndxf  *ib_ndx;                /* get input index from vector */
282 <        b_radf  *ib_ohm;                /* get input radius for index */
280 >        b_vecf2 *ib_vec;                /* get input vector from index */
281 >        b_ndxf2 *ib_ndx;                /* get input index from vector */
282 >        b_radf2 *ib_ohm;                /* get input radius for index */
283          void    *ob_priv;               /* output basis private data */
284 <        b_vecf  *ob_vec;                /* get output vector from index */
285 <        b_ndxf  *ob_ndx;                /* get output index from vector */
286 <        b_radf  *ob_ohm;                /* get output radius for index */
284 >        b_vecf2 *ob_vec;                /* get output vector from index */
285 >        b_ndxf2 *ob_ndx;                /* get output index from vector */
286 >        b_radf2 *ob_ohm;                /* get output radius for index */
287          float   *bsdf;                  /* scattering distribution data */
288   };                              /* bidirectional scattering distrib. func. */
289  
# Line 50 | Line 301 | extern int r_BSDF_incvec(FVECT v, struct BSDF_data *b,
301                                  double rv, MAT4 xm);
302   extern int r_BSDF_outvec(FVECT v, struct BSDF_data *b, int o,
303                                  double rv, MAT4 xm);
304 < extern int getBSDF_xfm(MAT4 xm, FVECT nrm, UpDir ud);
304 > extern int getBSDF_xfm(MAT4 xm, FVECT nrm, UpDir ud, char *xfbuf);
305  
306 < #endif  /* ! _RAD_BSDF_H_ */
306 > /*######### END DEPRECATED DEFINITIONS #######*/
307 > /*################################################################*/
308 >
309 > #ifdef __cplusplus
310 > }
311 > #endif
312 > #endif  /* ! _BSDF_H_ */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines