92 |
|
|
93 |
|
#define renderopts (*setqopts[vscale(QUALITY)]) |
94 |
|
|
95 |
< |
extern long fdate(); |
95 |
> |
extern long fdate(), time(); |
96 |
|
|
97 |
|
long scenedate; /* date of latest scene or object file */ |
98 |
|
long octreedate; /* date of octree */ |
341 |
|
return; |
342 |
|
fprintf(stderr, "%s: warning - multiple assignment of variable '%s'\n", |
343 |
|
progname, vp->name); |
344 |
< |
while (vp->nass-- > 1) |
344 |
> |
do |
345 |
|
vp->value += strlen(vp->value)+1; |
346 |
+ |
while (--vp->nass > 1); |
347 |
|
} |
348 |
|
|
349 |
|
|
388 |
|
|
389 |
|
checkfiles() /* check for existence and modified times */ |
390 |
|
{ |
391 |
+ |
char *cp; |
392 |
|
long objdate; |
393 |
|
|
394 |
< |
octreedate = vdef(OCTREE) ? fdate(vval(OCTREE)) : -1; |
394 |
> |
if (!vdef(OCTREE)) { |
395 |
> |
if ((cp = bmalloc(strlen(radname)+5)) == NULL) { |
396 |
> |
perror(progname); |
397 |
> |
exit(1); |
398 |
> |
} |
399 |
> |
sprintf(cp, "%s.oct", radname); |
400 |
> |
vval(OCTREE) = cp; |
401 |
> |
vdef(OCTREE)++; |
402 |
> |
} |
403 |
> |
octreedate = fdate(vval(OCTREE)); |
404 |
|
scenedate = -1; |
405 |
|
if (vdef(SCENE)) { |
406 |
|
scenedate = checklast(vval(SCENE)); |
411 |
|
} |
412 |
|
} |
413 |
|
if (octreedate < 0 & scenedate < 0) { |
414 |
< |
fprintf(stderr, "%s: need scene or octree\n", progname); |
414 |
> |
fprintf(stderr, "%s: need '%s' or '%s'\n", progname, |
415 |
> |
vnam(OCTREE), vnam(SCENE)); |
416 |
|
exit(1); |
417 |
|
} |
418 |
|
} |
419 |
|
|
420 |
|
|
421 |
< |
setdefaults() /* set default values for unassigned var's */ |
421 |
> |
getoctcube(org, sizp) /* get octree bounding cube */ |
422 |
> |
double org[3], *sizp; |
423 |
|
{ |
424 |
+ |
extern FILE *popen(); |
425 |
+ |
static double oorg[3], osiz = 0.; |
426 |
+ |
char buf[MAXPATH+16]; |
427 |
|
FILE *fp; |
412 |
– |
double xmin, ymin, zmin, size; |
413 |
– |
char buf[512]; |
414 |
– |
char *cp; |
428 |
|
|
429 |
< |
if (!vdef(OCTREE)) { |
430 |
< |
sprintf(buf, "%s.oct", radname); |
431 |
< |
vval(OCTREE) = savqstr(buf); |
432 |
< |
vdef(OCTREE)++; |
429 |
> |
if (osiz <= FTINY) { |
430 |
> |
oconv(); /* does nothing if done already */ |
431 |
> |
sprintf(buf, "getinfo -d < %s", vval(OCTREE)); |
432 |
> |
if ((fp = popen(buf, "r")) == NULL) { |
433 |
> |
perror("getinfo"); |
434 |
> |
exit(1); |
435 |
> |
} |
436 |
> |
if (fscanf(fp, "%lf %lf %lf %lf", &oorg[0], &oorg[1], |
437 |
> |
&oorg[2], &osiz) != 4) { |
438 |
> |
fprintf(stderr, |
439 |
> |
"%s: error reading bounding cube from getinfo\n", |
440 |
> |
progname); |
441 |
> |
exit(1); |
442 |
> |
} |
443 |
> |
pclose(fp); |
444 |
|
} |
445 |
+ |
org[0] = oorg[0]; org[1] = oorg[1]; org[2] = oorg[2]; *sizp = osiz; |
446 |
+ |
} |
447 |
+ |
|
448 |
+ |
|
449 |
+ |
setdefaults() /* set default values for unassigned var's */ |
450 |
+ |
{ |
451 |
+ |
double org[3], size; |
452 |
+ |
char buf[128]; |
453 |
+ |
|
454 |
|
if (!vdef(ZONE)) { |
455 |
< |
if (scenedate > octreedate) { |
456 |
< |
sprintf(buf, "getbbox -w -h %s", vval(SCENE)); |
457 |
< |
if (!silent) { |
425 |
< |
printf("\t%s\n", buf); |
426 |
< |
fflush(stdout); |
427 |
< |
} |
428 |
< |
if ((fp = popen(buf, "r")) == NULL) { |
429 |
< |
perror("getbbox"); |
430 |
< |
exit(1); |
431 |
< |
} |
432 |
< |
buf[0] = 'E'; buf[1] = ' '; |
433 |
< |
fgetline(buf+2, sizeof(buf)-2, fp); |
434 |
< |
pclose(fp); |
435 |
< |
} else { |
436 |
< |
sprintf(buf, "getinfo -d < %s", vval(OCTREE)); |
437 |
< |
if ((fp = popen(buf, "r")) == NULL) { |
438 |
< |
perror("getinfo"); |
439 |
< |
exit(1); |
440 |
< |
} |
441 |
< |
fscanf(fp, "%lf %lf %lf %lf", |
442 |
< |
&xmin, &ymin, &zmin, &size); |
443 |
< |
sprintf(buf, "E %g %g %g %g %g %g", xmin, xmin+size, |
444 |
< |
ymin, ymin+size, zmin, zmin+size); |
445 |
< |
pclose(fp); |
446 |
< |
} |
455 |
> |
getoctcube(org, &size); |
456 |
> |
sprintf(buf, "E %g %g %g %g %g %g", org[0], org[0]+size, |
457 |
> |
org[1], org[1]+size, org[2], org[2]+size); |
458 |
|
vval(ZONE) = savqstr(buf); |
459 |
|
vdef(ZONE)++; |
460 |
|
} |
478 |
|
vval(PICTURE) = radname; |
479 |
|
vdef(PICTURE)++; |
480 |
|
} |
470 |
– |
if (!vdef(AMBFILE)) { |
471 |
– |
sprintf(buf, "%s.amb", radname); |
472 |
– |
vval(AMBFILE) = savqstr(buf); |
473 |
– |
vdef(AMBFILE)++; |
474 |
– |
} |
481 |
|
if (!vdef(VIEW)) { |
482 |
|
vval(VIEW) = "X"; |
483 |
|
vdef(VIEW)++; |
512 |
|
{ |
513 |
|
char combuf[512], ocopts[64]; |
514 |
|
|
515 |
< |
if (octreedate > scenedate) /* check dates */ |
515 |
> |
if (octreedate >= scenedate) /* check dates */ |
516 |
|
return; |
517 |
|
/* build command */ |
518 |
|
oconvopts(ocopts); |
519 |
< |
sprintf(combuf, "oconv%s %s > %s", ocopts, vval(SCENE), vval(OCTREE)); |
519 |
> |
sprintf(combuf, "oconv%s %s %s > %s", ocopts, |
520 |
> |
vdef(MATERIAL) ? vval(MATERIAL) : "", |
521 |
> |
vval(SCENE), vval(OCTREE)); |
522 |
|
if (!silent) { /* echo it */ |
523 |
|
printf("\t%s\n", combuf); |
524 |
|
fflush(stdout); |
531 |
|
unlink(vval(OCTREE)); |
532 |
|
exit(1); |
533 |
|
} |
534 |
+ |
octreedate = time(0); |
535 |
|
} |
536 |
|
|
537 |
|
|
547 |
|
|
548 |
|
|
549 |
|
oconvopts(oo) /* get oconv options */ |
550 |
< |
char *oo; |
550 |
> |
register char *oo; |
551 |
|
{ |
552 |
+ |
/* BEWARE: This may be called via setdefaults(), so no assumptions */ |
553 |
+ |
|
554 |
|
*oo = '\0'; |
555 |
|
if (vdef(OCONV)) |
556 |
|
addarg(oo, vval(OCONV)); |
557 |
|
} |
558 |
|
|
559 |
|
|
560 |
< |
lowqopts(ro) /* low quality rendering options */ |
561 |
< |
char *ro; |
560 |
> |
double |
561 |
> |
ambval() /* compute ambient value */ |
562 |
|
{ |
563 |
< |
register char *op = ro; |
563 |
> |
if (vdef(EXPOSURE)) |
564 |
> |
if (vval(EXPOSURE)[0] == '+' || vval(EXPOSURE)[0] == '-') |
565 |
> |
return(.5/pow(2.,atof(vval(EXPOSURE)))); |
566 |
> |
else |
567 |
> |
return(.5/atof(vval(EXPOSURE))); |
568 |
> |
if (vlet(ZONE) == 'E') |
569 |
> |
return(10.); |
570 |
> |
else |
571 |
> |
return(.01); |
572 |
> |
} |
573 |
|
|
574 |
+ |
|
575 |
+ |
lowqopts(op) /* low quality rendering options */ |
576 |
+ |
register char *op; |
577 |
+ |
{ |
578 |
+ |
double d, org[3], siz[3]; |
579 |
+ |
|
580 |
|
*op = '\0'; |
581 |
+ |
if (sscanf(vval(ZONE), "%*s %lf %lf %lf %lf %lf %lf", &org[0], |
582 |
+ |
&siz[0], &org[1], &siz[1], &org[2], &siz[2]) != 6) { |
583 |
+ |
fprintf(stderr, "%s: bad value for variable '%s'\n", |
584 |
+ |
progname, vnam(ZONE)); |
585 |
+ |
exit(1); |
586 |
+ |
} |
587 |
+ |
siz[0] -= org[0]; siz[1] -= org[1]; siz[2] -= org[2]; |
588 |
+ |
getoctcube(org, &d); |
589 |
+ |
d *= 3./(siz[0]+siz[1]+siz[2]); |
590 |
+ |
switch (vscale(DETAIL)) { |
591 |
+ |
case LOW: |
592 |
+ |
op = addarg(op, "-ps 16"); |
593 |
+ |
op = addarg(op, "-dp 16"); |
594 |
+ |
sprintf(op, " -ar %d", (int)(4*d)); |
595 |
+ |
op += strlen(op); |
596 |
+ |
break; |
597 |
+ |
case MEDIUM: |
598 |
+ |
op = addarg(op, "-ps 8"); |
599 |
+ |
op = addarg(op, "-dp 32"); |
600 |
+ |
sprintf(op, " -ar %d", (int)(8*d)); |
601 |
+ |
op += strlen(op); |
602 |
+ |
break; |
603 |
+ |
case HIGH: |
604 |
+ |
op = addarg(op, "-ps 4"); |
605 |
+ |
op = addarg(op, "-dp 64"); |
606 |
+ |
sprintf(op, " -ar %d", (int)(16*d)); |
607 |
+ |
op += strlen(op); |
608 |
+ |
break; |
609 |
+ |
} |
610 |
+ |
op = addarg(op, "-pt .16"); |
611 |
+ |
if (vbool(PENUMBRAS)) |
612 |
+ |
op = addarg(op, "-ds .4"); |
613 |
+ |
op = addarg(op, "-dt .2"); |
614 |
+ |
op = addarg(op, "-dc .25"); |
615 |
+ |
op = addarg(op, "-dr 0"); |
616 |
+ |
op = addarg(op, "-sj 0"); |
617 |
+ |
op = addarg(op, "-st .7"); |
618 |
+ |
op = addarg(op, "-ab 0"); |
619 |
+ |
if (vdef(AMBFILE)) { |
620 |
+ |
sprintf(op, " -af %s", vval(AMBFILE)); |
621 |
+ |
op += strlen(op); |
622 |
+ |
} else |
623 |
+ |
overture = 0; |
624 |
+ |
switch (vscale(VARIABILITY)) { |
625 |
+ |
case LOW: |
626 |
+ |
op = addarg(op, "-aa .4"); |
627 |
+ |
op = addarg(op, "-ad 32"); |
628 |
+ |
break; |
629 |
+ |
case MEDIUM: |
630 |
+ |
op = addarg(op, "-aa .3"); |
631 |
+ |
op = addarg(op, "-ad 64"); |
632 |
+ |
break; |
633 |
+ |
case HIGH: |
634 |
+ |
op = addarg(op, "-aa .25"); |
635 |
+ |
op = addarg(op, "-ad 128"); |
636 |
+ |
break; |
637 |
+ |
} |
638 |
+ |
op = addarg(op, "-as 0"); |
639 |
+ |
d = ambval(); |
640 |
+ |
sprintf(op, " -av %.2g %.2g %.2g", d, d, d); |
641 |
+ |
op += strlen(op); |
642 |
+ |
op = addarg(op, "-lr 3"); |
643 |
+ |
op = addarg(op, "-lw .02"); |
644 |
|
if (vdef(RENDER)) |
645 |
|
op = addarg(op, vval(RENDER)); |
646 |
|
} |
647 |
|
|
648 |
|
|
649 |
< |
medqopts(ro) /* medium quality rendering options */ |
650 |
< |
char *ro; |
649 |
> |
medqopts(op) /* medium quality rendering options */ |
650 |
> |
register char *op; |
651 |
|
{ |
652 |
< |
register char *op = ro; |
652 |
> |
double d, org[3], siz[3]; |
653 |
|
|
654 |
|
*op = '\0'; |
655 |
+ |
if (sscanf(vval(ZONE), "%*s %lf %lf %lf %lf %lf %lf", &org[0], |
656 |
+ |
&siz[0], &org[1], &siz[1], &org[2], &siz[2]) != 6) { |
657 |
+ |
fprintf(stderr, "%s: bad value for variable '%s'\n", |
658 |
+ |
progname, vnam(ZONE)); |
659 |
+ |
exit(1); |
660 |
+ |
} |
661 |
+ |
siz[0] -= org[0]; siz[1] -= org[1]; siz[2] -= org[2]; |
662 |
+ |
getoctcube(org, &d); |
663 |
+ |
d *= 3./(siz[0]+siz[1]+siz[2]); |
664 |
+ |
switch (vscale(DETAIL)) { |
665 |
+ |
case LOW: |
666 |
+ |
op = addarg(op, vbool(PENUMBRAS) ? "-ps 4" : "-ps 8"); |
667 |
+ |
op = addarg(op, "-dp 64"); |
668 |
+ |
sprintf(op, " -ar %d", (int)(8*d)); |
669 |
+ |
op += strlen(op); |
670 |
+ |
break; |
671 |
+ |
case MEDIUM: |
672 |
+ |
op = addarg(op, vbool(PENUMBRAS) ? "-ps 3" : "-ps 6"); |
673 |
+ |
op = addarg(op, "-dp 128"); |
674 |
+ |
sprintf(op, " -ar %d", (int)(16*d)); |
675 |
+ |
op += strlen(op); |
676 |
+ |
break; |
677 |
+ |
case HIGH: |
678 |
+ |
op = addarg(op, vbool(PENUMBRAS) ? "-ps 2" : "-ps 4"); |
679 |
+ |
op = addarg(op, "-dp 256"); |
680 |
+ |
sprintf(op, " -ar %d", (int)(32*d)); |
681 |
+ |
op += strlen(op); |
682 |
+ |
break; |
683 |
+ |
} |
684 |
+ |
op = addarg(op, "-pt .08"); |
685 |
+ |
if (vbool(PENUMBRAS)) { |
686 |
+ |
op = addarg(op, "-ds .2"); |
687 |
+ |
op = addarg(op, "-dj .35"); |
688 |
+ |
} else |
689 |
+ |
op = addarg(op, "-ds .3"); |
690 |
+ |
op = addarg(op, "-dt .1"); |
691 |
+ |
op = addarg(op, "-dc .5"); |
692 |
+ |
op = addarg(op, "-dr 1"); |
693 |
+ |
op = addarg(op, "-sj .7"); |
694 |
+ |
op = addarg(op, "-st .15"); |
695 |
+ |
sprintf(op, " -ab %d", overture=vint(INDIRECT)); |
696 |
+ |
op += strlen(op); |
697 |
+ |
if (vdef(AMBFILE)) { |
698 |
+ |
sprintf(op, " -af %s", vval(AMBFILE)); |
699 |
+ |
op += strlen(op); |
700 |
+ |
} else |
701 |
+ |
overture = 0; |
702 |
+ |
switch (vscale(VARIABILITY)) { |
703 |
+ |
case LOW: |
704 |
+ |
op = addarg(op, "-aa .25"); |
705 |
+ |
op = addarg(op, "-ad 128"); |
706 |
+ |
op = addarg(op, "-as 0"); |
707 |
+ |
break; |
708 |
+ |
case MEDIUM: |
709 |
+ |
op = addarg(op, "-aa .2"); |
710 |
+ |
op = addarg(op, "-ad 300"); |
711 |
+ |
op = addarg(op, "-as 64"); |
712 |
+ |
break; |
713 |
+ |
case HIGH: |
714 |
+ |
op = addarg(op, "-aa .15"); |
715 |
+ |
op = addarg(op, "-ad 500"); |
716 |
+ |
op = addarg(op, "-as 128"); |
717 |
+ |
break; |
718 |
+ |
} |
719 |
+ |
d = ambval(); |
720 |
+ |
sprintf(op, " -av %.2g %.2g %.2g", d, d, d); |
721 |
+ |
op += strlen(op); |
722 |
+ |
op = addarg(op, "-lr 6"); |
723 |
+ |
op = addarg(op, "-lw .002"); |
724 |
|
if (vdef(RENDER)) |
725 |
|
op = addarg(op, vval(RENDER)); |
726 |
|
} |
727 |
|
|
728 |
|
|
729 |
< |
hiqopts(ro) /* high quality rendering options */ |
730 |
< |
char *ro; |
729 |
> |
hiqopts(op) /* high quality rendering options */ |
730 |
> |
register char *op; |
731 |
|
{ |
732 |
< |
register char *op = ro; |
732 |
> |
double d, org[3], siz[3]; |
733 |
|
|
734 |
|
*op = '\0'; |
735 |
+ |
if (sscanf(vval(ZONE), "%*s %lf %lf %lf %lf %lf %lf", &org[0], |
736 |
+ |
&siz[0], &org[1], &siz[1], &org[2], &siz[2]) != 6) { |
737 |
+ |
fprintf(stderr, "%s: bad value for variable '%s'\n", |
738 |
+ |
progname, vnam(ZONE)); |
739 |
+ |
exit(1); |
740 |
+ |
} |
741 |
+ |
siz[0] -= org[0]; siz[1] -= org[1]; siz[2] -= org[2]; |
742 |
+ |
getoctcube(org, &d); |
743 |
+ |
d *= 3./(siz[0]+siz[1]+siz[2]); |
744 |
+ |
switch (vscale(DETAIL)) { |
745 |
+ |
case LOW: |
746 |
+ |
op = addarg(op, vbool(PENUMBRAS) ? "-ps 1" : "-ps 8"); |
747 |
+ |
op = addarg(op, "-dp 256"); |
748 |
+ |
sprintf(op, " -ar %d", (int)(16*d)); |
749 |
+ |
op += strlen(op); |
750 |
+ |
break; |
751 |
+ |
case MEDIUM: |
752 |
+ |
op = addarg(op, vbool(PENUMBRAS) ? "-ps 1" : "-ps 5"); |
753 |
+ |
op = addarg(op, "-dp 512"); |
754 |
+ |
sprintf(op, " -ar %d", (int)(32*d)); |
755 |
+ |
op += strlen(op); |
756 |
+ |
break; |
757 |
+ |
case HIGH: |
758 |
+ |
op = addarg(op, vbool(PENUMBRAS) ? "-ps 1" : "-ps 3"); |
759 |
+ |
op = addarg(op, "-dp 1024"); |
760 |
+ |
sprintf(op, " -ar %d", (int)(64*d)); |
761 |
+ |
op += strlen(op); |
762 |
+ |
break; |
763 |
+ |
} |
764 |
+ |
op = addarg(op, "-pt .04"); |
765 |
+ |
if (vbool(PENUMBRAS)) { |
766 |
+ |
op = addarg(op, "-ds .1"); |
767 |
+ |
op = addarg(op, "-dj .7"); |
768 |
+ |
} else |
769 |
+ |
op = addarg(op, "-ds .2"); |
770 |
+ |
op = addarg(op, "-dt .05"); |
771 |
+ |
op = addarg(op, "-dc .75"); |
772 |
+ |
op = addarg(op, "-dr 3"); |
773 |
+ |
op = addarg(op, "-sj 1"); |
774 |
+ |
op = addarg(op, "-st .03"); |
775 |
+ |
sprintf(op, " -ab %d", overture=vint(INDIRECT)+1); |
776 |
+ |
op += strlen(op); |
777 |
+ |
if (vdef(AMBFILE)) { |
778 |
+ |
sprintf(op, " -af %s", vval(AMBFILE)); |
779 |
+ |
op += strlen(op); |
780 |
+ |
} else |
781 |
+ |
overture = 0; |
782 |
+ |
switch (vscale(VARIABILITY)) { |
783 |
+ |
case LOW: |
784 |
+ |
op = addarg(op, "-aa .15"); |
785 |
+ |
op = addarg(op, "-ad 200"); |
786 |
+ |
op = addarg(op, "-as 0"); |
787 |
+ |
break; |
788 |
+ |
case MEDIUM: |
789 |
+ |
op = addarg(op, "-aa .125"); |
790 |
+ |
op = addarg(op, "-ad 512"); |
791 |
+ |
op = addarg(op, "-as 128"); |
792 |
+ |
break; |
793 |
+ |
case HIGH: |
794 |
+ |
op = addarg(op, "-aa .08"); |
795 |
+ |
op = addarg(op, "-ad 850"); |
796 |
+ |
op = addarg(op, "-as 256"); |
797 |
+ |
break; |
798 |
+ |
} |
799 |
+ |
d = ambval(); |
800 |
+ |
sprintf(op, " -av %.2g %.2g %.2g", d, d, d); |
801 |
+ |
op += strlen(op); |
802 |
+ |
op = addarg(op, "-lr 12"); |
803 |
+ |
op = addarg(op, "-lw .0005"); |
804 |
|
if (vdef(RENDER)) |
805 |
|
op = addarg(op, vval(RENDER)); |
806 |
|
} |
838 |
|
} |
839 |
|
strcpy(evp, "ROPT="); |
840 |
|
strcat(evp, ro); |
841 |
< |
putenv(evp); |
841 |
> |
if (putenv(evp) != 0) { |
842 |
> |
fprintf(stderr, "%s: out of environment space\n", |
843 |
> |
progname); |
844 |
> |
exit(1); |
845 |
> |
} |
846 |
|
strcpy(ro, " $ROPT"); |
847 |
|
} |
848 |
|
#endif |
920 |
|
progname); |
921 |
|
exit(1); |
922 |
|
} |
923 |
< |
dim[0] -= cent[0]; |
924 |
< |
dim[1] -= cent[1]; |
925 |
< |
dim[2] -= cent[2]; |
923 |
> |
dim[0] -= cent[0]; cent[0] += .5*dim[0]; |
924 |
> |
dim[1] -= cent[1]; cent[1] += .5*dim[1]; |
925 |
> |
dim[2] -= cent[2]; cent[2] += .5*dim[2]; |
926 |
|
exterior = vlet(ZONE) == 'E'; |
927 |
|
mult = exterior ? 2. : .45 ; |
928 |
|
sprintf(cp, " -vp %.2g %.2g %.2g -vd %.2g %.2g %.2g", |
1040 |
|
rpict(opts) /* run rpict and pfilt for each view */ |
1041 |
|
char *opts; |
1042 |
|
{ |
1043 |
< |
char combuf[512]; |
1043 |
> |
char combuf[1024]; |
1044 |
|
char rawfile[MAXPATH], picfile[MAXPATH], rep[MAXPATH], res[32]; |
1045 |
|
char pfopts[64]; |
1046 |
|
char vs[32], *vw; |