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

Comparing ray/src/util/rtcontrib.c (file contents):
Revision 1.51 by greg, Sat Dec 6 01:08:53 2008 UTC vs.
Revision 1.57 by greg, Sun Sep 26 15:44:00 2010 UTC

# Line 14 | Line 14 | static const char RCSid[] = "$Id$";
14   #include  "color.h"
15   #include  "resolu.h"
16   #include  "lookup.h"
17 + #include  "random.h"
18   #include  "calcomp.h"
19  
20   #ifndef MAXMODLIST
# Line 246 | Line 247 | main(int argc, char *argv[])
247                  while ((j = expandarg(&argc, &argv, i)) > 0)
248                          ;
249                  if (j < 0) {
250 <                        fprintf(stderr, "%s: cannot expand '%s'",
250 >                        fprintf(stderr, "%s: cannot expand '%s'\n",
251                                          argv[0], argv[i]);
252                          exit(1);
253                  }
# Line 340 | Line 341 | main(int argc, char *argv[])
341                          case 'b':               /* bin expression/count */
342                                  if (i >= argc-2) break;
343                                  if (argv[i][2] == 'n') {
344 <                                        bincnt = atoi(argv[++i]);
344 >                                        bincnt = (int)(eval(argv[++i]) + .5);
345                                          continue;
346                                  }
347                                  if (argv[i][2]) break;
# Line 378 | Line 379 | main(int argc, char *argv[])
379          rtargv[rtargc++] = contrib ? RTCONTRIB : RTCOEFF;
380                                  /* just asking for defaults? */
381          if (!strcmp(argv[i], "-defaults")) {
382 <                char    sxres[16], syres[16];
382 >                char    nps[8], sxres[16], syres[16];
383                  char    *rtpath;
383                printf("-n %-2d\t\t\t\t# number of processes\n", nprocs);
384                  printf("-c %-5d\t\t\t# accumulated rays per record\n",
385                                  accumulate);
386                  printf("-V%c\t\t\t\t# output %s\n", contrib ? '+' : '-',
387                                  contrib ? "contributions" : "coefficients");
388                  fflush(stdout);                 /* report OUR options */
389 +                rtargv[rtargc++] = "-n";
390 +                sprintf(nps, "%d", nprocs);
391 +                rtargv[rtargc++] = nps;
392                  rtargv[rtargc++] = header ? "-h+" : "-h-";
393                  sprintf(fmt, "-f%c%c", inpfmt, outfmt);
394                  rtargv[rtargc++] = fmt;
# Line 543 | Line 546 | init(int np)
546                  raysleft = 0;
547          if ((account = accumulate) > 0)
548                  raysleft *= accumulate;
549 <        waitflush = xres;
549 >        waitflush = (yres > 0) & (xres > 1) ? 0 : xres;
550          if (!recover)
551                  return;
552                                          /* recover previous values */
# Line 580 | Line 583 | addmodifier(char *modn, char *outf, char *binv, int bi
583                  error(USER, errmsg);
584          }
585          if (nmods >= MAXMODLIST)
586 <                error(USER, "too many modifiers");
586 >                error(INTERNAL, "too many modifiers");
587          modname[nmods++] = modn;        /* XXX assumes static string */
588          lep->key = modn;                /* XXX assumes static string */
589          mp = (MODCONT *)malloc(sizeof(MODCONT));
# Line 588 | Line 591 | addmodifier(char *modn, char *outf, char *binv, int bi
591                  error(SYSTEM, "out of memory in addmodifier");
592          mp->outspec = outf;             /* XXX assumes static string */
593          mp->modname = modn;             /* XXX assumes static string */
594 <        if (binv != NULL)
595 <                mp->binv = eparse(binv);
596 <        else
597 <                mp->binv = eparse("0");
598 <        mp->nbins = 1;
594 >        if (binv == NULL)
595 >                binv = "0";             /* use single bin if unspecified */
596 >        mp->binv = eparse(binv);
597 >        if (mp->binv->type == NUM) {    /* check value if constant */
598 >                bincnt = (int)(evalue(mp->binv) + 1.5);
599 >                if (bincnt != 1) {
600 >                        sprintf(errmsg, "illegal non-zero constant for bin (%s)",
601 >                                        binv);
602 >                        error(USER, errmsg);
603 >                }
604 >        }
605 >        mp->nbins = 1;                  /* initialize results holder */
606          setcolor(mp->cbin[0], 0., 0., 0.);
607 <        if (mp->binv->type == NUM)      /* assume one bin if constant */
598 <                bincnt = 1;
599 <        else if (bincnt > 1)
607 >        if (bincnt > 1)
608                  mp = growmodifier(mp, bincnt);
609          lep->data = (char *)mp;
610                                          /* allocate output streams */
# Line 659 | Line 667 | ofname(char *oname, const char *ospec, const char *mna
667                                  mnp = cp;
668                                  break;
669                          case 'd':
670 +                        case 'i':
671 +                        case 'o':
672 +                        case 'x':
673 +                        case 'X':
674                                  if (bnp != NULL)
675                                          return -1;
676                                  bnp = cp;
# Line 725 | Line 737 | printresolu(FILE *fout, int xr, int yr)
737   {
738          if ((xr > 0) & (yr > 0))        /* resolution string */
739                  fprtresolu(xr, yr, fout);
728        if (xres > 0)                   /* global flush flag */
729                fflush(fout);
740   }
741  
742   /* Get output stream pointer (open and write header if new and noopen==0) */
# Line 747 | Line 757 | getostream(const char *ospec, const char *mname, int b
757                          if (header)
758                                  printheader(stdout, NULL);
759                          printresolu(stdout, xres, yres);
760 +                        if (waitflush > 0)
761 +                                fflush(stdout);
762                          stdos.xr = xres; stdos.yr = yres;
763                          using_stdout = 1;
764                  }
# Line 815 | Line 827 | getostream(const char *ospec, const char *mname, int b
827                          if (outfmt == 'a')
828                                  putc('\n', sop->ofp);
829                  }
830 <                if (xres > 0)
830 >                if (waitflush > 0)
831                          fflush(sop->ofp);
832          }
833          sop->reclen += noopen;                  /* add to length if noopen */
# Line 945 | Line 957 | put_contrib(const DCOLOR cnt, FILE *fout)
957          default:
958                  error(INTERNAL, "botched output format");
959          }
960 +        if (waitflush < 0 && frandom() < 0.001)
961 +                fflush(fout);                   /* staggers writes */
962   }
963  
964   /* output ray tallies and clear for next accumulation */
# Line 982 | Line 996 | done_contrib(int navg)
996          if (using_stdout & (outfmt == 'a'))
997                  putc('\n', stdout);
998          if (!waitflush) {
999 <                waitflush = xres;
999 >                waitflush = (yres > 0) & (xres > 1) ? 0 : xres;
1000                  if (using_stdout)
1001                          fflush(stdout);
1002          }
# Line 1148 | Line 1162 | trace_contribs(FILE *fin)
1162                                  "dummy ray(s) ignored during accumulation\n");
1163                          continue;
1164                  }
1165 <                if (!iblen ||                   /* need reset? */
1165 >                if (!iblen ||                   /* need flush/reset? */
1166                                  queue_length() > 10*nrtprocs() ||
1167                                  lastray+1 < lastray) {
1168                          while (wait_rproc() != NULL)
# Line 1161 | Line 1175 | trace_contribs(FILE *fin)
1175                  if (iblen) {                    /* trace ray if valid */
1176                          writebuf(rtp->pd.w, inpbuf, iblen);
1177                  } else {                        /* else bypass dummy ray */
1178 <                        queue_raytree(rtp);     /* empty tree */
1179 <                        if ((yres <= 0) | (waitflush > 1))
1180 <                                waitflush = 1;  /* flush after this */
1178 >                        queue_raytree(rtp);     /* queue empty ray/record */
1179 >                        if ((yres <= 0) | (xres <= 0))
1180 >                                waitflush = 1;  /* flush right after */
1181                  }
1182                  process_queue();                /* catch up with results */
1183                  if (raysleft && !--raysleft)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines