ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/bsdf2ttree.c
Revision: 2.10
Committed: Wed Dec 12 04:49:59 2012 UTC (11 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.9: +3 -2 lines
Log Message:
Fixed main bug, which was forgetting Klems axis reversal

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.10 static const char RCSid[] = "$Id: bsdf2ttree.c,v 2.9 2012/11/22 06:07:17 greg Exp $";
3 greg 2.1 #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 greg 2.7 double pctcull = 90.;
20 greg 2.1 /* 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 greg 2.4 float bsdf;
33 greg 2.1 #if DEBUG
34     fprintf(stderr, "Writing isotropic order %d ", samp_order);
35 greg 2.8 if (pctcull >= 0) fprintf(stderr, "data with %.1f%% culling\n", pctcull);
36 greg 2.1 else fputs("raw data\n", stderr);
37     #endif
38     if (pctcull >= 0) { /* begin output */
39 greg 2.7 sprintf(cmd, "rttree_reduce -h -a -ff -r 3 -t %f -g %d",
40 greg 2.1 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 greg 2.5 bsdf = eval_rbfrep(rbf, ovec) * output_orient/ovec[2];
64 greg 2.1 if (pctcull >= 0)
65     fwrite(&bsdf, sizeof(bsdf), 1, ofp);
66     else
67     printf("\t%.3e\n", bsdf);
68     }
69 greg 2.3 if (rbf != NULL)
70     free(rbf);
71 greg 2.1 }
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 greg 2.4 float bsdf;
95 greg 2.1 #if DEBUG
96     fprintf(stderr, "Writing anisotropic order %d ", samp_order);
97 greg 2.8 if (pctcull >= 0) fprintf(stderr, "data with %.1f%% culling\n", pctcull);
98 greg 2.1 else fputs("raw data\n", stderr);
99     #endif
100     if (pctcull >= 0) { /* begin output */
101 greg 2.7 sprintf(cmd, "rttree_reduce -h -a -ff -r 4 -t %f -g %d",
102 greg 2.1 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 greg 2.10 RBFNODE *rbf; /* Klems reversal */
116 greg 2.1 SDsquare2disk(ivec, (ix+.5)/sqres, (iy+.5)/sqres);
117 greg 2.10 ivec[0] = -ivec[0]; ivec[1] = -ivec[1];
118 greg 2.1 ivec[2] = input_orient *
119     sqrt(1. - ivec[0]*ivec[0] - ivec[1]*ivec[1]);
120     rbf = advect_rbf(ivec);
121     for (ox = 0; ox < sqres; ox++)
122     for (oy = 0; oy < sqres; oy++) {
123     SDsquare2disk(ovec, (ox+.5)/sqres, (oy+.5)/sqres);
124     ovec[2] = output_orient *
125     sqrt(1. - ovec[0]*ovec[0] - ovec[1]*ovec[1]);
126 greg 2.5 bsdf = eval_rbfrep(rbf, ovec) * output_orient/ovec[2];
127 greg 2.1 if (pctcull >= 0)
128     fwrite(&bsdf, sizeof(bsdf), 1, ofp);
129     else
130     printf("\t%.3e\n", bsdf);
131     }
132 greg 2.3 if (rbf != NULL)
133     free(rbf);
134 greg 2.1 }
135     if (pctcull >= 0) { /* finish output */
136     if (pclose(ofp)) {
137     fprintf(stderr, "%s: error running '%s'\n",
138     progname, cmd);
139     exit(1);
140     }
141     } else
142     fputs("}\n", stdout);
143     }
144    
145 greg 2.5 /* Output XML prologue to stdout */
146     static void
147     xml_prologue(int ac, char *av[])
148     {
149     static const char *bsdf_type[4] = {
150 greg 2.7 "Reflection Front",
151     "Transmission Front",
152 greg 2.5 "Transmission Back",
153 greg 2.7 "Reflection Back"
154 greg 2.5 };
155    
156 greg 2.6 puts("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
157     puts("<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\">");
158 greg 2.5 fputs("<!-- File produced by:", stdout);
159     while (ac-- > 0) {
160     fputc(' ', stdout);
161     fputs(*av++, stdout);
162     }
163     puts(" -->");
164 greg 2.6 puts("<WindowElementType>System</WindowElementType>");
165     puts("<FileType>BSDF</FileType>");
166     puts("<Optical>");
167     puts("<Layer>");
168     puts("\t<Material>");
169     puts("\t\t<Name>Name</Name>");
170     puts("\t\t<Manufacturer>Manufacturer</Manufacturer>");
171     puts("\t\t<DeviceType>Other</DeviceType>");
172     puts("\t</Material>");
173 greg 2.5 puts("\t<DataDefinition>");
174     printf("\t\t<IncidentDataStructure>TensorTree%c</IncidentDataStructure>\n",
175     single_plane_incident ? '3' : '4');
176     puts("\t</DataDefinition>");
177 greg 2.6 puts("\t<WavelengthData>");
178     puts("\t\t<LayerNumber>System</LayerNumber>");
179     puts("\t\t<Wavelength unit=\"Integral\">Visible</Wavelength>");
180     puts("\t\t<SourceSpectrum>CIE Illuminant D65 1nm.ssp</SourceSpectrum>");
181     puts("\t\t<DetectorSpectrum>ASTM E308 1931 Y.dsp</DetectorSpectrum>");
182     puts("\t\t<WavelengthDataBlock>");
183 greg 2.5 printf("\t\t\t<WavelengthDataDirection>%s</WavelengthDataDirection>\n",
184 greg 2.9 bsdf_type[(input_orient>0)<<1 | (output_orient>0)]);
185 greg 2.6 puts("\t\t\t<AngleBasis>LBNL/Shirley-Chiu</AngleBasis>");
186     puts("\t\t\t<ScatteringDataType>BTDF</ScatteringDataType>");
187 greg 2.5 puts("\t\t\t<ScatteringData>");
188     }
189    
190     /* Output XML epilogue to stdout */
191     static void
192     xml_epilogue(void)
193     {
194 greg 2.6 puts("\t\t\t</ScatteringData>");
195     puts("\t\t</WavelengthDataBlock>");
196     puts("\t</WavelengthData>");
197     puts("</Layer>");
198     puts("</Optical>");
199     puts("</WindowElement>");
200 greg 2.5 }
201    
202 greg 2.1 /* Read in BSDF and interpolate as tensor tree representation */
203     int
204     main(int argc, char *argv[])
205     {
206     FILE *fpin = stdin;
207     int i;
208    
209 greg 2.5 progname = argv[0];
210     for (i = 1; i < argc-1 && argv[i][0] == '-'; i++)
211     switch (argv[i][1]) { /* get option */
212 greg 2.1 case 't':
213 greg 2.7 pctcull = atof(argv[++i]);
214 greg 2.1 break;
215     case 'g':
216 greg 2.5 samp_order = atoi(argv[++i]);
217 greg 2.1 break;
218     default:
219     goto userr;
220     }
221 greg 2.5
222     if (i == argc-1) { /* open input if given */
223     fpin = fopen(argv[i], "r");
224 greg 2.2 if (fpin == NULL) {
225     fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n",
226     progname, argv[1]);
227     return(1);
228     }
229 greg 2.5 } else if (i < argc-1)
230 greg 2.1 goto userr;
231     SET_FILE_BINARY(fpin); /* load BSDF interpolant */
232     if (!load_bsdf_rep(fpin))
233     return(1);
234 greg 2.5 fclose(fpin);
235     xml_prologue(argc, argv); /* start XML output */
236 greg 2.1 if (single_plane_incident) /* resample dist. */
237     interp_isotropic();
238     else
239     interp_anisotropic();
240 greg 2.5 xml_epilogue(); /* finish XML output */
241 greg 2.1 return(0);
242     userr:
243     fprintf(stderr,
244     "Usage: %s [-t pctcull][-g log2grid] [bsdf.sir] > bsdf.xml\n",
245     progname);
246     return(1);
247     }