1 |
greg |
2.1 |
#ifndef lint |
2 |
|
|
static const char RCSid[] = "$Id$"; |
3 |
|
|
#endif |
4 |
|
|
/* |
5 |
|
|
* Routines for handling BSDF data within mkillum |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
#include "mkillum.h" |
9 |
|
|
#include "paths.h" |
10 |
|
|
|
11 |
|
|
|
12 |
|
|
struct BSDF_data * |
13 |
|
|
load_BSDF( /* load BSDF data from file */ |
14 |
|
|
char *fname |
15 |
|
|
) |
16 |
|
|
{ |
17 |
|
|
char *path; |
18 |
|
|
FILE *fp; |
19 |
|
|
struct BSDF_data *dp; |
20 |
|
|
|
21 |
|
|
path = getpath(fname, getrlibpath(), R_OK); |
22 |
|
|
if (path == NULL) { |
23 |
|
|
sprintf(errmsg, "cannot find BSDF file \"%s\"", fname); |
24 |
|
|
error(WARNING, errmsg); |
25 |
|
|
return(NULL); |
26 |
|
|
} |
27 |
|
|
if ((fp = fopen(path, "r")) == NULL) { |
28 |
|
|
sprintf(errmsg, "cannot open BSDF \"%s\"", path); |
29 |
|
|
error(WARNING, errmsg); |
30 |
|
|
return(NULL); |
31 |
|
|
} |
32 |
|
|
dp = (struct BSDF_data *)malloc(sizeof(struct BSDF_data)); |
33 |
|
|
if (dp == NULL) |
34 |
|
|
goto memerr; |
35 |
|
|
/* etc... */ |
36 |
|
|
fclose(fp); |
37 |
|
|
return(dp); |
38 |
|
|
memerr: |
39 |
|
|
error(SYSTEM, "out of memory in load_BSDF"); |
40 |
|
|
return NULL; /* pro forma return */ |
41 |
|
|
} |
42 |
|
|
|
43 |
|
|
|
44 |
|
|
void |
45 |
|
|
free_BSDF( /* free BSDF data structure */ |
46 |
|
|
struct BSDF_data *b |
47 |
|
|
) |
48 |
|
|
{ |
49 |
|
|
if (b == NULL) |
50 |
|
|
return; |
51 |
|
|
free(b->inc_dir); |
52 |
|
|
free(b->inc_rad); |
53 |
|
|
free(b->out_dir); |
54 |
|
|
free(b->out_rad); |
55 |
|
|
free(b->bsdf); |
56 |
|
|
free(b); |
57 |
|
|
} |
58 |
|
|
|
59 |
|
|
|
60 |
|
|
void |
61 |
|
|
r_BSDF_incvec( /* compute random input vector at given location */ |
62 |
|
|
FVECT v, |
63 |
|
|
struct BSDF_data *b, |
64 |
|
|
int i, |
65 |
|
|
double rv, |
66 |
|
|
MAT4 xm |
67 |
|
|
) |
68 |
|
|
{ |
69 |
|
|
FVECT pert; |
70 |
|
|
double rad; |
71 |
|
|
int j; |
72 |
|
|
|
73 |
|
|
getBSDF_incvec(v, b, i); |
74 |
|
|
rad = getBSDF_incrad(b, i); |
75 |
|
|
multisamp(pert, 3, rv); |
76 |
|
|
for (j = 0; j < 3; j++) |
77 |
|
|
v[j] += rad*(2.*pert[j] - 1.); |
78 |
|
|
if (xm != NULL) |
79 |
|
|
multv3(v, v, xm); |
80 |
|
|
normalize(v); |
81 |
|
|
} |
82 |
|
|
|
83 |
|
|
|
84 |
|
|
void |
85 |
|
|
r_BSDF_outvec( /* compute random output vector at given location */ |
86 |
|
|
FVECT v, |
87 |
|
|
struct BSDF_data *b, |
88 |
|
|
int o, |
89 |
|
|
double rv, |
90 |
|
|
MAT4 xm |
91 |
|
|
) |
92 |
|
|
{ |
93 |
|
|
FVECT pert; |
94 |
|
|
double rad; |
95 |
|
|
int j; |
96 |
|
|
|
97 |
|
|
getBSDF_outvec(v, b, o); |
98 |
|
|
rad = getBSDF_outrad(b, o); |
99 |
|
|
multisamp(pert, 3, rv); |
100 |
|
|
for (j = 0; j < 3; j++) |
101 |
|
|
v[j] += rad*(2.*pert[j] - 1.); |
102 |
|
|
if (xm != NULL) |
103 |
|
|
multv3(v, v, xm); |
104 |
|
|
normalize(v); |
105 |
|
|
} |