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

Comparing ray/src/rt/rcmain.c (file contents):
Revision 2.12 by greg, Sat Jul 19 18:19:33 2014 UTC vs.
Revision 2.40 by greg, Tue Apr 22 17:12:25 2025 UTC

# Line 13 | Line 13 | static const char      RCSid[] = "$Id$";
13   #include "random.h"
14   #include "source.h"
15   #include "ambient.h"
16 + #include "pmapray.h"
17 + #include "pmapcontrib.h"
18  
19   int     gargc;                          /* global argc */
20   char    **gargv;                        /* global argv */
# Line 41 | Line 43 | int    using_stdout = 0;               /* are we using stdout? */
43   int     imm_irrad = 0;                  /* compute immediate irradiance? */
44   int     lim_dist = 0;                   /* limit distance? */
45  
46 < const char      *modname[MAXMODLIST];   /* ordered modifier name list */
45 < int             nmods = 0;              /* number of modifiers */
46 > int     report_intvl = 0;               /* reporting interval (seconds) */
47  
48 + char    **modname = NULL;               /* ordered modifier name list */
49 + int     nmods = 0;                      /* number of modifiers */
50 + int     modasiz = 0;                    /* allocated modifier array size */
51 +
52   void    (*addobjnotify[8])() = {ambnotify, NULL};
53  
54 < char    RCCONTEXT[] = "RC";             /* our special evaluation context */
54 > char    RCCONTEXT[] = "RC.";            /* our special evaluation context */
55  
56 + #if defined(_WIN32) || defined(_WIN64)
57 + #define RCONTRIB_FEATURES       "Accumulation\nSummation\nRecovery\n" \
58 +                                "ImmediateIrradiance\n" \
59 +                                "ProgressReporting\nDistanceLimiting\n" \
60 +                                "InputFormats=a,f,d\nOutputFormats=a,f,d,c\n" \
61 +                                "Outputs=V,W\n" \
62 +                                "OutputCS=RGB,spec\n"
63 + #else
64 + #define RCONTRIB_FEATURES       "Multiprocessing\n" \
65 +                                "Accumulation\nSummation\nRecovery\n" \
66 +                                "ImmediateIrradiance\n" \
67 +                                "ProgressReporting\nDistanceLimiting\n" \
68 +                                "InputFormats=a,f,d\nOutputFormats=a,f,d,c\n" \
69 +                                "Outputs=V,W\n" \
70 +                                "OutputCS=RGB,spec\n"
71 + #endif
72  
73   static void
74   printdefaults(void)                     /* print default values to stdout */
# Line 63 | Line 84 | printdefaults(void)                    /* print default values to stdou
84          printf("-y %-9d\t\t\t# y resolution\n", yres);
85          printf(lim_dist ? "-ld+\t\t\t\t# limit distance on\n" :
86                          "-ld-\t\t\t\t# limit distance off\n");
87 <        printf("-h%c\t\t\t\t# %s header\n", header ? '+' : '-',
88 <                        header ? "output" : "no");
87 >        printf(header ? "-h+\t\t\t\t# output header\n" :
88 >                        "-h-\t\t\t\t# no header\n");
89          printf("-f%c%c\t\t\t\t# format input/output = %s/%s\n",
90                          inpfmt, outfmt, formstr(inpfmt), formstr(outfmt));
91 +        if (report_intvl > 0)
92 +                printf("-t %-9d\t\t\t#  time between reports\n", report_intvl);
93          printf(erract[WARNING].pf != NULL ?
94                          "-w+\t\t\t\t# warning messages on\n" :
95                          "-w-\t\t\t\t# warning messages off\n");
# Line 161 | Line 184 | main(int argc, char *argv[])
184   #define  check(ol,al)           if (argv[i][ol] || \
185                                  badarg(argc-i-1,argv+i+1,al)) \
186                                  goto badopt
187 < #define  bool(olen,var)         switch (argv[i][olen]) { \
187 > #define  check_bool(olen,var)           switch (argv[i][olen]) { \
188                                  case '\0': var = !var; break; \
189                                  case 'y': case 'Y': case 't': case 'T': \
190                                  case '+': case '1': var = 1; break; \
# Line 178 | Line 201 | main(int argc, char *argv[])
201          progname = argv[0] = fixargv0(argv[0]);
202          gargv = argv;
203          gargc = argc;
204 <                                        /* initialize calcomp routines early */
205 <        initfunc();
206 <        setcontext(RCCONTEXT);
204 >                                        /* feature check only? */
205 >        strcat(RFeatureList, RCONTRIB_FEATURES);
206 >        if (argc > 1 && !strcmp(argv[1], "-features"))
207 >                return feature_status(argc-2, argv+2);
208 > #if defined(_WIN32) || defined(_WIN64)  /* increase file limit to maximum */
209 >        for (i = 8192; i > _IOB_ENTRIES; i >>= 1)
210 >                if (_setmaxstdio(i) == i)
211 >                        break;
212 > #endif
213 >        initfunc();                     /* initialize calcomp routines */
214 >        calcontext(RCCONTEXT);
215                                          /* option city */
216          for (i = 1; i < argc; i++) {
217                                                  /* expand arguments */
# Line 215 | Line 246 | main(int argc, char *argv[])
246                                  error(USER, "bad number of processes");
247                          break;
248                  case 'V':                       /* output contributions */
249 <                        bool(2,contrib);
249 >                        check_bool(2,contrib);
250                          break;
251                  case 'x':                       /* x resolution */
252                          check(2,"i");
# Line 227 | Line 258 | main(int argc, char *argv[])
258                          break;
259                  case 'w':                       /* warnings */
260                          rval = (erract[WARNING].pf != NULL);
261 <                        bool(2,rval);
261 >                        check_bool(2,rval);
262                          if (rval) erract[WARNING].pf = wputs;
263                          else erract[WARNING].pf = NULL;
264                          break;
234                case 'e':                       /* expression */
235                        check(2,"s");
236                        scompile(argv[++i], NULL, 0);
237                        break;
265                  case 'l':                       /* limit distance */
266                          if (argv[i][2] != 'd')
267                                  goto badopt;
268 <                        bool(3,lim_dist);
268 >                        check_bool(3,lim_dist);
269                          break;
270                  case 'I':                       /* immed. irradiance */
271 <                        bool(2,imm_irrad);
271 >                        check_bool(2,imm_irrad);
272                          break;
273 <                case 'f':                       /* file or force or format */
247 <                        if (!argv[i][2]) {
248 <                                check(2,"s");
249 <                                loadfunc(argv[++i]);
250 <                                break;
251 <                        }
273 >                case 'f':                       /* force or format */
274                          if (argv[i][2] == 'o') {
275 <                                bool(3,force_open);
275 >                                check_bool(3,force_open);
276                                  break;
277                          }
278                          setformat(argv[i]+2);
# Line 259 | Line 281 | main(int argc, char *argv[])
281                          check(2,"s");
282                          curout = argv[++i];
283                          break;
262                case 'c':                       /* input rays per output */
263                        check(2,"i");
264                        accumulate = atoi(argv[++i]);
265                        break;
284                  case 'r':                       /* recover output */
285 <                        bool(2,recover);
285 >                        check_bool(2,recover);
286                          break;
287                  case 'h':                       /* header output */
288 <                        bool(2,header);
288 >                        check_bool(2,header);
289                          break;
290                  case 'p':                       /* parameter setting(s) */
291                          check(2,"s");
292 <                        prms = argv[++i];
292 >                        set_eparams(prms = argv[++i]);
293                          break;
294 +                case 'c':                       /* sample count */
295 +                        check(2,"i");
296 +                        accumulate = atoi(argv[++i]);
297 +                        break;
298                  case 'b':                       /* bin expression/count */
299                          if (argv[i][2] == 'n') {
300                                  check(3,"s");
# Line 290 | Line 312 | main(int argc, char *argv[])
312                          check(2,"s");
313                          addmodfile(argv[++i], curout, prms, binval, bincnt);
314                          break;
315 +                case 't':                       /* reporting interval */
316 +                        check(2,"i");
317 +                        report_intvl = atoi(argv[++i]);
318 +                        break;
319                  default:
320                          goto badopt;
321                  }
# Line 298 | Line 324 | main(int argc, char *argv[])
324                  error(USER, "missing required modifier argument");
325                                          /* override some option settings */
326          override_options();
327 +                                        /* set/check spectral sampling */
328 +        if (setspectrsamp(CNDX, WLPART) < 0)
329 +                error(USER, "unsupported spectral sampling");
330                                          /* initialize object types */
331          initotypes();
332                                          /* initialize urand */
# Line 340 | Line 369 | main(int argc, char *argv[])
369          readoct(octname, ~(IO_FILES|IO_INFO), &thescene, NULL);
370          nsceneobjs = nobjects;
371  
372 +        /* PMAP: set up & load photon maps */
373 +        ray_init_pmap();    
374 +        
375          marksources();                  /* find and mark sources */
376 +        
377 +        /* PMAP: init photon map for light source contributions */
378 +        initPmapContrib(&modconttab, nmods);
379  
380          setambient();                   /* initialize ambient calculation */
381 <
381 >        
382          rcontrib();                     /* trace ray contributions (loop) */
383  
384 <        ambsync();                      /* flush ambient file */
385 <
384 >        /* PMAP: free photon maps */
385 >        ray_done_pmap();    
386 >        
387          quit(0);        /* exit clean */
388  
389   badopt:
390          fprintf(stderr,
391 < "Usage: %s [-n nprocs][-V][-r][-e expr][-f source][-o ospec][-p p1=V1,p2=V2][-b binv][-bn N] {-m mod | -M file} [rtrace options] octree\n",
391 > "Usage: %s [-n nprocs][-V][-c count][-r][-e expr][-f source][-o ospec][-p p1=V1,p2=V2][-b binv][-bn N] {-m mod | -M file} [rtrace options] octree\n",
392                          progname);
393          sprintf(errmsg, "command line error at '%s'", argv[i]);
394          error(USER, errmsg);
395          return(1);      /* pro forma return */
396  
397   #undef  check
398 < #undef  bool
398 > #undef  check_bool
399   }
400  
401  
402   void
403   wputs(                          /* warning output function */
404 <        char    *s
404 >        const char      *s
405   )
406   {
407          int  lasterrno = errno;
408 +        if (erract[WARNING].pf == NULL)
409 +                return;         /* called by calcomp or someone */
410          eputs(s);
411          errno = lasterrno;
412   }
# Line 376 | Line 414 | wputs(                         /* warning output function */
414  
415   void
416   eputs(                          /* put string to stderr */
417 <        char  *s
417 >        const char  *s
418   )
419   {
420          static int  midline = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines