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

Comparing ray/src/cv/pabopto2bsdf.c (file contents):
Revision 2.20 by greg, Thu Mar 20 16:54:23 2014 UTC vs.
Revision 2.27 by greg, Fri Oct 3 21:57:06 2014 UTC

# Line 21 | Line 21 | char                   *progname;
21  
22   typedef struct {
23          const char      *fname;         /* input file path */
24 <        double          theta, phi;     /* input angles */
24 >        double          theta, phi;     /* input angles (degrees) */
25 >        double          up_phi;         /* azimuth for "up" direction */
26          int             igp[2];         /* input grid position */
27          int             isDSF;          /* data is DSF (rather than BSDF)? */
28          long            dstart;         /* data start offset in file */
# Line 60 | Line 61 | init_pabopto_inp(const int i, const char *fname)
61          }
62          inpfile[i].fname = fname;
63          inpfile[i].isDSF = -1;
64 +        inpfile[i].up_phi = 0;
65          inpfile[i].theta = inpfile[i].phi = -10001.;
66                                  /* read header information */
67          while ((c = getc(fp)) == '#' || c == EOF) {
# Line 77 | Line 79 | init_pabopto_inp(const int i, const char *fname)
79                                  inpfile[i].isDSF = 1;
80                                  continue;
81                          }
82 <                        if (!strcasecmp(typ, "BSDF")) {
82 >                        if (!strcasecmp(typ, "BSDF") ||
83 >                                        !strcasecmp(typ, "BRDF") ||
84 >                                        !strcasecmp(typ, "BTDF")) {
85                                  inpfile[i].isDSF = 0;
86                                  continue;
87                          }
88                  }
89 +                if (sscanf(buf, "upphi %lf", &inpfile[i].up_phi) == 1)
90 +                        continue;
91                  if (sscanf(buf, "intheta %lf", &inpfile[i].theta) == 1)
92                          continue;
93                  if (sscanf(buf, "inphi %lf", &inpfile[i].phi) == 1)
# Line 102 | Line 108 | init_pabopto_inp(const int i, const char *fname)
108                  fputs(": unknown incident angle\n", stderr);
109                  return(0);
110          }
111 +                                /* convert to Y-up orientation */
112 +        inpfile[i].phi += 90.-inpfile[i].up_phi;
113                                  /* convert angle to grid position */
114          dv[2] = sin(M_PI/180.*inpfile[i].theta);
115          dv[0] = cos(M_PI/180.*inpfile[i].phi)*dv[2];
# Line 129 | Line 137 | add_pabopto_inp(const int i)
137                  if (i)                  /* process previous incidence */
138                          make_rbfrep();
139   #ifdef DEBUG
140 <                fprintf(stderr, "New incident (theta,phi)=(%f,%f)\n",
140 >                fprintf(stderr, "New incident (theta,phi)=(%.1f,%.1f)\n",
141                                          inpfile[i].theta, inpfile[i].phi);
142   #endif
143                  new_bsdf_data(inpfile[i].theta, inpfile[i].phi);
# Line 139 | Line 147 | add_pabopto_inp(const int i)
147   #endif
148                                          /* read scattering data */
149          while (fscanf(fp, "%lf %lf %lf\n", &theta_out, &phi_out, &val) == 3)
150 <                add_bsdf_data(theta_out, phi_out, val, inpfile[i].isDSF);
150 >                add_bsdf_data(theta_out, phi_out+90.-inpfile[i].up_phi,
151 >                                val, inpfile[i].isDSF);
152          n = 0;
153          while ((c = getc(fp)) != EOF)
154                  n += !isspace(c);
# Line 184 | Line 193 | main(int argc, char *argv[])
193          for (i = 0; i < ninpfiles; i++)
194                  if (!init_pabopto_inp(i, argv[i+1]))
195                          return(1);
196 <        qsort(inpfile, ninpfiles, sizeof(PGINPUT), &cmp_indir);
196 >        qsort(inpfile, ninpfiles, sizeof(PGINPUT), cmp_indir);
197                                                  /* compile measurements */
198          for (i = 0; i < ninpfiles; i++)
199                  if (!add_pabopto_inp(i))
# Line 210 | Line 219 | main(int argc, char *argv[])
219          FVECT   dir;
220          int     i, j, n;
221  
222 +        progname = argv[0];
223          if (argc != 2) {
224 <                fprintf(stderr, "Usage: %s input.dat > output.rad\n", argv[0]);
224 >                fprintf(stderr, "Usage: %s input.dat > output.rad\n", progname);
225                  return(1);
226          }
227          ninpfiles = 1;
# Line 219 | Line 229 | main(int argc, char *argv[])
229          if (!init_pabopto_inp(0, argv[1]) || !add_pabopto_inp(0))
230                  return(1);
231                                                  /* reduce data set */
232 <        make_rbfrep();
232 >        if (make_rbfrep() == NULL) {
233 >                fprintf(stderr, "%s: nothing to plot!\n", progname);
234 >                exit(1);
235 >        }
236   #ifdef DEBUG
237          fprintf(stderr, "Minimum BSDF = %.4f\n", bsdf_min);
238   #endif
# Line 232 | Line 245 | main(int argc, char *argv[])
245                  if (dsf_grid[i][j].sum.n > 0) {
246                          ovec_from_pos(dir, i, j);
247                          bsdf = dsf_grid[i][j].sum.v /
248 <                                (dsf_grid[i][j].sum.n*output_orient*dir[2]);
248 >                           ((double)dsf_grid[i][j].sum.n*output_orient*dir[2]);
249                          if (bsdf <= bsdf_min*.6)
250                                  continue;
251                          bsdf = log(bsdf + 1e-5) - min_log;
# Line 248 | Line 261 | main(int argc, char *argv[])
261          for (n = 0; n < dsf_list->nrbf; n++) {
262                  RBFVAL  *rbf = &dsf_list->rbfa[n];
263                  ovec_from_pos(dir, rbf->gx, rbf->gy);
264 <                bsdf = eval_rbfrep(dsf_list, dir) / (output_orient*dir[2]);
264 >                bsdf = eval_rbfrep(dsf_list, dir);
265                  bsdf = log(bsdf + 1e-5) - min_log;
266                  printf("red sphere p%04d\n0\n0\n", ++n);
267                  printf("4 %.6g %.6g %.6g %.6g\n\n",
# Line 262 | Line 275 | main(int argc, char *argv[])
275          sprintf(buf, "gensurf tgreen bsdf - - - %d %d", GRIDRES-1, GRIDRES-1);
276          pfp = popen(buf, "w");
277          if (pfp == NULL) {
278 <                fprintf(stderr, "%s: cannot open '| %s'\n", argv[0], buf);
278 >                fprintf(stderr, "%s: cannot open '| %s'\n", progname, buf);
279                  return(1);
280          }
281          for (i = 0; i < GRIDRES; i++)
282              for (j = 0; j < GRIDRES; j++) {
283                  ovec_from_pos(dir, i, j);
284 <                bsdf = eval_rbfrep(dsf_list, dir) / (output_orient*dir[2]);
284 >                bsdf = eval_rbfrep(dsf_list, dir);
285                  bsdf = log(bsdf + 1e-5) - min_log;
286                  fprintf(pfp, "%.8e %.8e %.8e\n",
287                                  dir[0]*bsdf, dir[1]*bsdf, dir[2]*bsdf);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines