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

Comparing ray/src/util/rfluxmtx.c (file contents):
Revision 2.16 by greg, Tue Aug 26 07:41:29 2014 UTC vs.
Revision 2.28 by greg, Tue May 19 12:13:53 2015 UTC

# Line 84 | Line 84 | typedef struct {
84   } POLYTRIS;                     /* triangulated polygon */
85  
86   typedef struct param_s {
87 <        char            hemis[32];      /* hemispherical sampling spec. */
87 >        char            sign;           /* '-' for axis reversal */
88 >        char            hemis[31];      /* hemispherical sampling spec. */
89          int             hsiz;           /* hemisphere basis size */
90          int             nsurfs;         /* number of surfaces */
91          SURF            *slist;         /* list of surfaces */
92          FVECT           vup;            /* up vector (zero if unset) */
93          FVECT           nrm;            /* average normal direction */
94 <        FVECT           udir, vdir;     /* v-up tangent axes */
94 >        FVECT           udir, vdir;     /* tangent axes */
95          char            *outfn;         /* output file name (receiver) */
96          int             (*sample_basis)(struct param_s *p, int, FILE *);
97   } PARAMS;                       /* sender/receiver parameters */
# Line 324 | Line 325 | parse_params(PARAMS *p, char *pargs)
325                  case 'h':
326                          if (*cp++ != '=')
327                                  break;
328 +                        if ((*cp == '+') | (*cp == '-'))
329 +                                p->sign = *cp++;
330 +                        else
331 +                                p->sign = '+';
332                          p->hsiz = 0;
333                          i = 0;
334                          while (*cp && !isspace(*cp)) {
# Line 362 | Line 367 | parse_params(PARAMS *p, char *pargs)
367                  case ' ':
368                  case '\t':
369                  case '\r':
365                        continue;
370                  case '\n':
371 +                        continue;
372                  case '\0':
373                          return(nparams);
374                  default:
# Line 417 | Line 422 | finish_receiver(void)
422          }
423                                          /* determine sample type/bin */
424          if (tolower(curparams.hemis[0]) == 'u' | curparams.hemis[0] == '1') {
425 <                binv = "0";             /* uniform sampling -- one bin */
425 >                sprintf(sbuf, "if(-Dx*%g-Dy*%g-Dz*%g,0,-1)",
426 >                        curparams.nrm[0], curparams.nrm[1], curparams.nrm[2]);
427 >                binv = savqstr(sbuf);
428 >                nbins = "1";            /* uniform sampling -- one bin */
429                  uniform = 1;
430          } else if (tolower(curparams.hemis[0]) == 's' &&
431                                  tolower(curparams.hemis[1]) == 'c') {
# Line 428 | Line 436 | finish_receiver(void)
436                          exit(1);
437                  }
438                  calfn = shirchiufn; shirchiufn = NULL;
439 <                sprintf(sbuf, "SCdim=%d,rNx=%g,rNy=%g,rNz=%g,Ux=%g,Uy=%g,Uz=%g",
439 >                sprintf(sbuf, "SCdim=%d,rNx=%g,rNy=%g,rNz=%g,Ux=%g,Uy=%g,Uz=%g,RHS=%c1",
440                                  curparams.hsiz,
441                          curparams.nrm[0], curparams.nrm[1], curparams.nrm[2],
442 <                        curparams.vup[0], curparams.vup[1], curparams.vup[2]);
442 >                        curparams.vup[0], curparams.vup[1], curparams.vup[2],
443 >                        curparams.sign);
444                  params = savqstr(sbuf);
445                  binv = "scbin";
446                  nbins = "SCdim*SCdim";
447          } else if ((tolower(curparams.hemis[0]) == 'r') |
448                          (tolower(curparams.hemis[0]) == 't')) {
449                  calfn = reinhfn; reinhfn = NULL;
450 <                sprintf(sbuf, "MF=%d,rNx=%g,rNy=%g,rNz=%g,Ux=%g,Uy=%g,Uz=%g",
450 >                sprintf(sbuf, "MF=%d,rNx=%g,rNy=%g,rNz=%g,Ux=%g,Uy=%g,Uz=%g,RHS=%c1",
451                                  curparams.hsiz,
452                          curparams.nrm[0], curparams.nrm[1], curparams.nrm[2],
453 <                        curparams.vup[0], curparams.vup[1], curparams.vup[2]);
453 >                        curparams.vup[0], curparams.vup[1], curparams.vup[2],
454 >                        curparams.sign);
455                  params = savqstr(sbuf);
456                  binv = "rbin";
457                  nbins = "Nrbins";
# Line 469 | Line 479 | finish_receiver(void)
479                                  progname, curparams.hemis);
480                  exit(1);
481          }
482 +        if (tolower(curparams.hemis[0]) == 'k') {
483 +                sprintf(sbuf, "RHS=%c1", curparams.sign);
484 +                params = savqstr(sbuf);
485 +        }
486          if (!uniform & (curparams.slist->styp == ST_SOURCE)) {
487                  SURF    *sp;
488                  for (sp = curparams.slist; sp != NULL; sp = sp->next)
# Line 516 | Line 530 | make_axes(FVECT uva[2], const FVECT nrm)
530   {
531          int     i;
532  
533 <        uva[1][0] = 0.5 - frandom();
520 <        uva[1][1] = 0.5 - frandom();
521 <        uva[1][2] = 0.5 - frandom();
522 <        for (i = 3; i--; )
523 <                if ((-0.6 < nrm[i]) & (nrm[i] < 0.6))
524 <                        break;
525 <        if (i < 0) {
533 >        if (!getperpendicular(uva[0], nrm)) {
534                  fputs(progname, stderr);
535                  fputs(": bad surface normal in make_axes!\n", stderr);
536                  exit(1);
537          }
538 <        uva[1][i] = 1.0;
531 <        VCROSS(uva[0], uva[1], nrm);
532 <        normalize(uva[0]);
533 <        VCROSS(uva[1], nrm, uva[0]);
538 >        fcross(uva[1], nrm, uva[0]);
539   }
540  
541   /* Illegal sender surfaces end up here */
# Line 792 | Line 797 | sample_reinhart(PARAMS *p, int b, FILE *fp)
797                  alt = (row+samp3[1])*RAH;
798                  azi = (2.*PI)*(col+samp3[2]-.5)/rnaz(row);
799                  duvw[2] = cos(alt);     /* measured from horizon */
800 <                duvw[0] = tcos(azi)*duvw[2];
801 <                duvw[1] = tsin(azi)*duvw[2];
800 >                duvw[0] = tsin(azi)*duvw[2];
801 >                duvw[1] = tcos(azi)*duvw[2];
802                  duvw[2] = sqrt(1. - duvw[2]*duvw[2]);
803                  for (i = 3; i--; )
804                          orig_dir[1][i] = -duvw[0]*p->udir[i] -
# Line 844 | Line 849 | sample_klems(PARAMS *p, int b, FILE *fp)
849  
850          while (n--) {                   /* stratified sampling */
851                  SDmultiSamp(samp2, 2, (n+frandom())/sampcnt);
852 <                if (!bo_getvec(duvw, b+samp2[1], kbasis[bi]))
852 >                if (!fo_getvec(duvw, b+samp2[1], kbasis[bi]))
853                          return(0);
854                  for (i = 3; i--; )
855 <                        orig_dir[1][i] = duvw[0]*p->udir[i] +
856 <                                                duvw[1]*p->vdir[i] +
855 >                        orig_dir[1][i] = -duvw[0]*p->udir[i] -
856 >                                                duvw[1]*p->vdir[i] -
857                                                  duvw[2]*p->nrm[i] ;
858                  if (!sample_origin(p, orig_dir[0], orig_dir[1], samp2[0]))
859                          return(0);
# Line 888 | Line 893 | prepare_sampler(void)
893                  else
894                          curparams.vup[1] = 1;
895          }
896 <        VCROSS(curparams.udir, curparams.vup, curparams.nrm);
896 >        fcross(curparams.udir, curparams.vup, curparams.nrm);
897          if (normalize(curparams.udir) == 0) {
898                  fputs(progname, stderr);
899                  fputs(": up vector coincides with sender normal\n", stderr);
900                  return(-1);
901          }
902 <        VCROSS(curparams.vdir, curparams.nrm, curparams.udir);
902 >        fcross(curparams.vdir, curparams.nrm, curparams.udir);
903 >        if (curparams.sign == '-') {    /* left-handed coordinate system? */
904 >                curparams.udir[0] *= -1.;
905 >                curparams.udir[1] *= -1.;
906 >                curparams.udir[2] *= -1.;
907 >        }
908          if (tolower(curparams.hemis[0]) == 'u' | curparams.hemis[0] == '1')
909                  curparams.sample_basis = sample_uniform;
910          else if (tolower(curparams.hemis[0]) == 's' &&
# Line 1089 | Line 1099 | static int
1099   add_send_object(FILE *fp)
1100   {
1101          int             st;
1102 <        char            otype[32], oname[128];
1102 >        char            thismod[128], otype[32], oname[128];
1103          int             n;
1104  
1105 <        if (fscanf(fp, "%*s %s %s", otype, oname) != 2)
1105 >        if (fscanf(fp, "%s %s %s", thismod, otype, oname) != 3)
1106                  return(0);              /* must have hit EOF! */
1107          if (!strcmp(otype, "alias")) {
1108                  fscanf(fp, "%*s");      /* skip alias */
# Line 1105 | Line 1115 | add_send_object(FILE *fp)
1115                          fputs(": cannot use source as a sender!\n", stderr);
1116                          return(-1);
1117                  }
1118 +                if (strcmp(thismod, curmod)) {
1119 +                        if (curmod[0]) {
1120 +                                fputs(progname, stderr);
1121 +                                fputs(": warning - multiple modifiers in sender\n",
1122 +                                                stderr);
1123 +                        }
1124 +                        strcpy(curmod, thismod);
1125 +                }
1126                  parse_params(&curparams, newparams);
1127                  newparams[0] = '\0';
1128                  add_surface(st, oname, fp);     /* read & store surface */
# Line 1274 | Line 1292 | main(int argc, char *argv[])
1292                          if (argv[a][2] != 'v') na = 2;
1293                          break;
1294                  case 'a':               /* special case */
1295 <                        na = (argv[a][2] == 'v') ? 4 : 2;
1295 >                        if (argv[a][2] == 'p') {
1296 >                                na = 2; /* photon map [+ bandwidth(s)] */
1297 >                                if (a < argc-3 && atoi(argv[a+1]) > 0)
1298 >                                        na += 1 + (a < argc-4 && atoi(argv[a+2]) > 0);
1299 >                        } else
1300 >                                na = (argv[a][2] == 'v') ? 4 : 2;
1301                          break;
1302                  case 'm':               /* special case */
1303                          if (!argv[a][2]) goto userr;
# Line 1339 | Line 1362 | main(int argc, char *argv[])
1362                  return(my_exec(rcarg)); /* rcontrib does everything */
1363          }
1364          clear_params(&curparams, 0);    /* else load sender surface & params */
1365 +        curmod[0] = '\0';
1366          if (load_scene(sendfn, add_send_object) < 0)
1367                  return(1);
1368          if ((nsbins = prepare_sampler()) <= 0)
# Line 1356 | Line 1380 | main(int argc, char *argv[])
1380   #ifdef getc_unlocked
1381          flockfile(rcfp);
1382   #endif
1383 <        if (verbose) {
1383 >        if (verbose > 0) {
1384                  fprintf(stderr, "%s: sampling %d directions", progname, nsbins);
1385                  if (curparams.nsurfs > 1)
1386                          fprintf(stderr, " (%d elements)\n", curparams.nsurfs);
# Line 1366 | Line 1390 | main(int argc, char *argv[])
1390          for (i = 0; i < nsbins; i++)    /* send rcontrib ray samples */
1391                  if (!(*curparams.sample_basis)(&curparams, i, rcfp))
1392                          return(1);
1393 <        return(pclose(rcfp) == 0);      /* all finished! */
1393 >        return(pclose(rcfp) < 0);       /* all finished! */
1394   userr:
1395          if (a < argc-2)
1396                  fprintf(stderr, "%s: unsupported option '%s'", progname, argv[a]);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines