home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / graphicgems4.lha / GemsIV / arcball / Demo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-06  |  3.0 KB  |  126 lines

  1. /***** Demo.c *****/
  2. /* Ken Shoemake, 1993 */
  3. #include <gl/gl.h>
  4. #include <gl/device.h>
  5.  
  6. #include "BallAux.h"
  7. #include "Body.h"
  8. #include "Ball.h"
  9.  
  10. typedef struct {long x, y;} Place;
  11.  
  12. #define RADIUS      (0.75)
  13. #define CNTRLDN      1
  14. #define SHIFTDN      2
  15.  
  16. void main(void)
  17. {
  18.     int gid;
  19.     short active;    /* TRUE if window is attached */
  20.     Device dev;
  21.     short val;
  22.     Place winsize, winorig;
  23.     Place mouseNow, mouseDown;
  24.     int keysDown;
  25.     HVect vNow;
  26.     BallData ball;
  27.  
  28.     keepaspect(1, 1);
  29.     prefposition(50, 950, 50, 950);
  30.     gid = winopen("Arcball Demo");
  31.     doublebuffer();
  32.     RGBmode();
  33.     gconfig();
  34.     qdevice(WINSHUT);
  35.     qdevice(MOUSEX); qdevice(MOUSEY); qdevice(LEFTMOUSE);
  36.     qdevice(LEFTCTRLKEY); qdevice(RIGHTCTRLKEY);
  37.     qdevice(LEFTSHIFTKEY); qdevice(RIGHTSHIFTKEY);
  38.     qdevice(CAPSLOCKKEY);
  39.     /* perspective(400, 1.0, 0.001, 100000.0); */
  40.     ortho(-1.0, 1.0, -1.0, 1.0, 0.001, 100000.0);
  41.     translate(0.0, 0.0, -3.0);
  42.     active = 0;
  43.  
  44.     getsize(&winsize.x, &winsize.y);
  45.     getorigin(&winorig.x, &winorig.y);
  46.     keysDown = 0;
  47.     Ball_Init(&ball);
  48.     Ball_Place(&ball, qOne, RADIUS);
  49.  
  50.     while (TRUE) {
  51.     while (qtest()) {     /* process queued events */
  52.         dev = qread(&val);
  53.         switch (dev) {
  54.         case WINSHUT:     /* exit program */
  55.             gexit();
  56.             exit(0);
  57.             break;
  58.         case INPUTCHANGE:
  59.             active = val;
  60.             break;
  61.         case REDRAW:
  62.             reshapeviewport();
  63.             getsize(&winsize.x, &winsize.y);
  64.             getorigin(&winorig.x, &winorig.y);
  65.             break;
  66.         case MOUSEX:
  67.             mouseNow.x = val;
  68.             vNow.x = 2.0*(mouseNow.x - winorig.x)/winsize.x - 1.0;
  69.             break;
  70.         case MOUSEY:
  71.             mouseNow.y = val;
  72.             vNow.y = 2.0*(mouseNow.y - winorig.y)/winsize.y - 1.0;
  73.             break;
  74.         case LEFTMOUSE:
  75.             if (val) Ball_BeginDrag(&ball);
  76.             else     Ball_EndDrag(&ball);
  77.             break;
  78.         case LEFTCTRLKEY: case RIGHTCTRLKEY:
  79.             keysDown = (keysDown&~CNTRLDN)|(val? CNTRLDN : 0);
  80.             break;
  81.         case LEFTSHIFTKEY: case RIGHTSHIFTKEY:
  82.             keysDown = (keysDown&~SHIFTDN)|(val? SHIFTDN : 0);
  83.             break;
  84.         case CAPSLOCKKEY:
  85.             if (val) Ball_ShowResult(&ball);
  86.             else     Ball_HideResult(&ball);
  87.             break;
  88.         default:
  89.             break;
  90.         }             /* end of switch */
  91.         Ball_Mouse(&ball, vNow);
  92.         switch (keysDown) {
  93.         case CNTRLDN+SHIFTDN: Ball_UseSet(&ball, OtherAxes);  break;
  94.         case CNTRLDN:          Ball_UseSet(&ball, BodyAxes);   break;
  95.         case         SHIFTDN: Ball_UseSet(&ball, CameraAxes); break;
  96.         default:          Ball_UseSet(&ball, NoAxes);     break;
  97.         }
  98.     }             /* end of while on qtest */
  99.     Ball_Update(&ball);
  100.     scene_Draw(&ball);     /* draw into the back buffer */
  101.     swapbuffers();         /* and show it in the front buffer */
  102.     }
  103.     /* NOT REACHED */
  104. }
  105.  
  106. /* Draw whole window, including controller. */
  107. void scene_Draw(BallData *ball)
  108. {
  109.     RGBcolor(0, 0, 0);
  110.     clear();
  111.     body_Draw(ball);
  112.     Ball_Draw(ball);
  113. }
  114.  
  115. /* Draw the object being controlled. */
  116. void body_Draw(BallData *ball)
  117. {
  118.     HMatrix mNow;
  119.     Ball_Value(ball, mNow);
  120.     pushmatrix();
  121.     multmatrix(mNow);
  122.     scale(RADIUS, RADIUS, RADIUS);
  123.     drawbody(mNow);
  124.     popmatrix();
  125. }
  126.