--- ray/src/util/rad.c 1993/03/12 13:37:03 2.4 +++ ray/src/util/rad.c 1993/10/30 10:47:05 2.29 @@ -27,31 +27,35 @@ int onevalue(), catvalues(); #define OBJECT 0 /* object files */ #define SCENE 1 /* scene files */ #define MATERIAL 2 /* material files */ -#define RENDER 3 /* rendering options */ -#define OCONV 4 /* oconv options */ -#define PFILT 5 /* pfilt options */ -#define VIEW 6 /* view(s) for picture(s) */ -#define ZONE 7 /* simulation zone */ -#define QUALITY 8 /* desired rendering quality */ -#define OCTREE 9 /* octree file name */ -#define PICTURE 10 /* picture file name */ -#define AMBFILE 11 /* ambient file name */ -#define OPTFILE 12 /* rendering options file */ -#define EXPOSURE 13 /* picture exposure setting */ -#define RESOLUTION 14 /* maximum picture resolution */ -#define UP 15 /* view up (X, Y or Z) */ -#define INDIRECT 16 /* indirection in lighting */ -#define DETAIL 17 /* level of scene detail */ -#define PENUMBRAS 18 /* shadow penumbras are desired */ -#define VARIABILITY 19 /* level of light variability */ -#define REPORT 20 /* report frequency and errfile */ +#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 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 */ /* total number of variables */ -#define NVARS 21 +#define NVARS 23 VARIABLE vv[NVARS] = { /* variable-value pairs */ {"objects", 3, 0, NULL, catvalues}, {"scene", 3, 0, NULL, catvalues}, {"materials", 3, 0, NULL, catvalues}, + {"illum", 3, 0, NULL, catvalues}, + {"mkillum", 3, 0, NULL, catvalues}, {"render", 3, 0, NULL, catvalues}, {"oconv", 3, 0, NULL, catvalues}, {"pfilt", 2, 0, NULL, catvalues}, @@ -94,20 +98,36 @@ int (*setqopts[3])() = {lowqopts, medqopts, hiqopts}; #define renderopts (*setqopts[vscale(QUALITY)]) -extern long fdate(), time(); + /* overture calculation file */ +#ifdef NIX +char overfile[] = "overture.raw"; +#else +char overfile[] = "/dev/null"; +#endif -long scenedate; /* date of latest scene or object file */ -long octreedate; /* date of octree */ +extern unsigned long fdate(), time(); +unsigned long scenedate; /* date of latest scene or object file */ +unsigned long octreedate; /* date of octree */ +unsigned long matdate; /* date of latest material file */ +unsigned long illumdate; /* date of last illum file */ + +char *oct0name; /* name of pre-mkillum octree */ +unsigned long oct0date; /* date of pre-mkillum octree */ +char *oct1name; /* name of post-mkillum octree */ +unsigned long oct1date; /* date of post-mkillum octree (>= matdate) */ + int explicate = 0; /* explicate variables */ int silent = 0; /* do work silently */ int noaction = 0; /* don't do anything */ +int sayview = 0; /* print view out */ char *rvdevice = NULL; /* rview output device */ char *viewselect = NULL; /* specific view only */ 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 */ @@ -135,6 +155,9 @@ char *argv[]; case 'o': rvdevice = argv[++i]; break; + case 'V': + sayview++; + break; case 'v': viewselect = argv[++i]; break; @@ -143,10 +166,11 @@ char *argv[]; } if (i >= argc) goto userr; + rifname = argv[i]; /* assign Radiance root file name */ - rootname(radname, argv[i]); + rootname(radname, rifname); /* load variable values */ - load(argv[i]); + load(rifname); /* get any additional assignments */ for (i++; i < argc; i++) setvariable(argv[i]); @@ -159,8 +183,11 @@ char *argv[]; /* print all values if requested */ if (explicate) printvals(); - /* run simulation */ + /* build octree (and run mkillum) */ oconv(); + /* check date on ambient file */ + checkambfile(); + /* run simulation */ renderopts(ropts); xferopts(ropts); if (rvdevice != NULL) @@ -170,7 +197,7 @@ char *argv[]; exit(0); userr: fprintf(stderr, - "Usage: %s [-s][-n][-e][-v view][-o dev] rfile [VAR=value ..]\n", + "Usage: %s [-s][-n][-e][-V][-v view][-o dev] rfile [VAR=value ..]\n", progname); exit(1); } @@ -191,6 +218,9 @@ register char *rn, *fn; } +#define NOCHAR 127 /* constant for character to delete */ + + load(rfname) /* load Radiance simulation file */ char *rfname; { @@ -206,8 +236,7 @@ char *rfname; for (cp = buf; *cp; cp++) { switch (*cp) { case '\\': - case '\n': - *cp = ' '; + *cp++ = NOCHAR; continue; case '#': *cp = '\0'; @@ -227,10 +256,11 @@ setvariable(ass) /* assign variable according to stri register char *ass; { char varname[32]; + char varval[512]; + int n; register char *cp; register VARIABLE *vp; register int i; - int n; while (isspace(*ass)) /* skip leading space */ ass++; @@ -244,11 +274,9 @@ register char *ass; /* trim value */ while (isspace(*ass) || *ass == '=') ass++; - cp = ass + strlen(ass); - do - *cp-- = '\0'; - while (cp >= ass && isspace(*cp)); - n = cp - ass + 1; + for (n = strlen(ass); n > 0; n--) + if (!isspace(ass[n-1])) + break; if (!n) { fprintf(stderr, "%s: warning - missing value for variable '%s'\n", progname, varname); @@ -273,7 +301,18 @@ register char *ass; vp->value = malloc(n+1); if (vp->value == NULL) syserr(progname); - strcpy(vp->value+i, ass); + cp = vp->value+i; /* copy value, squeezing spaces */ + *cp = *ass; + for (i = 1; i <= n; i++) { + if (ass[i] == NOCHAR) + continue; + if (isspace(*cp)) + while (isspace(ass[i])) + i++; + *++cp = ass[i]; + } + if (isspace(*cp)) /* remove trailing space */ + *cp = '\0'; vp->nass++; } @@ -299,7 +338,7 @@ register int n; { register char *cp; - if (vp == NULL || n < 0 || n >= vp->nass) + if (vp == NULL | n < 0 | n >= vp->nass) return(NULL); cp = vp->value; while (n--) @@ -363,21 +402,23 @@ register VARIABLE *vp; } -long +unsigned long checklast(fnames) /* check files and find most recent */ register char *fnames; { char thisfile[MAXPATH]; - long thisdate, lastdate = -1; + unsigned long 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'; - if ((thisdate = fdate(thisfile)) < 0) + if (!(thisdate = fdate(thisfile))) syserr(thisfile); if (thisdate > lastdate) lastdate = thisdate; @@ -386,33 +427,60 @@ register char *fnames; } +char * +newfname(orig, pred) /* create modified file name */ +char *orig; +int pred; +{ + extern char *rindex(); + register char *cp; + register int n; + int suffix; + + n = 0; cp = orig; suffix = -1; /* suffix position, length */ + while (*cp) { + if (*cp == '.') suffix = n; + else if (ISDIRSEP(*cp)) suffix = -1; + cp++; n++; + } + if (suffix == -1) suffix = n; + if ((cp = bmalloc(n+2)) == NULL) + syserr(progname); + strncpy(cp, orig, suffix); + cp[suffix] = pred; /* root name + pred + suffix */ + strcpy(cp+suffix+1, orig+suffix); + return(cp); +} + + checkfiles() /* check for existence and modified times */ { - char *cp; - long objdate; + unsigned long objdate; if (!vdef(OCTREE)) { - if ((cp = bmalloc(strlen(radname)+5)) == NULL) + if ((vval(OCTREE) = bmalloc(strlen(radname)+5)) == NULL) syserr(progname); - sprintf(cp, "%s.oct", radname); - vval(OCTREE) = cp; + sprintf(vval(OCTREE), "%s.oct", radname); vdef(OCTREE)++; } octreedate = fdate(vval(OCTREE)); - scenedate = -1; - if (vdef(SCENE)) { - scenedate = checklast(vval(SCENE)); - if (vdef(OBJECT)) { - objdate = checklast(vval(OBJECT)); - if (objdate > scenedate) - scenedate = objdate; - } - } - if (octreedate < 0 & scenedate < 0) { - fprintf(stderr, "%s: need '%s' or '%s'\n", progname, - vnam(OCTREE), vnam(SCENE)); + if (vdef(ILLUM)) { /* illum requires secondary octrees */ + oct0name = newfname(vval(OCTREE), '0'); + oct1name = newfname(vval(OCTREE), '1'); + oct0date = fdate(oct0name); + oct1date = fdate(oct1name); + } else + oct0name = oct1name = vval(OCTREE); + if ((scenedate = checklast(vval(SCENE))) && + (objdate = checklast(vval(OBJECT))) > scenedate) + scenedate = objdate; + illumdate = checklast(vval(ILLUM)); + if (!octreedate & !scenedate & !illumdate) { + fprintf(stderr, "%s: need '%s' or '%s' or '%s'\n", progname, + vnam(OCTREE), vnam(SCENE), vnam(ILLUM)); exit(1); } + matdate = checklast(vval(MATERIAL)); } @@ -421,23 +489,47 @@ double org[3], *sizp; { extern FILE *popen(); static double oorg[3], osiz = 0.; - char buf[MAXPATH+16]; + double min[3], max[3]; + char buf[512]; FILE *fp; + register int i; - if (osiz <= FTINY) { - oconv(); /* does nothing if done already */ - sprintf(buf, "getinfo -d < %s", vval(OCTREE)); - if ((fp = popen(buf, "r")) == NULL) - syserr("getinfo"); - if (fscanf(fp, "%lf %lf %lf %lf", &oorg[0], &oorg[1], - &oorg[2], &osiz) != 4) { - fprintf(stderr, + if (osiz <= FTINY) + if (noaction && fdate(oct1name) < + (scenedate>illumdate?scenedate:illumdate)) { + /* run getbbox */ + sprintf(buf, "getbbox -w -h %s", + vdef(SCENE) ? vval(SCENE) : vval(ILLUM)); + if ((fp = popen(buf, "r")) == NULL) + syserr("getbbox"); + if (fscanf(fp, "%lf %lf %lf %lf %lf %lf", + &min[0], &max[0], &min[1], &max[1], + &min[2], &max[2]) != 6) { + fprintf(stderr, + "%s: error reading bounding box from getbbox\n", + progname); + exit(1); + } + for (i = 0; i < 3; i++) + if (max[i] - min[i] > osiz) + osiz = max[i] - min[i]; + for (i = 0; i < 3; i++) + oorg[i] = (max[i]+min[i]-osiz)*.5; + pclose(fp); + } else { /* from octree */ + oconv(); /* does nothing if done already */ + sprintf(buf, "getinfo -d < %s", oct1name); + if ((fp = popen(buf, "r")) == NULL) + syserr("getinfo"); + if (fscanf(fp, "%lf %lf %lf %lf", &oorg[0], &oorg[1], + &oorg[2], &osiz) != 4) { + fprintf(stderr, "%s: error reading bounding cube from getinfo\n", - progname); - exit(1); + progname); + exit(1); + } + pclose(fp); } - pclose(fp); - } org[0] = oorg[0]; org[1] = oorg[1]; org[2] = oorg[2]; *sizp = osiz; } @@ -500,28 +592,84 @@ printvals() /* print variable values */ } -oconv() /* run oconv if necessary */ +oconv() /* run oconv and mkillum if necessary */ { - char combuf[512], ocopts[64]; + static char illumtmp[] = "ilXXXXXX"; + char combuf[512], ocopts[64], mkopts[64]; - if (octreedate >= scenedate) /* check dates */ - return; - /* build command */ - oconvopts(ocopts); - if (vdef(MATERIAL)) - sprintf(combuf, "oconv%s %s %s > %s", ocopts, + oconvopts(ocopts); /* get options */ + if (octreedate < scenedate) { /* check date on original octree */ + /* build command */ + if (vdef(MATERIAL)) + sprintf(combuf, "oconv%s %s %s > %s", ocopts, vval(MATERIAL), vval(SCENE), vval(OCTREE)); + else + sprintf(combuf, "oconv%s %s > %s", ocopts, + vval(SCENE), vval(OCTREE)); + + if (runcom(combuf)) { /* run it */ + fprintf(stderr, + "%s: error generating octree\n\t%s removed\n", + progname, vval(OCTREE)); + unlink(vval(OCTREE)); + exit(1); + } + octreedate = time(0); + } + if (oct1name == vval(OCTREE)) /* no mkillum? */ + oct1date = octreedate > matdate ? octreedate : matdate; + if (oct1date >= octreedate & oct1date >= matdate + & oct1date >= illumdate) /* all done */ + return; + /* make octree0 */ + if (oct0date < scenedate | oct0date < illumdate) { + /* build command */ + if (octreedate) + sprintf(combuf, "oconv%s -i %s %s > %s", ocopts, + vval(OCTREE), vval(ILLUM), oct0name); + else if (vdef(MATERIAL)) + sprintf(combuf, "oconv%s %s %s > %s", ocopts, + vval(MATERIAL), vval(ILLUM), oct0name); + else + sprintf(combuf, "oconv%s %s > %s", ocopts, + vval(ILLUM), oct0name); + if (runcom(combuf)) { /* run it */ + fprintf(stderr, + "%s: error generating octree\n\t%s removed\n", + progname, oct0name); + unlink(oct0name); + exit(1); + } + oct0date = time(0); + } + mkillumopts(mkopts); /* build mkillum command */ + mktemp(illumtmp); + sprintf(combuf, "mkillum%s %s \"<\" %s > %s", mkopts, + oct0name, vval(ILLUM), illumtmp); + if (runcom(combuf)) { /* run it */ + fprintf(stderr, "%s: error running mkillum\n", progname); + unlink(illumtmp); + exit(1); + } + /* make octree1 (frozen) */ + if (octreedate) + sprintf(combuf, "oconv%s -f -i %s %s > %s", ocopts, + vval(OCTREE), illumtmp, oct1name); + else if (vdef(MATERIAL)) + sprintf(combuf, "oconv%s -f %s %s > %s", ocopts, + vval(MATERIAL), illumtmp, oct1name); else - sprintf(combuf, "oconv%s %s > %s", ocopts, - vval(SCENE), vval(OCTREE)); - + sprintf(combuf, "oconv%s -f %s > %s", ocopts, + illumtmp, oct1name); if (runcom(combuf)) { /* run it */ - fprintf(stderr, "%s: error generating octree\n\t%s removed\n", - progname, vval(OCTREE)); - unlink(vval(OCTREE)); + fprintf(stderr, + "%s: error generating octree\n\t%s removed\n", + progname, oct1name); + unlink(oct1name); exit(1); } - octreedate = time(0); + oct1date = time(0); + rmfile(illumtmp); } @@ -547,15 +695,39 @@ register char *oo; } +mkillumopts(mo) /* get mkillum options */ +register char *mo; +{ + /* BEWARE: This may be called via setdefaults(), so no assumptions */ + + *mo = '\0'; + if (vdef(MKILLUM)) + addarg(mo, vval(MKILLUM)); +} + + +checkambfile() /* check date on ambient file */ +{ + unsigned long afdate; + + if (!vdef(AMBFILE)) + return; + if (!(afdate = fdate(vval(AMBFILE)))) + return; + if (oct1date > afdate) + rmfile(vval(AMBFILE)); +} + + double ambval() /* compute ambient value */ { if (vdef(EXPOSURE)) { + if (!isflt(vval(EXPOSURE))) + badvalue(EXPOSURE); if (vval(EXPOSURE)[0] == '+' || vval(EXPOSURE)[0] == '-') return(.5/pow(2.,atof(vval(EXPOSURE)))); - if (isdigit(vval(EXPOSURE)[0]) || vval(EXPOSURE)[0] == '.') - return(.5/atof(vval(EXPOSURE))); - badvalue(EXPOSURE); + return(.5/atof(vval(EXPOSURE))); } if (vlet(ZONE) == 'E') return(10.); @@ -579,17 +751,17 @@ register char *op; d *= 3./(siz[0]+siz[1]+siz[2]); switch (vscale(DETAIL)) { case LOW: - op = addarg(op, "-ps 16 -dp 16"); + op = addarg(op, "-ps 16 -dp 64"); sprintf(op, " -ar %d", (int)(4*d)); op += strlen(op); break; case MEDIUM: - op = addarg(op, "-ps 8 -dp 32"); + op = addarg(op, "-ps 8 -dp 128"); sprintf(op, " -ar %d", (int)(8*d)); op += strlen(op); break; case HIGH: - op = addarg(op, "-ps 4 -dp 64"); + op = addarg(op, "-ps 4 -dp 256"); sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); break; @@ -599,7 +771,7 @@ register char *op; op = addarg(op, "-ds .4"); else op = addarg(op, "-ds 0"); - op = addarg(op, "-dt .2 -dc .25 -dr 0 -sj 0 -st .7"); + op = addarg(op, "-dt .2 -dc .25 -dr 0 -sj 0 -st .5"); if (vdef(AMBFILE)) { sprintf(op, " -af %s", vval(AMBFILE)); op += strlen(op); @@ -607,13 +779,13 @@ register char *op; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .4 -ad 32"); + op = addarg(op, "-aa .4 -ad 64"); break; case MEDIUM: - op = addarg(op, "-aa .3 -ad 64"); + op = addarg(op, "-aa .3 -ad 128"); break; case HIGH: - op = addarg(op, "-aa .25 -ad 128"); + op = addarg(op, "-aa .25 -ad 256"); break; } op = addarg(op, "-as 0"); @@ -641,31 +813,33 @@ register char *op; switch (vscale(DETAIL)) { case LOW: op = addarg(op, vbool(PENUMBRAS) ? "-ps 4" : "-ps 8"); - op = addarg(op, "-dp 64"); + op = addarg(op, "-dp 256"); sprintf(op, " -ar %d", (int)(8*d)); op += strlen(op); break; case MEDIUM: op = addarg(op, vbool(PENUMBRAS) ? "-ps 3" : "-ps 6"); - op = addarg(op, "-dp 128"); + op = addarg(op, "-dp 512"); sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); break; case HIGH: op = addarg(op, vbool(PENUMBRAS) ? "-ps 2" : "-ps 4"); - op = addarg(op, "-dp 256"); + op = addarg(op, "-dp 1024"); sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); break; } op = addarg(op, "-pt .08"); if (vbool(PENUMBRAS)) - op = addarg(op, "-ds .2 -dj .35"); + op = addarg(op, "-ds .2 -dj .5"); else op = addarg(op, "-ds .3"); - op = addarg(op, "-dt .1 -dc .5 -dr 1 -sj .7 -st .15"); - sprintf(op, " -ab %d", overture=vint(INDIRECT)); - op += strlen(op); + op = addarg(op, "-dt .1 -dc .5 -dr 1 -sj .7 -st .1"); + if (overture = vint(INDIRECT)) { + sprintf(op, " -ab %d", overture); + op += strlen(op); + } if (vdef(AMBFILE)) { sprintf(op, " -af %s", vval(AMBFILE)); op += strlen(op); @@ -673,13 +847,13 @@ register char *op; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .25 -ad 128 -as 0"); + op = addarg(op, "-aa .25 -ad 196 -as 0"); break; case MEDIUM: - op = addarg(op, "-aa .2 -ad 300 -as 64"); + op = addarg(op, "-aa .2 -ad 400 -as 64"); break; case HIGH: - op = addarg(op, "-aa .15 -ad 500 -as 128"); + op = addarg(op, "-aa .15 -ad 768 -as 196"); break; } d = ambval(); @@ -706,19 +880,19 @@ register char *op; switch (vscale(DETAIL)) { case LOW: op = addarg(op, vbool(PENUMBRAS) ? "-ps 1" : "-ps 8"); - op = addarg(op, "-dp 256"); + op = addarg(op, "-dp 1024"); sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); break; case MEDIUM: op = addarg(op, vbool(PENUMBRAS) ? "-ps 1" : "-ps 5"); - op = addarg(op, "-dp 512"); + op = addarg(op, "-dp 2048"); sprintf(op, " -ar %d", (int)(32*d)); op += strlen(op); break; case HIGH: op = addarg(op, vbool(PENUMBRAS) ? "-ps 1" : "-ps 3"); - op = addarg(op, "-dp 1024"); + op = addarg(op, "-dp 4096"); sprintf(op, " -ar %d", (int)(64*d)); op += strlen(op); break; @@ -728,7 +902,7 @@ register char *op; op = addarg(op, "-ds .1 -dj .7"); else op = addarg(op, "-ds .2"); - op = addarg(op, "-dt .05 -dc .75 -dr 3 -sj 1 -st .03"); + op = addarg(op, "-dt .05 -dc .75 -dr 3 -sj 1 -st .01"); sprintf(op, " -ab %d", overture=vint(INDIRECT)+1); op += strlen(op); if (vdef(AMBFILE)) { @@ -738,13 +912,13 @@ register char *op; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .15 -ad 200 -as 0"); + op = addarg(op, "-aa .15 -ad 256 -as 0"); break; case MEDIUM: - op = addarg(op, "-aa .125 -ad 512 -as 128"); + op = addarg(op, "-aa .125 -ad 512 -as 256"); break; case HIGH: - op = addarg(op, "-aa .08 -ad 850 -as 256"); + op = addarg(op, "-aa .08 -ad 1024 -as 512"); break; } d = ambval(); @@ -760,31 +934,26 @@ xferopts(ro) /* transfer options if indicated */ char *ro; { int fd, n; + register char *cp; n = strlen(ro); if (n < 2) return; if (vdef(OPTFILE)) { - if ((fd = open(vval(OPTFILE), O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1) + for (cp = ro; cp[1]; cp++) + if (isspace(cp[1]) && cp[2] == '-' && isalpha(cp[3])) + *cp = '\n'; + else + *cp = cp[1]; + *cp = '\n'; + fd = open(vval(OPTFILE), O_WRONLY|O_CREAT|O_TRUNC, 0666); + if (fd < 0 || write(fd, ro, n) != n || close(fd) < 0) syserr(vval(OPTFILE)); - if (write(fd, ro+1, n-1) != n-1) - syserr(vval(OPTFILE)); - write(fd, "\n", 1); - close(fd); - sprintf(ro, " \"^%s\"", vval(OPTFILE)); + sprintf(ro, " @%s", vval(OPTFILE)); } #ifdef MSDOS else if (n > 50) { - register char *evp = bmalloc(n+6); - if (evp == NULL) - syserr(progname); - strcpy(evp, "ROPT="); - strcat(evp, ro); - if (putenv(evp) != 0) { - fprintf(stderr, "%s: out of environment space\n", - progname); - exit(1); - } + setenv("ROPT", ro+1); strcpy(ro, " $ROPT"); } #endif @@ -799,8 +968,14 @@ register char *po; po = addarg(po, "-1 -e"); po = addarg(po, vval(EXPOSURE)); } - if (vscale(QUALITY) == HIGH) - po = addarg(po, "-r .65"); + switch (vscale(QUALITY)) { + case MEDIUM: + po = addarg(po, "-r 1"); + break; + case HIGH: + po = addarg(po, "-m .25"); + break; + } if (vdef(PFILT)) po = addarg(po, vval(PFILT)); } @@ -924,8 +1099,15 @@ register char *vs; cp += strlen(cp); } } - /* append any additional options */ + if (cp == viewopts) /* append any additional options */ + vs++; /* skip prefixed space if unneeded */ strcpy(cp, vs); +#ifdef MSDOS + if (strlen(viewopts) > 40) { + setenv("VIEW", viewopts); + return("$VIEW"); + } +#endif return(viewopts); } @@ -933,11 +1115,11 @@ register char *vs; char * getview(n, vn) /* get view n, or NULL if none */ int n; -char *vn; +char *vn; /* returned view name */ { register char *mv; - if (viewselect != NULL) { + if (viewselect != NULL) { /* command-line selected */ if (n) /* only do one */ return(NULL); if (viewselect[0] == '-') { /* already specified */ @@ -950,31 +1132,100 @@ char *vn; ; *vn = '\0'; } + /* view number? */ + if (isint(viewselect)) + return(specview(nvalue(vv+VIEW, atoi(viewselect)-1))); /* check list */ while ((mv = nvalue(vv+VIEW, n++)) != NULL) if (matchword(viewselect, mv)) return(specview(mv)); return(specview(viewselect)); /* standard view? */ } - if (vn != NULL && (mv = nvalue(vv+VIEW, n)) != NULL) { - if (*mv != '-') - while (*mv && !isspace(*mv)) - *vn++ = *mv++; + mv = nvalue(vv+VIEW, n); /* use view n */ + if (vn != NULL & mv != NULL) { + register char *mv2 = mv; + if (*mv2 != '-') + while (*mv2 && !isspace(*mv2)) + *vn++ = *mv2++; *vn = '\0'; } - return(specview(nvalue(vv+VIEW, n))); /* use view n */ + return(specview(mv)); } +printview(vopts) /* print out selected view */ +register char *vopts; +{ + extern char *atos(), *getenv(); + char buf[256]; + FILE *fp; + register char *cp; + + 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 +#endif + while (*vopts && !isspace(*vopts)) + putchar(*vopts++); + } + } while (*vopts++); + putchar('\n'); + return(0); +} + + rview(opts) /* run rview with first view */ char *opts; { + char *vw; char combuf[512]; /* build command */ - sprintf(combuf, "rview %s%s ", getview(0, NULL), opts); + if ((vw = getview(0, NULL)) == NULL) + return; + if (sayview) + printview(vw); + sprintf(combuf, "rview %s%s -R %s ", vw, opts, rifname); if (rvdevice != NULL) sprintf(combuf+strlen(combuf), "-o %s ", rvdevice); - strcat(combuf, vval(OCTREE)); + 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); exit(1); @@ -1020,43 +1271,41 @@ char *opts; else badvalue(REPORT); } - /* check date on ambient file */ - if (vdef(AMBFILE)) { - long afdate = fdate(vval(AMBFILE)); - if (afdate >= 0 & octreedate > afdate) - rmfile(vval(AMBFILE)); - } /* do each view */ vn = 0; while ((vw = getview(vn++, vs)) != NULL) { + if (sayview) + printview(vw); if (!vs[0]) sprintf(vs, "%d", vn); sprintf(picfile, "%s_%s.pic", vval(PICTURE), vs); /* check date on picture */ - if (fdate(picfile) > octreedate) + if (fdate(picfile) >= oct1date) continue; /* build rpict command */ sprintf(rawfile, "%s_%s.raw", vval(PICTURE), vs); - if (fdate(rawfile) > octreedate) /* recover */ + if (fdate(rawfile) >= oct1date) /* recover */ sprintf(combuf, "rpict%s%s -ro %s %s", - rep, opts, rawfile, vval(OCTREE)); + rep, opts, rawfile, oct1name); else { if (overture) { /* run overture calculation */ sprintf(combuf, "rpict%s %s%s -x 64 -y 64 -ps 1 %s > %s", rep, vw, opts, - vval(OCTREE), rawfile); + oct1name, overfile); if (runcom(combuf)) { fprintf(stderr, - "%s: error in overture for view %s\n\t%s removed\n", - progname, vs, rawfile); - unlink(rawfile); + "%s: error in overture for view %s\n", + progname, vs); exit(1); } +#ifdef NIX + rmfile(overfile); +#endif } sprintf(combuf, "rpict%s %s %s%s %s > %s", rep, vw, res, opts, - vval(OCTREE), rawfile); + oct1name, rawfile); } if (runcom(combuf)) { /* run rpict */ fprintf(stderr, "%s: error rendering view %s\n", @@ -1108,6 +1357,26 @@ char *fn; return(0); return(unlink(fn)); } + + +#ifdef MSDOS +setenv(vname, value) /* set an environment variable */ +char *vname, *value; +{ + register char *evp; + + evp = bmalloc(strlen(vname)+strlen(value)+2); + if (evp == NULL) + syserr(progname); + sprintf(evp, "%s=%s", vname, value); + if (putenv(evp) != 0) { + fprintf(stderr, "%s: out of environment space\n", progname); + exit(1); + } + if (!silent) + printf("set %s\n", evp); +} +#endif badvalue(vc) /* report bad variable value and exit */