--- ray/src/util/rad.c 1996/01/05 14:43:03 2.50 +++ ray/src/util/rad.c 2003/06/30 14:59:13 2.65 @@ -1,84 +1,86 @@ -/* Copyright (c) 1995 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: rad.c,v 2.65 2003/06/30 14:59:13 schorsch Exp $"; #endif - /* * Executive program for oconv, rpict and pfilt */ #include "standard.h" + +#include + +#include "platform.h" +#include "view.h" #include "paths.h" #include "vars.h" -#include -#include - /* variables */ -#define OBJECT 0 /* object files */ -#define SCENE 1 /* scene files */ -#define MATERIAL 2 /* material files */ -#define ILLUM 3 /* mkillum input files */ -#define MKILLUM 4 /* mkillum options */ -#define RENDER 5 /* rendering options */ -#define OCONV 6 /* oconv options */ -#define PFILT 7 /* pfilt options */ -#define VIEW 8 /* view(s) for picture(s) */ -#define ZONE 9 /* simulation zone */ -#define QUALITY 10 /* desired rendering quality */ -#define OCTREE 11 /* octree file name */ -#define PICTURE 12 /* picture file root name */ -#define AMBFILE 13 /* ambient file name */ -#define OPTFILE 14 /* rendering options file */ -#define EXPOSURE 15 /* picture exposure setting */ -#define RESOLUTION 16 /* maximum picture resolution */ -#define UP 17 /* view up (X, Y or Z) */ -#define INDIRECT 18 /* indirection in lighting */ -#define DETAIL 19 /* level of scene detail */ -#define PENUMBRAS 20 /* shadow penumbras are desired */ -#define VARIABILITY 21 /* level of light variability */ -#define REPORT 22 /* report frequency and errfile */ -#define RAWFILE 23 /* raw picture file root name */ + /* variables (alphabetical by name) */ +#define AMBFILE 0 /* ambient file name */ +#define DETAIL 1 /* level of scene detail */ +#define EXPOSURE 2 /* picture exposure setting */ +#define EYESEP 3 /* interocular distance */ +#define ILLUM 4 /* mkillum input files */ +#define INDIRECT 5 /* indirection in lighting */ +#define MATERIAL 6 /* material files */ +#define MKILLUM 7 /* mkillum options */ +#define OBJECT 8 /* object files */ +#define OCONV 9 /* oconv options */ +#define OCTREE 10 /* octree file name */ +#define OPTFILE 11 /* rendering options file */ +#define PENUMBRAS 12 /* shadow penumbras are desired */ +#define PFILT 13 /* pfilt options */ +#define PICTURE 14 /* picture file root name */ +#define QUALITY 15 /* desired rendering quality */ +#define RAWFILE 16 /* raw picture file root name */ +#define RENDER 17 /* rendering options */ +#define REPORT 18 /* report frequency and errfile */ +#define RESOLUTION 19 /* maximum picture resolution */ +#define SCENE 20 /* scene files */ +#define UP 21 /* view up (X, Y or Z) */ +#define VARIABILITY 22 /* level of light variability */ +#define VIEWS 23 /* view(s) for picture(s) */ #define ZFILE 24 /* distance file root name */ +#define ZONE 25 /* simulation zone */ /* total number of variables */ -int NVARS = 25; +int NVARS = 26; VARIABLE vv[] = { /* variable-value pairs */ - {"objects", 3, 0, NULL, catvalues}, - {"scene", 3, 0, NULL, catvalues}, - {"materials", 3, 0, NULL, catvalues}, + {"AMBFILE", 3, 0, NULL, onevalue}, + {"DETAIL", 3, 0, NULL, qualvalue}, + {"EXPOSURE", 3, 0, NULL, fltvalue}, + {"EYESEP", 3, 0, NULL, fltvalue}, {"illum", 3, 0, NULL, catvalues}, + {"INDIRECT", 3, 0, NULL, intvalue}, + {"materials", 3, 0, NULL, catvalues}, {"mkillum", 3, 0, NULL, catvalues}, - {"render", 3, 0, NULL, catvalues}, + {"objects", 3, 0, NULL, catvalues}, {"oconv", 3, 0, NULL, catvalues}, - {"pfilt", 2, 0, NULL, catvalues}, - {"view", 2, 0, NULL, NULL}, - {"ZONE", 2, 0, NULL, onevalue}, - {"QUALITY", 3, 0, NULL, qualvalue}, {"OCTREE", 3, 0, NULL, onevalue}, - {"PICTURE", 3, 0, NULL, onevalue}, - {"AMBFILE", 3, 0, NULL, onevalue}, {"OPTFILE", 3, 0, NULL, onevalue}, - {"EXPOSURE", 3, 0, NULL, fltvalue}, + {"PENUMBRAS", 3, 0, NULL, boolvalue}, + {"pfilt", 2, 0, NULL, catvalues}, + {"PICTURE", 3, 0, NULL, onevalue}, + {"QUALITY", 3, 0, NULL, qualvalue}, + {"RAWFILE", 3, 0, NULL, onevalue}, + {"render", 3, 0, NULL, catvalues}, + {"REPORT", 3, 0, NULL, onevalue}, {"RESOLUTION", 3, 0, NULL, onevalue}, + {"scene", 3, 0, NULL, catvalues}, {"UP", 2, 0, NULL, onevalue}, - {"INDIRECT", 3, 0, NULL, intvalue}, - {"DETAIL", 3, 0, NULL, qualvalue}, - {"PENUMBRAS", 3, 0, NULL, boolvalue}, {"VARIABILITY", 3, 0, NULL, qualvalue}, - {"REPORT", 3, 0, NULL, onevalue}, - {"RAWFILE", 3, 0, NULL, onevalue}, + {"view", 2, 0, NULL, NULL}, {"ZFILE", 2, 0, NULL, onevalue}, + {"ZONE", 2, 0, NULL, onevalue}, }; /* overture calculation file */ -#ifdef NIX -char overfile[] = "overture.unf"; +#ifdef NULL_DEVICE +char overfile[] = NULL_DEVICE; #else -char overfile[] = "/dev/null"; +char overfile[] = "overture.unf"; #endif -extern time_t fdate(), time(); +extern time_t time(); time_t scenedate; /* date of latest scene or object file */ time_t octreedate; /* date of octree */ @@ -104,7 +106,7 @@ int overture = 0; /* overture calculation needed */ char *progname; /* global argv[0] */ char *rifname; /* global rad input file name */ -char radname[MAXPATH]; /* root Radiance file name */ +char radname[PATH_MAX]; /* root Radiance file name */ main(argc, argv) @@ -155,7 +157,11 @@ char *argv[]; loadvars(rifname); /* get any additional assignments */ for (i++; i < argc; i++) - setvariable(argv[i]); + if (setvariable(argv[i], matchvar) < 0) { + fprintf(stderr, "%s: unknown variable: %s\n", + progname, argv[i]); + quit(1); + } /* check assignments */ checkvalues(); /* check files and dates */ @@ -176,12 +182,12 @@ char *argv[]; rview(ropts, popts); else rpict(ropts, popts); - exit(0); + quit(0); userr: fprintf(stderr, -"Usage: %s [-s][-n][-t][-e][-V][-v view][-o dev] rfile [VAR=value ..]\n", +"Usage: %s [-w][-s][-n][-t][-e][-V][-v view][-o dev] rfile [VAR=value ..]\n", progname); - exit(1); + quit(1); } @@ -204,18 +210,15 @@ time_t checklast(fnames) /* check files and find most recent */ register char *fnames; { - char thisfile[MAXPATH]; + char thisfile[PATH_MAX]; time_t thisdate, lastdate = 0; - register char *cp; if (fnames == NULL) return(0); - while (*fnames) { - while (isspace(*fnames)) fnames++; - cp = thisfile; - while (*fnames && !isspace(*fnames)) - *cp++ = *fnames++; - *cp = '\0'; + while ((fnames = nextword(thisfile, PATH_MAX, fnames)) != NULL) { + if (thisfile[0] == '!' || + (thisfile[0] == '\\' && thisfile[1] == '!')) + continue; if (!(thisdate = fdate(thisfile))) syserr(thisfile); if (thisdate > lastdate) @@ -230,7 +233,6 @@ newfname(orig, pred) /* create modified file name */ char *orig; int pred; { - extern char *rindex(); register char *cp; register int n; int suffix; @@ -260,6 +262,10 @@ checkfiles() /* check for existence and modified tim syserr(progname); sprintf(vval(OCTREE), "%s.oct", radname); vdef(OCTREE)++; + } else if (vval(OCTREE)[0] == '!') { + fprintf(stderr, "%s: illegal '%s' specification\n", + progname, vnam(OCTREE)); + quit(1); } octreedate = fdate(vval(OCTREE)); if (vdef(ILLUM)) { /* illum requires secondary octrees */ @@ -276,7 +282,7 @@ checkfiles() /* check for existence and modified tim if (!octreedate & !scenedate & !illumdate) { fprintf(stderr, "%s: need '%s' or '%s' or '%s'\n", progname, vnam(OCTREE), vnam(SCENE), vnam(ILLUM)); - exit(1); + quit(1); } matdate = checklast(vval(MATERIAL)); } @@ -306,7 +312,7 @@ double org[3], *sizp; fprintf(stderr, "%s: error reading bounding box from getbbox\n", progname); - exit(1); + quit(1); } for (i = 0; i < 3; i++) if (max[i] - min[i] > osiz) @@ -324,7 +330,7 @@ double org[3], *sizp; fprintf(stderr, "%s: error reading bounding cube from getinfo\n", progname); - exit(1); + quit(1); } pclose(fp); } @@ -334,7 +340,7 @@ double org[3], *sizp; setdefaults() /* set default values for unassigned var's */ { - double org[3], size; + double org[3], lim[3], size; char buf[128]; if (!vdef(ZONE)) { @@ -344,6 +350,16 @@ setdefaults() /* set default values for unassigned v vval(ZONE) = savqstr(buf); vdef(ZONE)++; } + if (!vdef(EYESEP)) { + if (sscanf(vval(ZONE), "%*s %lf %lf %lf %lf %lf %lf", + &org[0], &lim[0], &org[1], &lim[1], + &org[2], &lim[2]) != 6) + badvalue(ZONE); + sprintf(buf, "%f", + 0.01*(lim[0]-org[0]+lim[1]-org[1]+lim[2]-org[2])); + vval(EYESEP) = savqstr(buf); + vdef(EYESEP)++; + } if (!vdef(INDIRECT)) { vval(INDIRECT) = "0"; vdef(INDIRECT)++; @@ -360,9 +376,9 @@ setdefaults() /* set default values for unassigned v vval(PICTURE) = radname; vdef(PICTURE)++; } - if (!vdef(VIEW)) { - vval(VIEW) = "X"; - vdef(VIEW)++; + if (!vdef(VIEWS)) { + vval(VIEWS) = "X"; + vdef(VIEWS)++; } if (!vdef(DETAIL)) { vval(DETAIL) = "M"; @@ -382,7 +398,7 @@ setdefaults() /* set default values for unassigned v oconv() /* run oconv and mkillum if necessary */ { static char illumtmp[] = "ilXXXXXX"; - char combuf[1024], ocopts[64], mkopts[64]; + char combuf[PATH_MAX], ocopts[64], mkopts[64]; oconvopts(ocopts); /* get options */ if (octreedate < scenedate) { /* check date on original octree */ @@ -402,7 +418,7 @@ oconv() /* run oconv and mkillum if necessary */ "%s: error generating octree\n\t%s removed\n", progname, vval(OCTREE)); unlink(vval(OCTREE)); - exit(1); + quit(1); } } octreedate = time((time_t *)NULL); @@ -433,7 +449,7 @@ oconv() /* run oconv and mkillum if necessary */ "%s: error generating octree\n\t%s removed\n", progname, oct0name); unlink(oct0name); - exit(1); + quit(1); } } oct0date = time((time_t *)NULL); @@ -453,7 +469,7 @@ oconv() /* run oconv and mkillum if necessary */ fprintf(stderr, "%s: error running mkillum\n", progname); unlink(illumtmp); - exit(1); + quit(1); } /* make octree1 (frozen) */ if (octreedate) @@ -471,7 +487,7 @@ oconv() /* run oconv and mkillum if necessary */ progname, oct1name); unlink(oct1name); unlink(illumtmp); - exit(1); + quit(1); } rmfile(illumtmp); } @@ -807,7 +823,7 @@ char *ro; syserr(vval(OPTFILE)); sprintf(ro, " @%s", vval(OPTFILE)); } -#ifdef MSDOS +#ifdef _WIN32 else if (n > 50) { setenv("ROPT", ro+1); strcpy(ro, " $ROPT"); @@ -826,7 +842,7 @@ register char *po; } switch (vscale(QUALITY)) { case MEDIUM: - po = addarg(po, "-r 1"); + po = addarg(po, "-r .6"); break; case HIGH: po = addarg(po, "-m .25"); @@ -963,7 +979,7 @@ register char *vs; if (cp == viewopts) /* append any additional options */ vs++; /* skip prefixed space if unneeded */ strcpy(cp, vs); -#ifdef MSDOS +#ifdef _WIN32 if (strlen(viewopts) > 40) { setenv("VIEW", viewopts); return("$VIEW"); @@ -995,14 +1011,14 @@ char *vn; /* returned view name */ } /* view number? */ if (isint(viewselect)) - return(specview(nvalue(vv+VIEW, atoi(viewselect)-1))); + return(specview(nvalue(VIEWS, atoi(viewselect)-1))); /* check list */ - while ((mv = nvalue(vv+VIEW, n++)) != NULL) + while ((mv = nvalue(VIEWS, n++)) != NULL) if (matchword(viewselect, mv)) return(specview(mv)); return(specview(viewselect)); /* standard view? */ } - mv = nvalue(vv+VIEW, n); /* use view n */ + mv = nvalue(VIEWS, n); /* use view n */ if (vn != NULL & mv != NULL) { register char *mv2 = mv; if (*mv2 != '-') @@ -1017,56 +1033,28 @@ char *vn; /* returned view name */ printview(vopts) /* print out selected view */ register char *vopts; { - extern char *atos(), *getenv(); - char buf[256]; - FILE *fp; + VIEW vwr; + char buf[128]; register char *cp; - +again: if (vopts == NULL) return(-1); - fputs("VIEW=", stdout); - do { - if (matchword(vopts, "-vf")) { /* expand view file */ - vopts = sskip(vopts); - if (!*atos(buf, sizeof(buf), vopts)) - return(-1); - if ((fp = fopen(buf, "r")) == NULL) - return(-1); - for (buf[sizeof(buf)-2] = '\n'; - fgets(buf, sizeof(buf), fp) != NULL && - buf[0] != '\n'; - buf[sizeof(buf)-2] = '\n') { - if (buf[sizeof(buf)-2] != '\n') { - ungetc(buf[sizeof(buf)-2], fp); - buf[sizeof(buf)-2] = '\0'; - } - if (matchword(buf, "VIEW=") || - matchword(buf, "rview")) { - for (cp = sskip(buf); *cp && *cp != '\n'; cp++) - putchar(*cp); - } - } - fclose(fp); - vopts = sskip(vopts); - } else { - while (isspace(*vopts)) - vopts++; - putchar(' '); -#ifdef MSDOS - if (*vopts == '$') { /* expand env. var. */ - if (!*atos(buf, sizeof(buf), vopts+1)) - return(-1); - if ((cp = getenv(buf)) == NULL) - return(-1); - fputs(cp, stdout); - vopts = sskip(vopts); - } else +#ifdef _WIN32 + if (vopts[0] == '$') { + vopts = getenv(vopts+1); + goto again; + } #endif - while (*vopts && !isspace(*vopts)) - putchar(*vopts++); - } - } while (*vopts++); - putchar('\n'); + copystruct(&vwr, &stdview); + sscanview(&vwr, cp=vopts); /* set initial options */ + while ((cp = strstr(cp, "-vf ")) != NULL && + *atos(buf, sizeof(buf), cp += 4)) { + viewfile(buf, &vwr, NULL); /* load -vf file */ + sscanview(&vwr, cp); /* reset tail */ + } + fputs(VIEWSTR, stdout); + fprintview(&vwr, stdout); /* print full spec. */ + fputc('\n', stdout); return(0); } @@ -1075,7 +1063,7 @@ rview(opts, po) /* run rview with first view */ char *opts, *po; { char *vw; - char combuf[512]; + char combuf[PATH_MAX]; /* build command */ if (touchonly || (vw = getview(0, NULL)) == NULL) return; @@ -1089,7 +1077,7 @@ char *opts, *po; strcat(combuf, oct1name); if (runcom(combuf)) { /* run it */ fprintf(stderr, "%s: error running rview\n", progname); - exit(1); + quit(1); } } @@ -1097,9 +1085,9 @@ char *opts, *po; rpict(opts, po) /* run rpict and pfilt for each view */ char *opts, *po; { - char combuf[1024]; - char rawfile[MAXPATH], picfile[MAXPATH]; - char zopt[MAXPATH+4], rep[MAXPATH+16], res[32]; + char combuf[PATH_MAX]; + char rawfile[PATH_MAX], picfile[PATH_MAX]; + char zopt[PATH_MAX+4], rep[PATH_MAX+16], res[32]; char pfopts[128]; char vs[32], *vw; int vn, mult; @@ -1186,9 +1174,9 @@ char *opts, *po; fprintf(stderr, "%s: error in overture for view %s\n", progname, vs); - exit(1); + quit(1); } -#ifdef NIX +#ifndef NULL_DEVICE rmfile(overfile); #endif } @@ -1199,7 +1187,7 @@ char *opts, *po; if (runcom(combuf)) { /* run rpict */ fprintf(stderr, "%s: error rendering view %s\n", progname, vs); - exit(1); + quit(1); } if (!vdef(RAWFILE) || strcmp(vval(RAWFILE),vval(PICTURE))) { /* build pfilt command */ @@ -1214,7 +1202,7 @@ char *opts, *po; "%s: error filtering view %s\n\t%s removed\n", progname, vs, picfile); unlink(picfile); - exit(1); + quit(1); } } /* remove/rename raw file */ @@ -1259,7 +1247,7 @@ rmfile(fn) /* remove a file */ char *fn; { if (!silent) -#ifdef MSDOS +#ifdef _WIN32 printf("\tdel %s\n", fn); #else printf("\trm -f %s\n", fn); @@ -1274,7 +1262,7 @@ mvfile(fold, fnew) /* move a file */ char *fold, *fnew; { if (!silent) -#ifdef MSDOS +#ifdef _WIN32 printf("\trename %s %s\n", fold, fnew); #else printf("\tmv %s %s\n", fold, fnew); @@ -1285,7 +1273,7 @@ char *fold, *fnew; } -#ifdef MSDOS +#ifdef _WIN32 setenv(vname, value) /* set an environment variable */ char *vname, *value; { @@ -1297,7 +1285,7 @@ char *vname, *value; sprintf(evp, "%s=%s", vname, value); if (putenv(evp) != 0) { fprintf(stderr, "%s: out of environment space\n", progname); - exit(1); + quit(1); } if (!silent) printf("set %s\n", evp); @@ -1310,7 +1298,7 @@ int vc; { fprintf(stderr, "%s: bad value for variable '%s'\n", progname, vnam(vc)); - exit(1); + quit(1); } @@ -1318,5 +1306,13 @@ syserr(s) /* report a system error and exit */ char *s; { perror(s); - exit(1); + quit(1); +} + + +void +quit(ec) /* exit program */ +int ec; +{ + exit(ec); }