home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / BGIACTOR.CPP next >
C/C++ Source or Header  |  1993-05-10  |  6KB  |  250 lines

  1. //
  2. // BGIActor.cpp:
  3. //    Implementation of classes BGI_XYZ, and BGIgraphicsActor.
  4. //    Example use of Object Glove.
  5. //
  6. // Purpose:
  7. //    Outputs graphics and text using Borland BGI toolkit.
  8. //
  9. // Compatibility:
  10. //    DOS only!
  11. //
  12. // Copyright 1993   Mark Thomas Pflaging
  13. //
  14. // Date:    3/22/93 (Release 3.0)
  15. //
  16. #include "BGIActor.hpp"
  17. #include "BGIgest.hpp"
  18. #include <stdio.h>
  19. #include <conio.h>
  20. #include <math.h>
  21.  
  22. Boolean BGIgraphicsActor::textActive;
  23.  
  24. void BGI_XYZ::erase(int leaveTrail)
  25. {
  26.     int erased[5 * 2] = {
  27.         right, top,  right, bottom,  left, bottom,  left, top,
  28.         right, top
  29.     };
  30.     setfillstyle(SOLID_FILL,/*EGA_BLACK*/0);
  31.     fillpoly( 5, erased);
  32.     if (!leaveTrail) {
  33.         setcolor(0);
  34.         ::rectangle(left, top, right, bottom);
  35.     }
  36. }
  37.  
  38. void BGIgraphicsActor::eraseGlove()
  39. {
  40.     // erase old box.
  41.     oldData.erase(leaveTrails);
  42. }
  43.  
  44. // draw square cursor
  45. void BGIgraphicsActor::drawGlove(gloveDriver &gd)
  46. {
  47.     BGI_XYZ newRect;
  48.  
  49.     newRect.scaleToGlove(gd, getmaxx(), getmaxy());
  50.  
  51.     // prevent redundant drawing.
  52.     if ((newRect == oldData) && (gd.getFingers() == oldFingers) &&
  53.        (gd.getKeys() == -1))
  54.         return;
  55.  
  56.     setcolor(currentColor);
  57.     if( drawn ) eraseGlove();
  58.  
  59.     newRect.rectangle(currentColor);
  60.     setcolor(currentColor);
  61.     newRect.displayGlove(gd, *this);
  62.     setfillstyle(fillMode, currentColor);
  63.     poly_space->drawAll();
  64.     setfillstyle (SOLID_FILL,EGA_LIGHTGRAY);
  65.     drawn = 1;
  66.     oldData = newRect;         // save pos'n for next erase
  67.     oldFingers = gd.getFingers();
  68. }
  69.  
  70. void BGIgraphicsActor::Process(gloveDriver& gd)
  71. {
  72.     gd.checkGestures();
  73.     postCheck();
  74.     if (!textActive) {
  75.         if (gloveActive)
  76.             drawGlove(gd);    // animate glove cursor
  77.         if (handActive)
  78.             drawFingers(gd, getInstance());    // draw the nonmoving "hand"
  79.         if (infoActive)
  80.             infoDisplay(gd);
  81.         if (gestureActive)
  82.             gests.draw();
  83.     }
  84. }
  85.  
  86. void BGIgraphicsActor::displayHelp()
  87. {
  88.     cleardevice();
  89.     // output a message
  90.     int x = getmaxx() / 2;
  91.     int y = 5; // getmaxy() / 2;
  92.     settextjustify(CENTER_TEXT, CENTER_TEXT);
  93.  
  94.     int height = textheight("Tq");
  95.     moveto(x,y+=height);
  96.     outtext("This program tests the Nintendo Power Glove");
  97.     moveto(x,y+=height);
  98.     outtext("when connected to an IBM PC parallel port.");
  99.     moveto(x,y+=height);
  100.     moveto(x-=(getmaxx()/4),y+=height);
  101.     settextjustify(LEFT_TEXT, TOP_TEXT);
  102.     moveto(x,y+=height);
  103.  
  104.     outtext("The following POWER GLOVE keys (NOT keyboard keys!)");
  105.     moveto(x,y+=height);
  106.  
  107.     outtext("have been defined:");
  108.     moveto(x,y+=height);
  109.  
  110.     outtext("1 - display this help screen");
  111.     moveto(x,y+=height);
  112.  
  113.     outtext("2 - toggle drawing of moving hand.");
  114.     moveto(x,y+=height);
  115.  
  116.     outtext("3 - toggle drawing of nonmoving hand.");
  117.     moveto(x,y+=height);
  118.  
  119.     outtext("4 - to toggle info display.");
  120.     moveto(x,y+=height);
  121.  
  122.     outtext("5 - toggle display of gestures.");
  123.     moveto(x,y+=height);
  124.     moveto(x,y+=height);
  125.  
  126.     outtext("A - to toggle \"trails\" behind the rectangle (try it!)");
  127.     moveto(x,y+=height);
  128.     outtext("B - to clear screen.");
  129.     moveto(x,y+=height);
  130.     moveto(x,y+=height);
  131.     outtext("* Arrows - change color of moving hand *");
  132.     moveto(x,y+=height);
  133.     moveto(x,y+=height);
  134.  
  135.     outtext("Press any KEYBOARD key to exit the program.");
  136.     moveto(x,y+=height);
  137.     moveto(x,y+=height);
  138. }
  139.  
  140. #define LINES 4
  141. #define XOFF  20
  142. #define YOFF  25
  143. #define NUMSTART 17
  144. void BGIgraphicsActor::infoErase(int start)
  145. {
  146.     int unit_wid = textwidth("W");
  147.     static char hightxt[] = "Tq";
  148.     int height = textheight(hightxt);
  149.     int x = XOFF + unit_wid * start, y = YOFF + (height * LINES + 1) * getInstance();
  150.     int width = unit_wid * (33 - start);
  151.     setviewport(x, y, width + x, height * LINES + y, 1);
  152.     clearviewport();
  153.     setviewport(0, 0, getmaxx(), getmaxy(), 0);
  154. }
  155.  
  156. void BGIgraphicsActor::infoDisplay(gloveDriver & gd)
  157. {
  158.     char temp[255];
  159.     int height = textheight("Tq");
  160.     int width = textwidth("W");
  161.  
  162.     infoErase(NUMSTART);
  163.     int x = XOFF, y = YOFF + (height * LINES + 1) * getInstance();
  164.  
  165.     setcolor(EGA_LIGHTGRAY);
  166.     // print constant text:
  167.     moveto(x + width * 8, y);
  168.     outtext("X, Y, Z:");
  169.     // print rot, fingers, keys
  170.     moveto(x + width * NUMSTART, y);
  171.     sprintf(temp, "%4d, %4d, %4d",
  172.         gd.getX(), gd.getY(), gd.getZ());
  173.     outtext(temp);
  174.  
  175.     moveto(x,y+=height);
  176.     outtext(" Rotation, Keys:");
  177.     sprintf(temp, "  %2d,  %-2x %-3d",
  178.         gd.getRotation(), gd.getKeys(), gd.getKeys());
  179.     moveto(x + width * NUMSTART, y);
  180.     outtext(temp);
  181.  
  182.     moveto(x + width * 8, y += height);
  183.     outtext("Fingers:");
  184.     sprintf(temp, "  %2x, %2x, %2x, %2x",
  185.         gd.getThumb(),
  186.         gd.getIndex(),
  187.         gd.getMiddle(),
  188.         gd.getRing());
  189.     moveto(x + width * NUMSTART, y);
  190.     outtext(temp);
  191. }
  192.  
  193. void BGIgraphicsActor::Setup()
  194. {
  195.     if (!getInstance()) {
  196.         int gdriver = DETECT, gmode, errorcode;
  197.  
  198.         // detect graphics hardware available
  199.         detectgraph(&gdriver, &gmode);
  200.         // gdriver now contains detected hardware info.
  201.         // (see graphics_drivers enum type in Borland help)
  202.  
  203.         initgraph(&gdriver, &gmode, NULL);    // detect best graphics mode
  204.         // read result of initialization
  205.         errorcode = graphresult();
  206.  
  207.         if (errorcode != grOk)  // an error occurred
  208.         {
  209.             printf("Graphics error: %s\n", grapherrormsg(errorcode));
  210.             printf("Press any key to halt:");
  211.             getch();
  212.             exit(1);             // exit with error code
  213.         }
  214.     }
  215.     upIncrement = (int)sqrt((double)(getmaxcolor() + 1));
  216.     if (currentColor == -1) currentColor = getmaxcolor();
  217. }
  218.  
  219. void BGIgraphicsActor::Init(InitFile & ini)
  220. {
  221.     drawn = 0;
  222.     xx = 0;
  223.     keyDown = False;
  224.     textActive = False;
  225.     currentColor = ini.find(title, "startColor", -1);
  226.     fillMode = ini.find(title, "fillMode", 0);
  227. }
  228.  
  229. BGIgraphicsActor::BGIgraphicsActor(InitFile & ini, BGIGestureActor & garg) :
  230.     graphicsActor(ini, *(new BGI_PolySpace)), gests(garg)
  231. {
  232.     Init(ini);
  233. }
  234.  
  235. BGIgraphicsActor::BGIgraphicsActor(InitFile & ini, BGIGestureActor & garg, ButtonGestSet & buttons) :
  236.     graphicsActor(ini, *(new BGI_PolySpace), buttons), gests(garg)
  237. {
  238.     Init(ini);
  239. }
  240.  
  241. void BGIgraphicsActor::displayGestures()
  242. {
  243.     gests.draw();
  244. }
  245.  
  246. void BGIgraphicsActor::clearGestures()
  247. {
  248.     gests.clear();
  249. }
  250.