ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rad.c
(Generate patch)

Comparing ray/src/util/rad.c (file contents):
Revision 2.1 by greg, Thu Mar 11 09:11:00 1993 UTC vs.
Revision 2.2 by greg, Thu Mar 11 11:39:48 1993 UTC

# Line 92 | Line 92 | int    (*setqopts[3])() = {lowqopts, medqopts, hiqopts};
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 */
# Line 341 | Line 341 | register VARIABLE      *vp;
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  
# Line 387 | Line 388 | register char  *fnames;
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));
# Line 400 | Line 411 | checkfiles()                   /* check for existence and modified tim
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          }
# Line 467 | Line 478 | setdefaults()                  /* set default values for unassigned v
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)++;
# Line 506 | Line 512 | oconv()                                /* run oconv if necessary */
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);
# Line 523 | Line 531 | oconv()                                /* run oconv if necessary */
531                  unlink(vval(OCTREE));
532                  exit(1);
533          }
534 +        octreedate = time(0);
535   }
536  
537  
# Line 538 | Line 547 | register char  *op, *arg;
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   }
# Line 611 | Line 838 | char   *ro;
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
# Line 689 | Line 920 | register char  *vs;
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",
# Line 809 | Line 1040 | char   *opts;
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;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines