--- ray/src/util/rad.c 2003/07/27 22:12:03 2.71 +++ ray/src/util/rad.c 2004/09/09 20:08:21 2.77 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rad.c,v 2.71 2003/07/27 22:12:03 schorsch Exp $"; +static const char RCSid[] = "$Id: rad.c,v 2.77 2004/09/09 20:08:21 greg Exp $"; #endif /* * Executive program for oconv, rpict and pfilt @@ -11,6 +11,7 @@ static const char RCSid[] = "$Id: rad.c,v 2.71 2003/07 #include #include "platform.h" +#include "rtprocess.h" #include "view.h" #include "paths.h" #include "vars.h" @@ -21,6 +22,8 @@ static const char RCSid[] = "$Id: rad.c,v 2.71 2003/07 #else #define DELCMD "rm -f" #define RENAMECMD "mv" + #include + #include #endif /* variables (alphabetical by name) */ @@ -106,7 +109,7 @@ int silent = 0; /* do work silently */ int touchonly = 0; /* touch files only */ int nprocs = 1; /* maximum executing processes */ int sayview = 0; /* print view out */ -char *rvdevice = NULL; /* rview output device */ +char *rvdevice = NULL; /* rvu output device */ char *viewselect = NULL; /* specific view only */ int overture = 0; /* overture calculation needed */ @@ -120,10 +123,46 @@ char radname[PATH_MAX]; /* root Radiance file name */ #define inchild() (children_running < 0) +static void rootname(char *rn, char *fn); +static time_t checklast(char *fnames); +static char * newfname(char *orig, int pred); +static void checkfiles(void); +static void getoctcube(double org[3], double *sizp); +static void setdefaults(void); +static void oconv(void); +static char * addarg(char *op, char *arg); +static void oconvopts(char *oo); +static void mkillumopts(char *mo); +static void checkambfile(void); +static double ambval(void); +static void renderopts(char *op, char *po); +static void lowqopts(char *op, char *po); +static void medqopts(char *op, char *po); +static void hiqopts(char *op, char *po); +static void xferopts(char *ro); +static void pfiltopts(char *po); +static int matchword(char *s1, char *s2); +static char * specview(char *vs); +static char * getview(int n, char *vn); +static int myprintview(char *vopts, FILE *fp); +static void rvu(char *opts, char *po); +static void rpict(char *opts, char *po); +static int touch(char *fn); +static int runcom(char *cs); +static int rmfile(char *fn); +static int mvfile(char *fold, char *fnew); +static int next_process(void); +static void wait_process(int all); +static void finish_process(void); +static void badvalue(int vc); +static void syserr(char *s); -main(argc, argv) -int argc; -char *argv[]; + +int +main( + int argc, + char *argv[] +) { char ropts[512]; char popts[64]; @@ -199,7 +238,7 @@ char *argv[]; renderopts(ropts, popts); xferopts(ropts); if (rvdevice != NULL) - rview(ropts, popts); + rvu(ropts, popts); else rpict(ropts, popts); quit(0); @@ -208,11 +247,15 @@ userr: "Usage: %s [-w][-s][-n|-N npr][-t][-e][-V][-v view][-o dev] rfile [VAR=value ..]\n", progname); quit(1); + return 1; /* pro forma return */ } -rootname(rn, fn) /* remove tail from end of fn */ -register char *rn, *fn; +static void +rootname( /* remove tail from end of fn */ + register char *rn, + register char *fn +) { char *tp, *dp; @@ -226,9 +269,10 @@ register char *rn, *fn; } -time_t -checklast(fnames) /* check files and find most recent */ -register char *fnames; +static time_t +checklast( /* check files and find most recent */ + register char *fnames +) { char thisfile[PATH_MAX]; time_t thisdate, lastdate = 0; @@ -237,8 +281,11 @@ register char *fnames; return(0); while ((fnames = nextword(thisfile, PATH_MAX, fnames)) != NULL) { if (thisfile[0] == '!' || - (thisfile[0] == '\\' && thisfile[1] == '!')) + (thisfile[0] == '\\' && thisfile[1] == '!')) { + if (!lastdate) + lastdate = 1; continue; + } if (!(thisdate = fdate(thisfile))) syserr(thisfile); if (thisdate > lastdate) @@ -248,10 +295,11 @@ register char *fnames; } -char * -newfname(orig, pred) /* create modified file name */ -char *orig; -int pred; +static char * +newfname( /* create modified file name */ + char *orig, + int pred +) { register char *cp; register int n; @@ -273,7 +321,8 @@ int pred; } -checkfiles() /* check for existence and modified times */ +static void +checkfiles(void) /* check for existence and modified times */ { time_t objdate; @@ -308,10 +357,12 @@ checkfiles() /* check for existence and modified tim } -getoctcube(org, sizp) /* get octree bounding cube */ -double org[3], *sizp; +static void +getoctcube( /* get octree bounding cube */ + double org[3], + double *sizp +) { - extern FILE *popen(); static double oorg[3], osiz = 0.; double min[3], max[3]; char buf[1024]; @@ -359,7 +410,8 @@ double org[3], *sizp; } -setdefaults() /* set default values for unassigned var's */ +static void +setdefaults(void) /* set default values for unassigned var's */ { double org[3], lim[3], size; char buf[128]; @@ -416,7 +468,8 @@ setdefaults() /* set default values for unassigned v } -oconv() /* run oconv and mkillum if necessary */ +static void +oconv(void) /* run oconv and mkillum if necessary */ { static char illumtmp[] = "ilXXXXXX"; char combuf[PATH_MAX], ocopts[64], mkopts[64]; @@ -518,9 +571,11 @@ oconv() /* run oconv and mkillum if necessary */ } -char * -addarg(op, arg) /* add argument and advance pointer */ -register char *op, *arg; +static char * +addarg( /* add argument and advance pointer */ +register char *op, +register char *arg +) { *op = ' '; while ( (*++op = *arg++) ) @@ -529,8 +584,10 @@ register char *op, *arg; } -oconvopts(oo) /* get oconv options */ -register char *oo; +static void +oconvopts( /* get oconv options */ + register char *oo +) { /* BEWARE: This may be called via setdefaults(), so no assumptions */ @@ -540,8 +597,10 @@ register char *oo; } -mkillumopts(mo) /* get mkillum options */ -register char *mo; +static void +mkillumopts( /* get mkillum options */ + register char *mo +) { /* BEWARE: This may be called via setdefaults(), so no assumptions */ @@ -551,7 +610,8 @@ register char *mo; } -checkambfile() /* check date on ambient file */ +static void +checkambfile(void) /* check date on ambient file */ { time_t afdate; @@ -568,8 +628,8 @@ checkambfile() /* check date on ambient file */ } -double -ambval() /* compute ambient value */ +static double +ambval(void) /* compute ambient value */ { if (vdef(EXPOSURE)) { if (vval(EXPOSURE)[0] == '+' || vval(EXPOSURE)[0] == '-') @@ -581,11 +641,15 @@ ambval() /* compute ambient value */ if (vlet(ZONE) == 'I') return(.01); badvalue(ZONE); + return 0; /* pro forma return */ } -renderopts(op, po) /* set rendering options */ -char *op, *po; +static void +renderopts( /* set rendering options */ + char *op, + char *po +) { switch(vscale(QUALITY)) { case LOW: @@ -601,9 +665,11 @@ char *op, *po; } -lowqopts(op, po) /* low quality rendering options */ -register char *op; -char *po; +static void +lowqopts( /* low quality rendering options */ + register char *op, + char *po +) { double d, org[3], siz[3]; @@ -621,19 +687,19 @@ char *po; case LOW: po = addarg(po, "-ps 16"); op = addarg(op, "-dp 64"); - sprintf(op, " -ar %d", (int)(4*d)); + sprintf(op, " -ar %d", (int)(8*d)); op += strlen(op); break; case MEDIUM: po = addarg(po, "-ps 8"); op = addarg(op, "-dp 128"); - sprintf(op, " -ar %d", (int)(8*d)); + sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); break; case HIGH: po = addarg(po, "-ps 4"); op = addarg(op, "-dp 256"); - sprintf(op, " -ar %d", (int)(16*d)); + sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); break; } @@ -650,28 +716,30 @@ char *po; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .4 -ad 64"); + op = addarg(op, "-aa .3 -ad 256"); break; case MEDIUM: - op = addarg(op, "-aa .3 -ad 128"); + op = addarg(op, "-aa .25 -ad 512"); break; case HIGH: - op = addarg(op, "-aa .25 -ad 256"); + op = addarg(op, "-aa .2 -ad 1024"); break; } op = addarg(op, "-as 0"); d = ambval(); sprintf(op, " -av %.2g %.2g %.2g", d, d, d); op += strlen(op); - op = addarg(op, "-lr 3 -lw .02"); + op = addarg(op, "-lr 6 -lw .01"); if (vdef(RENDER)) op = addarg(op, vval(RENDER)); } -medqopts(op, po) /* medium quality rendering options */ -register char *op; -char *po; +static void +medqopts( /* medium quality rendering options */ + register char *op, + char *po +) { double d, org[3], siz[3], asz; @@ -690,7 +758,7 @@ char *po; case LOW: po = addarg(po, vbool(PENUMBRAS) ? "-ps 4" : "-ps 8"); op = addarg(op, "-dp 256"); - sprintf(op, " -ar %d", (int)(8*d)); + sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); sprintf(op, " -ms %.2g", asz/20.); op += strlen(op); @@ -698,7 +766,7 @@ char *po; case MEDIUM: po = addarg(po, vbool(PENUMBRAS) ? "-ps 3" : "-ps 6"); op = addarg(op, "-dp 512"); - sprintf(op, " -ar %d", (int)(16*d)); + sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); sprintf(op, " -ms %.2g", asz/40.); op += strlen(op); @@ -706,7 +774,7 @@ char *po; case HIGH: po = addarg(po, vbool(PENUMBRAS) ? "-ps 2" : "-ps 4"); op = addarg(op, "-dp 1024"); - sprintf(op, " -ar %d", (int)(32*d)); + sprintf(op, " -ar %d", (int)(64*d)); op += strlen(op); sprintf(op, " -ms %.2g", asz/80.); op += strlen(op); @@ -729,27 +797,29 @@ char *po; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .25 -ad 196 -as 0"); + op = addarg(op, "-aa .2 -ad 329 -as 42"); break; case MEDIUM: - op = addarg(op, "-aa .2 -ad 400 -as 64"); + op = addarg(op, "-aa .15 -ad 800 -as 128"); break; case HIGH: - op = addarg(op, "-aa .15 -ad 768 -as 196"); + op = addarg(op, "-aa .1 -ad 1536 -as 392"); break; } d = ambval(); sprintf(op, " -av %.2g %.2g %.2g", d, d, d); op += strlen(op); - op = addarg(op, "-lr 6 -lw .002"); + op = addarg(op, "-lr 8 -lw .002"); if (vdef(RENDER)) op = addarg(op, vval(RENDER)); } -hiqopts(op, po) /* high quality rendering options */ -register char *op; -char *po; +static void +hiqopts( /* high quality rendering options */ + register char *op, + char *po +) { double d, org[3], siz[3], asz; @@ -768,7 +838,7 @@ char *po; case LOW: po = addarg(po, vbool(PENUMBRAS) ? "-ps 1" : "-ps 8"); op = addarg(op, "-dp 1024"); - sprintf(op, " -ar %d", (int)(16*d)); + sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); sprintf(op, " -ms %.2g", asz/40.); op += strlen(op); @@ -776,7 +846,7 @@ char *po; case MEDIUM: po = addarg(po, vbool(PENUMBRAS) ? "-ps 1" : "-ps 5"); op = addarg(op, "-dp 2048"); - sprintf(op, " -ar %d", (int)(32*d)); + sprintf(op, " -ar %d", (int)(64*d)); op += strlen(op); sprintf(op, " -ms %.2g", asz/80.); op += strlen(op); @@ -784,7 +854,7 @@ char *po; case HIGH: po = addarg(po, vbool(PENUMBRAS) ? "-ps 1" : "-ps 3"); op = addarg(op, "-dp 4096"); - sprintf(op, " -ar %d", (int)(64*d)); + sprintf(op, " -ar %d", (int)(128*d)); op += strlen(op); sprintf(op, " -ms %.2g", asz/160.); op += strlen(op); @@ -805,13 +875,13 @@ char *po; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .15 -ad 256 -as 0"); + op = addarg(op, "-aa .125 -ad 512 -as 64"); break; case MEDIUM: - op = addarg(op, "-aa .125 -ad 512 -as 256"); + op = addarg(op, "-aa .1 -ad 1536 -as 768"); break; case HIGH: - op = addarg(op, "-aa .08 -ad 1024 -as 512"); + op = addarg(op, "-aa .075 -ad 4096 -as 2048"); break; } d = ambval(); @@ -823,8 +893,10 @@ char *po; } -xferopts(ro) /* transfer options if indicated */ -char *ro; +static void +xferopts( /* transfer options if indicated */ + char *ro +) { int fd, n; register char *cp; @@ -854,8 +926,10 @@ char *ro; } -pfiltopts(po) /* get pfilt options */ -register char *po; +static void +pfiltopts( /* get pfilt options */ + register char *po +) { *po = '\0'; if (vdef(EXPOSURE)) { @@ -875,8 +949,11 @@ register char *po; } -matchword(s1, s2) /* match white-delimited words */ -register char *s1, *s2; +static int +matchword( /* match white-delimited words */ + register char *s1, + register char *s2 +) { while (isspace(*s1)) s1++; while (isspace(*s2)) s2++; @@ -887,9 +964,10 @@ register char *s1, *s2; } -char * -specview(vs) /* get proper view spec from vs */ -register char *vs; +static char * +specview( /* get proper view spec from vs */ + register char *vs +) { static char vup[7][12] = {"-vu 0 0 -1","-vu 0 -1 0","-vu -1 0 0", "-vu 0 0 1", "-vu 1 0 0","-vu 0 1 0","-vu 0 0 1"}; @@ -1011,10 +1089,11 @@ register char *vs; } -char * -getview(n, vn) /* get view n, or NULL if none */ -int n; -char *vn; /* returned view name */ +static char * +getview( /* get view n, or NULL if none */ + int n, + char *vn /* returned view name */ +) { register char *mv; @@ -1052,15 +1131,15 @@ char *vn; /* returned view name */ } -int -myprintview(vopts, fp) /* print out selected view */ -register char *vopts; -FILE *fp; +static int +myprintview( /* print out selected view */ + register char *vopts, + FILE *fp +) { VIEW vwr; char buf[128]; register char *cp; -again: if (vopts == NULL) return(-1); #ifdef _WIN32 @@ -1083,8 +1162,11 @@ again: } -rview(opts, po) /* run rview with first view */ -char *opts, *po; +static void +rvu( /* run rvu with first view */ + char *opts, + char *po +) { char *vw; char combuf[PATH_MAX]; @@ -1093,21 +1175,24 @@ char *opts, *po; return; if (sayview) myprintview(vw, stdout); - sprintf(combuf, "rview %s%s%s -R %s ", vw, po, opts, rifname); + sprintf(combuf, "rvu %s%s%s -R %s ", vw, po, opts, rifname); if (rvdevice != NULL) sprintf(combuf+strlen(combuf), "-o %s ", rvdevice); if (vdef(EXPOSURE)) sprintf(combuf+strlen(combuf), "-pe %s ", vval(EXPOSURE)); strcat(combuf, oct1name); if (runcom(combuf)) { /* run it */ - fprintf(stderr, "%s: error running rview\n", progname); + fprintf(stderr, "%s: error running rvu\n", progname); quit(1); } } -rpict(opts, po) /* run rpict and pfilt for each view */ -char *opts, *po; +static void +rpict( /* run rpict and pfilt for each view */ + char *opts, + char *po +) { char combuf[PATH_MAX]; char rawfile[PATH_MAX], picfile[PATH_MAX]; @@ -1264,7 +1349,7 @@ char *opts, *po; mvfile(rawfile, combuf); } else rmfile(rawfile); - finish_process(); /* leave if child */ + finish_process(); /* exit if child */ } wait_process(1); /* wait for children to finish */ if (pfile != NULL) { /* clean up rpict persistent mode */ @@ -1272,7 +1357,7 @@ char *opts, *po; fp = fopen(pfile, "r"); if (fp != NULL) { if (fscanf(fp, "%*s %d", &pid) != 1 || - kill(pid, 1) == -1) + kill(pid, 1) < 0) unlink(pfile); fclose(fp); } @@ -1284,8 +1369,10 @@ rperror: } -touch(fn) /* update a file */ -char *fn; +static int +touch( /* update a file */ + char *fn +) { if (!silent) printf("\ttouch %s\n", fn); @@ -1300,8 +1387,10 @@ char *fn; } -runcom(cs) /* run command */ -char *cs; +static int +runcom( /* run command */ + char *cs +) { if (!silent) /* echo it */ printf("\t%s\n", cs); @@ -1312,8 +1401,10 @@ char *cs; } -rmfile(fn) /* remove a file */ -char *fn; +static int +rmfile( /* remove a file */ + char *fn +) { if (!silent) printf("\t%s %s\n", DELCMD, fn); @@ -1323,8 +1414,11 @@ char *fn; } -mvfile(fold, fnew) /* move a file */ -char *fold, *fnew; +static int +mvfile( /* move a file */ + char *fold, + char *fnew +) { if (!silent) printf("\t%s %s %s\n", RENAMECMD, fold, fnew); @@ -1335,15 +1429,15 @@ char *fold, *fnew; #ifdef RHAS_FORK_EXEC -int -next_process() /* fork the next process (max. nprocs) */ +static int +next_process(void) /* fork the next process (max. nprocs) */ { int child_pid; if (nprocs <= 1) return(0); /* it's us or no one */ if (inchild()) { - fprintf(stderr, "%s: internal error 1 in spawn_process()\n", + fprintf(stderr, "%s: internal error 1 in next_process()\n", progname); quit(1); } @@ -1363,8 +1457,10 @@ next_process() /* fork the next process (max. nprocs return(0); } -wait_process(all) /* wait for process(es) to finish */ -int all; +static void +wait_process( /* wait for process(es) to finish */ + int all +) { int ourstatus = 0; int pid, status; @@ -1391,11 +1487,12 @@ int all; quit(ourstatus); /* bad status from child */ } #else /* ! RHAS_FORK_EXEC */ -int -next_process() +static int +next_process(void) { return(0); /* cannot start new process */ } +static void wait_process(all) int all; { @@ -1409,7 +1506,8 @@ int pid, sig; } #endif /* ! RHAS_FORK_EXEC */ -finish_process() /* exit a child process */ +static void +finish_process(void) /* exit a child process */ { if (!inchild()) return; /* in parent -- noop */ @@ -1436,8 +1534,10 @@ char *vname, *value; #endif -badvalue(vc) /* report bad variable value and exit */ -int vc; +static void +badvalue( /* report bad variable value and exit */ + int vc +) { fprintf(stderr, "%s: bad value for variable '%s'\n", progname, vnam(vc)); @@ -1445,8 +1545,10 @@ int vc; } -syserr(s) /* report a system error and exit */ -char *s; +static void +syserr( /* report a system error and exit */ + char *s +) { perror(s); quit(1);