| 9 |
|
|
| 10 |
|
#include <ctype.h> |
| 11 |
|
#include <time.h> |
| 12 |
+ |
#include <signal.h> |
| 13 |
|
|
| 14 |
|
#include "platform.h" |
| 15 |
|
#include "rtprocess.h" |
| 17 |
|
#include "paths.h" |
| 18 |
|
#include "vars.h" |
| 19 |
|
|
| 20 |
< |
#ifdef _WIN32 |
| 20 |
> |
#if defined(_WIN32) || defined(_WIN64) |
| 21 |
|
#define DELCMD "del" |
| 22 |
|
#define RENAMECMD "rename" |
| 23 |
|
#else |
| 64 |
|
int NVARS = 31; |
| 65 |
|
|
| 66 |
|
VARIABLE vv[] = { /* variable-value pairs */ |
| 67 |
< |
{"AMBFILE", 3, 0, NULL, onevalue}, |
| 67 |
> |
{"AMBFILE", 3, 0, NULL, strvalue}, |
| 68 |
|
{"DETAIL", 3, 0, NULL, qualvalue}, |
| 69 |
|
{"EXPOSURE", 3, 0, NULL, fltvalue}, |
| 70 |
|
{"EYESEP", 3, 0, NULL, fltvalue}, |
| 75 |
|
{"mkpmap", 3, 0, NULL, catvalues}, |
| 76 |
|
{"objects", 3, 0, NULL, catvalues}, |
| 77 |
|
{"oconv", 3, 0, NULL, catvalues}, |
| 78 |
< |
{"OCTREE", 3, 0, NULL, onevalue}, |
| 79 |
< |
{"OPTFILE", 3, 0, NULL, onevalue}, |
| 80 |
< |
{"PCMAP", 2, 0, NULL, onevalue}, |
| 78 |
> |
{"OCTREE", 3, 0, NULL, strvalue}, |
| 79 |
> |
{"OPTFILE", 3, 0, NULL, strvalue}, |
| 80 |
> |
{"PCMAP", 2, 0, NULL, strvalue}, |
| 81 |
|
{"PENUMBRAS", 3, 0, NULL, boolvalue}, |
| 82 |
|
{"pfilt", 2, 0, NULL, catvalues}, |
| 83 |
< |
{"PGMAP", 2, 0, NULL, onevalue}, |
| 84 |
< |
{"PICTURE", 3, 0, NULL, onevalue}, |
| 83 |
> |
{"PGMAP", 2, 0, NULL, strvalue}, |
| 84 |
> |
{"PICTURE", 3, 0, NULL, strvalue}, |
| 85 |
|
{"QUALITY", 3, 0, NULL, qualvalue}, |
| 86 |
< |
{"RAWFILE", 3, 0, NULL, onevalue}, |
| 86 |
> |
{"RAWFILE", 3, 0, NULL, strvalue}, |
| 87 |
|
{"render", 3, 0, NULL, catvalues}, |
| 88 |
|
{"REPORT", 3, 0, NULL, onevalue}, |
| 89 |
|
{"RESOLUTION", 3, 0, NULL, onevalue}, |
| 93 |
|
{"UP", 2, 0, NULL, onevalue}, |
| 94 |
|
{"VARIABILITY", 3, 0, NULL, qualvalue}, |
| 95 |
|
{"view", 2, 0, NULL, NULL}, |
| 96 |
< |
{"ZFILE", 2, 0, NULL, onevalue}, |
| 96 |
> |
{"ZFILE", 2, 0, NULL, strvalue}, |
| 97 |
|
{"ZONE", 2, 0, NULL, onevalue}, |
| 98 |
|
}; |
| 99 |
|
|
| 131 |
|
|
| 132 |
|
#define DEF_RPICT_PATH "rpict" /* default rpict path */ |
| 133 |
|
|
| 134 |
+ |
#define R_CMDMAX (5*PATH_MAX+512) |
| 135 |
|
/* command paths */ |
| 136 |
|
char c_oconv[256] = "oconv"; |
| 137 |
|
char c_mkillum[256] = "mkillum"; |
| 243 |
|
/* load variable values */ |
| 244 |
|
loadvars(rifname); |
| 245 |
|
/* get any additional assignments */ |
| 246 |
< |
for (i++; i < argc; i++) |
| 247 |
< |
if (setvariable(argv[i], matchvar) < 0) { |
| 248 |
< |
fprintf(stderr, "%s: unknown variable: %s\n", |
| 246 |
> |
for (i++; i < argc; i++) { |
| 247 |
> |
int rv = setvariable(argv[i], matchvar); |
| 248 |
> |
if (rv < 0) { |
| 249 |
> |
fprintf(stderr, "%s: unknown setting: %s\n", |
| 250 |
|
progname, argv[i]); |
| 251 |
|
quit(1); |
| 252 |
|
} |
| 253 |
+ |
if (!rv) |
| 254 |
+ |
fprintf(stderr, |
| 255 |
+ |
"%s: bad variable assignment: %s (ignored)\n", |
| 256 |
+ |
progname, argv[i]); |
| 257 |
+ |
} |
| 258 |
|
/* check assignments */ |
| 259 |
|
checkvalues(); |
| 260 |
|
/* check files and dates */ |
| 529 |
|
oconv(void) /* run oconv and mkillum if necessary */ |
| 530 |
|
{ |
| 531 |
|
static char illumtmp[] = "ilXXXXXX"; |
| 532 |
< |
char combuf[PATH_MAX], ocopts[64], mkopts[1024]; |
| 532 |
> |
char combuf[R_CMDMAX], ocopts[64], mkopts[1024]; |
| 533 |
|
|
| 534 |
|
oconvopts(ocopts); /* get options */ |
| 535 |
|
if (octreedate < scenedate) { /* check date on original octree */ |
| 563 |
|
return; |
| 564 |
|
/* make octree0 */ |
| 565 |
|
if ((oct0date < scenedate) | (oct0date < illumdate)) { |
| 566 |
< |
if (touchonly && oct0date) |
| 567 |
< |
touch(oct0name); |
| 568 |
< |
else { /* build command */ |
| 566 |
> |
if (touchonly && (oct0date || oct1date)) { |
| 567 |
> |
if (oct0date) |
| 568 |
> |
touch(oct0name); |
| 569 |
> |
} else { /* build command */ |
| 570 |
|
if (octreedate) |
| 571 |
|
sprintf(combuf, "%s%s -i %s %s > %s", c_oconv, |
| 572 |
|
ocopts, vval(OCTREE), |
| 591 |
|
oct0date = octreedate; |
| 592 |
|
if (oct0date < illumdate) /* ditto */ |
| 593 |
|
oct0date = illumdate; |
| 594 |
< |
} |
| 594 |
> |
} |
| 595 |
|
if (touchonly && oct1date) |
| 596 |
|
touch(oct1name); |
| 597 |
|
else { |
| 653 |
|
for (cp = combuf; *cp; cp++) |
| 654 |
|
; |
| 655 |
|
mkpmapopts(cp); |
| 656 |
+ |
/* force file overwrite */ |
| 657 |
+ |
cp = addarg(cp, "-fo+"); |
| 658 |
|
if (vdef(REPORT)) { |
| 659 |
|
char errfile[256]; |
| 660 |
|
int n; |
| 668 |
|
badvalue(REPORT); |
| 669 |
|
} |
| 670 |
|
if (pgmapname != NULL && pgmapdate < oct1date) { |
| 660 |
– |
if (pgmapdate) |
| 661 |
– |
rmfile(pgmapname); |
| 671 |
|
cp = addarg(cp, "-apg"); |
| 672 |
|
addarg(cp, vval(PGMAP)); |
| 673 |
|
cp = sskip(sskip(cp)); /* remove any bandwidth */ |
| 674 |
|
*cp = '\0'; |
| 675 |
|
} |
| 676 |
|
if (pcmapname != NULL && pcmapdate < oct1date) { |
| 668 |
– |
if (pcmapdate) |
| 669 |
– |
rmfile(pcmapname); |
| 677 |
|
cp = addarg(cp, "-apc"); |
| 678 |
|
addarg(cp, vval(PCMAP)); |
| 679 |
|
cp = sskip(sskip(cp)); /* remove any bandwidth */ |
| 760 |
|
{ |
| 761 |
|
/* BEWARE: This may be called via setdefaults(), so no assumptions */ |
| 762 |
|
|
| 763 |
< |
*mo = '\0'; |
| 763 |
> |
if (nprocs > 1) |
| 764 |
> |
sprintf(mo, " -n %d", nprocs); |
| 765 |
> |
else |
| 766 |
> |
*mo = '\0'; |
| 767 |
|
if (!vdef(MKPMAP)) |
| 768 |
|
return; |
| 769 |
|
if (vval(MKPMAP)[0] != '-') { |
| 797 |
|
{ |
| 798 |
|
if (vdef(EXPOSURE)) { |
| 799 |
|
if (vval(EXPOSURE)[0] == '+' || vval(EXPOSURE)[0] == '-') |
| 800 |
< |
return(.5/pow(2.,vflt(EXPOSURE))); |
| 801 |
< |
return(.5/vflt(EXPOSURE)); |
| 800 |
> |
return(.18/pow(2.,vflt(EXPOSURE))); |
| 801 |
> |
return(.18/vflt(EXPOSURE)); |
| 802 |
|
} |
| 803 |
|
if (vlet(ZONE) == 'E') |
| 804 |
|
return(10.); |
| 817 |
|
{ |
| 818 |
|
char pmapf[256], *bw; |
| 819 |
|
|
| 820 |
+ |
if (vdef(PGMAP)) { |
| 821 |
+ |
*op = '\0'; |
| 822 |
+ |
bw = sskip2(vval(PGMAP), 2); |
| 823 |
+ |
atos(pmapf, sizeof(pmapf), vval(PGMAP)); |
| 824 |
+ |
op = addarg(addarg(op, "-ap"), pmapf); |
| 825 |
+ |
if (atoi(bw) > 0) op = addarg(op, bw); |
| 826 |
+ |
} |
| 827 |
|
switch(vscale(QUALITY)) { |
| 828 |
|
case LOW: |
| 829 |
|
lowqopts(op, po); |
| 835 |
|
hiqopts(op, po); |
| 836 |
|
break; |
| 837 |
|
} |
| 821 |
– |
if (vdef(PGMAP)) { |
| 822 |
– |
bw = sskip2(vval(PGMAP), 2); |
| 823 |
– |
atos(pmapf, sizeof(pmapf), vval(PGMAP)); |
| 824 |
– |
op = addarg(addarg(op, "-ap"), pmapf); |
| 825 |
– |
if (atoi(bw) > 0) op = addarg(op, bw); |
| 826 |
– |
} |
| 838 |
|
if (vdef(PCMAP)) { |
| 839 |
|
bw = sskip2(vval(PCMAP), 2); |
| 840 |
|
atos(pmapf, sizeof(pmapf), vval(PCMAP)); |
| 841 |
|
op = addarg(addarg(op, "-ap"), pmapf); |
| 842 |
|
if (atoi(bw) > 0) op = addarg(op, bw); |
| 843 |
|
} |
| 844 |
< |
if (vdef(RENDER)) |
| 844 |
> |
if (vdef(RENDER)) { |
| 845 |
|
op = addarg(op, vval(RENDER)); |
| 846 |
+ |
bw = strstr(vval(RENDER), "-aa "); |
| 847 |
+ |
if (bw != NULL && atof(bw+4) <= FTINY) |
| 848 |
+ |
overture = 0; |
| 849 |
+ |
} |
| 850 |
|
if (rvdevice != NULL) { |
| 851 |
< |
if (vdef(RVU)) |
| 851 |
> |
if (vdef(RVU)) { |
| 852 |
|
if (vval(RVU)[0] != '-') { |
| 853 |
|
atos(c_rvu, sizeof(c_rvu), vval(RVU)); |
| 854 |
|
po = addarg(po, sskip2(vval(RVU), 1)); |
| 855 |
|
} else |
| 856 |
|
po = addarg(po, vval(RVU)); |
| 857 |
+ |
} |
| 858 |
|
} else { |
| 859 |
< |
if (vdef(RPICT)) |
| 859 |
> |
if (vdef(RPICT)) { |
| 860 |
|
if (vval(RPICT)[0] != '-') { |
| 861 |
|
atos(c_rpict, sizeof(c_rpict), vval(RPICT)); |
| 862 |
|
po = addarg(po, sskip2(vval(RPICT), 1)); |
| 863 |
|
} else |
| 864 |
|
po = addarg(po, vval(RPICT)); |
| 865 |
+ |
} |
| 866 |
|
} |
| 867 |
|
} |
| 868 |
|
|
| 931 |
|
d = ambval(); |
| 932 |
|
sprintf(op, " -av %.2g %.2g %.2g", d, d, d); |
| 933 |
|
op += strlen(op); |
| 934 |
< |
op = addarg(op, "-lr 6 -lw .003"); |
| 934 |
> |
op = addarg(op, "-lr 6 -lw .001"); |
| 935 |
|
} |
| 936 |
|
|
| 937 |
|
|
| 1085 |
|
d = ambval(); |
| 1086 |
|
sprintf(op, " -av %.2g %.2g %.2g", d, d, d); |
| 1087 |
|
op += strlen(op); |
| 1088 |
< |
op = addarg(op, "-lr 12 -lw 1e-5"); |
| 1088 |
> |
op = addarg(op, "-lr 12 -lw 5e-6"); |
| 1089 |
|
} |
| 1090 |
|
|
| 1091 |
|
|
| 1092 |
< |
#ifdef _WIN32 |
| 1092 |
> |
#if defined(_WIN32) || defined(_WIN64) |
| 1093 |
|
static void |
| 1094 |
|
setenv( /* set an environment variable */ |
| 1095 |
|
char *vname, |
| 1136 |
|
syserr(vval(OPTFILE)); |
| 1137 |
|
sprintf(ro, " @%s", vval(OPTFILE)); |
| 1138 |
|
} |
| 1139 |
< |
#ifdef _WIN32 |
| 1139 |
> |
#if defined(_WIN32) || defined(_WIN64) |
| 1140 |
|
else if (n > 50) { |
| 1141 |
|
setenv("ROPT", ro+1); |
| 1142 |
|
strcpy(ro, " $ROPT"); |
| 1163 |
|
po = addarg(po, "-m .25"); |
| 1164 |
|
break; |
| 1165 |
|
} |
| 1166 |
< |
if (vdef(PFILT)) |
| 1166 |
> |
if (vdef(PFILT)) { |
| 1167 |
|
if (vval(PFILT)[0] != '-') { |
| 1168 |
|
atos(c_pfilt, sizeof(c_pfilt), vval(PFILT)); |
| 1169 |
|
po = addarg(po, sskip2(vval(PFILT), 1)); |
| 1170 |
|
} else |
| 1171 |
|
po = addarg(po, vval(PFILT)); |
| 1172 |
+ |
} |
| 1173 |
|
} |
| 1174 |
|
|
| 1175 |
|
|
| 1314 |
|
if (cp == viewopts) /* append any additional options */ |
| 1315 |
|
vs++; /* skip prefixed space if unneeded */ |
| 1316 |
|
strcpy(cp, vs); |
| 1317 |
< |
#ifdef _WIN32 |
| 1317 |
> |
#if defined(_WIN32) || defined(_WIN64) |
| 1318 |
|
if (strlen(viewopts) > 40) { |
| 1319 |
|
setenv("VIEW", viewopts); |
| 1320 |
|
return("$VIEW"); |
| 1360 |
|
} |
| 1361 |
|
numview: |
| 1362 |
|
mv = nvalue(VIEWS, n); /* use view n */ |
| 1363 |
< |
if ((vn != NULL) & (mv != NULL)) |
| 1363 |
> |
if ((vn != NULL) & (mv != NULL)) { |
| 1364 |
|
if (*mv != '-') { |
| 1365 |
|
char *mv2 = mv; |
| 1366 |
|
while (*mv2 && !isspace(*mv2)) |
| 1368 |
|
*vn = '\0'; |
| 1369 |
|
} else |
| 1370 |
|
sprintf(vn, "%d", n+1); |
| 1371 |
< |
|
| 1371 |
> |
} |
| 1372 |
|
return(specview(mv)); |
| 1373 |
|
} |
| 1374 |
|
|
| 1382 |
|
VIEW vwr; |
| 1383 |
|
char buf[128]; |
| 1384 |
|
char *cp; |
| 1385 |
< |
#ifdef _WIN32 |
| 1385 |
> |
#if defined(_WIN32) || defined(_WIN64) |
| 1386 |
|
/* XXX Should we allow something like this for all platforms? */ |
| 1387 |
|
/* XXX Or is it still required at all? */ |
| 1388 |
|
again: |
| 1389 |
|
#endif |
| 1390 |
|
if (vopts == NULL) |
| 1391 |
|
return(-1); |
| 1392 |
< |
#ifdef _WIN32 |
| 1392 |
> |
#if defined(_WIN32) || defined(_WIN64) |
| 1393 |
|
if (vopts[0] == '$') { |
| 1394 |
|
vopts = getenv(vopts+1); |
| 1395 |
|
goto again; |
| 1416 |
|
) |
| 1417 |
|
{ |
| 1418 |
|
char *vw; |
| 1419 |
< |
char combuf[PATH_MAX]; |
| 1419 |
> |
char combuf[R_CMDMAX]; |
| 1420 |
|
/* build command */ |
| 1421 |
|
if (touchonly || (vw = getview(0, NULL)) == NULL) |
| 1422 |
|
return; |
| 1536 |
|
fprintf(stderr, "%s: cannot create\n", pfile); |
| 1537 |
|
quit(1); |
| 1538 |
|
} |
| 1539 |
+ |
pfile[-5] = '\0'; |
| 1540 |
|
pfile = NULL; |
| 1541 |
|
} |
| 1542 |
|
} |
| 1614 |
|
} else { |
| 1615 |
|
if (overture) { /* run overture calculation */ |
| 1616 |
|
sprintf(combuf, |
| 1617 |
< |
"%s%s %s%s -x 64 -y 64 -ps 1 %s > %s", |
| 1618 |
< |
c_rpict, rep, vw, opts, |
| 1617 |
> |
"%s%s %s%s%s -x 64 -y 64 -ps 1 %s > %s", |
| 1618 |
> |
c_rpict, rep, vw, opts, po, |
| 1619 |
|
oct1name, overfile); |
| 1620 |
|
if (!do_rpiece || !next_process(0)) { |
| 1621 |
|
if (runcom(combuf)) { |