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

Comparing ray/src/cv/bsdfquery.c (file contents):
Revision 2.3 by greg, Fri Apr 11 20:27:23 2014 UTC vs.
Revision 2.10 by greg, Tue Jun 11 16:09:40 2019 UTC

# Line 5 | Line 5 | static const char RCSid[] = "$Id$";
5   *  Query values from the given BSDF (scattering interpolant or XML repres.)
6   *  Input query is incident and exiting vectors directed away from surface.
7   *  We normalize.  Output is a BSDF value for the vector pair.
8 + *  A zero length in or out vector is ignored, causing output to be flushed.
9   *  It is wise to sort the input directions to keep identical ones together
10   *  when using a scattering interpolant representation.
11   */
# Line 14 | Line 15 | static const char RCSid[] = "$Id$";
15   #include <string.h>
16   #include <stdlib.h>
17   #include "rtmath.h"
18 + #include "rtio.h"
19   #include "bsdfrep.h"
20  
21   char    *progname;
# Line 24 | Line 26 | readIOdir(FVECT idir, FVECT odir, FILE *fp, int fmt)
26   {
27          double  dvec[6];
28          float   fvec[6];
29 <
29 > tryagain:
30          switch (fmt) {
31          case 'a':
32 <                if (fscanf(fp, FVFORMAT, dvec, dvec+1, dvec+2) != 3 ||
33 <                                fscanf(fp, FVFORMAT, dvec+3, dvec+4, dvec+5) != 3)
32 >                if (fscanf(fp, FVFORMAT, &idir[0], &idir[1], &idir[2]) != 3 ||
33 >                                fscanf(fp, FVFORMAT, &odir[0], &odir[1], &odir[2]) != 3)
34                          return(0);
33                VCOPY(idir, dvec);
34                VCOPY(odir, dvec+3);
35                  break;
36          case 'd':
37 <                if (fread(dvec, sizeof(double), 6, fp) != 6)
37 >                if (getbinary(dvec, sizeof(double), 6, fp) != 6)
38                          return(0);
39                  VCOPY(idir, dvec);
40                  VCOPY(odir, dvec+3);
41                  break;
42          case 'f':
43 <                if (fread(fvec, sizeof(float), 6, fp) != 6)
43 >                if (getbinary(fvec, sizeof(float), 6, fp) != 6)
44                          return(0);
45                  VCOPY(idir, fvec);
46                  VCOPY(odir, fvec+3);
47                  break;
48          }
49          if ((normalize(idir) == 0) | (normalize(odir) == 0)) {
50 <                fprintf(stderr, "%s: zero input vector!\n", progname);
51 <                return(0);
50 >                fflush(stdout);         /* desired side-effect? */
51 >                goto tryagain;
52          }
53          return(1);
54   }
# Line 57 | Line 57 | readIOdir(FVECT idir, FVECT odir, FILE *fp, int fmt)
57   int
58   main(int argc, char *argv[])
59   {
60 +        int     unbuffered = 0;
61 +        int     repXYZ = 0;
62          int     inpXML = -1;
63          int     inpfmt = 'a';
64          int     outfmt = 'a';
# Line 67 | Line 69 | main(int argc, char *argv[])
69          int     n;
70                                                  /* check arguments */
71          progname = argv[0];
72 <        if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'f' &&
73 <                        argv[1][2] && strchr("afd", argv[1][2]) != NULL) {
74 <                inpfmt = outfmt = argv[1][2];
75 <                if (argv[1][3] && strchr("afd", argv[1][3]) != NULL)
76 <                        outfmt = argv[1][3];
72 >        while (argc > 2 && argv[1][0] == '-') {
73 >                switch (argv[1][1]) {
74 >                case 'u':                       /* unbuffered output */\
75 >                        unbuffered = 1;
76 >                        break;
77 >                case 'c':                       /* color output */
78 >                        repXYZ = 1;
79 >                        break;
80 >                case 'f':                       /* i/o format */
81 >                        if (!argv[1][2] || strchr("afd", argv[1][2]) == NULL)
82 >                                goto userr;
83 >                        inpfmt = outfmt = argv[1][2];
84 >                        if (argv[1][3] && strchr("afd", argv[1][3]) != NULL)
85 >                                outfmt = argv[1][3];
86 >                        break;
87 >                default:
88 >                        goto userr;
89 >                }
90                  ++argv; --argc;
91          }
92          if (argc > 1 && (n = strlen(argv[1])-4) > 0) {
# Line 80 | Line 95 | main(int argc, char *argv[])
95                  else if (!strcasecmp(argv[1]+n, ".sir"))
96                          inpXML = 0;
97          }
98 <        if ((argc != 2) | (inpXML < 0)) {
99 <                fprintf(stderr, "Usage: %s [-fio] bsdf.{sir|xml}\n", progname);
85 <                return(1);
86 <        }
98 >        if ((argc != 2) | (inpXML < 0))
99 >                goto userr;
100                                                  /* load BSDF representation */
101          if (inpXML) {
102                  SDclearBSDF(&myBSDF, argv[1]);
# Line 102 | Line 115 | main(int argc, char *argv[])
115          }
116                                                  /* query BSDF values */
117          while (readIOdir(idir, odir, stdin, inpfmt)) {
118 <                double  bsdf;
106 <                float   fval;
118 >                SDValue sval;
119                  if (inpXML) {
108                        SDValue sval;
120                          if (SDreportError(SDevalBSDF(&sval, odir,
121                                                  idir, &myBSDF), stderr))
122                                  return(1);
112                        bsdf = sval.cieY;
123                  } else {
124                          int32   inpDir = encodedir(idir);
125                          if (inpDir != prevInpDir) {
# Line 127 | Line 137 | main(int argc, char *argv[])
137                                                  progname);
138                                  return(1);
139                          }
140 <                        bsdf = eval_rbfrep(rbf, odir)/(output_orient*odir[2]);
140 >                        if (SDreportError(eval_rbfcol(&sval, rbf, odir), stderr))
141 >                                return(1);
142                  }
143 +
144                  switch (outfmt) {               /* write to stdout */
145                  case 'a':
146 <                        printf("%.6e\n", bsdf);
146 >                        if (repXYZ) {
147 >                                double  cieX = sval.spec.cx/sval.spec.cy*sval.cieY;
148 >                                double  cieZ = (1. - sval.spec.cx - sval.spec.cy) /
149 >                                                sval.spec.cy * sval.cieY;
150 >                                printf("%.6e %.6e %.6e\n", cieX, sval.cieY, cieZ);
151 >                        } else
152 >                                printf("%.6e\n", sval.cieY);
153                          break;
154                  case 'd':
155 <                        fwrite(&bsdf, sizeof(double), 1, stdout);
155 >                        if (repXYZ) {
156 >                                double  cieXYZ[3];
157 >                                cieXYZ[0] = sval.spec.cx/sval.spec.cy*sval.cieY;
158 >                                cieXYZ[1] = sval.cieY;
159 >                                cieXYZ[2] = (1. - sval.spec.cx - sval.spec.cy) /
160 >                                                sval.spec.cy * sval.cieY;
161 >                                putbinary(cieXYZ, sizeof(double), 3, stdout);
162 >                        } else
163 >                                putbinary(&sval.cieY, sizeof(double), 1, stdout);
164                          break;
165                  case 'f':
166 <                        fval = bsdf;
167 <                        fwrite(&fval, sizeof(float), 1, stdout);
166 >                        if (repXYZ) {
167 >                                float   cieXYZ[3];
168 >                                cieXYZ[0] = sval.spec.cx/sval.spec.cy*sval.cieY;
169 >                                cieXYZ[1] = sval.cieY;
170 >                                cieXYZ[2] = (1. - sval.spec.cx - sval.spec.cy) /
171 >                                                sval.spec.cy * sval.cieY;
172 >                                putbinary(cieXYZ, sizeof(float), 3, stdout);
173 >                        } else {
174 >                                float   cieY = sval.cieY;
175 >                                putbinary(&cieY, sizeof(float), 1, stdout);
176 >                        }
177                          break;
178                  }
179 +                if (unbuffered)
180 +                        fflush(stdout);
181          }
182 +        /* if (rbf != NULL) free(rbf); */
183          return(0);
184 + userr:
185 +        fprintf(stderr, "Usage: %s [-u][-c][-fio] bsdf.{sir|xml}\n", progname);
186 +        return(1);
187   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines