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.15 by greg, Thu Jan 2 20:19:48 2025 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 >        printf("-x %-9d\t\t\t# x resolution\n", myRCmanager.xres);
51 >        printf("-y %-9d\t\t\t# y resolution\n", myRCmanager.yres);
52 >        printf(myRCmanager.HasFlag(RTlimDist) ?
53 >                        "-ld+\t\t\t\t# limit distance on\n" :
54                          "-ld-\t\t\t\t# limit distance off\n");
55          printf("-f%c%c\t\t\t\t# format input/output = %s/%s\n",
56                          inpfmt, outfmt, formstr(inpfmt), formstr(outfmt));
57          if (report_intvl > 0)
58 <                printf("-t %-9d\t\t\t#  time between reports\n", report_intvl);
58 >                printf("-t %-9d\t\t\t# time between reports\n", report_intvl);
59          printf(erract[WARNING].pf != NULL ?
60                          "-w+\t\t\t\t# warning messages on\n" :
61                          "-w-\t\t\t\t# warning messages off\n");
# Line 81 | Line 74 | onsig(                         /* fatal signal */
74                  _exit(signo);
75  
76   #ifdef SIGALRM
77 <        alarm(15);                      /* allow 15 seconds to clean up */
77 >        alarm(600);                     /* allow 10 minutes to clean up */
78          signal(SIGALRM, SIG_DFL);       /* make certain we do die */
79   #endif
80          eputs("signal - ");
# Line 102 | Line 95 | sigdie(                        /* set fatal signal */
95          sigerr[signo] = msg;
96   }
97  
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
98   /* set input/output format */
99   static void
100   setformat(const char *fmt)
# Line 150 | Line 131 | fmterr:
131          error(USER, errmsg);
132   }
133  
134 + /* Set default options */
135 + static void
136 + default_options(void)
137 + {
138 +        rand_samp = 1;
139 +        dstrsrc = 0.9;
140 +        directrelay = 3;
141 +        vspretest = 512;
142 +        srcsizerat = .2;
143 +        specthresh = .02;
144 +        specjitter = 1.;
145 +        maxdepth = -10;
146 +        minweight = 2e-3;
147 +        ambres = 256;
148 +        ambdiv = 350;
149 +        ambounce = 1;
150 + }
151  
152   /* Set overriding options */
153   static void
# Line 160 | Line 158 | override_options(void)
158          ambacc = 0;
159   }
160  
163
161   int
162   main(int argc, char *argv[])
163   {
# Line 191 | Line 188 | main(int argc, char *argv[])
188                                          /* initialize calcomp routines early */
189          initfunc();
190          calcontext(RCCONTEXT);
191 +                                        /* set rcontrib defaults */
192 +        default_options();
193                                          /* option city */
194          for (i = 1; i < argc; i++) {
195                                                  /* expand arguments */
# Line 218 | Line 217 | main(int argc, char *argv[])
217                          continue;
218                  }
219                  switch (argv[i][1]) {
220 <                case 'n':                       /* number of cores */
220 >                case 'n':                       /* number of processes */
221                          check(2,"i");
222                          nproc = atoi(argv[++i]);
223                          if (nproc < 0 && (nproc += RadSimulManager::GetNCores()) <= 0)
224                                  nproc = 1;
225                          break;
226 <                case 'V':                       /* output contributions */
227 <                        check_bool(2,contrib);
226 >                case 'V':                       /* output contributions? */
227 >                        rval = myRCmanager.HasFlag(RCcontrib);
228 >                        check_bool(2,rval);
229 >                        myRCmanager.SetFlag(RCcontrib, rval);
230                          break;
231                  case 'x':                       /* x resolution */
232                          check(2,"i");
233 <                        xres = atoi(argv[++i]);
233 >                        myRCmanager.xres = atoi(argv[++i]);
234                          break;
235                  case 'y':                       /* y resolution */
236                          check(2,"i");
237 <                        yres = atoi(argv[++i]);
237 >                        myRCmanager.yres = atoi(argv[++i]);
238                          break;
239 <                case 'w':                       /* warnings */
239 >                case 'w':                       /* warnings on/off */
240                          rval = (erract[WARNING].pf != NULL);
241                          check_bool(2,rval);
242                          if (rval) erract[WARNING].pf = wputs;
243                          else erract[WARNING].pf = NULL;
244                          break;
245 <                case 'e':                       /* expression */
245 >                case 'e':                       /* .cal expression */
246                          check(2,"s");
247                          scompile(argv[++i], NULL, 0);
248                          break;
249                  case 'l':                       /* limit distance */
250                          if (argv[i][2] != 'd')
251                                  goto badopt;
252 <                        check_bool(3,lim_dist);
252 >                        rval = myRCmanager.HasFlag(RTlimDist);
253 >                        check_bool(3,rval);
254 >                        myRCmanager.SetFlag(RTlimDist, rval);
255                          break;
256                  case 'I':                       /* immed. irradiance */
257 <                        check_bool(2,imm_irrad);
257 >                        rval = myRCmanager.HasFlag(RTimmIrrad);
258 >                        check_bool(2,rval);
259 >                        myRCmanager.SetFlag(RTimmIrrad, rval);
260                          break;
261 <                case 'f':                       /* file or force or format */
261 >                case 'f':                       /* .cal file or force or format */
262                          if (!argv[i][2]) {
263                                  check(2,"s");
264                                  loadfunc(argv[++i]);
# Line 266 | Line 271 | main(int argc, char *argv[])
271                          setformat(argv[i]+2);
272                          myRCmanager.SetDataFormat(outfmt);
273                          break;
274 <                case 'o':                       /* output */
274 >                case 'o':                       /* output file */
275                          check(2,"s");
276                          curout = argv[++i];
277                          break;
# Line 294 | Line 299 | main(int argc, char *argv[])
299                          check(2,"s");
300                          myRCmanager.AddModifier(argv[++i], curout, prms, binval, bincnt);
301                          break;
302 <                case 'M':                       /* modifier file */
302 >                case 'M':                       /* file of modifier names */
303                          check(2,"s");
304                          myRCmanager.AddModFile(argv[++i], curout, prms, binval, bincnt);
305                          break;
# Line 308 | Line 313 | main(int argc, char *argv[])
313          }
314          if (i != argc-1)
315                  error(USER, "expected single octree argument");
316 +
317 +        override_options();             /* override some option settings */
318 +
319 +        if (!myRCmanager.GetOutput())   // check that we have work to do
320 +                error(USER, "missing required modifier argument");
321                                          // get ready to rock...
322          if (setspectrsamp(CNDX, WLPART) < 0)
323                  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();
324                                          /* set up signal handling */
325          sigdie(SIGINT, "Interrupt");
326   #ifdef SIGHUP
# Line 348 | Line 353 | main(int argc, char *argv[])
353                  myRCmanager.outOp = RCOnew;
354                                          // rval = # rows recovered
355          rval = myRCmanager.PrepOutput();
356 <                                        // check if all done
357 <        if (recover && rval >= myRCmanager.GetRowMax()) {
356 >                                        // check if recovered everything
357 >        if (rval >= myRCmanager.GetRowMax()) {
358                  error(WARNING, "nothing left to compute");
359                  quit(0);
360 <        }                               // add processes as requested
356 <        myRCmanager.SetThreadCount(nproc);
357 <
360 >        }
361          rxcontrib(rval);                /* trace ray contributions (loop) */
362  
363          quit(0);        /* exit clean */
# Line 409 | Line 412 | getRayBundle(FVECT *orig_dir = NULL)
412          int     n2go = myRCmanager.accum;
413  
414          switch (inpfmt) {
415 <        case 'a':                               // ASCII input
415 >        case 'a':                       // ASCII input
416                  if (!orig_dir)
417                          return skipWords(6*n2go);
418                  while (n2go-- > 0) {
# Line 422 | Line 425 | getRayBundle(FVECT *orig_dir = NULL)
425                          orig_dir += 2;
426                  }
427                  break;
428 <        case 'f':                               // float input
428 >        case 'f':                       // float input
429                  if (!orig_dir)
430                          return skipBytes(6*sizeof(float)*n2go);
431   #ifdef SMLFLT
432                  if (getbinary(orig_dir, sizeof(FVECT), 2*n2go, stdin) != 2*n2go)
433                          return false;
434 +                orig_dir += 2*n2go;
435   #else
436                  while (n2go-- > 0) {
437                          float   fvecs[6];
# Line 439 | Line 443 | getRayBundle(FVECT *orig_dir = NULL)
443                  }
444   #endif
445                  break;
446 <        case 'd':                               // double input
446 >        case 'd':                       // double input
447                  if (!orig_dir)
448                          return skipBytes(6*sizeof(double)*n2go);
449   #ifndef SMLFLT
450                  if (getbinary(orig_dir, sizeof(FVECT), 2*n2go, stdin) != 2*n2go)
451                          return false;
452 +                orig_dir += 2*n2go;
453   #else
454                  while (n2go-- > 0) {
455                          double  dvecs[6];
# Line 460 | Line 465 | getRayBundle(FVECT *orig_dir = NULL)
465                  error(INTERNAL, "unsupported format in getRayBundle()");
466                  return false;
467          }
468 <        int     warned = 0;             // normalize directions
464 <        n2go = myRCmanager.accum;
468 >        n2go = myRCmanager.accum;       // normalize directions
469          while (n2go-- > 0) {
470                  orig_dir -= 2;
471 <                if (normalize(orig_dir[1]) == 0)
468 <                        if (!warned++)
469 <                                error(WARNING, "zero ray direction on input");
471 >                normalize(orig_dir[1]);
472          }
473          return true;
474   }
# Line 494 | Line 496 | rxcontrib(const int rstart)
496                  }
497                  last_report = tstart = time(0);
498          }
499 <        while (r < totRows) {           // getting to work...
499 >                                        // start children as requested
500 >        myRCmanager.SetThreadCount(nproc);
501 >
502 >        while (r < totRows) {           // loop until done
503                  time_t  tnow;
504                  if (!getRayBundle(odarr))
505                          goto readerr;
506 <                if (myRCmanager.ComputeRecord(odarr) < 0)
506 >                if (myRCmanager.ComputeRecord(odarr) <= 0)
507                          return;         // error reported, hopefully...
508                  r++;
509                  if (report_intvl <= 0)
510                          continue;
511 <                if ((r < totRows) & ((tnow = time(0)) < last_report+report_intvl))
511 >                if (r == totRows)       // need to finish up?
512 >                        myRCmanager.SetThreadCount(1);
513 >                tnow = time(0);
514 >                if ((r < totRows) & (tnow < last_report+report_intvl))
515                          continue;
516                  sprintf(errmsg, "%.2f%% done after %.3f hours\n",
517 <                                100.*r/totRows, (1./3600.)*(tnow - tstart));
517 >                                100.*myRCmanager.GetRowFinished()/totRows,
518 >                                (1./3600.)*(tnow - tstart));
519                  eputs(errmsg);
520                  last_report = tnow;
521          }
# Line 524 | Line 533 | wputs(                         /* warning output function */
533          const char      *s
534   )
535   {
536 +        if (!erract[WARNING].pf) return;
537          int  lasterrno = errno;
538          eputs(s);
539          errno = lasterrno;
# Line 551 | Line 561 | eputs(                         /* put string to stderr */
561   }
562  
563  
564 < /* Quit program */
564 > /* Exit program */
565   void
566   quit(
567          int  code
568   )
569   {
570 <        if (!code && myRCmanager.Ready())       // clean up on normal exit
561 <                code = myRCmanager.Cleanup();
570 >        myRCmanager.FlushQueue();       // leave nothing in queue
571  
572          exit(code);
573   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines