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.23 by greg, Wed Feb 18 06:18:38 2015 UTC vs.
Revision 2.29 by greg, Thu May 21 05:54:54 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 431 | 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 472 | 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 519 | Line 530 | make_axes(FVECT uva[2], const FVECT nrm)
530   {
531          int     i;
532  
533 <        if (!getperpendicular(uva[0], nrm)) {
533 >        if (!getperpendicular(uva[0], nrm, 1)) {
534                  fputs(progname, stderr);
535                  fputs(": bad surface normal in make_axes!\n", stderr);
536                  exit(1);
# Line 838 | 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 (!bi_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 882 | 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 1083 | 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 1099 | 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 1268 | 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 1333 | 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)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines