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.19 by greg, Wed Mar 19 19:48:57 2014 UTC vs.
Revision 2.20 by greg, Thu Mar 20 16:54:23 2014 UTC

# Line 7 | Line 7 | static const char RCSid[] = "$Id$";
7   *      G. Ward
8   */
9  
10 + #define _USE_MATH_DEFINES
11   #include <stdio.h>
12   #include <stdlib.h>
13   #include <string.h>
# Line 20 | Line 21 | char                   *progname;
21  
22   typedef struct {
23          const char      *fname;         /* input file path */
24 <        double          theta, phi;     /* incident angles (in degrees) */
24 >        double          theta, phi;     /* input angles */
25 >        int             igp[2];         /* input grid position */
26          int             isDSF;          /* data is DSF (rather than BSDF)? */
27          long            dstart;         /* data start offset in file */
28   } PGINPUT;
29  
28 double          angle_eps = 0;  /* epsilon for angle comparisons */
29
30   PGINPUT         *inpfile;       /* input files sorted by incidence */
31   int             ninpfiles;      /* number of input files */
32  
33   /* Compare incident angles */
34   static int
35 < cmp_inang(const void *p1, const void *p2)
35 > cmp_indir(const void *p1, const void *p2)
36   {
37          const PGINPUT   *inp1 = (const PGINPUT *)p1;
38          const PGINPUT   *inp2 = (const PGINPUT *)p2;
39 +        int             ydif = inp1->igp[1] - inp2->igp[1];
40          
41 <        if (inp1->theta > inp2->theta+angle_eps)
42 <                return(1);
43 <        if (inp1->theta < inp2->theta-angle_eps)
44 <                return(-1);
44 <        if (inp1->phi > inp2->phi+angle_eps)
45 <                return(1);
46 <        if (inp1->phi < inp2->phi-angle_eps)
47 <                return(-1);
48 <        return(0);
41 >        if (ydif)
42 >                return(ydif);
43 >
44 >        return(inp1->igp[0] - inp2->igp[0]);
45   }
46  
47   /* Prepare a PAB-Opto input file by reading its header */
# Line 53 | Line 49 | static int
49   init_pabopto_inp(const int i, const char *fname)
50   {
51          FILE    *fp = fopen(fname, "r");
52 +        FVECT   dv;
53          char    buf[2048];
54          int     c;
55          
# Line 105 | Line 102 | init_pabopto_inp(const int i, const char *fname)
102                  fputs(": unknown incident angle\n", stderr);
103                  return(0);
104          }
105 <        while (inpfile[i].phi < 0)      /* normalize phi direction */
106 <                inpfile[i].phi += 360.;
105 >                                /* convert angle to grid position */
106 >        dv[2] = sin(M_PI/180.*inpfile[i].theta);
107 >        dv[0] = cos(M_PI/180.*inpfile[i].phi)*dv[2];
108 >        dv[1] = sin(M_PI/180.*inpfile[i].phi)*dv[2];
109 >        dv[2] = sqrt(1. - dv[2]*dv[2]);
110 >        pos_from_vec(inpfile[i].igp, dv);
111          return(1);
112   }
113  
# Line 114 | Line 115 | init_pabopto_inp(const int i, const char *fname)
115   static int
116   add_pabopto_inp(const int i)
117   {
117        static int      lastnew = -1;
118          FILE            *fp = fopen(inpfile[i].fname, "r");
119          double          theta_out, phi_out, val;
120          int             n, c;
# Line 125 | Line 125 | add_pabopto_inp(const int i)
125                  return(0);
126          }
127                                          /* prepare input grid */
128 <        angle_eps = 180./2./GRIDRES;
129 <        if (lastnew < 0 || cmp_inang(&inpfile[lastnew], &inpfile[i])) {
130 <                if (lastnew >= 0)       /* need to process previous incidence */
128 >        if (!i || cmp_indir(&inpfile[i-1], &inpfile[i])) {
129 >                if (i)                  /* process previous incidence */
130                          make_rbfrep();
131   #ifdef DEBUG
132                  fprintf(stderr, "New incident (theta,phi)=(%f,%f)\n",
133                                          inpfile[i].theta, inpfile[i].phi);
134   #endif
135                  new_bsdf_data(inpfile[i].theta, inpfile[i].phi);
137                lastnew = i;
136          }
137   #ifdef DEBUG
138          fprintf(stderr, "Loading measurements from '%s'...\n", inpfile[i].fname);
# Line 186 | Line 184 | main(int argc, char *argv[])
184          for (i = 0; i < ninpfiles; i++)
185                  if (!init_pabopto_inp(i, argv[i+1]))
186                          return(1);
187 <        angle_eps = 0;
190 <        qsort(inpfile, ninpfiles, sizeof(PGINPUT), &cmp_inang);
187 >        qsort(inpfile, ninpfiles, sizeof(PGINPUT), &cmp_indir);
188                                                  /* compile measurements */
189          for (i = 0; i < ninpfiles; i++)
190                  if (!add_pabopto_inp(i))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines