--- ray/src/util/rad.c 1993/03/11 17:23:33 2.3 +++ ray/src/util/rad.c 1993/09/25 13:21:35 2.27 @@ -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,11 +218,14 @@ register char *rn, *fn; } +#define NOCHAR 127 /* constant for character to delete */ + + load(rfname) /* load Radiance simulation file */ char *rfname; { FILE *fp; - char buf[256]; + char buf[512]; register char *cp; if (rfname == NULL) @@ -206,12 +236,13 @@ char *rfname; for (cp = buf; *cp; cp++) { switch (*cp) { case '\\': - case '\n': - *cp = ' '; + *cp++ = NOCHAR; continue; case '#': *cp = '\0'; break; + default: + continue; } break; } @@ -225,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++; @@ -242,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); @@ -260,15 +290,29 @@ register char *ass; exit(1); } /* assign new value */ - cp = vp->value; i = vp->nass; - while (i--) - while (*cp++) - ; - i = cp - vp->value; - vp->value = realloc(vp->value, i+n+1); + if (i = vp->nass) { + cp = vp->value; + while (i--) + while (*cp++) + ; + i = cp - vp->value; + vp->value = realloc(vp->value, i+n+1); + } else + 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++; } @@ -294,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--) @@ -358,20 +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++; + while (*fnames && !isspace(*fnames)) + *cp++ = *fnames++; *cp = '\0'; - if ((thisdate = fdate(thisfile)) < 0) + if (!(thisdate = fdate(thisfile))) syserr(thisfile); if (thisdate > lastdate) lastdate = thisdate; @@ -380,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)); } @@ -415,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; } @@ -488,36 +586,90 @@ printvals() /* print variable values */ register int i, j; for (i = 0; i < NVARS; i++) - for (j = 0; j < vv[i].nass; j++) - printf("%s= %s\n", vv[i].name, nvalue(vv+i, j)); + for (j = 0; j < vdef(i); j++) + printf("%s= %s\n", vnam(i), nvalue(vv+i, j)); fflush(stdout); } -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); - sprintf(combuf, "oconv%s %s %s > %s", ocopts, - vdef(MATERIAL) ? vval(MATERIAL) : "", - vval(SCENE), vval(OCTREE)); - if (!silent) { /* echo it */ - printf("\t%s\n", combuf); - fflush(stdout); + 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 (noaction) + if (oct1name == vval(OCTREE)) /* no mkillum? */ + oct1date = octreedate > matdate ? octreedate : matdate; + if (oct1date >= octreedate & oct1date >= matdate + & oct1date >= illumdate) /* all done */ return; - if (system(combuf)) { /* run it */ - fprintf(stderr, "%s: error generating octree\n\t%s removed\n", - progname, vval(OCTREE)); - unlink(vval(OCTREE)); + /* 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); } - octreedate = time(0); + /* 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 -f %s > %s", ocopts, + illumtmp, oct1name); + if (runcom(combuf)) { /* run it */ + fprintf(stderr, + "%s: error generating octree\n\t%s removed\n", + progname, oct1name); + unlink(oct1name); + exit(1); + } + oct1date = time(0); + rmfile(illumtmp); } @@ -543,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.); @@ -575,20 +751,17 @@ register char *op; d *= 3./(siz[0]+siz[1]+siz[2]); switch (vscale(DETAIL)) { case LOW: - op = addarg(op, "-ps 16"); - op = addarg(op, "-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"); - op = addarg(op, "-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"); - op = addarg(op, "-dp 64"); + op = addarg(op, "-ps 4 -dp 256"); sprintf(op, " -ar %d", (int)(16*d)); op += strlen(op); break; @@ -596,12 +769,9 @@ register char *op; op = addarg(op, "-pt .16"); if (vbool(PENUMBRAS)) op = addarg(op, "-ds .4"); - op = addarg(op, "-dt .2"); - op = addarg(op, "-dc .25"); - op = addarg(op, "-dr 0"); - op = addarg(op, "-sj 0"); - op = addarg(op, "-st .7"); - op = addarg(op, "-ab 0"); + else + op = addarg(op, "-ds 0"); + 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); @@ -609,24 +779,20 @@ register char *op; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .4"); - op = addarg(op, "-ad 32"); + op = addarg(op, "-aa .4 -ad 64"); break; case MEDIUM: - op = addarg(op, "-aa .3"); - op = addarg(op, "-ad 64"); + op = addarg(op, "-aa .3 -ad 128"); break; case HIGH: - op = addarg(op, "-aa .25"); - op = addarg(op, "-ad 128"); + op = addarg(op, "-aa .25 -ad 256"); 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"); - op = addarg(op, "-lw .02"); + op = addarg(op, "-lr 3 -lw .02"); if (vdef(RENDER)) op = addarg(op, vval(RENDER)); } @@ -647,36 +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"); - op = addarg(op, "-dj .35"); - } else + if (vbool(PENUMBRAS)) + op = addarg(op, "-ds .2 -dj .35"); + else op = addarg(op, "-ds .3"); - op = addarg(op, "-dt .1"); - op = addarg(op, "-dc .5"); - op = addarg(op, "-dr 1"); - op = addarg(op, "-sj .7"); - op = addarg(op, "-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); @@ -684,26 +847,19 @@ register char *op; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .25"); - op = addarg(op, "-ad 128"); - op = addarg(op, "-as 0"); + op = addarg(op, "-aa .25 -ad 196 -as 0"); break; case MEDIUM: - op = addarg(op, "-aa .2"); - op = addarg(op, "-ad 300"); - op = addarg(op, "-as 64"); + op = addarg(op, "-aa .2 -ad 400 -as 64"); break; case HIGH: - op = addarg(op, "-aa .15"); - op = addarg(op, "-ad 500"); - op = addarg(op, "-as 128"); + op = addarg(op, "-aa .15 -ad 768 -as 196"); break; } d = ambval(); sprintf(op, " -av %.2g %.2g %.2g", d, d, d); op += strlen(op); - op = addarg(op, "-lr 6"); - op = addarg(op, "-lw .002"); + op = addarg(op, "-lr 6 -lw .002"); if (vdef(RENDER)) op = addarg(op, vval(RENDER)); } @@ -724,34 +880,29 @@ 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; } op = addarg(op, "-pt .04"); - if (vbool(PENUMBRAS)) { - op = addarg(op, "-ds .1"); - op = addarg(op, "-dj .7"); - } else + if (vbool(PENUMBRAS)) + op = addarg(op, "-ds .1 -dj .7"); + else op = addarg(op, "-ds .2"); - op = addarg(op, "-dt .05"); - op = addarg(op, "-dc .75"); - op = addarg(op, "-dr 3"); - op = addarg(op, "-sj 1"); - op = addarg(op, "-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)) { @@ -761,26 +912,19 @@ register char *op; overture = 0; switch (vscale(VARIABILITY)) { case LOW: - op = addarg(op, "-aa .15"); - op = addarg(op, "-ad 200"); - op = addarg(op, "-as 0"); + op = addarg(op, "-aa .15 -ad 256 -as 0"); break; case MEDIUM: - op = addarg(op, "-aa .125"); - op = addarg(op, "-ad 512"); - op = addarg(op, "-as 128"); + op = addarg(op, "-aa .125 -ad 512 -as 256"); break; case HIGH: - op = addarg(op, "-aa .08"); - op = addarg(op, "-ad 850"); - op = addarg(op, "-as 256"); + op = addarg(op, "-aa .08 -ad 1024 -as 512"); break; } d = ambval(); sprintf(op, " -av %.2g %.2g %.2g", d, d, d); op += strlen(op); - op = addarg(op, "-lr 12"); - op = addarg(op, "-lw .0005"); + op = addarg(op, "-lr 12 -lw .0005"); if (vdef(RENDER)) op = addarg(op, vval(RENDER)); } @@ -790,33 +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); - ro[0] = ' '; - ro[1] = '^'; - strcpy(ro+2, 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 @@ -831,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)); } @@ -948,15 +1091,23 @@ register char *vs; break; } } else { - while (*vs && !isspace(*vs)) /* else skip id */ - vs++; + while (!isspace(*vs)) /* else skip id */ + if (!*vs++) + return(NULL); if (upax) { /* specify up vector */ strcpy(cp, vup[upax+3]); 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); } @@ -964,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 */ @@ -981,38 +1132,99 @@ 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 (!silent) { /* echo it */ - printf("\t%s\n", combuf); - fflush(stdout); - } - if (noaction) - return; - if (system(combuf)) { /* run it */ + strcat(combuf, oct1name); + if (runcom(combuf)) { /* run it */ fprintf(stderr, "%s: error running rview\n", progname); exit(1); } @@ -1057,61 +1269,43 @@ char *opts; else badvalue(REPORT); } - /* check date on ambient file */ - if (vdef(AMBFILE)) { - long afdate = fdate(vval(AMBFILE)); - if (afdate >= 0 & octreedate > afdate) { - if (!silent) -#ifdef MSDOS - printf("\tdel %s\n", vval(AMBFILE)); -#else - printf("\trm %s\n", vval(AMBFILE)); -#endif - if (!noaction) - unlink(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); - if (!silent) { - printf("\t%s\n", combuf); - fflush(stdout); - } - if (!noaction && system(combuf)) { + 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 (!silent) { /* echo rpict command */ - printf("\t%s\n", combuf); - fflush(stdout); - } - if (!noaction && system(combuf)) { /* run rpict */ + if (runcom(combuf)) { /* run rpict */ fprintf(stderr, "%s: error rendering view %s\n", progname, vs); exit(1); @@ -1123,11 +1317,7 @@ char *opts; else sprintf(combuf, "pfilt%s %s > %s", pfopts, rawfile, picfile); - if (!silent) { /* echo pfilt command */ - printf("\t%s\n", combuf); - fflush(stdout); - } - if (!noaction && system(combuf)) { /* run pfilt */ + if (runcom(combuf)) { /* run pfilt */ fprintf(stderr, "%s: error filtering view %s\n\t%s removed\n", progname, vs, picfile); @@ -1135,16 +1325,56 @@ char *opts; exit(1); } /* remove raw file */ - if (!silent) + rmfile(rawfile); + } +} + + +runcom(cs) /* run command */ +char *cs; +{ + if (!silent) /* echo it */ + printf("\t%s\n", cs); + if (noaction) + return(0); + fflush(stdout); /* flush output and pass to shell */ + return(system(cs)); +} + + +rmfile(fn) /* remove a file */ +char *fn; +{ + if (!silent) #ifdef MSDOS - printf("\tdel %s\n", rawfile); + printf("\tdel %s\n", fn); #else - printf("\trm %s\n", rawfile); + printf("\trm -f %s\n", fn); #endif - if (!noaction) - unlink(rawfile); + if (noaction) + 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 */