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.8 by gwlarson, Wed Dec 23 17:41:14 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 430 | Line 432 | dobj_command(cmd, args)                /* run object display command
432   char    *cmd;
433   register char   *args;
434   {
435 +        int     somechange = 0;
436 +        VIEW    sameview;
437          int     cn, na, doxfm;
438          register int    nn;
439          char    *alist[MAXAC+1], *nm;
# Line 460 | Line 464 | register char  *args;
464                  else
465                          return(cmderror(cn, "need octree [name]"));
466                  break;
467 <        case DO_UNLOAD:                         /* unload an object */
467 >        case DO_UNLOAD:                         /* clear an object */
468                  if (na > 1) goto toomany;
469                  if (na && alist[0][0] == '*')
470 <                        dobj_cleanup();
470 >                        somechange += dobj_cleanup();
471                  else
472 <                        dobj_unload(na ? alist[0] : curname);
472 >                        somechange += dobj_unload(na ? alist[0] : curname);
473                  break;
474          case DO_XFORM:                          /* transform object */
475          case DO_MOVE:
# Line 476 | Line 480 | register char  *args;
480                  }
481                  if (cn == DO_MOVE && nn >= na)
482                          return(cmderror(cn, "missing transform"));
483 <                dobj_xform(nm, cn==DO_MOVE, na-nn, alist+nn);
483 >                somechange += dobj_xform(nm, cn==DO_MOVE, na-nn, alist+nn);
484                  break;
485          case DO_UNMOVE:                         /* undo last transform */
486 <                dobj_unmove();
486 >                somechange += dobj_unmove();
487                  break;
488          case DO_OBJECT:                         /* print object statistics */
489                  if (dobj_putstats(na ? alist[0] : curname, sstdout))
490 <                        if (na && alist[0][0] != '*' &&
491 <                                        strcmp(alist[0], curname))
490 >                        if (na && alist[0][0] != '*' && (curobj == NULL ||
491 >                                        strcmp(alist[0], curobj->name)))
492                                  savedxf(curobj = getdobj(alist[0]));
493                  break;
494          case DO_DUP:                            /* duplicate object */
# Line 506 | Line 510 | register char  *args;
510                  if (!dobj_dup(nm, alist[nn-1]))
511                          break;
512                  if (na > nn)
513 <                        dobj_xform(curname, 1, na-nn, alist+nn);
513 >                        somechange += dobj_xform(curname, 1, na-nn, alist+nn);
514                  else
515                          curobj->drawcode = DO_HIDE;
516                  savedxf(curobj);
# Line 516 | Line 520 | register char  *args;
520          case DO_HIDE:
521                  if (na > 1) goto toomany;
522                  dobj_lighting(na ? alist[0] : curname, cn);
523 +                somechange++;
524                  break;
525          default:
526                  error(CONSISTENCY, "bad command id in dobj_command");
527          }
528 <        dev_view(&odev.v);                      /* redraw */
528 >        if (somechange) {
529 >                copystruct(&sameview, &odev.v); /* make 'em think new view */
530 >                dev_view(&sameview);            /* redraw */
531 >        }
532          return(cn);
533   toomany:
534          return(cmderror(cn, "too many arguments"));
# Line 547 | Line 555 | char   *oct, *nam;
555                  return(0);
556          }
557          if (getdobj(nam) != NULL) {
558 <                error(COMMAND, "name already taken (unload first)");
558 >                error(COMMAND, "name already taken (clear first)");
559                  return(0);
560          }
561                                          /* get octree path */
# Line 569 | Line 577 | char   *oct, *nam;
577          op->xfav[op->xfac=0] = NULL;
578                                          /* load octree into display list */
579          dolights = 0;
580 +        domats = 1;
581          op->listid = rgl_octlist(fpath, op->center, &op->radius);
582                                          /* start rtrace */
583          rtargv[RTARGC-1] = fpath;
# Line 612 | Line 621 | dobj_cleanup()                         /* free all resources */
621   }
622  
623  
624 < dobj_xform(nam, add, ac, av)            /* set/add transform for nam */
624 > dobj_xform(nam, rel, ac, av)            /* set/add transform for nam */
625   char    *nam;
626 < int     add, ac;
626 > int     rel, ac;
627   char    **av;
628   {
629          register DOBJECT        *op;
630 +        FVECT   cent;
631 +        double  rad;
632 +        char    scoord[16];
633 +        int     i;
634  
635          if ((op = getdobj(nam)) == NULL) {
636                  error(COMMAND, "no object");
637                  return(0);
638          }
639 <        if (add) add = op->xfac;
640 <        if (ac + add > MAXAC) {
639 >        if (rel)
640 >                rel = op->xfac + 8;
641 >        if (ac + rel > MAXAC) {
642                  error(COMMAND, "too many transform arguments");
643                  return(0);
644          }
645 <        savedxf(curobj = op);
646 <        if (!add)
645 >        savedxf(curobj = op);           /* remember current transform */
646 >        if (rel && ac == 4 && !strcmp(av[0], "-t"))
647 >                rel = -1;                       /* don't move for translate */
648 >        else {
649 >                getdcent(cent, op);             /* don't move if near orig. */
650 >                rad = getdrad(op);
651 >                if (DOT(cent,cent) < rad*rad)
652 >                        rel = -1;
653 >        }
654 >        if (!rel) {                             /* remove old transform */
655                  while (op->xfac)
656                          freestr(op->xfav[--op->xfac]);
657 +        } else if (rel > 0) {                   /* relative move */
658 +                op->xfav[op->xfac++] = savestr("-t");
659 +                for (i = 0; i < 3; i++) {
660 +                        sprintf(scoord, "%.4e", -cent[i]);
661 +                        op->xfav[op->xfac++] = savestr(scoord);
662 +                }
663 +        }
664          while (ac--)
665                  op->xfav[op->xfac++] = savestr(*av++);
666 +        if (rel > 0) {                          /* move back */
667 +                op->xfav[op->xfac++] = savestr("-t");
668 +                for (i = 0; i < 3; i++) {
669 +                        sprintf(scoord, "%.4e", cent[i]);
670 +                        op->xfav[op->xfac++] = savestr(scoord);
671 +                }
672 +        }
673          op->xfav[op->xfac] = NULL;
674          if (fullxf(&op->xfb, op->xfac, op->xfav) != op->xfac) {
675                  error(COMMAND, "bad transform arguments");
# Line 670 | Line 706 | FILE   *fp;
706                  return(0);
707          }
708          getdcent(ocent, op);
709 <        fprintf(fp, "%s: %s, center [%f %f %f], radius %f", op->name,
709 >        fprintf(fp, "%s: %s, center [%g %g %g], radius %g", op->name,
710                          op->drawcode==DO_HIDE ? "hidden" :
711                          op->drawcode==DO_LIGHT && op->ol!=NULL ? "lighted" :
712                          "shown",
# Line 732 | Line 768 | char   *oldnm, *nam;
768                  return(0);
769          }
770          if (getdobj(nam) != NULL) {
771 <                error(COMMAND, "name already taken (unload first)");
771 >                error(COMMAND, "name already taken (clear first)");
772                  return(0);
773          }
774                                          /* allocate and copy struct */
# Line 837 | Line 873 | FVECT   rorg, rdir;
873   }
874  
875  
876 + int
877   dobj_render()                   /* render our objects in OpenGL */
878   {
879 +        int     nrendered = 0;
880          GLboolean       normalizing;
881          GLfloat vec[4];
882          FVECT   v1;
# Line 849 | Line 887 | dobj_render()                  /* render our objects in OpenGL */
887                  if (op->drawcode != DO_HIDE)
888                          break;
889          if (op == NULL)
890 <                return(1);
890 >                return(0);
891                                          /* set up general rendering params */
892          glGetBooleanv(GL_NORMALIZE, &normalizing);
893          glPushAttrib(GL_LIGHTING_BIT|GL_TRANSFORM_BIT|GL_ENABLE_BIT|
# Line 935 | Line 973 | dobj_render()                  /* render our objects in OpenGL */
973                  }
974                                          /* render the display list */
975                  glCallList(op->listid);
976 +                nrendered++;
977                                          /* restore matrix */
978                  if (op->xfac) {
979                          glMatrixMode(GL_MODELVIEW);
# Line 952 | Line 991 | dobj_render()                  /* render our objects in OpenGL */
991          }
992          glPopAttrib();                  /* restore rendering params */
993          rgl_checkerr("rendering objects in dobj_render");
994 <        return(1);
994 >        return(nrendered);
995   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines