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

Comparing ray/src/hd/rhdobj.c (file contents):
Revision 3.4 by gwlarson, Wed Aug 26 17:26:26 1998 UTC vs.
Revision 3.7 by gwlarson, Fri Dec 18 11:06:45 1998 UTC

# Line 5 | Line 5 | static char SCCSid[] = "$SunId$ SGI";
5   #endif
6  
7   /*
8 < * Routines for loading and displaying Radiance objects under OpenGL in rholo.
8 > * Routines for loading and displaying Radiance objects in rholo with GLX.
9   */
10  
11   #include "radogl.h"
# Line 22 | Line 22 | int    (*dobj_lightsamp)() = NULL;     /* pointer to function
22  
23   #define AVGREFL         0.5             /* assumed average reflectance */
24  
25 < #define MAXAC           64              /* maximum number of args */
25 > #define MAXAC           512             /* maximum number of args */
26  
27   #ifndef MINTHRESH
28   #define MINTHRESH       5.0             /* source threshold w.r.t. mean */
# Line 320 | Line 320 | ssph_compute()                 /* compute source set from sphere sam
320                                  continue;               /* too dim */
321                          ssph_direc(v, alt, azi);        /* else add it in */
322                          VSUM(ls->direc, ls->direc, v, d);
323 <                        ls->omega++;
323 >                        ls->omega += 1.;
324                          addcolor(ls->val, ssamp[alt][azi].val);
325 +                                                        /* remove from list */
326                          setcolor(ssamp[alt][azi].val, 0., 0., 0.);
327 +                        ssamp[alt][azi].nsamp = 0;
328                  }
329                  d = 1./ls->omega;                       /* avg. brightness */
330                  scalecolor(ls->val, d);
# Line 460 | Line 462 | register char  *args;
462                  else
463                          return(cmderror(cn, "need octree [name]"));
464                  break;
465 <        case DO_UNLOAD:                         /* unload an object */
465 >        case DO_UNLOAD:                         /* clear an object */
466                  if (na > 1) goto toomany;
467                  if (na && alist[0][0] == '*')
468                          dobj_cleanup();
# Line 483 | Line 485 | register char  *args;
485                  break;
486          case DO_OBJECT:                         /* print object statistics */
487                  if (dobj_putstats(na ? alist[0] : curname, sstdout))
488 <                        if (na && alist[0][0] != '*' &&
489 <                                        strcmp(alist[0], curname))
488 >                        if (na && alist[0][0] != '*' && (curobj == NULL ||
489 >                                        strcmp(alist[0], curobj->name)))
490                                  savedxf(curobj = getdobj(alist[0]));
491                  break;
492          case DO_DUP:                            /* duplicate object */
# Line 547 | Line 549 | char   *oct, *nam;
549                  return(0);
550          }
551          if (getdobj(nam) != NULL) {
552 <                error(COMMAND, "name already taken (unload first)");
552 >                error(COMMAND, "name already taken (clear first)");
553                  return(0);
554          }
555                                          /* get octree path */
# Line 612 | Line 614 | dobj_cleanup()                         /* free all resources */
614   }
615  
616  
617 < dobj_xform(nam, add, ac, av)            /* set/add transform for nam */
617 > dobj_xform(nam, rel, ac, av)            /* set/add transform for nam */
618   char    *nam;
619 < int     add, ac;
619 > int     rel, ac;
620   char    **av;
621   {
622          register DOBJECT        *op;
623 +        FVECT   cent;
624 +        double  rad;
625 +        char    scoord[16];
626 +        int     i;
627  
628          if ((op = getdobj(nam)) == NULL) {
629                  error(COMMAND, "no object");
630                  return(0);
631          }
632 <        if (add) add = op->xfac;
633 <        if (ac + add > MAXAC) {
632 >        if (rel)
633 >                rel = op->xfac + 8;
634 >        if (ac + rel > MAXAC) {
635                  error(COMMAND, "too many transform arguments");
636                  return(0);
637          }
638 <        savedxf(curobj = op);
639 <        if (!add)
638 >        savedxf(curobj = op);           /* remember current transform */
639 >        if (rel && ac == 4 && !strcmp(av[0], "-t"))
640 >                rel = -1;                       /* don't move for translate */
641 >        else {
642 >                getdcent(cent, op);             /* don't move if near orig. */
643 >                rad = getdrad(op);
644 >                if (DOT(cent,cent) < rad*rad)
645 >                        rel = -1;
646 >        }
647 >        if (!rel) {                             /* remove old transform */
648                  while (op->xfac)
649                          freestr(op->xfav[--op->xfac]);
650 +        } else if (rel > 0) {                   /* relative move */
651 +                op->xfav[op->xfac++] = savestr("-t");
652 +                for (i = 0; i < 3; i++) {
653 +                        sprintf(scoord, "%.4e", -cent[i]);
654 +                        op->xfav[op->xfac++] = savestr(scoord);
655 +                }
656 +        }
657          while (ac--)
658                  op->xfav[op->xfac++] = savestr(*av++);
659 +        if (rel > 0) {                          /* move back */
660 +                op->xfav[op->xfac++] = savestr("-t");
661 +                for (i = 0; i < 3; i++) {
662 +                        sprintf(scoord, "%.4e", cent[i]);
663 +                        op->xfav[op->xfac++] = savestr(scoord);
664 +                }
665 +        }
666          op->xfav[op->xfac] = NULL;
667          if (fullxf(&op->xfb, op->xfac, op->xfav) != op->xfac) {
668                  error(COMMAND, "bad transform arguments");
# Line 670 | Line 699 | FILE   *fp;
699                  return(0);
700          }
701          getdcent(ocent, op);
702 <        fprintf(fp, "%s: %s, center [%f %f %f], radius %f", op->name,
702 >        fprintf(fp, "%s: %s, center [%g %g %g], radius %g", op->name,
703                          op->drawcode==DO_HIDE ? "hidden" :
704                          op->drawcode==DO_LIGHT && op->ol!=NULL ? "lighted" :
705                          "shown",
# Line 732 | Line 761 | char   *oldnm, *nam;
761                  return(0);
762          }
763          if (getdobj(nam) != NULL) {
764 <                error(COMMAND, "name already taken (unload first)");
764 >                error(COMMAND, "name already taken (clear first)");
765                  return(0);
766          }
767                                          /* allocate and copy struct */
# Line 837 | Line 866 | FVECT   rorg, rdir;
866   }
867  
868  
869 + int
870   dobj_render()                   /* render our objects in OpenGL */
871   {
872 +        int     nrendered = 0;
873          GLboolean       normalizing;
874          GLfloat vec[4];
875          FVECT   v1;
# Line 849 | Line 880 | dobj_render()                  /* render our objects in OpenGL */
880                  if (op->drawcode != DO_HIDE)
881                          break;
882          if (op == NULL)
883 <                return(1);
883 >                return(0);
884                                          /* set up general rendering params */
885          glGetBooleanv(GL_NORMALIZE, &normalizing);
886          glPushAttrib(GL_LIGHTING_BIT|GL_TRANSFORM_BIT|GL_ENABLE_BIT|
# Line 935 | Line 966 | dobj_render()                  /* render our objects in OpenGL */
966                  }
967                                          /* render the display list */
968                  glCallList(op->listid);
969 +                nrendered++;
970                                          /* restore matrix */
971                  if (op->xfac) {
972                          glMatrixMode(GL_MODELVIEW);
# Line 952 | Line 984 | dobj_render()                  /* render our objects in OpenGL */
984          }
985          glPopAttrib();                  /* restore rendering params */
986          rgl_checkerr("rendering objects in dobj_render");
987 <        return(1);
987 >        return(nrendered);
988   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines