home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Madness / VRMAD96_ONE.ISO / virtek / examples / show3d.c < prev   
C/C++ Source or Header  |  1995-08-24  |  19KB  |  768 lines

  1. // ┌─────────────────────────────────────────────────────────────┐
  2. // │                                                             │
  3. // │ Filename:       show3d.c                                    │
  4. // │ Author:         Various                                     │
  5. // │                               <support@virtek.com>          │
  6. // │ Creation date:  30th October 1994                           │
  7. // │                                                             │
  8. // │ Compiled using: Borland C++ V3.1                            │
  9. // │                                                             │
  10. // │ Tested by:      CKD, PBA, NAJ                               │
  11. // │                                                             │
  12. // │                                                             │
  13. // │ Purpose:        A small program to load a 3D-Ware           │
  14. // │                 world file and use a mouse to control       │
  15. // │                 flight throughout the world.                │
  16. // │                                                             │
  17. // └─────────────────────────────────────────────────────────────┘
  18.  
  19. #include <stdio.h>
  20. #include <conio.h>
  21. #include <dos.h>
  22. #include <dir.h>
  23. #include <io.h>
  24. #include <alloc.h>
  25. #include <string.h>
  26. #include <stdlib.h>
  27.  
  28. #include "..\3d-ware\dddware.h"
  29.  
  30. #define   ALLOC_THRESHOLD    50
  31. #define   SHIFT              (dddkeypressed [_L_SHIFT] || dddkeypressed [_R_SHIFT])
  32.  
  33. enum      { FALSE,TRUE };
  34.  
  35.  
  36. /************/
  37. /* typedefs */
  38. /************/
  39.  
  40. typedef struct shapename_s {
  41.    char *name;
  42.    long size;
  43. }  shapename;
  44.  
  45.  
  46. /**************/
  47. /* prototypes */
  48. /**************/
  49.  
  50. void      ContinuousRotation(void);
  51. void      MouseControlsViewer(void);
  52. void      MouseControlsObject(void);
  53. void      Finish(void);
  54. void      NextControlMethod(void);
  55. void      ToggleHoriFade(void);
  56. void      ToggleHorizon(void);
  57. void      ToggleInfo(void);
  58. void      ToggleSame(void);
  59. void      ToggleLine(void);
  60. void      KeyHelp(void);
  61. void      IncSem(void);
  62. void      DecSem(void);
  63. void      ZeroSem(void);
  64. void      ToggleSem1(void);
  65. void      ToggleSem2(void);
  66. void      ToggleSem3(void);
  67. void      ToggleSem4(void);
  68. void      ToggleSem5(void);
  69. void      ToggleSem6(void);
  70. void      ToggleSem7(void);
  71. void      ToggleSem8(void);
  72. void      main(int ,char **);
  73. char      IsFullPath(char *);
  74. void      TryDrawUsing(void);
  75. void      GetBits(unsigned short,char);
  76. void      ResetViewer(void);
  77. void      ReadShape(char *);
  78. void      GrabScreen(void);
  79. void      ToggleDrawModes();
  80. void      NewMessage(char *message);
  81. void      DisplayInfo(void);
  82.  
  83.  
  84. /********/
  85. /* vars */
  86. /********/
  87.  
  88. char      bobsem = 0;
  89. char      msgcol = 11;
  90. char      xlook = 0;
  91. short     back_screen = 0;
  92. char      sameon = 0;                                            // same on/off flag
  93. char      outline = 0;                                           // outline on/off flag
  94. short     mouse = 0;                                             // mouse control select
  95. char      timing = 0;                                            // timing on/off flag
  96. char      done = 0;
  97. char      showinfo = 0;
  98. char      dohorizon = 0;
  99. char      doHoriFade = 0;
  100. char far  shape_directory[MAXPATH];
  101. char      current_directory[MAXPATH];
  102. struct    ffblk dta;
  103. long      lastime;                                               // frame comp values for continuous rot'n
  104. long      thistime;
  105. short     x,y,z;
  106. char      buff[80];
  107. char      work[80];
  108. short     vz,vx,vy,vdist;
  109. short     vpage;
  110. short far mx,my;
  111. short     thiskey;
  112. char      control_num = 0;
  113. void      (*control_route)(void);
  114. short     shapeno = 0;
  115. short     numshapes = 0;
  116. shapename *shapelist;
  117. char      *thisfile;
  118. char      target_toggle=0;
  119. short     grab_screen_flag=0;
  120. short     temp1_shape;
  121. char      temp1_flags;
  122. short     temp1_ax;
  123. short     temp1_ay;
  124. short     temp1_az;
  125. char      temp1_draw;
  126. char      fade_shift = 9;
  127. char far  *flags = &temp1_flags;
  128. char      bitstring[17];
  129. short     Xrotspeed=0x80;
  130. short     Yrotspeed=0x120;
  131. short     Zrotspeed=0;
  132. char      message_string[80];
  133. short     message_countdown;
  134.  
  135. void      (*control_table[])(void) =
  136. {
  137.     MouseControlsViewer,
  138.     ContinuousRotation,
  139.     0
  140. };
  141.  
  142. struct {
  143.     short    key;
  144.     char    *name;
  145.     void    (*route)(void);
  146.     char    *help;
  147. } keytable[] = {
  148. { _ESC,     "ESC",   Finish,            "Exit"                     },    // Ok.
  149. { _F1,      "F1",    KeyHelp,           "Help"                     },    // Ok.
  150. { _F2,      "F2",    ToggleInfo,        "Toggle info display"      },    // Ok.
  151. { _F3,      "F3",    ToggleHorizon,     "Toggle horizon routines"  },
  152. { _F4,      "F4",    ToggleDrawModes,   "Toggle draw routines"     },
  153. { _F5,      "F5",    NextControlMethod, "Toggle spin"              },    // Ok.
  154. { _C,       "C",     ResetViewer,       "Reset the viewer"         },
  155. { _G,       "G",     GrabScreen,        "Grab the current screen"  },
  156. { _0,       "0",     ZeroSem,           "Zero SEM flags"           },
  157. { _1,       "1",     ToggleSem1,        "Toggle SEM1"              },
  158. { _2,       "2",     ToggleSem2,        "Toggle SEM2"              },
  159. { _3,       "3",     ToggleSem3,        "Toggle SEM3"              },
  160. { _4,       "4",     ToggleSem4,        "Toggle SEM4"              },
  161. { _5,       "5",     ToggleSem5,        "Toggle SEM5"              },
  162. { _6,       "6",     ToggleSem6,        "Toggle SEM6"              },
  163. { _7,       "7",     ToggleSem7,        "Toggle SEM7"              },
  164. { _8,       "8",     ToggleSem8,        "Toggle SEM8"              },
  165. { _K_PLUS,  "PLUS",  IncSem,            "Increment SEM flags"      },
  166. { _K_MINUS, "MINUS", DecSem,            "Decrement SEM flags"      },
  167. { 0,        "?",     0,                 0                          }  };
  168.  
  169. void      (*key[128])(void);
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180. //════════════════════════════════════════════════════════════════════════
  181. // MAIN PROGRAM
  182. //════════════════════════════════════════════════════════════════════════
  183.  
  184. void main(int argc,char **argv)
  185. {
  186. char      *s;
  187. shapename *p;
  188. long      filesize;
  189. short     i;
  190. void      (*action)(void);
  191. char      tempname[80];
  192.  
  193.    printf("\nShow3D. Simple 3D shape viewer. Version 1.0\n\n");  // Say hello.
  194.  
  195.    mouse = dddInitMouse();                                       // Initialise the mouse.
  196.    if(mouse)
  197.    {
  198.       dddMouseHidePointer();
  199.    }
  200.  
  201.     shapelist = (shapename *)0;
  202.     filesize  = 0L;
  203.  
  204.  
  205.    if(argc < 2)                                                  // Is a 3D file specified ?
  206.    {
  207.       printf("** ERROR ** No .3D file specified\n");
  208.       return;
  209.    }
  210.    strupr(argv[1]);
  211.    filesize = dddGetFileSize(argv[1]);                           // Get the size of the .3D file.
  212.  
  213.    if(filesize==0)
  214.    {
  215.       printf("** ERROR ** couldn't find %s\n",argv[1]);
  216.       return;
  217.    }
  218.  
  219.    if(filesize > 16000)
  220.    {
  221.       printf("** ERROR ** file is too large\n");
  222.       return;
  223.    }
  224.  
  225.     control_route = control_table[0];
  226.  
  227.    dddSelectEmmAmount(100);                                      // 100k of EMM is ample.
  228.    dddInit3d();
  229.    dddInitVideo();
  230.    dddLoadColors("default.col");
  231.    dddSetPal(dddstandardpal);
  232.  
  233.     temp1_draw       = DRW_MOBILE;
  234.    temp1_shape      = dddShapeLoad(argv[1]);
  235.     temp1_ax         = 0;
  236.     temp1_ay         = 0;
  237.     temp1_az         = 0;
  238.     vx               = 0;
  239.     vy               = 0;
  240.     vz               = 0;
  241.     vpage            = 0;
  242.      vdist            = 1000;
  243.     x = y = z = 0;
  244.  
  245.     dddInitKeybd();                                               // Initialise Keyboard reading.
  246.  
  247.    memset(key,  0, sizeof(key));
  248.    i = 0;
  249.    do {
  250.       key[keytable[i].key] = keytable[i].route;
  251.       strupr(keytable[i].name);
  252.       strupr(keytable[i].help);
  253.    } while(keytable[++i].key);
  254.  
  255.    do {
  256.       control_route();
  257.       if(dddkeypressed [_Q]) temp1_ax += 0x100;
  258.       if(dddkeypressed [_W]) temp1_ay += 0x100;
  259.       if(dddkeypressed [_E]) temp1_az += 0x100;
  260.       if(dddkeypressed [_A]) temp1_ax -= 0x100;
  261.       if(dddkeypressed [_S]) temp1_ay -= 0x100;
  262.       if(dddkeypressed [_D]) temp1_az -= 0x100;
  263.       if(dddkeypressed [_LF_ARROW]) vz -= 0x100;
  264.       if(dddkeypressed [_RT_ARROW]) vz += 0x100;
  265.       if(dddkeypressed [_UP_ARROW]) z += 0x50;
  266.       if(dddkeypressed [_DN_ARROW]) z -= 0x50;
  267.       if(dddkeypressed [_R]) z += 0x8;
  268.       if(dddkeypressed [_F]) z -= 0x8;
  269.  
  270.       if(dddkeypressed [_X]&& dddkeypressed [_K_0])     Xrotspeed=0;
  271.       if(dddkeypressed [_Y]&& dddkeypressed [_K_0])     Yrotspeed=0;
  272.       if(dddkeypressed [_Z]&& dddkeypressed [_K_0])     Zrotspeed=0;
  273.  
  274.       if(dddkeypressed [_X]&& dddkeypressed [_K_PLUS])  Xrotspeed+=0x5;
  275.       if(dddkeypressed [_Y]&& dddkeypressed [_K_PLUS])  Yrotspeed+=0x5;
  276.       if(dddkeypressed [_Z]&& dddkeypressed [_K_PLUS])  Zrotspeed+=0x5;
  277.       if(dddkeypressed [_X]&& dddkeypressed [_K_MINUS]) Xrotspeed-=0x5;
  278.       if(dddkeypressed [_Y]&& dddkeypressed [_K_MINUS]) Yrotspeed-=0x5;
  279.       if(dddkeypressed [_Z]&& dddkeypressed [_K_MINUS]) Zrotspeed-=0x5;
  280.  
  281.         if(dddkeycode)
  282.         {
  283.             action = key[ dddkeycode ];
  284.             dddkeycode = 0;
  285.             if(action)
  286.             {
  287.                 action();
  288.             }
  289.         }
  290.  
  291.    dddClearObjects();
  292.  
  293.    dddInsertObject16(temp1_draw,temp1_shape,temp1_flags,x,y,z,temp1_ax,temp1_ay,temp1_az);
  294.  
  295.       if    (message_countdown>0)
  296.       {
  297.          message_countdown--;
  298.          dddPrint7(12,10,180,message_string);
  299.       }
  300.  
  301.       if (target_toggle)
  302.       {
  303.          dddDrawLine(msgcol,154,97,164,97);                      // Draw horizontal first.
  304.          dddDrawLine(msgcol,159,92,159,102);                     // Draw vertical last.
  305.          dddPlot(0,159,97);
  306.         }
  307.  
  308.       dddScreenSwap();
  309.  
  310.       if(back_screen)
  311.       {
  312.          dddCopyScreenBuffer2Logbase();
  313.       }
  314.       else
  315.       {
  316.          if(dohorizon)
  317.          {
  318.             dddHorizon(vx,vz);
  319.             dddDotGrid();
  320.          }
  321.          else
  322.             if(doHoriFade)
  323.             {
  324.                dddHoriFade(vx,vz);
  325.             }
  326.             else
  327.             {
  328.                dddCls();
  329.             }
  330.       }
  331.       dddDrawObjects();
  332.  
  333.       if(showinfo)
  334.       {
  335.          DisplayInfo();
  336.       }
  337.    }while(!done);
  338.  
  339.  
  340.    dddClose3d();
  341.    dddRestoreKeybd();
  342.    dddRestoreVideo();
  343. }
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362. void DisplayInfo(void)
  363. {
  364. // ┌─────────────────────────────────────────────────────────────────┐
  365. // │                                                                                         │
  366. // │ Print the shape's position.                                                    │
  367. // │                                                                                         │
  368. // └─────────────────────────────────────────────────────────────────┘
  369.  
  370.    sprintf(work,"SHAPE POSN: X=%d Y=%d Z=%d",x,y,z);
  371.    dddGamePrint5(msgcol,0,0,work);
  372.  
  373. // ┌─────────────────────────────────────────────────────────────────┐
  374. // │                                                                                         │
  375. // │ Print the camera's Z distance.                                                │
  376. // │                                                                                         │
  377. // └─────────────────────────────────────────────────────────────────┘
  378.  
  379.    sprintf(work,"CAMERA DIST = %d",vdist);
  380.    dddGamePrint5(msgcol,19,191,work);
  381.  
  382. // ┌─────────────────────────────────────────────────────────────────┐
  383. // │                                                                                         │
  384. // │ Print the current Semaphore values.                                        │
  385. // │                                                                                         │
  386. // └─────────────────────────────────────────────────────────────────┘
  387.  
  388.    GetBits(temp1_flags,8);
  389.    sprintf(work,"SEMS = %s %3d",bitstring,temp1_flags);
  390.    dddGamePrint5(msgcol,180,10,work);
  391.  
  392. }
  393.  
  394.  
  395.  
  396. //─────────────────────────────────────────────────────────────────────────
  397. // GetBits
  398. //─────────────────────────────────────────────────────────────────────────
  399.  
  400. void GetBits(unsigned short n,char bits)
  401. {
  402. char *p;
  403.    p = &bitstring[bits];
  404.    *p-- = 0;
  405.    while(bits)
  406.    {
  407.       *p-- = (n & 1) ? '*' : '.';
  408.       n >>= 1;
  409.       --bits;
  410.    }
  411. }
  412.  
  413. //─────────────────────────────────────────────────────────────────────────
  414. // Is Full Path -- return true if filename is a full path
  415. //─────────────────────────────────────────────────────────────────────────
  416.  
  417. char IsFullPath(char *fname)
  418. {
  419. char drive[_MAX_DRIVE];
  420. char dir[_MAX_DIR];
  421. char file[_MAX_FNAME];
  422. char ext[_MAX_EXT];
  423.  
  424.    _splitpath(fname,drive,dir,file,ext);
  425.    if(drive[0] || dir[0])
  426.    {
  427.       return(TRUE);
  428.    }
  429.    return(FALSE);
  430. }
  431.  
  432. //─────────────────────────────────────────────────────────────────────────
  433. // Continuous Rotation
  434. //─────────────────────────────────────────────────────────────────────────
  435.  
  436. void ContinuousRotation()
  437. {
  438.       vx += Xrotspeed;
  439.       vy += Yrotspeed;
  440.       vz += Zrotspeed;
  441.  
  442.       dddMouseGetRelPointerXy(&mx,&my);
  443.       if(dddMouseGetButtons() & 1)
  444.       {
  445.          vx += my << 4;
  446.          vy += mx << 4;
  447.       }
  448.       else
  449.       {
  450.          vdist += my;
  451.       }
  452.       dddLookAt16(x,y,z,vx,vy,vz,vdist);
  453. }
  454.  
  455. //─────────────────────────────────────────────────────────────────────────
  456. // mouse controls viewer
  457. //─────────────────────────────────────────────────────────────────────────
  458.  
  459. void MouseControlsViewer()
  460. {
  461.    dddMouseGetRelPointerXy(&mx,&my);
  462.    if(dddMouseGetButtons() & 2)
  463.    {
  464.       x += mx>>2;
  465.       y += my>>2;
  466.       dddLookAt16(0,0,0,vx,vy,vz,vdist);
  467.    }
  468.    else
  469.    {
  470.       if(dddMouseGetButtons() & 1)
  471.       {
  472.          vx += my << 6;
  473.          vy += mx << 6;
  474.       }
  475.       else
  476.       {
  477.          vdist += my;
  478.       }
  479.       dddLookAt16(0,0,0,vx,vy,vz,vdist);
  480.    }
  481. }
  482.  
  483. //─────────────────────────────────────────────────────────────────────────
  484. // mouse controls object
  485. //─────────────────────────────────────────────────────────────────────────
  486.  
  487. void MouseControlsObject()
  488. {
  489. int b;
  490.    dddMouseGetRelPointerXy(&mx,&my);
  491.    b = dddMouseGetButtons();
  492.    if(b)
  493.    {
  494.       if(b & 1)
  495.       {
  496.          x += mx << 4;
  497.          y -= my << 4;
  498.       }
  499.       else
  500.       {
  501.          z += my << 4;
  502.       }
  503.    }
  504.    else
  505.    {
  506.       temp1_ax += my << 4;
  507.       temp1_ay += mx << 4;
  508.    }
  509.    dddSetViewAngles(0,0,0);
  510.    dddSetViewPos16(0,0,0);
  511. }
  512.  
  513. //─────────────────────────────────────────────────────────────────────────
  514. // Finish
  515. //─────────────────────────────────────────────────────────────────────────
  516.  
  517. void Finish()
  518. {
  519.    done = 1;
  520. }
  521.  
  522. //─────────────────────────────────────────────────────────────────────────
  523. // NextControlMethod
  524. //─────────────────────────────────────────────────────────────────────────
  525.  
  526. void NextControlMethod()
  527. {
  528.    NewMessage("CONTINUOUS ROTATION ON");
  529.  
  530.    if(!control_table[++control_num])
  531.    {
  532.       control_num = 0;
  533.       NewMessage("CONTINUOUS ROTATION OFF");
  534.    }
  535.    control_route = control_table[control_num];
  536. }
  537.  
  538. //─────────────────────────────────────────────────────────────────────────
  539. // ToggleHorizon
  540. //─────────────────────────────────────────────────────────────────────────
  541.  
  542. void ToggleHorizon()
  543. {
  544.    if    (doHoriFade)
  545.    {
  546.       doHoriFade = ~doHoriFade;
  547.       NewMessage("HORIZON OFF");
  548.  
  549.    }
  550.    else
  551.    {
  552.       if (!dohorizon)
  553.       {
  554.          dohorizon = ~dohorizon;
  555.          NewMessage("NORMAL HORIZON ON");
  556.       }
  557.       else
  558.       {
  559.          doHoriFade = ~doHoriFade;
  560.          dohorizon = ~dohorizon;
  561.          NewMessage("BANDED HORIZON ON");
  562.       }    
  563.    }
  564. }
  565.  
  566. //─────────────────────────────────────────────────────────────────────────
  567. // ToggleInfo
  568. //─────────────────────────────────────────────────────────────────────────
  569.  
  570. void ToggleInfo()
  571. {
  572.    showinfo = ~showinfo;
  573. }
  574.  
  575.  
  576. //─────────────────────────────────────────────────────────────────────────
  577. // GrabScreen -- grab the current screen + use as a backdrop
  578. //─────────────────────────────────────────────────────────────────────────
  579.  
  580. void GrabScreen(void)
  581. {
  582.    if (grab_screen_flag==0)
  583.    {
  584.       if(!back_screen)
  585.       {
  586.          back_screen = ~back_screen;
  587.       }
  588.       grab_screen_flag=1;
  589.    }
  590.    dddCopyLogbase2ScreenBuffer();
  591.    dddSetLogbase2ScreenBuffer();
  592. }
  593.  
  594. //─────────────────────────────────────────────────────────────────────────
  595. // ToggleDrawModes -- toggle same color /line color /normal
  596. //─────────────────────────────────────────────────────────────────────────
  597.  
  598.  
  599. void ToggleDrawModes()
  600. {
  601.    if    (sameon)
  602.    {
  603.       sameon = ~sameon;
  604.       dddLineOff();
  605.       dddSameOff();
  606.       NewMessage("NORMAL DRAWING MODES");
  607.    }
  608.    else
  609.    {
  610.       if    (!outline)
  611.       {
  612.          outline = ~outline;
  613.          dddSameOff();
  614.          dddLineOn(msgcol);
  615.          NewMessage("LINE DRAWING ON");
  616.       }
  617.       else
  618.       {
  619.          sameon = ~sameon;
  620.          outline = ~outline;
  621.          dddLineOff();
  622.          dddSameOn(255);
  623.          NewMessage("MASK DRAWING ON");
  624.       }
  625.    }
  626. }
  627.  
  628. //─────────────────────────────────────────────────────────────────────────
  629. // ToggleSame -- toggle same color on/off
  630. //─────────────────────────────────────────────────────────────────────────
  631.  
  632. void ToggleSame()
  633. {
  634.    if((sameon = ~sameon) != 0)
  635.       dddSameOn(255);
  636.    else
  637.       dddSameOff();
  638. }
  639.  
  640. //─────────────────────────────────────────────────────────────────────────
  641. // ToggleLine -- toggle line on/off
  642. //─────────────────────────────────────────────────────────────────────────
  643.  
  644. void ToggleLine()
  645. {
  646.    if((outline = ~outline) != 0)
  647.       dddLineOn(msgcol);
  648.    else
  649.       dddLineOff();
  650. }
  651.  
  652. //─────────────────────────────────────────────────────────────────────────
  653. // Display key help
  654. //─────────────────────────────────────────────────────────────────────────
  655.  
  656. void KeyHelp()
  657. {
  658. int  i,j;
  659.    i = 0;
  660.    do{
  661.       j = 0;
  662.       dddCls();
  663.       do{
  664.          dddPrint7(msgcol,5,j<<3,keytable[i].name);
  665.          dddGamePrint5(msgcol,90,j<<3,keytable[i].help);
  666.       }while(keytable[++i].key && ((++j) < 25));
  667.       dddScreenSwap();
  668.       dddkeycode = 0;
  669.       while( dddkeycode ==0);        // wait for key before continuing
  670.       dddkeycode = 0;
  671.    }while(keytable[i].key && j>=25);
  672. }
  673.  
  674. //─────────────────────────────────────────────────────────────────────────
  675. // ToggleSem
  676. //─────────────────────────────────────────────────────────────────────────
  677.  
  678. void ZeroSem()
  679. {
  680.    *flags = 0;
  681. }
  682.  
  683. void IncSem()
  684. {
  685.    (*flags)++;
  686. }
  687.  
  688. void DecSem()
  689. {
  690.    (*flags)--;
  691. }
  692.  
  693. void ToggleSem1()
  694. {
  695.    *flags ^= 1;
  696. }
  697.  
  698. void ToggleSem2()
  699. {
  700.    *flags ^= 2;
  701. }
  702.  
  703. void ToggleSem3()
  704. {
  705.    *flags ^= 4;
  706. }
  707.  
  708. void ToggleSem4()
  709. {
  710.    *flags ^= 8;
  711. }
  712.  
  713. void ToggleSem5()
  714. {
  715.    *flags ^= 16;
  716. }
  717.  
  718. void ToggleSem6()
  719. {
  720.    *flags ^= 32;
  721. }
  722.  
  723. void ToggleSem7()
  724. {
  725.    *flags ^= 64;
  726. }
  727.  
  728. void ToggleSem8()
  729. {
  730.    *flags ^= 128;
  731. }
  732.  
  733.  
  734. //─────────────────────────────────────────────────────────────────────────
  735. // ResetViewer -- Reset the viewed shape to the centre pos and angles
  736. //─────────────────────────────────────────────────────────────────────────
  737.  
  738. void ResetViewer(void)
  739. {
  740.    vx=0;
  741.    vy=0;
  742.    x=0;
  743.    y=0;
  744.    temp1_ax = 0;
  745.    temp1_ay = 0;
  746.    temp1_az = 0;
  747.    vz = 0;
  748.    z = 0;
  749.    vdist = 1000;
  750.    Xrotspeed=0x80;
  751.    Yrotspeed=0x120;
  752.    Zrotspeed=0;
  753. }
  754.  
  755. // ┌──────────────────────────────────────┐
  756. // │ NewMessage                                    │
  757. // │                                                     │
  758. // │         Displays the new message for        │
  759. // │         50 frames.                                │
  760. // │                                                     │
  761. // └──────────────────────────────────────┘
  762.  
  763. void  NewMessage(char *message)
  764. {
  765.       strcpy(message_string,message);
  766.       message_countdown=50;
  767. }
  768.