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

Comparing ray/src/cv/bsdf2klems.c (file contents):
Revision 2.4 by greg, Thu Apr 25 03:12:08 2013 UTC vs.
Revision 2.12 by greg, Thu Nov 21 20:09:06 2013 UTC

# Line 25 | Line 25 | char                   *progname;
25   static const char       *kbasis = "LBNL/Klems Full";
26                                  /* number of BSDF samples per patch */
27   static int              npsamps = 256;
28 +                                /* limit on number of RBF lobes */
29 + static int              lobe_lim = 15000;
30  
31   /* Return angle basis corresponding to the given name */
32   ANGLE_BASIS *
# Line 56 | Line 58 | xml_header(int ac, char *av[])
58   static void
59   xml_prologue(const SDData *sd)
60   {
61 <        const char      *matn = (sd && sd->matn[0]) ? sd->matn : "Name";
62 <        const char      *makr = (sd && sd->makr[0]) ? sd->makr : "Manufacturer";
61 >        const char      *matn = (sd && sd->matn[0]) ? sd->matn :
62 >                                bsdf_name[0] ? bsdf_name : "Unknown";
63 >        const char      *makr = (sd && sd->makr[0]) ? sd->makr :
64 >                                bsdf_manuf[0] ? bsdf_manuf : "Unknown";
65          ANGLE_BASIS     *abp = get_basis(kbasis);
66          int             i;
67  
# Line 174 | Line 178 | eval_bsdf(const char *fname)
178                      sum = 0;                    /* average over patches */
179                      for (n = npsamps; n-- > 0; ) {
180                          fo_getvec(vout, j+(n+frandom())/npsamps, abp);
181 <                        fi_getvec(vin, i+(n+frandom())/npsamps, abp);
181 >                        fi_getvec(vin, i+urand(n), abp);
182                          ec = SDevalBSDF(&sv, vout, vin, &bsd);
183                          if (ec != SDEnone)
184                                  goto err;
# Line 195 | Line 199 | eval_bsdf(const char *fname)
199                      sum = 0;                    /* average over patches */
200                      for (n = npsamps; n-- > 0; ) {
201                          bo_getvec(vout, j+(n+frandom())/npsamps, abp);
202 <                        bi_getvec(vin, i+(n+frandom())/npsamps, abp);
202 >                        bi_getvec(vin, i+urand(n), abp);
203                          ec = SDevalBSDF(&sv, vout, vin, &bsd);
204                          if (ec != SDEnone)
205                                  goto err;
# Line 216 | Line 220 | eval_bsdf(const char *fname)
220                      sum = 0;                    /* average over patches */
221                      for (n = npsamps; n-- > 0; ) {
222                          bo_getvec(vout, j+(n+frandom())/npsamps, abp);
223 <                        fi_getvec(vin, i+(n+frandom())/npsamps, abp);
223 >                        fi_getvec(vin, i+urand(n), abp);
224                          ec = SDevalBSDF(&sv, vout, vin, &bsd);
225                          if (ec != SDEnone)
226                                  goto err;
# Line 229 | Line 233 | eval_bsdf(const char *fname)
233              data_epilogue();
234          }
235                                                  /* back transmission */
236 <        if (bsd.tb != NULL) {
236 >        if ((bsd.tb != NULL) | (bsd.tf != NULL)) {
237              input_orient = -1; output_orient = 1;
238              data_prologue();
239              for (j = 0; j < abp->nangles; j++) {
240                  for (i = 0; i < abp->nangles; i++) {
241 <                    sum = 0;                    /* average over patches */
241 >                    sum = 0;            /* average over patches */
242                      for (n = npsamps; n-- > 0; ) {
243                          fo_getvec(vout, j+(n+frandom())/npsamps, abp);
244 <                        bi_getvec(vin, i+(n+frandom())/npsamps, abp);
244 >                        bi_getvec(vin, i+urand(n), abp);
245                          ec = SDevalBSDF(&sv, vout, vin, &bsd);
246                          if (ec != SDEnone)
247                                  goto err;
# Line 261 | Line 265 | static void
265   eval_function(char *funame)
266   {
267          ANGLE_BASIS     *abp = get_basis(kbasis);
268 +        int             assignD = (fundefined(funame) < 6);
269          double          iovec[6];
270          double          sum;
271          int             i, j, n;
# Line 281 | Line 286 | eval_function(char *funame)
286                      else
287                          bi_getvec(iovec, i+urand(n), abp);
288  
289 +                    if (assignD) {
290 +                        varset("Dx", '=', -iovec[3]);
291 +                        varset("Dy", '=', -iovec[4]);
292 +                        varset("Dz", '=', -iovec[5]);
293 +                        ++eclock;
294 +                    }
295                      sum += funvalue(funame, 6, iovec);
296                  }
297                  printf("\t%.3e\n", sum/npsamps);
# Line 312 | Line 323 | eval_rbf(void)
323              else
324                  bi_getvec(vin, i+.5*(i>0), abp);
325  
326 <            rbf = advect_rbf(vin);              /* compute radial basis func */
326 >            rbf = advect_rbf(vin, lobe_lim);    /* compute radial basis func */
327  
328              for (j = 0; j < abp->nangles; j++) {
329                  sum = 0;                        /* sample over exiting patch */
# Line 322 | Line 333 | eval_rbf(void)
333                      else
334                          bo_getvec(vout, j+(n+frandom())/npsamps, abp);
335  
336 <                    sum += eval_rbfrep(rbf, vout) / vout[2];
336 >                    sum += eval_rbfrep(rbf, vout);
337                  }
338 <                bsdfarr[j*abp->nangles + i] = sum*output_orient/npsamps;
338 >                fo_getvec(vout, j+.5, abp);     /* use centered secant */
339 >                bsdfarr[j*abp->nangles + i] = sum / (npsamps*vout[2]);
340              }
341 +            if (rbf != NULL)
342 +                free(rbf);
343          }
344          n = 0;                                  /* write out our matrix */
345          for (j = 0; j < abp->nangles; j++) {
# Line 376 | Line 390 | main(int argc, char *argv[])
390                  case 'q':
391                          kbasis = "LBNL/Klems Quarter";
392                          break;
393 +                case 'l':
394 +                        lobe_lim = atoi(argv[++i]);
395 +                        break;
396                  default:
397                          goto userr;
398                  }
# Line 384 | Line 401 | main(int argc, char *argv[])
401                          fprintf(stderr,
402          "%s: need single function with 6 arguments: bsdf(ix,iy,iz,ox,oy,oz)\n",
403                                          progname);
404 +                        fprintf(stderr, "\tor 3 arguments using Dx,Dy,Dz: bsdf(ix,iy,iz)\n",
405 +                                        progname);
406                          goto userr;
407                  }
408 +                ++eclock;
409                  xml_header(argc, argv);                 /* start XML output */
410                  xml_prologue(NULL);
411                  if (dofwd) {
# Line 444 | Line 464 | main(int argc, char *argv[])
464          return(0);
465   userr:
466          fprintf(stderr,
467 <        "Usage: %s [-n spp][-h|-q][bsdf.sir ..] > bsdf.xml\n", progname);
467 >        "Usage: %s [-n spp][-h|-q][-l maxlobes] [bsdf.sir ..] > bsdf.xml\n", progname);
468          fprintf(stderr,
469          "   or: %s [-n spp][-h|-q] bsdf_in.xml > bsdf_out.xml\n", progname);
470          fprintf(stderr,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines