ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/pabopto2bsdf.c
Revision: 2.1
Committed: Fri Oct 19 04:14:29 2012 UTC (11 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Broke pabopto2xml into pabopto2bsdf and bsdf2ttree

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * Load measured BSDF data in PAB-Opto format.
6 *
7 * G. Ward
8 */
9
10 #include <stdio.h>
11 #include <string.h>
12 #include <ctype.h>
13 #include "platform.h"
14 #include "bsdfrep.h"
15 /* global argv[0] */
16 char *progname;
17
18 /* Load a set of measurements corresponding to a particular incident angle */
19 static int
20 load_pabopto_meas(const char *fname)
21 {
22 FILE *fp = fopen(fname, "r");
23 int inp_is_DSF = -1;
24 double new_theta, new_phi, theta_out, phi_out, val;
25 char buf[2048];
26 int n, c;
27
28 if (fp == NULL) {
29 fputs(fname, stderr);
30 fputs(": cannot open\n", stderr);
31 return(0);
32 }
33 #ifdef DEBUG
34 fprintf(stderr, "Loading measurement file '%s'...\n", fname);
35 #endif
36 /* read header information */
37 while ((c = getc(fp)) == '#' || c == EOF) {
38 if (fgets(buf, sizeof(buf), fp) == NULL) {
39 fputs(fname, stderr);
40 fputs(": unexpected EOF\n", stderr);
41 fclose(fp);
42 return(0);
43 }
44 if (!strcmp(buf, "format: theta phi DSF\n")) {
45 inp_is_DSF = 1;
46 continue;
47 }
48 if (!strcmp(buf, "format: theta phi BSDF\n")) {
49 inp_is_DSF = 0;
50 continue;
51 }
52 if (sscanf(buf, "intheta %lf", &new_theta) == 1)
53 continue;
54 if (sscanf(buf, "inphi %lf", &new_phi) == 1)
55 continue;
56 if (sscanf(buf, "incident_angle %lf %lf",
57 &new_theta, &new_phi) == 2)
58 continue;
59 }
60 ungetc(c, fp);
61 if (inp_is_DSF < 0) {
62 fputs(fname, stderr);
63 fputs(": unknown format\n", stderr);
64 fclose(fp);
65 return(0);
66 }
67 /* prepare input grid */
68 new_bsdf_data(new_theta, new_phi);
69 /* read actual data */
70 while (fscanf(fp, "%lf %lf %lf\n", &theta_out, &phi_out, &val) == 3)
71 add_bsdf_data(theta_out, phi_out, val, inp_is_DSF);
72 n = 0;
73 while ((c = getc(fp)) != EOF)
74 n += !isspace(c);
75 if (n)
76 fprintf(stderr,
77 "%s: warning: %d unexpected characters past EOD\n",
78 fname, n);
79 fclose(fp);
80 return(1);
81 }
82
83 /* Read in PAB-Opto BSDF files and output RBF interpolant */
84 int
85 main(int argc, char *argv[])
86 {
87 extern int nprocs;
88 int i;
89 /* start header */
90 SET_FILE_BINARY(stdout);
91 newheader("RADIANCE", stdout);
92 printargs(argc, argv, stdout);
93 fputnow(stdout);
94 progname = argv[0]; /* get options */
95 while (argc > 2 && argv[1][0] == '-') {
96 switch (argv[1][1]) {
97 case 'n':
98 nprocs = atoi(argv[2]);
99 break;
100 default:
101 goto userr;
102 }
103 argv += 2; argc -= 2;
104 }
105 if (argc < 3)
106 goto userr;
107 for (i = 1; i < argc; i++) { /* compile measurements */
108 if (!load_pabopto_meas(argv[i]))
109 return(1);
110 make_rbfrep();
111 }
112 build_mesh(); /* create interpolation */
113 save_bsdf_rep(stdout); /* write it out */
114 return(0);
115 userr:
116 fprintf(stderr, "Usage: %s [-n nproc] meas1.dat meas2.dat .. > bsdf.sir\n",
117 progname);
118 return(1);
119 }