home *** CD-ROM | disk | FTP | other *** search
/ Cutting-Edge 3D Game Programming with C++ / CE3DC++.ISO / BOOK / CHAP03 / EXTRA / POLYDEMO.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-24  |  8.7 KB  |  264 lines

  1. //
  2. // File name: PolyDemo.CPP
  3. //
  4. // Description: The main section for a polygon demonstration
  5. //
  6. // Author: John De Goes
  7. //
  8. // Project: Cutting Edge 3D Game Programming
  9. //
  10.  
  11. // ------------------------------------------------------------
  12. // | Global Include Files:                                    |
  13. // ------------------------------------------------------------
  14.  
  15. #include <Dos.h>
  16. #include <Math.h>
  17. #include <Time.h>
  18. #include <Conio.h>
  19. #include <Iostream.h>
  20.  
  21. // ------------------------------------------------------------
  22. // | Local Include Files:                                     |
  23. // ------------------------------------------------------------
  24.  
  25. #include "32Bit.hpp"
  26. #include "3DClass.hpp"
  27. #include "MouseLib.hpp"
  28.  
  29. // ------------------------------------------------------------
  30. // | Global variables/constants                               |
  31. // ------------------------------------------------------------
  32.  
  33. // ------------------------------------------------------------
  34. // | Local classes/structs                                    |
  35. // ------------------------------------------------------------
  36.  
  37. // ------------------------------------------------------------
  38. // | Function section                                         |
  39. // ------------------------------------------------------------
  40.  
  41. // Function designed to emulate a track-ball:
  42. void UpdatePos ( MousePtr &Mouse, int &XRot, int &YRot, int &ZRot, double &ZPos )
  43.    {
  44.    // Get the mouse coordinates and map them to a suitable
  45.    // range:
  46.    int X = -( Mouse.GetX () - 50 ) >> 2;
  47.    int Y = -( Mouse.GetY () - 50 ) >> 2;
  48.  
  49.    // If the left button is pressed:
  50.    if ( ( Mouse.GetLb () ) && ( !Mouse.GetRb () ) )
  51.       {
  52.       // Do the rotations:
  53.       XRot += Y;
  54.       YRot += X;
  55.       }
  56.  
  57.    // Else if the right button is pressed:   
  58.    else if ( ( Mouse.GetRb () ) && ( ! Mouse.GetLb () ) )
  59.            {
  60.            ZPos += ( double ) Y / -100.0F;
  61.            ZRot += X;
  62.            }
  63.    }
  64.  
  65. void FindExtents ( TriangleWorld &World, double &Xa, 
  66.                     double &Ya, double &Za )
  67.    {
  68.    double TotalX = 0, TotalY = 0, TotalZ = 0;
  69.    unsigned int VertexCount = 0;
  70.    for ( unsigned int TCount = 0; TCount < World.TriCount; TCount++ )
  71.        {
  72.        TotalX += World.World [ TCount ].VPoint [ 0 ].Wx;
  73.        TotalY += World.World [ TCount ].VPoint [ 0 ].Wy;
  74.        TotalZ += World.World [ TCount ].VPoint [ 0 ].Wz;
  75.        TotalX += World.World [ TCount ].VPoint [ 1 ].Wx;
  76.        TotalY += World.World [ TCount ].VPoint [ 1 ].Wy;
  77.        TotalZ += World.World [ TCount ].VPoint [ 1 ].Wz;
  78.        TotalX += World.World [ TCount ].VPoint [ 2 ].Wx;
  79.        TotalY += World.World [ TCount ].VPoint [ 2 ].Wy;
  80.        TotalZ += World.World [ TCount ].VPoint [ 2 ].Wz;
  81.        VertexCount += 3;
  82.        }
  83.    Xa = TotalX / ( double ) VertexCount;
  84.    Ya = TotalY / ( double ) VertexCount;
  85.    Za = TotalZ / ( double ) VertexCount;
  86.    }
  87.    
  88. // ------------------------------------------------------------
  89. // | Program entry                                            |
  90. // ------------------------------------------------------------
  91.  
  92. void main ()
  93.    {
  94.    MousePtr Mouse;
  95.    TriangleWorld World;
  96.    Matrix3D M;
  97.    int YRot = 0, XRot = 0, ZRot = 0; 
  98.    double Xt = 0, Yt = 0, Zt = 0, ZPos;
  99.    unsigned long Ticks = 0, StartTime, TotalTime;
  100.    unsigned char *Buffer1, *VidMem;
  101.    
  102.    // Create an image of a cross for the mouse:
  103.    unsigned char Cursor [ 1000 ] = {
  104.                         0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0,
  105.                         0, 0, 0, 0, 0,18,18, 0, 0, 0, 0, 0,
  106.                         0, 0, 0, 0, 0,19,19, 0, 0, 0, 0, 0,
  107.                         0, 0, 0, 0, 0,20,20, 0, 0, 0, 0, 0,
  108.                         0, 0, 0, 0, 0,21,21, 0, 0, 0, 0, 0,
  109.                         17,18,19,20,21,22,22,21,20,19,18,17,
  110.                         17,18,19,20,21,22,22,21,20,19,18,17,
  111.                         0, 0, 0, 0, 0,21,21, 0, 0, 0, 0, 0,
  112.                         0, 0, 0, 0, 0,20,20, 0, 0, 0, 0, 0,
  113.                         0, 0, 0, 0, 0,19,19, 0, 0, 0, 0, 0,
  114.                         0, 0, 0, 0, 0,18,18, 0, 0, 0, 0, 0,
  115.                         0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0,
  116.                         };
  117.                                      
  118.    // Allocate buffer memory:
  119.    Buffer1 = new unsigned char [ 64000 ];
  120.    // Check for error:
  121.    if ( !Buffer1 )
  122.       {
  123.       cout << "\nNot enough memory to run application\n";
  124.       return;
  125.       }
  126.  
  127.    // Get the video address:   
  128.    VidMem = VideoAddress ();
  129.    
  130.    // Tell them what were doing:
  131.    cout << "\nAttempting to load database...";
  132.    
  133.    // Load a complete virtual world in one line of code:
  134.    if ( !World.Load ( "Test.raw" ) )
  135.       {
  136.       cout << "\nError Loading Test.RAW\n";
  137.       cout << "Press any key to continue...";
  138.       getch ();
  139.       return;
  140.       }
  141.  
  142.    // Find the extents of the file we just loaded:
  143.    FindExtents ( World, Xt, Yt, Zt );
  144.       
  145.    // Initialize the mouse driver:
  146.    Mouse.Init ();
  147.  
  148.    // Hide the pointer:   
  149.    Mouse.Hide ();
  150.  
  151.    // Set remap the cursor's coordinates:
  152.    Mouse.MappingRange ( 100, 100 ); // Map the cursor to a 100x100
  153.                                     // matrix
  154.    // Clip the cursor to a rectangular region:
  155.    Mouse.Clip ( 5, 5, 95, 95 );
  156.  
  157.  
  158.    // Give the cursor a face-lift:
  159.    Mouse.ChangeCursor ( Cursor, 12, 12 );
  160.  
  161.    // Set the video mode to 13h:
  162.    SetVideo ( 0x13 );
  163.    
  164.    // Record the current time so we can calculate the
  165.    // frame rate:
  166.    StartTime = clock ();
  167.  
  168.    while ( !kbhit() ) // Loop until keyboard is hit...
  169.          {
  170.          // Clear buffer1 (the screen buffer) - writes four pixels
  171.          // with each line of code:
  172.          register unsigned long *Buf1Ptr = ( unsigned long * ) Buffer1;
  173.          for ( unsigned short N = 0; N < 1000u; N++ )
  174.              {
  175.              *Buf1Ptr++ = 0ul;
  176.              *Buf1Ptr++ = 0ul;
  177.              *Buf1Ptr++ = 0ul;
  178.              *Buf1Ptr++ = 0ul;
  179.              *Buf1Ptr++ = 0ul;
  180.              *Buf1Ptr++ = 0ul;
  181.              *Buf1Ptr++ = 0ul;
  182.              *Buf1Ptr++ = 0ul;
  183.              *Buf1Ptr++ = 0ul;
  184.              *Buf1Ptr++ = 0ul;
  185.              *Buf1Ptr++ = 0ul;
  186.              *Buf1Ptr++ = 0ul;
  187.              *Buf1Ptr++ = 0ul;
  188.              *Buf1Ptr++ = 0ul;
  189.              *Buf1Ptr++ = 0ul;
  190.              *Buf1Ptr++ = 0ul;
  191.              }
  192.          
  193.          // Read the mouse position and adjust
  194.          // our variables appropriately:
  195.          UpdatePos ( Mouse, XRot, YRot, ZRot, ZPos );
  196.  
  197.          // Perform the matrix math:
  198.          M.Initialize ();
  199.          // Translate object to origin:
  200.          M.Translate ( -Xt, -Yt, -Zt );
  201.          // Rotate object:
  202.          M.Rotate ( XRot, YRot, ZRot );
  203.          // Translate back to previous position plus the Z 
  204.          // offset:
  205.          M.Translate ( Xt, Yt, Zt + ZPos );
  206.          // Find the new extents of the object:
  207.          FindExtents ( World, Xt, Yt, Zt );
  208.  
  209.          // Set the rotation values to zero:
  210.          ZRot = XRot = YRot = 0.0F;
  211.          // Do the same with the ZPos variable:
  212.          ZPos = 0.0F;
  213.          
  214.          // Transform and display the world(two lines of code!):
  215.          World.Transform ( M );
  216.          World.Display ( Buffer1 );
  217.          
  218.          // Display the mouse:
  219.          Mouse.Display ( Buffer1 );
  220.  
  221.          // Copy the buffer to the screen - writes four pixels
  222.          // with each line of C code:
  223.          register unsigned long *VidPtr = ( unsigned long * ) VidMem;
  224.          register unsigned long *BufPtr = ( unsigned long * ) Buffer1;
  225.          for ( N = 0; N < 1000u; N++ )
  226.              {
  227.              *VidPtr++ = *BufPtr++;
  228.              *VidPtr++ = *BufPtr++;
  229.              *VidPtr++ = *BufPtr++;
  230.              *VidPtr++ = *BufPtr++;
  231.              *VidPtr++ = *BufPtr++;
  232.              *VidPtr++ = *BufPtr++;
  233.              *VidPtr++ = *BufPtr++;
  234.              *VidPtr++ = *BufPtr++;
  235.              *VidPtr++ = *BufPtr++;
  236.              *VidPtr++ = *BufPtr++;
  237.              *VidPtr++ = *BufPtr++;
  238.              *VidPtr++ = *BufPtr++;
  239.              *VidPtr++ = *BufPtr++;
  240.              *VidPtr++ = *BufPtr++;
  241.              *VidPtr++ = *BufPtr++;
  242.              *VidPtr++ = *BufPtr++;
  243.              }
  244.  
  245.          // Increment the number of frames:    
  246.          ++Ticks;
  247.          }
  248.          
  249.    getch ();
  250.  
  251.    // Calculate elapsed time:
  252.    TotalTime = clock () - StartTime;
  253.    
  254.    // Set the video mode to text mode:
  255.    SetVideo ( 0x03 );
  256.  
  257.    // Unlock used memory:
  258.    delete [] Buffer1;
  259.    
  260.    // Tell the user the frame rate:
  261.    cout << "Frames per second = " << ( ( double ) Ticks * 
  262.                                        ( double ) CLK_TCK / 
  263.                                        ( double ) TotalTime );
  264.    }