ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/bsdf2ttree.c
(Generate patch)

Comparing ray/src/cv/bsdf2ttree.c (file contents):
Revision 2.2 by greg, Sat Oct 20 17:01:26 2012 UTC vs.
Revision 2.9 by greg, Thu Nov 22 06:07:17 2012 UTC

# Line 16 | Line 16 | static const char RCSid[] = "$Id$";
16                                  /* global argv[0] */
17   char                    *progname;
18                                  /* percentage to cull (<0 to turn off) */
19 < int                     pctcull = 90;
19 > double                  pctcull = 90.;
20                                  /* sampling order */
21   int                     samp_order = 6;
22  
# Line 29 | Line 29 | interp_isotropic()
29          char            cmd[128];
30          int             ix, ox, oy;
31          FVECT           ivec, ovec;
32 <        double          bsdf;
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);
35 >        if (pctcull >= 0) fprintf(stderr, "data with %.1f%% 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 -fd -r 3 -t %d -g %d",
39 >                sprintf(cmd, "rttree_reduce -h -a -ff -r 3 -t %f -g %d",
40                                  pctcull, samp_order);
41                  fflush(stdout);
42                  ofp = popen(cmd, "w");
# Line 60 | Line 60 | interp_isotropic()
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) / fabs(ovec[2]);
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 <                free(rbf);
69 >                if (rbf != NULL)
70 >                        free(rbf);
71          }
72          if (pctcull >= 0) {                     /* finish output */
73                  if (pclose(ofp)) {
# Line 90 | Line 91 | interp_anisotropic()
91          char            cmd[128];
92          int             ix, iy, ox, oy;
93          FVECT           ivec, ovec;
94 <        double          bsdf;
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);
97 >        if (pctcull >= 0) fprintf(stderr, "data with %.1f%% 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 -fd -r 4 -t %d -g %d",
101 >                sprintf(cmd, "rttree_reduce -h -a -ff -r 4 -t %f -g %d",
102                                  pctcull, samp_order);
103                  fflush(stdout);
104                  ofp = popen(cmd, "w");
# Line 121 | Line 122 | interp_anisotropic()
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) / fabs(ovec[2]);
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 <                free(rbf);
131 >                if (rbf != NULL)
132 >                        free(rbf);
133              }
134          if (pctcull >= 0) {                     /* finish output */
135                  if (pclose(ofp)) {
# Line 139 | Line 141 | interp_anisotropic()
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       *bsdf_type[4] = {
149 +                                        "Reflection Front",
150 +                                        "Transmission Front",
151 +                                        "Transmission Back",
152 +                                        "Reflection Back"
153 +                                };
154 +
155 +        puts("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
156 +        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\">");
157 +        fputs("<!-- File produced by:", stdout);
158 +        while (ac-- > 0) {
159 +                fputc(' ', stdout);
160 +                fputs(*av++, stdout);
161 +        }
162 +        puts(" -->");
163 +        puts("<WindowElementType>System</WindowElementType>");
164 +        puts("<FileType>BSDF</FileType>");
165 +        puts("<Optical>");
166 +        puts("<Layer>");
167 +        puts("\t<Material>");
168 +        puts("\t\t<Name>Name</Name>");
169 +        puts("\t\t<Manufacturer>Manufacturer</Manufacturer>");
170 +        puts("\t\t<DeviceType>Other</DeviceType>");
171 +        puts("\t</Material>");
172 +        puts("\t<DataDefinition>");
173 +        printf("\t\t<IncidentDataStructure>TensorTree%c</IncidentDataStructure>\n",
174 +                        single_plane_incident ? '3' : '4');
175 +        puts("\t</DataDefinition>");
176 +        puts("\t<WavelengthData>");
177 +        puts("\t\t<LayerNumber>System</LayerNumber>");
178 +        puts("\t\t<Wavelength unit=\"Integral\">Visible</Wavelength>");
179 +        puts("\t\t<SourceSpectrum>CIE Illuminant D65 1nm.ssp</SourceSpectrum>");
180 +        puts("\t\t<DetectorSpectrum>ASTM E308 1931 Y.dsp</DetectorSpectrum>");
181 +        puts("\t\t<WavelengthDataBlock>");
182 +        printf("\t\t\t<WavelengthDataDirection>%s</WavelengthDataDirection>\n",
183 +                        bsdf_type[(input_orient>0)<<1 | (output_orient>0)]);
184 +        puts("\t\t\t<AngleBasis>LBNL/Shirley-Chiu</AngleBasis>");
185 +        puts("\t\t\t<ScatteringDataType>BTDF</ScatteringDataType>");
186 +        puts("\t\t\t<ScatteringData>");
187 + }
188 +
189 + /* Output XML epilogue to stdout */
190 + static void
191 + xml_epilogue(void)
192 + {
193 +        puts("\t\t\t</ScatteringData>");
194 +        puts("\t\t</WavelengthDataBlock>");
195 +        puts("\t</WavelengthData>");
196 +        puts("</Layer>");
197 +        puts("</Optical>");
198 +        puts("</WindowElement>");
199 + }
200 +
201   /* Read in BSDF and interpolate as tensor tree representation */
202   int
203   main(int argc, char *argv[])
# Line 146 | Line 205 | main(int argc, char *argv[])
205          FILE    *fpin = stdin;
206          int     i;
207  
208 <        progname = argv[0];                     /* get options */
209 <        while (argc > 2 && argv[1][0] == '-') {
210 <                switch (argv[1][1]) {
208 >        progname = argv[0];
209 >        for (i = 1; i < argc-1 && argv[i][0] == '-'; i++)
210 >                switch (argv[i][1]) {           /* get option */
211                  case 't':
212 <                        pctcull = atoi(argv[2]);
212 >                        pctcull = atof(argv[++i]);
213                          break;
214                  case 'g':
215 <                        samp_order = atoi(argv[2]);
215 >                        samp_order = atoi(argv[++i]);
216                          break;
217                  default:
218                          goto userr;
219                  }
220 <                argv += 2; argc -= 2;
221 <        }
222 <        if (argc == 2) {                        /* open input if given */
164 <                fpin = fopen(argv[1], "r");
220 >
221 >        if (i == argc-1) {                      /* open input if given */
222 >                fpin = fopen(argv[i], "r");
223                  if (fpin == NULL) {
224                          fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n",
225                                          progname, argv[1]);
226                          return(1);
227                  }
228 <        } else if (argc != 1)
228 >        } else if (i < argc-1)
229                  goto userr;
230          SET_FILE_BINARY(fpin);                  /* load BSDF interpolant */
231          if (!load_bsdf_rep(fpin))
232                  return(1);
233 <        draw_edges();
234 <        /* xml_prologue();                              /* start XML output */
233 >        fclose(fpin);
234 >        xml_prologue(argc, argv);               /* start XML output */
235          if (single_plane_incident)              /* resample dist. */
236                  interp_isotropic();
237          else
238                  interp_anisotropic();
239 <        /* xml_epilogue();                              /* finish XML output */
239 >        xml_epilogue();                         /* finish XML output */
240          return(0);
241   userr:
242          fprintf(stderr,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines