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

Comparing ray/src/hd/rhd_glx.c (file contents):
Revision 3.19 by gwlarson, Wed Aug 19 17:45:58 1998 UTC vs.
Revision 3.24 by gwlarson, Thu Dec 10 10:45:54 1998 UTC

# Line 21 | Line 21 | static char SCCSid[] = "$SunId$ SGI";
21   #endif
22  
23   #include "standard.h"
24 #include "rhd_sample.h"
24  
25   #include <sys/types.h>
26   #include <GL/glx.h>
# Line 29 | Line 28 | static char SCCSid[] = "$SunId$ SGI";
28   #ifdef STEREO
29   #include <X11/extensions/SGIStereo.h>
30   #endif
31 +
32 + #include "rhd_sample.h"
33   #ifdef DOBJ
34   #include "rhdobj.h"
35   #endif
# Line 36 | Line 37 | static char SCCSid[] = "$SunId$ SGI";
37   #include "x11icon.h"
38  
39   #ifndef RAYQLEN
40 < #define RAYQLEN         250             /* max. rays to queue before flush */
40 > #define RAYQLEN         1024            /* max. rays to queue before flush */
41   #endif
42  
43   #ifndef FEQ
# Line 45 | Line 46 | static char SCCSid[] = "$SunId$ SGI";
46  
47   #define GAMMA           1.4             /* default gamma correction */
48  
49 + #define FRAMESTATE(s)   (((s)&(ShiftMask|ControlMask))==(ShiftMask|ControlMask))
50 +
51   #define MOVPCT          7               /* percent distance to move /frame */
52   #define MOVDIR(b)       ((b)==Button1 ? 1 : (b)==Button2 ? 0 : -1)
53   #define MOVDEG          (-5)            /* degrees to orbit CW/down /frame */
# Line 74 | Line 77 | static char SCCSid[] = "$SunId$ SGI";
77  
78   struct driver   odev;                   /* global device driver structure */
79  
80 + char odev_args[64];                     /* command arguments */
81 +
82 + #ifdef STEREO
83   static VIEW     vwright;                /* right eye view */
84 + #endif
85  
86   static int      rayqleft = 0;           /* rays left to queue before flush */
87  
# Line 99 | Line 106 | static int     inpresflags;            /* input result flags */
106   static int      headlocked = 0;         /* lock vertical motion */
107  
108   static int  resizewindow(), getevent(), getkey(), moveview(), wipeclean(),
109 <                setglpersp(), getmove(), fixwindow(), mytmflags();
109 >                setglpersp(), getframe(), getmove(), fixwindow(), mytmflags();
110  
111   #ifdef STEREO
112   static int  pushright(), popright();
# Line 124 | Line 131 | char  *id;
131          XSizeHints      oursizhints;
132                                          /* check for unsupported stereo */
133   #ifdef NOSTEREO
134 <        error(USER, "stereo display driver unavailable");
134 >        error(INTERNAL, "stereo display driver unavailable");
135   #endif
136                                          /* open display server */
137          ourdisplay = XOpenDisplay(NULL);
# Line 216 | Line 223 | char  *id;
223          pheight *= 2.;
224          setstereobuf(STEREO_BUFFER_LEFT);
225   #endif
226 +        checkglerr("setting rendering parameters");
227          copystruct(&odev.v, &stdview);
228          odev.v.type = VT_PER;
229                                          /* map the window */
# Line 273 | Line 281 | register VIEW  *nv;
281                  return(0);
282          }
283          if (nv != &odev.v) {
284 <                if (!FEQ(nv->horiz,odev.v.horiz) ||     /* resize window? */
284 >                                                /* resize window? */
285 >                if (!FEQ(nv->horiz,odev.v.horiz) ||
286                                  !FEQ(nv->vert,odev.v.vert)) {
287                          int     dw = DisplayWidth(ourdisplay,ourscreen);
288                          int     dh = DisplayHeight(ourdisplay,ourscreen);
# Line 299 | Line 308 | register VIEW  *nv;
308                          dev_input();    /* get resize event */
309                  }
310                  copystruct(&odev.v, nv);        /* setview() already called */
302                setglpersp(&odev.v);
311   #ifdef STEREO
312                  copystruct(&vwright, nv);
313                  d = eyesepdist / sqrt(nv->hn2);
314                  VSUM(vwright.vp, nv->vp, nv->hvec, d);
315                  /* setview(&vwright);   -- Unnecessary */
316   #endif
309                checkglerr("setting view");
317          }
318          wipeclean();
319          return(1);
# Line 368 | Line 375 | FVECT  d, p;
375                  return;
376          }
377   #endif
378 <        smNewSamp(c, d, p);             /* add to display representation */
372 <        if (p != NULL) {
378 >        if (p != NULL) {                /* add depth to our range */
379                  depth = (p[0] - odev.v.vp[0])*d[0] +
380                          (p[1] - odev.v.vp[1])*d[1] +
381                          (p[2] - odev.v.vp[2])*d[2];
# Line 380 | Line 386 | FVECT  d, p;
386                                  maxdpth = depth;
387                  }
388          }
389 +        smNewSamp(c, d, p);             /* add to display representation */
390          if (!--rayqleft)
391                  dev_flush();            /* flush output */
392   }
# Line 388 | Line 395 | FVECT  d, p;
395   int
396   dev_flush()                     /* flush output */
397   {
398 +        if (mapped) {
399   #ifdef STEREO
400 <        pushright();                    /* update right eye */
401 <        glClear(GL_DEPTH_BUFFER_BIT);
394 <        smUpdate(&vwright, 100);
400 >                pushright();                    /* update right eye */
401 >                smUpdate(&vwright, 100);
402   #ifdef DOBJ
403 <        dobj_render();                  /* usually in foreground */
403 >                dobj_render();                  /* usually in foreground */
404   #endif
405 <        popright();                     /* update left eye */
399 <        glClear(GL_DEPTH_BUFFER_BIT);
405 >                popright();                     /* update left eye */
406   #endif
407 <        smUpdate(&odev.v, 100);
407 >                smUpdate(&odev.v, 100);
408 >                checkglerr("rendering mesh");
409   #ifdef DOBJ
410 <        dobj_render();
410 >                dobj_render();
411   #endif
412 <        glFlush();                      /* flush OGL */
413 <        checkglerr("flushing display");
412 >                glFlush();                      /* flush OGL */
413 >        }
414          rayqleft = RAYQLEN;
415                                          /* flush X11 and return # pending */
416          return(odev.inpready = XPending(ourdisplay));
# Line 434 | Line 441 | pushright()                    /* push on right view */
441          glPushMatrix();
442          d = -eyesepdist / sqrt(odev.v.hn2);
443          glTranslated(d*odev.v.hvec[0], d*odev.v.hvec[1], d*odev.v.hvec[2]);
444 +        checkglerr("setting right view");
445   }
446  
447  
# Line 486 | Line 494 | getevent()                     /* get next event */
494                  getkey(levptr(XKeyPressedEvent));
495                  break;
496          case ButtonPress:
497 <                getmove(levptr(XButtonPressedEvent));
497 >                if (FRAMESTATE(levptr(XButtonPressedEvent)->state))
498 >                        getframe(levptr(XButtonPressedEvent));
499 >                else
500 >                        getmove(levptr(XButtonPressedEvent));
501                  break;
502          }
503   }
# Line 502 | Line 513 | register FVECT wp[2];
513  
514  
515   static
516 < draw_grids()                    /* draw holodeck section grids */
516 > draw_grids(fore)                /* draw holodeck section grids */
517 > int     fore;
518   {
519 <        static BYTE     gridrgba[4] = {0x0, 0xff, 0xff, 0x00};
520 <
521 <        if (!mapped)
522 <                return;
511 <        glColor4ub(gridrgba[0], gridrgba[1], gridrgba[2], gridrgba[3]);
519 >        if (fore)
520 >                glColor4ub(0, 255, 255, 0);
521 >        else
522 >                glColor4ub(0, 0, 0, 0);
523          glBegin(GL_LINES);              /* draw each grid line */
524          gridlines(draw3dline);
525          glEnd();
526 +        checkglerr("drawing grid lines");
527   }
528  
529  
# Line 525 | Line 537 | int    dx, dy, mov, orb;
537          register int    li;
538                                  /* start with old view */
539          copystruct(&nv, &odev.v);
540 <                                /* change view direction */
540 >                                /* orient our motion */
541          if (viewray(v1, odir, &odev.v,
542                          (dx+.5)/odev.hres, (dy+.5)/odev.vres) < -FTINY)
543                  return(0);              /* outside view */
544 <        if (mov | orb) {
544 >        if (mov | orb) {        /* moving relative to geometry */
545   #ifdef DOBJ
546 <                d = dobj_trace(v1, odir);       /* check objects */
547 <                                                /* is holodeck in front? */
548 <                if ((li = smFindSamp(v1, odir)) >= 0 &&
537 <                                (rsL.wp[li][0] - nv.vp[0])*odir[0] +
538 <                                (rsL.wp[li][1] - nv.vp[1])*odir[1] +
539 <                                (rsL.wp[li][2] - nv.vp[2])*odir[2] < d)
546 >                d = dobj_trace(NULL, v1, odir); /* check objects */
547 >                                                /* check holodeck */
548 >                if ((li = smFindSamp(v1, odir)) >= 0) {
549                          VCOPY(wip, rsL.wp[li]);
550 <                else if (d < .99*FHUGE)         /* object is closer */
551 <                        VSUM(wip, nv.vp, odir, d);
552 <                else                            /* nothing visible */
553 <                        return(0);
550 >                        if (d < .99*FHUGE && d*d <= dist2(v1, wip))
551 >                                li = -1;        /* object is closer */
552 >                } else if (d >= .99*FHUGE)
553 >                        return(0);              /* nothing visible */
554 >                if (li < 0)
555 >                        VSUM(wip, v1, odir, d); /* else get object point */
556   #else
557                  if ((li = smFindSamp(v1, odir)) < 0)
558                          return(0);      /* not on window */
559                  VCOPY(wip, rsL.wp[li]);
560   #endif
561 <                VSUM(odir, wip, nv.vp, -1.);
562 <        } else
561 > #ifdef DEBUG
562 >                fprintf(stderr, "moveview: hit %s at (%f,%f,%f) (t=%f)\n",
563 >                                li < 0 ? "object" : "mesh",
564 >                                wip[0], wip[1], wip[2],
565 >                                (wip[0]-odev.v.vp[0])*odir[0] +
566 >                                (wip[1]-odev.v.vp[1])*odir[1] +
567 >                                (wip[2]-odev.v.vp[2])*odir[2]);
568 > #endif
569 >                VSUM(odir, wip, odev.v.vp, -1.);
570 >        } else                  /* panning with constant viewpoint */
571                  VCOPY(nv.vdir, odir);
572          if (orb && mov) {               /* orbit left/right */
573                  spinvector(odir, odir, nv.vup, d=MOVDEG*PI/180.*mov);
# Line 567 | Line 586 | int    dx, dy, mov, orb;
586          }
587          if (!mov ^ !orb && headlocked) {        /* restore head height */
588                  VSUM(v1, odev.v.vp, nv.vp, -1.);
589 <                d = DOT(v1, odev.v.vup);
589 >                d = DOT(v1, nv.vup);
590                  VSUM(nv.vp, nv.vp, odev.v.vup, d);
591          }
592          if (setview(&nv) != NULL)
# Line 579 | Line 598 | int    dx, dy, mov, orb;
598  
599  
600   static
601 + getframe(ebut)                          /* get focus frame */
602 + XButtonPressedEvent     *ebut;
603 + {
604 +        int     startx = ebut->x, starty = ebut->y;
605 +        int     endx, endy;
606 +
607 +        XMaskEvent(ourdisplay, ButtonReleaseMask, levptr(XEvent));
608 +        endx = levptr(XButtonReleasedEvent)->x;
609 +        endy = levptr(XButtonReleasedEvent)->y;
610 +        if (endx == startx | endy == starty) {
611 +                XBell(ourdisplay, 0);
612 +                return;
613 +        }
614 +        if (endx < startx) {register int c = endx; endx = startx; startx = c;}
615 +        if (endy < starty) {register int c = endy; endy = starty; starty = c;}
616 +        sprintf(odev_args, "%.3f %.3f %.3f %.3f",
617 +                        (startx+.5)/odev.hres, 1.-(endy+.5)/odev.vres,
618 +                        (endx+.5)/odev.hres, 1.-(starty+.5)/odev.vres);
619 +        inpresflags |= DFL(DC_FOCUS);
620 + }
621 +
622 +
623 + static
624   getmove(ebut)                           /* get view change */
625   XButtonPressedEvent     *ebut;
626   {
# Line 591 | Line 633 | XButtonPressedEvent    *ebut;
633          int     rootx, rooty, wx, wy;
634          unsigned int    statemask;
635  
636 <        XNoOp(ourdisplay);
636 >        XNoOp(ourdisplay);              /* makes sure we're not idle */
637  
638          lasttime = time(0); nframes = 0;
639          while (!XCheckMaskEvent(ourdisplay,
640                          ButtonReleaseMask, levptr(XEvent))) {
641 <
641 >                                        /* get cursor position */
642                  if (!XQueryPointer(ourdisplay, gwind, &rootw, &childw,
643                                  &rootx, &rooty, &wx, &wy, &statemask))
644                          break;          /* on another screen */
645  
646 +                draw_grids(0);          /* clear old grid lines */
647 + #ifdef STEREO
648 +                pushright(); draw_grids(0); popright();
649 + #endif
650 +                                        /* compute view motion */
651                  if (!moveview(wx, odev.vres-1-wy, movdir, movorb)) {
652                          sleep(1);
653                          lasttime++;
654 <                        continue;
654 >                        continue;       /* cursor in bad place */
655                  }
656 +                draw_grids(1);          /* redraw grid */
657   #ifdef STEREO
658                  pushright();
659 <                glClear(GL_COLOR_BUFFER_BIT);
612 <                draw_grids();
659 >                draw_grids(1);
660                  smUpdate(&vwright, qlevel);
661   #ifdef DOBJ
662                  dobj_render();
663   #endif
664                  popright();
665   #endif
666 <                glClear(GL_COLOR_BUFFER_BIT);
620 <                draw_grids();
666 >                                        /* redraw mesh */
667                  smUpdate(&odev.v, qlevel);
668   #ifdef DOBJ
669 <                dobj_render();
669 >                dobj_render();          /* redraw object */
670   #endif
671                  glFlush();
672 <                checkglerr("moving view");
627 <                nframes++;
672 >                nframes++;              /* figure out good quality level */
673                  thistime = time(0);
674                  if (thistime - lasttime >= 3 ||
675                                  nframes > (int)(3*3*TARGETFPS)) {
# Line 689 | Line 734 | register VIEW  *vp;
734                  odev.v.vp[1] + odev.v.vdir[1],
735                  odev.v.vp[2] + odev.v.vdir[2],
736                  odev.v.vup[0], odev.v.vup[1], odev.v.vup[2]);
737 +        checkglerr("setting perspective view");
738   }
739  
740  
741   static
742   wipeclean()                     /* prepare for redraw */
743   {
744 +                                        /* clear depth buffer */
745   #ifdef STEREO
746          setstereobuf(STEREO_BUFFER_RIGHT);
747          glClear(GL_DEPTH_BUFFER_BIT);
748          setstereobuf(STEREO_BUFFER_LEFT);
749   #endif
750          glClear(GL_DEPTH_BUFFER_BIT);
751 <        smClean();
751 >        smClean();                      /* reset drawing routines */
752 >        setglpersp(&odev.v);            /* reset view & clipping planes */
753   }
754  
755  
# Line 709 | Line 757 | static
757   getkey(ekey)                            /* get input key */
758   register XKeyPressedEvent  *ekey;
759   {
760 +        Window  rootw, childw;
761 +        int     rootx, rooty, wx, wy;
762 +        unsigned int    statemask;
763          int  n;
764          char    buf[8];
765  
# Line 731 | Line 782 | register XKeyPressedEvent  *ekey;
782          case 'v':                       /* spit out view */
783                  inpresflags |= DFL(DC_GETVIEW);
784                  return;
785 +        case 'f':                       /* frame view position */
786 +                if (!XQueryPointer(ourdisplay, gwind, &rootw, &childw,
787 +                                &rootx, &rooty, &wx, &wy, &statemask))
788 +                        return;         /* on another screen */
789 +                sprintf(odev_args, "%.4f %.4f", (wx+.5)/odev.hres,
790 +                                1.-(wy+.5)/odev.vres);
791 +                inpresflags |= DFL(DC_FOCUS);
792 +                return;
793 +        case 'F':                       /* unfocus */
794 +                odev_args[0] = '\0';
795 +                inpresflags |= DFL(DC_FOCUS);
796 +                return;
797          case '\n':
798          case '\r':                      /* resume computation */
799                  inpresflags |= DFL(DC_RESUME);
# Line 741 | Line 804 | register XKeyPressedEvent  *ekey;
804          case CTRL('L'):                 /* refresh from server */
805                  if (inpresflags & DFL(DC_REDRAW))
806                          return;
807 +                setglpersp(&odev.v);            /* reset clipping planes */
808                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
809 <                glDisable(GL_DEPTH_TEST);
810 <                draw_grids();
809 >                glDisable(GL_DEPTH_TEST);       /* so grids will clear */
810 >                draw_grids(1);
811   #ifdef STEREO
812                  pushright();
813                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
814 <                draw_grids();
814 >                draw_grids(1);
815                  popright();
816   #endif
817                  glEnable(GL_DEPTH_TEST);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines