ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/bsdf2ttree.c
Revision: 2.1
Committed: Fri Oct 19 04:14:29 2012 UTC (11 years, 5 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 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 double 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 -fd -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) / fabs(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);
70 }
71 if (pctcull >= 0) { /* finish output */
72 if (pclose(ofp)) {
73 fprintf(stderr, "%s: error running '%s'\n",
74 progname, cmd);
75 exit(1);
76 }
77 } else {
78 for (ix = sqres*sqres*sqres/2; ix--; )
79 fputs("\t0\n", stdout);
80 fputs("}\n", stdout);
81 }
82 }
83
84 /* Interpolate and output anisotropic BSDF data */
85 static void
86 interp_anisotropic()
87 {
88 const int sqres = 1<<samp_order;
89 FILE *ofp = NULL;
90 char cmd[128];
91 int ix, iy, ox, oy;
92 FVECT ivec, ovec;
93 double bsdf;
94 #if DEBUG
95 fprintf(stderr, "Writing anisotropic order %d ", samp_order);
96 if (pctcull >= 0) fprintf(stderr, "data with %d%% culling\n", pctcull);
97 else fputs("raw data\n", stderr);
98 #endif
99 if (pctcull >= 0) { /* begin output */
100 sprintf(cmd, "rttree_reduce -h -a -fd -r 4 -t %d -g %d",
101 pctcull, samp_order);
102 fflush(stdout);
103 ofp = popen(cmd, "w");
104 if (ofp == NULL) {
105 fprintf(stderr, "%s: cannot create pipe to rttree_reduce\n",
106 progname);
107 exit(1);
108 }
109 } else
110 fputs("{\n", stdout);
111 /* run through directions */
112 for (ix = 0; ix < sqres; ix++)
113 for (iy = 0; iy < sqres; iy++) {
114 RBFNODE *rbf;
115 SDsquare2disk(ivec, (ix+.5)/sqres, (iy+.5)/sqres);
116 ivec[2] = input_orient *
117 sqrt(1. - ivec[0]*ivec[0] - ivec[1]*ivec[1]);
118 rbf = advect_rbf(ivec);
119 for (ox = 0; ox < sqres; ox++)
120 for (oy = 0; oy < sqres; oy++) {
121 SDsquare2disk(ovec, (ox+.5)/sqres, (oy+.5)/sqres);
122 ovec[2] = output_orient *
123 sqrt(1. - ovec[0]*ovec[0] - ovec[1]*ovec[1]);
124 bsdf = eval_rbfrep(rbf, ovec) / fabs(ovec[2]);
125 if (pctcull >= 0)
126 fwrite(&bsdf, sizeof(bsdf), 1, ofp);
127 else
128 printf("\t%.3e\n", bsdf);
129 }
130 free(rbf);
131 }
132 if (pctcull >= 0) { /* finish output */
133 if (pclose(ofp)) {
134 fprintf(stderr, "%s: error running '%s'\n",
135 progname, cmd);
136 exit(1);
137 }
138 } else
139 fputs("}\n", stdout);
140 }
141
142 /* Read in BSDF and interpolate as tensor tree representation */
143 int
144 main(int argc, char *argv[])
145 {
146 FILE *fpin = stdin;
147 int i;
148
149 progname = argv[0]; /* get options */
150 while (argc > 2 && argv[1][0] == '-') {
151 switch (argv[1][1]) {
152 case 't':
153 pctcull = atoi(argv[2]);
154 break;
155 case 'g':
156 samp_order = atoi(argv[2]);
157 break;
158 default:
159 goto userr;
160 }
161 argv += 2; argc -= 2;
162 }
163 if (argc == 2)
164 fpin = fopen(argv[1], "r");
165 else if (argc != 1)
166 goto userr;
167 SET_FILE_BINARY(fpin); /* load BSDF interpolant */
168 if (!load_bsdf_rep(fpin))
169 return(1);
170 draw_edges();
171 /* xml_prologue(); /* start XML output */
172 if (single_plane_incident) /* resample dist. */
173 interp_isotropic();
174 else
175 interp_anisotropic();
176 /* xml_epilogue(); /* finish XML output */
177 return(0);
178 userr:
179 fprintf(stderr,
180 "Usage: %s [-t pctcull][-g log2grid] [bsdf.sir] > bsdf.xml\n",
181 progname);
182 return(1);
183 }