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.1 by greg, Sat Jun 9 07:16:47 2012 UTC vs.
Revision 2.31 by greg, Tue Aug 15 00:46:56 2023 UTC

# Line 8 | Line 8 | static const char      RCSid[] = "$Id$";
8   #include "copyright.h"
9  
10   #include <signal.h>
11 + #include <time.h>
12   #include "rcontrib.h"
13 < #include "platform.h"
13 < #include "paths.h"
13 > #include "random.h"
14   #include "source.h"
15   #include "ambient.h"
16 + #include "pmapray.h"
17 + #include "pmapcontrib.h"
18  
17 char    *shm_boundary = NULL;           /* boundary of shared memory */
18
19   int     gargc;                          /* global argc */
20   char    **gargv;                        /* global argv */
21   char    *octname;                       /* global octree name */
# Line 43 | 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 */
47 < int             nmods = 0;              /* number of modifiers */
46 > int     report_intvl = 0;               /* reporting interval (seconds) */
47  
48 < char    RCCONTEXT[] = "RCONTRIB";       /* our special evaluation context */
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, tranotify, NULL};
52 > void    (*addobjnotify[8])() = {ambnotify, NULL};
53  
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 + #else
63 + #define RCONTRIB_FEATURES       "Multiprocessing\n" \
64 +                                "Accumulation\nSummation\nRecovery\n" \
65 +                                "ImmediateIrradiance\n" \
66 +                                "ProgressReporting\nDistanceLimiting\n" \
67 +                                "InputFormats=a,f,d\nOutputFormats=a,f,d,c\n" \
68 +                                "Outputs=V,W\n"
69 + #endif
70 +
71   static void
72   printdefaults(void)                     /* print default values to stdout */
73   {
74 <        char  *cp;
75 <
74 >        printf("-c %-5d\t\t\t# accumulated rays per record\n", accumulate);
75 >        printf("-V%c\t\t\t\t# output %s\n", contrib ? '+' : '-',
76 >                        contrib ? "contributions" : "coefficients");
77          if (imm_irrad)
78                  printf("-I+\t\t\t\t# immediate irradiance on\n");
79          printf("-n %-2d\t\t\t\t# number of rendering processes\n", nproc);
# Line 162 | Line 180 | main(int argc, char *argv[])
180   #define  check(ol,al)           if (argv[i][ol] || \
181                                  badarg(argc-i-1,argv+i+1,al)) \
182                                  goto badopt
183 < #define  bool(olen,var)         switch (argv[i][olen]) { \
183 > #define  check_bool(olen,var)           switch (argv[i][olen]) { \
184                                  case '\0': var = !var; break; \
185                                  case 'y': case 'Y': case 't': case 'T': \
186                                  case '+': case '1': var = 1; break; \
187                                  case 'n': case 'N': case 'f': case 'F': \
188                                  case '-': case '0': var = 0; break; \
189                                  default: goto badopt; }
172        int     nprocs = 1;
190          char    *curout = NULL;
191 +        char    *prms = NULL;
192          char    *binval = NULL;
193          int     bincnt = 0;
194          int     rval;
# Line 179 | Line 197 | main(int argc, char *argv[])
197          progname = argv[0] = fixargv0(argv[0]);
198          gargv = argv;
199          gargc = argc;
200 +                                        /* feature check only? */
201 +        strcat(RFeatureList, RCONTRIB_FEATURES);
202 +        if (argc > 1 && !strcmp(argv[1], "-features"))
203 +                return feature_status(argc-2, argv+2);
204 + #if defined(_WIN32) || defined(_WIN64)  /* increase file limit to maximum */
205 +        for (i = 8192; i > _IOB_ENTRIES; i >>= 1)
206 +                if (_setmaxstdio(i) == i)
207 +                        break;
208 + #endif
209                                          /* initialize calcomp routines early */
210          initfunc();
211 <        setcontext(RCCONTEXT);
211 >        calcontext(RCCONTEXT);
212                                          /* option city */
213          for (i = 1; i < argc; i++) {
214                                                  /* expand arguments */
# Line 216 | Line 243 | main(int argc, char *argv[])
243                                  error(USER, "bad number of processes");
244                          break;
245                  case 'V':                       /* output contributions */
246 <                        bool(2,contrib);
246 >                        check_bool(2,contrib);
247                          break;
248                  case 'x':                       /* x resolution */
249                          check(2,"i");
# Line 227 | Line 254 | main(int argc, char *argv[])
254                          yres = atoi(argv[++i]);
255                          break;
256                  case 'w':                       /* warnings */
257 <                        rval = erract[WARNING].pf != NULL;
258 <                        bool(2,rval);
257 >                        rval = (erract[WARNING].pf != NULL);
258 >                        check_bool(2,rval);
259                          if (rval) erract[WARNING].pf = wputs;
260                          else erract[WARNING].pf = NULL;
261                          break;
# Line 239 | Line 266 | main(int argc, char *argv[])
266                  case 'l':                       /* limit distance */
267                          if (argv[i][2] != 'd')
268                                  goto badopt;
269 <                        bool(3,lim_dist);
269 >                        check_bool(3,lim_dist);
270                          break;
271                  case 'I':                       /* immed. irradiance */
272 <                        bool(2,imm_irrad);
272 >                        check_bool(2,imm_irrad);
273                          break;
274                  case 'f':                       /* file or force or format */
275                          if (!argv[i][2]) {
# Line 251 | Line 278 | main(int argc, char *argv[])
278                                  break;
279                          }
280                          if (argv[i][2] == 'o') {
281 <                                bool(3,force_open);
281 >                                check_bool(3,force_open);
282                                  break;
283                          }
284                          setformat(argv[i]+2);
# Line 265 | Line 292 | main(int argc, char *argv[])
292                          accumulate = atoi(argv[++i]);
293                          break;
294                  case 'r':                       /* recover output */
295 <                        bool(2,recover);
295 >                        check_bool(2,recover);
296                          break;
297                  case 'h':                       /* header output */
298 <                        bool(2,header);
298 >                        check_bool(2,header);
299                          break;
300 +                case 'p':                       /* parameter setting(s) */
301 +                        check(2,"s");
302 +                        set_eparams(prms = argv[++i]);
303 +                        break;
304                  case 'b':                       /* bin expression/count */
305                          if (argv[i][2] == 'n') {
306                                  check(3,"s");
# Line 281 | Line 312 | main(int argc, char *argv[])
312                          break;
313                  case 'm':                       /* modifier name */
314                          check(2,"s");
315 <                        addmodifier(argv[++i], curout, binval, bincnt);
315 >                        addmodifier(argv[++i], curout, prms, binval, bincnt);
316                          break;
317                  case 'M':                       /* modifier file */
318                          check(2,"s");
319 <                        addmodfile(argv[++i], curout, binval, bincnt);
319 >                        addmodfile(argv[++i], curout, prms, binval, bincnt);
320                          break;
321 +                case 't':                       /* reporting interval */
322 +                        check(2,"i");
323 +                        report_intvl = atoi(argv[++i]);
324 +                        break;
325                  default:
326                          goto badopt;
327                  }
328          }
329 +        if (nmods <= 0)
330 +                error(USER, "missing required modifier argument");
331                                          /* override some option settings */
332          override_options();
333                                          /* initialize object types */
# Line 335 | Line 372 | main(int argc, char *argv[])
372          readoct(octname, ~(IO_FILES|IO_INFO), &thescene, NULL);
373          nsceneobjs = nobjects;
374  
375 +        /* PMAP: set up & load photon maps */
376 +        ray_init_pmap();    
377 +        
378          marksources();                  /* find and mark sources */
379 +        
380 +        /* PMAP: init photon map for light source contributions */
381 +        initPmapContrib(&modconttab, nmods);
382  
383          setambient();                   /* initialize ambient calculation */
384 +        
385 +        rcontrib();                     /* trace ray contributions (loop) */
386  
342        if (nproc > 1) {
343                preload_objs();         /* preload auxiliary data */
344                                        /* set shared memory boundary */
345                shm_boundary = strcpy((char *)malloc(16), "SHM_BOUNDARY");
346        }
347        rcontrib();                     /* trace ray contributions */
348
387          ambsync();                      /* flush ambient file */
388  
389 +        /* PMAP: free photon maps */
390 +        ray_done_pmap();    
391 +        
392          quit(0);        /* exit clean */
393  
394   badopt:
395          fprintf(stderr,
396 < "Usage: %s [-n nprocs][-V][-r][-e expr][-f source][-o ospec][-b binv][-bn N] {-m mod | -M file} [rtrace options] octree\n",
396 > "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",
397                          progname);
398          sprintf(errmsg, "command line error at '%s'", argv[i]);
399          error(USER, errmsg);
400          return(1);      /* pro forma return */
401  
402   #undef  check
403 < #undef  bool
403 > #undef  check_bool
404   }
405  
406  
407   void
408   wputs(                          /* warning output function */
409 <        char    *s
409 >        const char      *s
410   )
411   {
412          int  lasterrno = errno;
# Line 376 | Line 417 | wputs(                         /* warning output function */
417  
418   void
419   eputs(                          /* put string to stderr */
420 <        char  *s
420 >        const char  *s
421   )
422   {
423          static int  midline = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines