ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rpmain.c
Revision: 2.15
Committed: Wed Aug 7 05:10:09 2013 UTC (10 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R2P2, rad4R2, rad4R2P1
Changes since 2.14: +2 -2 lines
Log Message:
Eliminated a number of minor warnings (all innocuous)

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: rpmain.c,v 2.14 2008/03/11 02:21:47 greg Exp $";
3 #endif
4 /*
5 * rpmain.c - main for rpict batch rendering program
6 */
7
8 #include "copyright.h"
9
10 #include <time.h>
11 #include <signal.h>
12
13 #include "platform.h"
14 #include "rtprocess.h" /* getpid() */
15 #include "ray.h"
16 #include "source.h"
17 #include "ambient.h"
18 #include "random.h"
19 #include "paths.h"
20 #include "view.h"
21
22 /* persistent processes define */
23 #ifdef F_SETLKW
24 #define PERSIST 1 /* normal persist */
25 #define PARALLEL 2 /* parallel persist */
26 #define PCHILD 3 /* child of normal persist */
27 #endif
28
29 char *progname; /* argv[0] */
30 char *octname; /* octree name */
31 char *sigerr[NSIG]; /* signal error messages */
32 char *shm_boundary = NULL; /* boundary of shared memory */
33 char *errfile = NULL; /* error output file */
34
35 extern time_t time();
36 extern time_t tstart; /* start time */
37
38 extern int ralrm; /* seconds between reports */
39
40 extern VIEW ourview; /* viewing parameters */
41
42 extern int hresolu; /* horizontal resolution */
43 extern int vresolu; /* vertical resolution */
44 extern double pixaspect; /* pixel aspect ratio */
45
46 extern int psample; /* pixel sample size */
47 extern double maxdiff; /* max. sample difference */
48 extern double dstrpix; /* square pixel distribution */
49
50 extern double mblur; /* motion blur parameter */
51
52 extern double dblur; /* depth-of-field blur parameter */
53
54 static void onsig(int signo);
55 static void sigdie(int signo, char *msg);
56 static void printdefaults(void);
57
58
59 int
60 main(int argc, char *argv[])
61 {
62 #define check(ol,al) if (argv[i][ol] || \
63 badarg(argc-i-1,argv+i+1,al)) \
64 goto badopt
65 #define bool(olen,var) switch (argv[i][olen]) { \
66 case '\0': var = !var; break; \
67 case 'y': case 'Y': case 't': case 'T': \
68 case '+': case '1': var = 1; break; \
69 case 'n': case 'N': case 'f': case 'F': \
70 case '-': case '0': var = 0; break; \
71 default: goto badopt; }
72 char *err;
73 char *recover = NULL;
74 char *outfile = NULL;
75 char *zfile = NULL;
76 int loadflags = ~IO_FILES;
77 int seqstart = 0;
78 int persist = 0;
79 int duped1 = -1;
80 int rval;
81 int i;
82 /* record start time */
83 tstart = time((time_t *)NULL);
84 /* global program name */
85 progname = argv[0] = fixargv0(argv[0]);
86 /* option city */
87 for (i = 1; i < argc; i++) {
88 /* expand arguments */
89 while ((rval = expandarg(&argc, &argv, i)) > 0)
90 ;
91 if (rval < 0) {
92 sprintf(errmsg, "cannot expand '%s'", argv[i]);
93 error(SYSTEM, errmsg);
94 }
95 if (argv[i] == NULL || argv[i][0] != '-')
96 break; /* break from options */
97 if (!strcmp(argv[i], "-version")) {
98 puts(VersionID);
99 quit(0);
100 }
101 if (!strcmp(argv[i], "-defaults") ||
102 !strcmp(argv[i], "-help")) {
103 printdefaults();
104 quit(0);
105 }
106 rval = getrenderopt(argc-i, argv+i);
107 if (rval >= 0) {
108 i += rval;
109 continue;
110 }
111 rval = getviewopt(&ourview, argc-i, argv+i);
112 if (rval >= 0) {
113 i += rval;
114 continue;
115 }
116 /* rpict options */
117 switch (argv[i][1]) {
118 case 'v': /* view file */
119 if (argv[i][2] != 'f')
120 goto badopt;
121 check(3,"s");
122 rval = viewfile(argv[++i], &ourview, NULL);
123 if (rval < 0) {
124 sprintf(errmsg,
125 "cannot open view file \"%s\"",
126 argv[i]);
127 error(SYSTEM, errmsg);
128 } else if (rval == 0) {
129 sprintf(errmsg,
130 "bad view file \"%s\"",
131 argv[i]);
132 error(USER, errmsg);
133 }
134 break;
135 case 'p': /* pixel */
136 switch (argv[i][2]) {
137 case 's': /* sample */
138 check(3,"i");
139 psample = atoi(argv[++i]);
140 break;
141 case 't': /* threshold */
142 check(3,"f");
143 maxdiff = atof(argv[++i]);
144 break;
145 case 'j': /* jitter */
146 check(3,"f");
147 dstrpix = atof(argv[++i]);
148 break;
149 case 'a': /* aspect */
150 check(3,"f");
151 pixaspect = atof(argv[++i]);
152 break;
153 case 'm': /* motion */
154 check(3,"f");
155 mblur = atof(argv[++i]);
156 break;
157 case 'd': /* aperture */
158 check(3,"f");
159 dblur = atof(argv[++i]);
160 break;
161 default:
162 goto badopt;
163 }
164 break;
165 case 'x': /* x resolution */
166 check(2,"i");
167 hresolu = atoi(argv[++i]);
168 break;
169 case 'y': /* y resolution */
170 check(2,"i");
171 vresolu = atoi(argv[++i]);
172 break;
173 case 'S': /* slave index */
174 check(2,"i");
175 seqstart = atoi(argv[++i]);
176 break;
177 case 'o': /* output file */
178 check(2,"s");
179 outfile = argv[++i];
180 break;
181 case 'z': /* z file */
182 check(2,"s");
183 zfile = argv[++i];
184 break;
185 case 'r': /* recover file */
186 if (argv[i][2] == 'o') { /* +output */
187 check(3,"s");
188 outfile = argv[i+1];
189 } else
190 check(2,"s");
191 recover = argv[++i];
192 break;
193 case 't': /* timer */
194 check(2,"i");
195 ralrm = atoi(argv[++i]);
196 break;
197 #ifdef PERSIST
198 case 'P': /* persist file */
199 if (argv[i][2] == 'P') {
200 check(3,"s");
201 persist = PARALLEL;
202 } else {
203 check(2,"s");
204 persist = PERSIST;
205 }
206 persistfile(argv[++i]);
207 break;
208 #endif
209 case 'w': /* warnings */
210 rval = erract[WARNING].pf != NULL;
211 bool(2,rval);
212 if (rval) erract[WARNING].pf = wputs;
213 else erract[WARNING].pf = NULL;
214 break;
215 case 'e': /* error file */
216 check(2,"s");
217 errfile = argv[++i];
218 break;
219 default:
220 goto badopt;
221 }
222 }
223 err = setview(&ourview); /* set viewing parameters */
224 if (err != NULL)
225 error(USER, err);
226 /* initialize object types */
227 initotypes();
228 /* initialize urand */
229 if (rand_samp) {
230 srandom((long)time(0));
231 initurand(0);
232 } else {
233 srandom(0L);
234 initurand(2048);
235 }
236 /* set up signal handling */
237 sigdie(SIGINT, "Interrupt");
238 #ifdef SIGHUP
239 sigdie(SIGHUP, "Hangup");
240 #endif
241 sigdie(SIGTERM, "Terminate");
242 #ifdef SIGPIPE
243 sigdie(SIGPIPE, "Broken pipe");
244 #endif
245 #ifdef SIGALRM
246 sigdie(SIGALRM, "Alarm clock");
247 #endif
248 #ifdef SIGXCPU
249 sigdie(SIGXCPU, "CPU limit exceeded");
250 sigdie(SIGXFSZ, "File size exceeded");
251 #endif
252 /* open error file */
253 if (errfile != NULL) {
254 if (freopen(errfile, "a", stderr) == NULL)
255 quit(2);
256 fprintf(stderr, "**************\n*** PID %5d: ",
257 getpid());
258 printargs(argc, argv, stderr);
259 putc('\n', stderr);
260 fflush(stderr);
261 }
262 #ifdef NICE
263 nice(NICE); /* lower priority */
264 #endif
265 /* get octree */
266 if (i == argc)
267 octname = NULL;
268 else if (i == argc-1)
269 octname = argv[i];
270 else
271 goto badopt;
272 if (seqstart > 0 && octname == NULL)
273 error(USER, "missing octree argument");
274 /* set up output */
275 #ifdef PERSIST
276 if (persist) {
277 if (recover != NULL)
278 error(USER, "persist option used with recover file");
279 if (seqstart <= 0)
280 error(USER, "persist option only for sequences");
281 if (outfile == NULL)
282 duped1 = dup(fileno(stdout)); /* don't lose our output */
283 openheader();
284 } else
285 #endif
286 if (outfile != NULL)
287 openheader();
288 #ifdef _WIN32
289 SET_FILE_BINARY(stdout);
290 if (octname == NULL)
291 SET_FILE_BINARY(stdin);
292 #endif
293 readoct(octname, loadflags, &thescene, NULL);
294 nsceneobjs = nobjects;
295
296 if (loadflags & IO_INFO) { /* print header */
297 printargs(i, argv, stdout);
298 printf("SOFTWARE= %s\n", VersionID);
299 }
300
301 marksources(); /* find and mark sources */
302
303 setambient(); /* initialize ambient calculation */
304
305 #ifdef PERSIST
306 if (persist) {
307 fflush(stdout);
308 if (outfile == NULL) { /* reconnect stdout */
309 dup2(duped1, fileno(stdout));
310 close(duped1);
311 }
312 if (persist == PARALLEL) { /* multiprocessing */
313 preload_objs(); /* preload scene */
314 shm_boundary = (char *)malloc(16);
315 strcpy(shm_boundary, "SHM_BOUNDARY");
316 while ((rval=fork()) == 0) { /* keep on forkin' */
317 pflock(1);
318 pfhold();
319 tstart = time((time_t *)NULL);
320 ambsync(); /* load new values */
321 }
322 if (rval < 0)
323 error(SYSTEM, "cannot fork child for persist function");
324 pfdetach(); /* parent will run then exit */
325 }
326 }
327 runagain:
328 if (persist) {
329 if (outfile == NULL) /* if out to stdout */
330 dupheader(); /* send header */
331 else /* if out to file */
332 duped1 = dup(fileno(stdout)); /* hang onto pipe */
333 }
334 #endif
335 /* batch render picture(s) */
336 rpict(seqstart, outfile, zfile, recover);
337 /* flush ambient file */
338 ambsync();
339 #ifdef PERSIST
340 if (persist == PERSIST) { /* first run-through */
341 if ((rval=fork()) == 0) { /* child loops until killed */
342 pflock(1);
343 persist = PCHILD;
344 } else { /* original process exits */
345 if (rval < 0)
346 error(SYSTEM, "cannot fork child for persist function");
347 pfdetach(); /* parent exits */
348 }
349 }
350 if (persist == PCHILD) { /* wait for a signal then go again */
351 if (outfile != NULL)
352 close(duped1); /* release output handle */
353 pfhold();
354 tstart = time((time_t *)NULL); /* reinitialize */
355 raynum = nrays = 0;
356 goto runagain;
357 }
358 #endif
359 quit(0);
360
361 badopt:
362 sprintf(errmsg, "command line error at '%s'", argv[i]);
363 error(USER, errmsg);
364 return 1; /* pro forma return */
365
366 #undef check
367 #undef bool
368 }
369
370
371 void
372 wputs( /* warning output function */
373 char *s
374 )
375 {
376 int lasterrno = errno;
377 eputs(s);
378 errno = lasterrno;
379 }
380
381
382 void
383 eputs( /* put string to stderr */
384 register char *s
385 )
386 {
387 static int midline = 0;
388
389 if (!*s)
390 return;
391 if (!midline++) {
392 fputs(progname, stderr);
393 fputs(": ", stderr);
394 }
395 fputs(s, stderr);
396 if (s[strlen(s)-1] == '\n') {
397 fflush(stderr);
398 midline = 0;
399 }
400 }
401
402
403 static void
404 onsig( /* fatal signal */
405 int signo
406 )
407 {
408 static int gotsig = 0;
409
410 if (gotsig++) /* two signals and we're gone! */
411 _exit(signo);
412
413 #ifdef SIGALRM /* XXX how critical is this? */
414 alarm(15); /* allow 15 seconds to clean up */
415 signal(SIGALRM, SIG_DFL); /* make certain we do die */
416 #endif
417 eputs("signal - ");
418 eputs(sigerr[signo]);
419 eputs("\n");
420 quit(3);
421 }
422
423
424 static void
425 sigdie( /* set fatal signal */
426 int signo,
427 char *msg
428 )
429 {
430 if (signal(signo, onsig) == SIG_IGN)
431 signal(signo, SIG_IGN);
432 sigerr[signo] = msg;
433 }
434
435
436 static void
437 printdefaults(void) /* print default values to stdout */
438 {
439 printf("-vt%c\t\t\t\t# view type %s\n", ourview.type,
440 ourview.type==VT_PER ? "perspective" :
441 ourview.type==VT_PAR ? "parallel" :
442 ourview.type==VT_HEM ? "hemispherical" :
443 ourview.type==VT_ANG ? "angular" :
444 ourview.type==VT_CYL ? "cylindrical" :
445 ourview.type==VT_PLS ? "planisphere" :
446 "unknown");
447 printf("-vp %f %f %f\t# view point\n",
448 ourview.vp[0], ourview.vp[1], ourview.vp[2]);
449 printf("-vd %f %f %f\t# view direction\n",
450 ourview.vdir[0], ourview.vdir[1], ourview.vdir[2]);
451 printf("-vu %f %f %f\t# view up\n",
452 ourview.vup[0], ourview.vup[1], ourview.vup[2]);
453 printf("-vh %f\t\t\t# view horizontal size\n", ourview.horiz);
454 printf("-vv %f\t\t\t# view vertical size\n", ourview.vert);
455 printf("-vo %f\t\t\t# view fore clipping plane\n", ourview.vfore);
456 printf("-va %f\t\t\t# view aft clipping plane\n", ourview.vaft);
457 printf("-vs %f\t\t\t# view shift\n", ourview.hoff);
458 printf("-vl %f\t\t\t# view lift\n", ourview.voff);
459 printf("-x %-9d\t\t\t# x resolution\n", hresolu);
460 printf("-y %-9d\t\t\t# y resolution\n", vresolu);
461 printf("-pa %f\t\t\t# pixel aspect ratio\n", pixaspect);
462 printf("-pj %f\t\t\t# pixel jitter\n", dstrpix);
463 printf("-pm %f\t\t\t# pixel motion\n", mblur);
464 printf("-pd %f\t\t\t# pixel depth-of-field\n", dblur);
465 printf("-ps %-9d\t\t\t# pixel sample\n", psample);
466 printf("-pt %f\t\t\t# pixel threshold\n", maxdiff);
467 printf("-t %-9d\t\t\t# time between reports\n", ralrm);
468 printf(erract[WARNING].pf != NULL ?
469 "-w+\t\t\t\t# warning messages on\n" :
470 "-w-\t\t\t\t# warning messages off\n");
471 print_rdefaults();
472 }