--- ray/src/util/rfluxmtx.c 2014/08/15 19:59:56 2.15 +++ ray/src/util/rfluxmtx.c 2015/02/18 05:56:12 2.21 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rfluxmtx.c,v 2.15 2014/08/15 19:59:56 greg Exp $"; +static const char RCSid[] = "$Id: rfluxmtx.c,v 2.21 2015/02/18 05:56:12 greg Exp $"; #endif /* * Calculate flux transfer matrix or matrices using rcontrib @@ -36,7 +36,7 @@ static const char RCSid[] = "$Id: rfluxmtx.c,v 2.15 20 char *progname; /* global argv[0] */ -int verbose = 0; /* verbose mode? */ +int verbose = 0; /* verbose mode (< 0 no warnings) */ char *rcarg[MAXRCARG+1] = {"rcontrib", "-fo+"}; int nrcargs = 2; @@ -226,7 +226,7 @@ popen_arglist(char *av[], char *mode) fputs(": command line too long in popen_arglist()\n", stderr); return(NULL); } - if (verbose) + if (verbose > 0) fprintf(stderr, "%s: opening pipe %s: %s\n", progname, (*mode=='w') ? "to" : "from", cmd); return(popen(cmd, mode)); @@ -244,7 +244,7 @@ my_exec(char *av[]) fputs(": command line too long in my_exec()\n", stderr); return(1); } - if (verbose) + if (verbose > 0) fprintf(stderr, "%s: running: %s\n", progname, cmd); return(system(cmd)); } @@ -259,7 +259,7 @@ my_exec(char *av[]) fprintf(stderr, "%s: cannot locate %s\n", progname, av[0]); return(1); } - if (verbose) { + if (verbose > 0) { char cmd[4096]; if (!convert_commandline(cmd, sizeof(cmd), av)) strcpy(cmd, "COMMAND TOO LONG TO SHOW"); @@ -362,8 +362,8 @@ parse_params(PARAMS *p, char *pargs) case ' ': case '\t': case '\r': - continue; case '\n': + continue; case '\0': return(nparams); default: @@ -417,7 +417,10 @@ finish_receiver(void) } /* determine sample type/bin */ if (tolower(curparams.hemis[0]) == 'u' | curparams.hemis[0] == '1') { - binv = "0"; /* uniform sampling -- one bin */ + sprintf(sbuf, "if(-Dx*%g-Dy*%g-Dz*%g,0,-1)", + curparams.nrm[0], curparams.nrm[1], curparams.nrm[2]); + binv = savqstr(sbuf); + nbins = "1"; /* uniform sampling -- one bin */ uniform = 1; } else if (tolower(curparams.hemis[0]) == 's' && tolower(curparams.hemis[1]) == 'c') { @@ -516,21 +519,12 @@ make_axes(FVECT uva[2], const FVECT nrm) { int i; - uva[1][0] = 0.5 - frandom(); - uva[1][1] = 0.5 - frandom(); - uva[1][2] = 0.5 - frandom(); - for (i = 3; i--; ) - if ((-0.6 < nrm[i]) & (nrm[i] < 0.6)) - break; - if (i < 0) { + if (!getperpendicular(uva[0], nrm)) { fputs(progname, stderr); fputs(": bad surface normal in make_axes!\n", stderr); exit(1); } - uva[1][i] = 1.0; - VCROSS(uva[0], uva[1], nrm); - normalize(uva[0]); - VCROSS(uva[1], nrm, uva[0]); + fcross(uva[1], nrm, uva[0]); } /* Illegal sender surfaces end up here */ @@ -792,8 +786,8 @@ sample_reinhart(PARAMS *p, int b, FILE *fp) alt = (row+samp3[1])*RAH; azi = (2.*PI)*(col+samp3[2]-.5)/rnaz(row); duvw[2] = cos(alt); /* measured from horizon */ - duvw[0] = tcos(azi)*duvw[2]; - duvw[1] = tsin(azi)*duvw[2]; + duvw[0] = tsin(azi)*duvw[2]; + duvw[1] = tcos(azi)*duvw[2]; duvw[2] = sqrt(1. - duvw[2]*duvw[2]); for (i = 3; i--; ) orig_dir[1][i] = -duvw[0]*p->udir[i] - @@ -844,7 +838,7 @@ sample_klems(PARAMS *p, int b, FILE *fp) while (n--) { /* stratified sampling */ SDmultiSamp(samp2, 2, (n+frandom())/sampcnt); - if (!bo_getvec(duvw, b+samp2[1], kbasis[bi])) + if (!bi_getvec(duvw, b+samp2[1], kbasis[bi])) return(0); for (i = 3; i--; ) orig_dir[1][i] = duvw[0]*p->udir[i] + @@ -867,7 +861,8 @@ prepare_sampler(void) fputs(": no sender surface!\n", stderr); return(-1); } - if (curparams.outfn != NULL) /* misplaced output file spec. */ + /* misplaced output file spec. */ + if ((curparams.outfn != NULL) & (verbose >= 0)) fprintf(stderr, "%s: warning - ignoring output file in sender ('%s')\n", progname, curparams.outfn); /* check/set basis hemisphere */ @@ -1018,7 +1013,7 @@ add_surface(int st, const char *oname, FILE *fp) snew->area *= PI*snew->area; break; } - if (snew->area <= FTINY) { + if ((snew->area <= FTINY) & (verbose >= 0)) { fprintf(stderr, "%s: warning - zero area for surface '%s'\n", progname, oname); free(snew); @@ -1205,7 +1200,7 @@ main(int argc, char *argv[]) na = 1; switch (argv[a][1]) { /* !! Keep consistent !! */ case 'v': /* verbose mode */ - verbose = !verbose; + verbose = 1; na = 0; continue; case 'f': /* special case for -fo, -ff, etc. */ @@ -1246,8 +1241,9 @@ main(int argc, char *argv[]) iropt = argv[a]; na = 0; continue; - case 'V': /* options without arguments */ - case 'w': + case 'w': /* options without arguments */ + if (argv[a][2] != '+') verbose = -1; + case 'V': case 'u': case 'h': case 'r':