ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/bsdf2ttree.c
Revision: 2.5
Committed: Fri Nov 9 02:16:29 2012 UTC (11 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +91 -15 lines
Log Message:
Added data to complete XML file output

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: bsdf2ttree.c,v 2.4 2012/11/07 03:04:23 greg Exp $";
3 #endif
4 /*
5 * Load measured BSDF interpolant and write out as XML file with tensor tree.
6 *
7 * G. Ward
8 */
9
10 #define _USE_MATH_DEFINES
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <math.h>
14 #include "platform.h"
15 #include "bsdfrep.h"
16 /* global argv[0] */
17 char *progname;
18 /* percentage to cull (<0 to turn off) */
19 int pctcull = 90;
20 /* sampling order */
21 int samp_order = 6;
22
23 /* Interpolate and output isotropic BSDF data */
24 static void
25 interp_isotropic()
26 {
27 const int sqres = 1<<samp_order;
28 FILE *ofp = NULL;
29 char cmd[128];
30 int ix, ox, oy;
31 FVECT ivec, ovec;
32 float bsdf;
33 #if DEBUG
34 fprintf(stderr, "Writing isotropic order %d ", samp_order);
35 if (pctcull >= 0) fprintf(stderr, "data with %d%% culling\n", pctcull);
36 else fputs("raw data\n", stderr);
37 #endif
38 if (pctcull >= 0) { /* begin output */
39 sprintf(cmd, "rttree_reduce -h -a -ff -r 3 -t %d -g %d",
40 pctcull, samp_order);
41 fflush(stdout);
42 ofp = popen(cmd, "w");
43 if (ofp == NULL) {
44 fprintf(stderr, "%s: cannot create pipe to rttree_reduce\n",
45 progname);
46 exit(1);
47 }
48 SET_FILE_BINARY(ofp);
49 } else
50 fputs("{\n", stdout);
51 /* run through directions */
52 for (ix = 0; ix < sqres/2; ix++) {
53 RBFNODE *rbf;
54 SDsquare2disk(ivec, (ix+.5)/sqres, .5);
55 ivec[2] = input_orient *
56 sqrt(1. - ivec[0]*ivec[0] - ivec[1]*ivec[1]);
57 rbf = advect_rbf(ivec);
58 for (ox = 0; ox < sqres; ox++)
59 for (oy = 0; oy < sqres; oy++) {
60 SDsquare2disk(ovec, (ox+.5)/sqres, (oy+.5)/sqres);
61 ovec[2] = output_orient *
62 sqrt(1. - ovec[0]*ovec[0] - ovec[1]*ovec[1]);
63 bsdf = eval_rbfrep(rbf, ovec) * output_orient/ovec[2];
64 if (pctcull >= 0)
65 fwrite(&bsdf, sizeof(bsdf), 1, ofp);
66 else
67 printf("\t%.3e\n", bsdf);
68 }
69 if (rbf != NULL)
70 free(rbf);
71 }
72 if (pctcull >= 0) { /* finish output */
73 if (pclose(ofp)) {
74 fprintf(stderr, "%s: error running '%s'\n",
75 progname, cmd);
76 exit(1);
77 }
78 } else {
79 for (ix = sqres*sqres*sqres/2; ix--; )
80 fputs("\t0\n", stdout);
81 fputs("}\n", stdout);
82 }
83 }
84
85 /* Interpolate and output anisotropic BSDF data */
86 static void
87 interp_anisotropic()
88 {
89 const int sqres = 1<<samp_order;
90 FILE *ofp = NULL;
91 char cmd[128];
92 int ix, iy, ox, oy;
93 FVECT ivec, ovec;
94 float bsdf;
95 #if DEBUG
96 fprintf(stderr, "Writing anisotropic order %d ", samp_order);
97 if (pctcull >= 0) fprintf(stderr, "data with %d%% culling\n", pctcull);
98 else fputs("raw data\n", stderr);
99 #endif
100 if (pctcull >= 0) { /* begin output */
101 sprintf(cmd, "rttree_reduce -h -a -ff -r 4 -t %d -g %d",
102 pctcull, samp_order);
103 fflush(stdout);
104 ofp = popen(cmd, "w");
105 if (ofp == NULL) {
106 fprintf(stderr, "%s: cannot create pipe to rttree_reduce\n",
107 progname);
108 exit(1);
109 }
110 } else
111 fputs("{\n", stdout);
112 /* run through directions */
113 for (ix = 0; ix < sqres; ix++)
114 for (iy = 0; iy < sqres; iy++) {
115 RBFNODE *rbf;
116 SDsquare2disk(ivec, (ix+.5)/sqres, (iy+.5)/sqres);
117 ivec[2] = input_orient *
118 sqrt(1. - ivec[0]*ivec[0] - ivec[1]*ivec[1]);
119 rbf = advect_rbf(ivec);
120 for (ox = 0; ox < sqres; ox++)
121 for (oy = 0; oy < sqres; oy++) {
122 SDsquare2disk(ovec, (ox+.5)/sqres, (oy+.5)/sqres);
123 ovec[2] = output_orient *
124 sqrt(1. - ovec[0]*ovec[0] - ovec[1]*ovec[1]);
125 bsdf = eval_rbfrep(rbf, ovec) * output_orient/ovec[2];
126 if (pctcull >= 0)
127 fwrite(&bsdf, sizeof(bsdf), 1, ofp);
128 else
129 printf("\t%.3e\n", bsdf);
130 }
131 if (rbf != NULL)
132 free(rbf);
133 }
134 if (pctcull >= 0) { /* finish output */
135 if (pclose(ofp)) {
136 fprintf(stderr, "%s: error running '%s'\n",
137 progname, cmd);
138 exit(1);
139 }
140 } else
141 fputs("}\n", stdout);
142 }
143
144 /* Output XML prologue to stdout */
145 static void
146 xml_prologue(int ac, char *av[])
147 {
148 static const char *prologue0[] = {
149 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
150 "<WindowElement xmlns=\"http://windows.lbl.gov\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://windows.lbl.gov/BSDF-v1.4.xsd\">",
151 NULL};
152 static const char *prologue1[] = {
153 "<WindowElementType>System</WindowElementType>",
154 "<FileType>BSDF</FileType>",
155 "<Optical>",
156 "<Layer>",
157 "\t<Material>",
158 "\t\t<Name>Name</Name>",
159 "\t\t<Manufacturer>Manufacturer</Manufacturer>",
160 "\t\t<DeviceType>Other</DeviceType>",
161 "\t</Material>",
162 NULL};
163 static const char *prologue2[] = {
164 "\t<WavelengthData>",
165 "\t\t<LayerNumber>System</LayerNumber>",
166 "\t\t<Wavelength unit=\"Integral\">Visible</Wavelength>",
167 "\t\t<SourceSpectrum>CIE Illuminant D65 1nm.ssp</SourceSpectrum>",
168 "\t\t<DetectorSpectrum>ASTM E308 1931 Y.dsp</DetectorSpectrum>",
169 "\t\t<WavelengthDataBlock>",
170 "\t\t\t<AngleBasis>LBNL/Shirley-Chiu</AngleBasis>",
171 "\t\t\t<ScatteringDataType>BTDF</ScatteringDataType>",
172 NULL};
173 static const char *bsdf_type[4] = {
174 "Reflection Back",
175 "Transmission Back",
176 "Transmission Front",
177 "Reflection Front"
178 };
179 int i;
180
181 for (i = 0; prologue0[i] != NULL; i++)
182 puts(prologue0[i]);
183 fputs("<!-- File produced by:", stdout);
184 while (ac-- > 0) {
185 fputc(' ', stdout);
186 fputs(*av++, stdout);
187 }
188 puts(" -->");
189 for (i = 0; prologue1[i] != NULL; i++)
190 puts(prologue1[i]);
191 puts("\t<DataDefinition>");
192 printf("\t\t<IncidentDataStructure>TensorTree%c</IncidentDataStructure>\n",
193 single_plane_incident ? '3' : '4');
194 puts("\t</DataDefinition>");
195 for (i = 0; prologue2[i] != NULL; i++)
196 puts(prologue2[i]);
197 printf("\t\t\t<WavelengthDataDirection>%s</WavelengthDataDirection>\n",
198 bsdf_type[(input_orient>0)<<1 | (output_orient>0)]);
199 puts("\t\t\t<ScatteringData>");
200 }
201
202 /* Output XML epilogue to stdout */
203 static void
204 xml_epilogue(void)
205 {
206 static const char *epilogue[] = {
207 "\t\t\t</ScatteringData>",
208 "\t\t</WavelengthDataBlock>",
209 "\t</WavelengthData>",
210 "</Layer>",
211 "</Optical>",
212 "</WindowElement>",
213 NULL};
214 int i;
215
216 for (i = 0; epilogue[i] != NULL; i++)
217 puts(epilogue[i]);
218 }
219
220 /* Read in BSDF and interpolate as tensor tree representation */
221 int
222 main(int argc, char *argv[])
223 {
224 FILE *fpin = stdin;
225 int i;
226
227 progname = argv[0];
228 for (i = 1; i < argc-1 && argv[i][0] == '-'; i++)
229 switch (argv[i][1]) { /* get option */
230 case 't':
231 pctcull = atoi(argv[++i]);
232 break;
233 case 'g':
234 samp_order = atoi(argv[++i]);
235 break;
236 default:
237 goto userr;
238 }
239
240 if (i == argc-1) { /* open input if given */
241 fpin = fopen(argv[i], "r");
242 if (fpin == NULL) {
243 fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n",
244 progname, argv[1]);
245 return(1);
246 }
247 } else if (i < argc-1)
248 goto userr;
249 SET_FILE_BINARY(fpin); /* load BSDF interpolant */
250 if (!load_bsdf_rep(fpin))
251 return(1);
252 fclose(fpin);
253 xml_prologue(argc, argv); /* start XML output */
254 if (single_plane_incident) /* resample dist. */
255 interp_isotropic();
256 else
257 interp_anisotropic();
258 xml_epilogue(); /* finish XML output */
259 return(0);
260 userr:
261 fprintf(stderr,
262 "Usage: %s [-t pctcull][-g log2grid] [bsdf.sir] > bsdf.xml\n",
263 progname);
264 return(1);
265 }