ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rxcmain.cpp
(Generate patch)

Comparing ray/src/rt/rxcmain.cpp (file contents):
Revision 2.1 by greg, Tue Oct 29 00:36:54 2024 UTC vs.
Revision 2.9 by greg, Tue Dec 3 17:39:42 2024 UTC

# Line 21 | Line 21 | int    nproc = 1;                      /* number of processes requested */
21   int     inpfmt = 'a';                   /* input format */
22   int     outfmt = 'f';                   /* output format */
23  
24 int     contrib = 0;                    /* computing contributions? */
25
26 int     xres = 0;                       /* horizontal (scan) size */
27 int     yres = 0;                       /* vertical resolution */
28
29 int     imm_irrad = 0;                  /* compute immediate irradiance? */
30 int     lim_dist = 0;                   /* limit distance? */
31
24   int     report_intvl = 0;               /* reporting interval (seconds) */
25  
26   extern char *   progname;               // global argv[0]
# Line 38 | Line 30 | RcontribSimulManager   myRCmanager;    // global rcontrib s
30   #define RCONTRIB_FEATURES       "Multiprocessing\n" \
31                                  "Accumulation\nRecovery\n" \
32                                  "ImmediateIrradiance\n" \
33 <                                "ProgressReporting?\nDistanceLimiting\n" \
33 >                                "ProgressReporting\nDistanceLimiting\n" \
34                                  "InputFormats=a,f,d\nOutputFormats=f,d,c\n" \
35                                  "Outputs=V,W\n" \
36                                  "OutputCS=RGB,spec\n"
# Line 49 | Line 41 | static void
41   printdefaults(void)                     /* print default values to stdout */
42   {
43          printf("-c %-5d\t\t\t# accumulated rays per record\n", myRCmanager.accum);
44 <        printf("-V%c\t\t\t\t# output %s\n", contrib ? '+' : '-',
45 <                        contrib ? "contributions" : "coefficients");
46 <        if (imm_irrad)
44 >        printf(myRCmanager.HasFlag(RCcontrib) ?
45 >                        "-V+\t\t\t\t# output contributions\n" :
46 >                        "-V-\t\t\t\t# output coefficients\n");
47 >        if (myRCmanager.HasFlag(RTimmIrrad))
48                  printf("-I+\t\t\t\t# immediate irradiance on\n");
49          printf("-n %-2d\t\t\t\t# number of rendering processes\n", nproc);
50 <        if (xres > 0)
51 <                printf("-x %-9d\t\t\t# x resolution\n", xres);
52 <        printf("-y %-9d\t\t\t# y resolution\n", yres);
53 <        printf(lim_dist ? "-ld+\t\t\t\t# limit distance on\n" :
50 >        if (myRCmanager.xres > 0)
51 >                printf("-x %-9d\t\t\t# x resolution\n", myRCmanager.xres);
52 >        printf("-y %-9d\t\t\t# y resolution\n", myRCmanager.yres);
53 >        printf(myRCmanager.HasFlag(RTlimDist) ?
54 >                        "-ld+\t\t\t\t# limit distance on\n" :
55                          "-ld-\t\t\t\t# limit distance off\n");
56          printf("-f%c%c\t\t\t\t# format input/output = %s/%s\n",
57                          inpfmt, outfmt, formstr(inpfmt), formstr(outfmt));
# Line 81 | Line 75 | onsig(                         /* fatal signal */
75                  _exit(signo);
76  
77   #ifdef SIGALRM
78 <        alarm(15);                      /* allow 15 seconds to clean up */
78 >        alarm(180);                     /* allow 3 minutes to clean up */
79          signal(SIGALRM, SIG_DFL);       /* make certain we do die */
80   #endif
81          eputs("signal - ");
# Line 102 | Line 96 | sigdie(                        /* set fatal signal */
96          sigerr[signo] = msg;
97   }
98  
105 const char *
106 formstr(int f)                          // return format identifier
107 {
108        switch (f) {
109        case 'a': return("ascii");
110        case 'f': return("float");
111        case 'd': return("double");
112        case 'c': return(NCSAMP==3 ? COLRFMT : SPECFMT);
113        }
114        return("unknown");
115 }
116
99   /* set input/output format */
100   static void
101   setformat(const char *fmt)
# Line 218 | Line 200 | main(int argc, char *argv[])
200                          continue;
201                  }
202                  switch (argv[i][1]) {
203 <                case 'n':                       /* number of cores */
203 >                case 'n':                       /* number of processes */
204                          check(2,"i");
205                          nproc = atoi(argv[++i]);
206                          if (nproc < 0 && (nproc += RadSimulManager::GetNCores()) <= 0)
207                                  nproc = 1;
208                          break;
209 <                case 'V':                       /* output contributions */
210 <                        check_bool(2,contrib);
209 >                case 'V':                       /* output contributions? */
210 >                        rval = myRCmanager.HasFlag(RCcontrib);
211 >                        check_bool(2,rval);
212 >                        myRCmanager.SetFlag(RCcontrib, rval);
213                          break;
214                  case 'x':                       /* x resolution */
215                          check(2,"i");
216 <                        xres = atoi(argv[++i]);
216 >                        myRCmanager.xres = atoi(argv[++i]);
217                          break;
218                  case 'y':                       /* y resolution */
219                          check(2,"i");
220 <                        yres = atoi(argv[++i]);
220 >                        myRCmanager.yres = atoi(argv[++i]);
221                          break;
222 <                case 'w':                       /* warnings */
222 >                case 'w':                       /* warnings on/off */
223                          rval = (erract[WARNING].pf != NULL);
224                          check_bool(2,rval);
225                          if (rval) erract[WARNING].pf = wputs;
226                          else erract[WARNING].pf = NULL;
227                          break;
228 <                case 'e':                       /* expression */
228 >                case 'e':                       /* .cal expression */
229                          check(2,"s");
230                          scompile(argv[++i], NULL, 0);
231                          break;
232                  case 'l':                       /* limit distance */
233                          if (argv[i][2] != 'd')
234                                  goto badopt;
235 <                        check_bool(3,lim_dist);
235 >                        rval = myRCmanager.HasFlag(RTlimDist);
236 >                        check_bool(3,rval);
237 >                        myRCmanager.SetFlag(RTlimDist, rval);
238                          break;
239                  case 'I':                       /* immed. irradiance */
240 <                        check_bool(2,imm_irrad);
240 >                        rval = myRCmanager.HasFlag(RTimmIrrad);
241 >                        check_bool(2,rval);
242 >                        myRCmanager.SetFlag(RTimmIrrad, rval);
243                          break;
244 <                case 'f':                       /* file or force or format */
244 >                case 'f':                       /* .cal file or force or format */
245                          if (!argv[i][2]) {
246                                  check(2,"s");
247                                  loadfunc(argv[++i]);
# Line 266 | Line 254 | main(int argc, char *argv[])
254                          setformat(argv[i]+2);
255                          myRCmanager.SetDataFormat(outfmt);
256                          break;
257 <                case 'o':                       /* output */
257 >                case 'o':                       /* output file */
258                          check(2,"s");
259                          curout = argv[++i];
260                          break;
# Line 294 | Line 282 | main(int argc, char *argv[])
282                          check(2,"s");
283                          myRCmanager.AddModifier(argv[++i], curout, prms, binval, bincnt);
284                          break;
285 <                case 'M':                       /* modifier file */
285 >                case 'M':                       /* file of modifier names */
286                          check(2,"s");
287                          myRCmanager.AddModFile(argv[++i], curout, prms, binval, bincnt);
288                          break;
# Line 308 | Line 296 | main(int argc, char *argv[])
296          }
297          if (i != argc-1)
298                  error(USER, "expected single octree argument");
299 +
300 +        override_options();             /* override some option settings */
301 +
302 +        if (!myRCmanager.GetOutput())   // check that we have work to do
303 +                error(USER, "missing required modifier argument");
304                                          // get ready to rock...
305          if (setspectrsamp(CNDX, WLPART) < 0)
306                  error(USER, "unsupported spectral sampling");
314
315        if (!myRCmanager.GetOutputs(NULL))      // check that we're ready
316                error(USER, "missing required modifier argument");
317                                        /* override some option settings */
318        override_options();
307                                          /* set up signal handling */
308          sigdie(SIGINT, "Interrupt");
309   #ifdef SIGHUP
# Line 348 | Line 336 | main(int argc, char *argv[])
336                  myRCmanager.outOp = RCOnew;
337                                          // rval = # rows recovered
338          rval = myRCmanager.PrepOutput();
339 <                                        // check if all done
340 <        if (recover && rval >= myRCmanager.GetRowMax()) {
339 >                                        // check if recovered everything
340 >        if (rval >= myRCmanager.GetRowMax()) {
341                  error(WARNING, "nothing left to compute");
342                  quit(0);
343          }                               // add processes as requested
# Line 494 | Line 482 | rxcontrib(const int rstart)
482                  }
483                  last_report = tstart = time(0);
484          }
485 <        while (r < totRows) {           // getting to work...
485 >        while (r < totRows) {           // loop until done
486                  time_t  tnow;
487                  if (!getRayBundle(odarr))
488                          goto readerr;
489 <                if (myRCmanager.ComputeRecord(odarr) < 0)
489 >                if (myRCmanager.ComputeRecord(odarr) <= 0)
490                          return;         // error reported, hopefully...
491                  r++;
492                  if (report_intvl <= 0)
493                          continue;
494 <                if ((r < totRows) & ((tnow = time(0)) < last_report+report_intvl))
494 >                tnow = time(0);         // time to report progress?
495 >                if (r == totRows)
496 >                        myRCmanager.FlushQueue();
497 >                else if (tnow < last_report+report_intvl)
498                          continue;
499                  sprintf(errmsg, "%.2f%% done after %.3f hours\n",
500 <                                100.*r/totRows, (1./3600.)*(tnow - tstart));
500 >                                100.*myRCmanager.GetRowFinished()/totRows,
501 >                                (1./3600.)*(tnow - tstart));
502                  eputs(errmsg);
503                  last_report = tnow;
504          }
# Line 524 | Line 516 | wputs(                         /* warning output function */
516          const char      *s
517   )
518   {
519 +        if (!erract[WARNING].pf) return;
520          int  lasterrno = errno;
521          eputs(s);
522          errno = lasterrno;
# Line 551 | Line 544 | eputs(                         /* put string to stderr */
544   }
545  
546  
547 < /* Quit program */
547 > /* Exit program */
548   void
549   quit(
550          int  code

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines