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.25 by greg, Fri Mar 20 15:19:22 2015 UTC vs.
Revision 2.26 by greg, Fri Mar 27 18:58:06 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 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 (!fi_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' &&

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines