home *** CD-ROM | disk | FTP | other *** search
/ Learn 3D Graphics Programming on the PC / Learn_3D_Graphics_Programming_on_the_PC_Ferraro.iso / rwdos / man.c < prev    next >
C/C++ Source or Header  |  1995-02-15  |  6KB  |  203 lines

  1. /**********************************************************************
  2.  *
  3.  * File :     man.c
  4.  *
  5.  * Abstract : This is the module of the cyberstreet demo that handles 
  6.  *            the animated figure seen walking in the pool room.
  7.  *
  8.  **********************************************************************
  9.  *
  10.  * This file is a product of Criterion Software Ltd.
  11.  *
  12.  * This file is provided as is with no warranties of any kind and is
  13.  * provided without any obligation on Criterion Software Ltd. or
  14.  * Canon Inc. to assist in its use or modification.
  15.  *
  16.  * Criterion Software Ltd. will not, under any
  17.  * circumstances, be liable for any lost revenue or other damages arising
  18.  * from the use of this file.
  19.  *
  20.  * Copyright (c) 1995 Criterion Software Ltd.
  21.  * All Rights Reserved.
  22.  *
  23.  * RenderWare is a trademark of Canon Inc.
  24.  *
  25.  ************************************************************************/
  26.  
  27.  
  28. /**********************************************************************
  29.  *
  30.  * Include Files
  31.  *
  32.  **********************************************************************/
  33.  
  34. /* Standard include files */
  35.  
  36. #include "global.h"
  37. #include "animate.h"
  38.  
  39. /*--- Macros and Magic Number definitions */
  40.  
  41. #define MAN_HEIGHT      CREAL(0.12)  /* Absolute height to position the man's
  42.                                         origin */
  43.  
  44. #define MAN_SCALE       CREAL(0.8)   /* Scale factor to apply to man */
  45. #define MAN_RADIUS      CREAL(0.6)   /* Radius of circle that man walks 
  46.                                         around */
  47.  
  48. #define MAN_CENTRE_X    CREAL(5.0)   /* Centre of circle */
  49. #define MAN_CENTRE_Y    MAN_HEIGHT  
  50. #define MAN_CENTRE_Z    CREAL(5.0)  
  51.  
  52. #define MAN_ROTATE      CREAL(3.0)   /* Man moves 3 degrees round circle 
  53.                                         every frame */
  54.  
  55. /*--- Structure Definitions ---*/
  56.  
  57. /* Man: This structure defines the walking Man figure */
  58.  
  59. typedef struct 
  60. {
  61.     RwClump *cpMan;       /* The RenderWare clump object for the man */
  62.     RwV3d vCentre;        /* The centre of the circle that the man walks 
  63.                              around */
  64.     RwMatrix4d *mpPos;    /* The absolute position matrix for the man */
  65.     RwMatrix4d *mpRot;    /* The increment that is added to mpPos each 
  66.                              frame */
  67. } Man;
  68.  
  69. /*--- Global Variables ---*/
  70.  
  71. static Man mGMan;                /* The man in the Pool Room */
  72.  
  73. /*--- Function Definitions ---*/
  74.  
  75. /************************************************************************
  76.  *
  77.  *      Function:       ManSetup()
  78.  *                      
  79.  *      Description:    Initialise the global Man data structure
  80.  *
  81.  *      Return Value:   TRUE on success, FALSE on failure
  82.  *
  83.  ************************************************************************/
  84. int ManSetup(void)
  85. {
  86.     /* Read the RenderWare script file */
  87.  
  88.     if (!(mGMan.cpMan = RwReadShape("chappy.rwx"))) 
  89.     {
  90.         /* Error - Failed to load RenderWare script file */
  91.         return FALSE;
  92.     }
  93.  
  94.     /* Add the man to the poolroom scene */
  95.  
  96.     RwAddClumpToScene(spGPoolScene, mGMan.cpMan);
  97.  
  98.     /* Load the animation data file */
  99.  
  100.     if (!(LoadAnimation(mGMan.cpMan, ".\\chappy.rwv"))) 
  101.     {
  102.         /* Error - failed to load animation */
  103.         return FALSE;
  104.     }
  105.  
  106.     /* Create the incremental rotation matrix. This matrix is postconcated
  107.        to the absolute position matrix on each frame to advance the position
  108.        of the man */
  109.  
  110.     if (!(mGMan.mpRot = RwCreateMatrix())) 
  111.     {
  112.         /* Error - failed to create RenderWare matrix object */
  113.         return FALSE;
  114.     }
  115.     RwRotateMatrix(mGMan.mpRot, CREAL(0.0), CREAL(1.0), CREAL(0.0), 
  116.                    MAN_ROTATE, rwREPLACE);
  117.  
  118.  
  119.     if (!(mGMan.mpPos = RwCreateMatrix())) 
  120.     {
  121.         /* Error - failed to create RenderWare matrix object */
  122.         return FALSE;
  123.     }
  124.     RwIdentityMatrix(mGMan.mpPos);
  125.  
  126.     mGMan.vCentre.x = MAN_CENTRE_X;
  127.     mGMan.vCentre.y = MAN_CENTRE_Y;
  128.     mGMan.vCentre.z = MAN_CENTRE_Z;
  129.  
  130.     return TRUE;
  131. }
  132.  
  133. /************************************************************************
  134.  *
  135.  *      Function:       ManDestroy()
  136.  *                      
  137.  *      Description:    Destroy the global Man data structure
  138.  *
  139.  ************************************************************************/
  140. void ManDestroy(void)
  141. {
  142.     DestroyAnimation(mGMan.cpMan);  /* Destroy animation data attached to 
  143.                                        clump */
  144.     RwDestroyClump(mGMan.cpMan);    /* Destroy RenderWare clump object */
  145.  
  146.     RwDestroyMatrix(mGMan.mpRot);     /* Destroy RenderWare matrices */
  147.     RwDestroyMatrix(mGMan.mpPos);
  148.  
  149. }
  150.  
  151. /************************************************************************
  152.  *
  153.  *      Function:       ManUpdate()
  154.  *                      
  155.  *      Description:    Called every frame to update the mans position
  156.  *
  157.  ************************************************************************/
  158. void ManUpdate(void)
  159. {
  160.     RwV3d vPos;
  161.  
  162.     /* Apply the next frame of animation */
  163.  
  164.     RwForAllClumpsInHierarchy(mGMan.cpMan, AnimateClump);
  165.  
  166.     /* Postconcat the incremental rotation onto the absolute position */
  167.  
  168.     RwTransformMatrix(mGMan.mpPos, mGMan.mpRot, rwPOSTCONCAT);
  169.  
  170.     /* Ensure the matrix stays orthonormal. */
  171.  
  172.     RwOrthoNormalizeMatrix(mGMan.mpPos, mGMan.mpPos);
  173.  
  174.     RwCopyMatrix(mGMan.mpPos, RwScratchMatrix());
  175.     RwScaleMatrix(RwScratchMatrix(),
  176.            MAN_SCALE, MAN_SCALE, MAN_SCALE, rwPOSTCONCAT);
  177.     RwTransformClumpJoint(mGMan.cpMan, RwScratchMatrix(), rwREPLACE);
  178.  
  179.     /* Set up default radius vector */
  180.     vPos.x = -MAN_RADIUS;
  181.     vPos.y = CREAL(0.0);
  182.     vPos.z = CREAL(0.0);
  183.  
  184.     /* Rotate the vector by the absolute rotation matrix */
  185.  
  186.     RwTransformVector(&vPos, mGMan.mpPos);
  187.  
  188.     /* and add the vector to the circle's centre to get the absolute
  189.        position for the man */
  190.  
  191.     RwAddVector(&vPos, &mGMan.vCentre, &vPos);
  192.  
  193.     /* Build a translation matrix to move the Man to this position */
  194.  
  195.     RwTranslateMatrix(RwScratchMatrix(),
  196.                       vPos.x, vPos.y, vPos.z,rwREPLACE);
  197.  
  198.     /* and apply the matrix to the Man's clump */    
  199.  
  200.     RwTransformClump(mGMan.cpMan, RwScratchMatrix(), rwREPLACE);
  201. }
  202.  
  203.