d3dutil.h
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:15k
源码类别:

游戏

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: D3DUtil.h
  3. //
  4. // Desc: Helper functions and typing shortcuts for Direct3D programming.
  5. //
  6. // Copyright (c) Microsoft Corporation. All rights reserved
  7. //-----------------------------------------------------------------------------
  8. #ifndef D3DUTIL_H
  9. #define D3DUTIL_H
  10. //-----------------------------------------------------------------------------
  11. // Name: D3DUtil_GetCubeMapViewMatrix()
  12. // Desc: Returns a view matrix for rendering to a face of a cubemap.
  13. //-----------------------------------------------------------------------------
  14. D3DXMATRIX D3DUtil_GetCubeMapViewMatrix( DWORD dwFace );
  15. //-----------------------------------------------------------------------------
  16. // Name: D3DUtil_GetRotationFromCursor()
  17. // Desc: Returns a quaternion for the rotation implied by the window's cursor
  18. //       position.
  19. //-----------------------------------------------------------------------------
  20. D3DXQUATERNION D3DUtil_GetRotationFromCursor( HWND hWnd,
  21.                                               FLOAT fTrackBallRadius=1.0f );
  22. //-----------------------------------------------------------------------------
  23. // Name: D3DUtil_SetDeviceCursor
  24. // Desc: Builds and sets a cursor for the D3D device based on hCursor.
  25. //-----------------------------------------------------------------------------
  26. HRESULT D3DUtil_SetDeviceCursor( LPDIRECT3DDEVICE9 pd3dDevice, HCURSOR hCursor,
  27.                                  BOOL bAddWatermark );
  28. //-----------------------------------------------------------------------------
  29. // Name: D3DUtil_D3DFormatToString
  30. // Desc: Returns the string for the given D3DFORMAT.
  31. //       bWithPrefix determines whether the string should include the "D3DFMT_"
  32. //-----------------------------------------------------------------------------
  33. LPCTSTR D3DUtil_D3DFormatToString( D3DFORMAT format, bool bWithPrefix = true );
  34. //-----------------------------------------------------------------------------
  35. // Name: class CD3DArcBall
  36. // Desc:
  37. //-----------------------------------------------------------------------------
  38. class CD3DArcBall
  39. {
  40. public:
  41.     CD3DArcBall();
  42.     // Functions to change behavior
  43.     void Reset(); 
  44.     VOID SetTranslationRadius( FLOAT fRadiusTranslation ) { m_fRadiusTranslation = fRadiusTranslation; }
  45.     void SetWindow( INT nWidth, INT nHeight, FLOAT fRadius = 0.9f ) { m_nWidth = nWidth; m_nHeight = nHeight; m_fRadius = fRadius; m_vCenter = D3DXVECTOR2(m_nWidth/2.0f,m_nHeight/2.0f); }
  46.     // Call these from client and use GetRotationMatrix() to read new rotation matrix
  47.     void OnBegin( int nX, int nY );  // start the rotation (pass current mouse position)
  48.     void OnMove( int nX, int nY );   // continue the rotation (pass current mouse position)
  49.     void OnEnd();                    // end the rotation 
  50.     // Or call this to automatically handle left, middle, right buttons
  51.     LRESULT     HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  52.     // Functions to get/set state
  53.     D3DXMATRIX* GetRotationMatrix() { return D3DXMatrixRotationQuaternion(&m_mRotation, &m_qNow); };
  54.     D3DXMATRIX* GetTranslationMatrix()      { return &m_mTranslation; }
  55.     D3DXMATRIX* GetTranslationDeltaMatrix() { return &m_mTranslationDelta; }
  56.     BOOL        IsBeingDragged()            { return m_bDrag; }
  57.     D3DXQUATERNION GetQuatNow()             { return m_qNow; }
  58.     void        SetQuatNow( D3DXQUATERNION q ) { m_qNow = q; }
  59. protected:
  60.     D3DXMATRIXA16  m_mRotation;         // Matrix for arc ball's orientation
  61.     D3DXMATRIXA16  m_mTranslation;      // Matrix for arc ball's position
  62.     D3DXMATRIXA16  m_mTranslationDelta; // Matrix for arc ball's position
  63.     INT            m_nWidth;   // arc ball's window width
  64.     INT            m_nHeight;  // arc ball's window height
  65.     D3DXVECTOR2    m_vCenter;  // center of arc ball 
  66.     FLOAT          m_fRadius;  // arc ball's radius in screen coords
  67.     FLOAT          m_fRadiusTranslation; // arc ball's radius for translating the target
  68.     D3DXQUATERNION m_qDown;             // Quaternion before button down
  69.     D3DXQUATERNION m_qNow;              // Composite quaternion for current drag
  70.     BOOL           m_bDrag;             // Whether user is dragging arc ball
  71.     POINT          m_ptLastMouse;      // position of last mouse point
  72.     D3DXVECTOR3    m_vDownPt;           // starting point of rotation arc
  73.     D3DXVECTOR3    m_vCurrentPt;        // current point of rotation arc
  74.     D3DXQUATERNION QuatFromBallPoints( const D3DXVECTOR3 &vFrom, const D3DXVECTOR3 &vTo );
  75.     D3DXVECTOR3    ScreenToVector( float fScreenPtX, float fScreenPtY );
  76. };
  77. //-----------------------------------------------------------------------------
  78. // Name: enum D3DUtil_CameraKeys 
  79. // Desc: used by CCamera to map WM_KEYDOWN keys
  80. //-----------------------------------------------------------------------------
  81. enum D3DUtil_CameraKeys
  82. {
  83.     CAM_STRAFE_LEFT = 0,
  84.     CAM_STRAFE_RIGHT,
  85.     CAM_MOVE_FORWARD,
  86.     CAM_MOVE_BACKWARD,
  87.     CAM_MOVE_UP,
  88.     CAM_MOVE_DOWN,
  89.     CAM_RESET,
  90.     CAM_MAX_KEYS,
  91.     CAM_UNKNOWN = 0xFF
  92. };
  93. #define KEY_WAS_DOWN_MASK 0x80
  94. #define KEY_IS_DOWN_MASK  0x01
  95. #define MOUSE_LEFT_BUTTON   0x01
  96. #define MOUSE_MIDDLE_BUTTON 0x02
  97. #define MOUSE_RIGHT_BUTTON  0x04
  98. #define MOUSE_WHEEL         0x08
  99. //-----------------------------------------------------------------------------
  100. // Name: class CBaseCamera
  101. // Desc: Simple base camera class that moves and rotates.  The base class
  102. //       records mouse and keyboard input for use by a derieved class, and 
  103. //       keeps common state.
  104. //-----------------------------------------------------------------------------
  105. class CBaseCamera
  106. {
  107. public:
  108.     CBaseCamera();
  109.     // Call these from client and use Get*Matrix() to read new matrices
  110.     virtual LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  111.     virtual VOID    FrameMove( FLOAT fElapsedTime ) = 0;
  112.     // Functions to change camera matrices
  113.     virtual void Reset(); 
  114.     VOID SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt );
  115.     VOID SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane, FLOAT fFarPlane );
  116.     // Functions to change behavior
  117.     VOID SetInvertPitch( bool bInvertPitch ) { m_bInvertPitch = bInvertPitch; }
  118.     VOID SetDrag( bool bMovementDrag, FLOAT fTotalDragTimeToZero = 0.25f ) { m_bMovementDrag = bMovementDrag; m_fTotalDragTimeToZero = fTotalDragTimeToZero; }
  119.     VOID SetEnableYAxisMovement( bool bEnableYAxisMovement ) { m_bEnableYAxisMovement = bEnableYAxisMovement; }
  120.     VOID SetEnablePositionMovement( bool bEnablePositionMovement ) { m_bEnablePositionMovement = bEnablePositionMovement; }
  121.     VOID SetClipToBoundary( bool bClipToBoundary, D3DXVECTOR3* pvMinBoundary, D3DXVECTOR3* pvMaxBoundary ) { m_bClipToBoundary = bClipToBoundary; if( pvMinBoundary ) m_vMinBoundary = *pvMinBoundary; if( pvMaxBoundary ) m_vMaxBoundary = *pvMaxBoundary; }
  122.     VOID SetScalers( FLOAT fRotationScaler = 0.01f, FLOAT fMoveScaler = 5.0f )  { m_fRotationScaler = fRotationScaler; m_fMoveScaler = fMoveScaler; }
  123.     VOID SetNumberOfFramesToSmoothMouseData( int nFrames ) { if( nFrames > 0 ) m_fFramesToSmoothMouseData = (float)nFrames; }
  124.     VOID SetResetCursorAfterMove( bool bResetCursorAfterMove ) { m_bResetCursorAfterMove = bResetCursorAfterMove; }
  125.     // Functions to get state
  126.     D3DXMATRIX*  GetViewMatrix()            { return &m_mView; }
  127.     D3DXMATRIX*  GetProjMatrix()            { return &m_mProj; }
  128.     bool IsBeingDragged() { return (m_bMouseLButtonDown || m_bMouseMButtonDown || m_bMouseRButtonDown); }
  129.     bool IsMouseLButtonDown() { return m_bMouseLButtonDown; } 
  130.     bool IsMouseMButtonDown() { return m_bMouseMButtonDown; } 
  131.     bool IsMouseRButtonDown() { return m_bMouseRButtonDown; } 
  132. protected:
  133.     // Functions to map a WM_KEYDOWN key to a D3DUtil_CameraKeys enum
  134.     virtual D3DUtil_CameraKeys MapKey( UINT nKey );    
  135.     BOOL IsKeyDown( BYTE key )  { return( (key & KEY_IS_DOWN_MASK) == KEY_IS_DOWN_MASK ); }
  136.     BOOL WasKeyDown( BYTE key ) { return( (key & KEY_WAS_DOWN_MASK) == KEY_WAS_DOWN_MASK ); }
  137.     void ConstrainToBoundary( D3DXVECTOR3* pV );
  138.     void UpdateMouseDelta( float fElapsedTime );
  139.     void UpdateVelocity( float fElapsedTime );
  140.     D3DXMATRIX            m_mView;              // View matrix 
  141.     D3DXMATRIX            m_mProj;              // Projection matrix
  142.     BYTE                  m_aKeys[CAM_MAX_KEYS];  // State of input - KEY_WAS_DOWN_MASK|KEY_IS_DOWN_MASK
  143.     POINT                 m_ptLastMousePosition;  // Last absolute postion of mouse cursor
  144.     bool                  m_bMouseLButtonDown;    // True if left button is down 
  145.     bool                  m_bMouseMButtonDown;    // True if middle button is down 
  146.     bool                  m_bMouseRButtonDown;    // True if right button is down 
  147.     int                   m_nCurrentButtonMask;   // mask of which buttons are down
  148.     int                   m_nMouseWheelDelta;     // Amount of middle wheel scroll (+/-) 
  149.     D3DXVECTOR2           m_vMouseDelta;          // Mouse relative delta smoothed over a few frames
  150.     float                 m_fFramesToSmoothMouseData; // Number of frames to smooth mouse data over
  151.     D3DXVECTOR3           m_vDefaultEye;          // Default camera eye position
  152.     D3DXVECTOR3           m_vDefaultLookAt;       // Default LookAt position
  153.     D3DXVECTOR3           m_vEye;                 // Camera eye position
  154.     D3DXVECTOR3           m_vLookAt;              // LookAt position
  155.     float                 m_fCameraYawAngle;      // Yaw angle of camera
  156.     float                 m_fCameraPitchAngle;    // Pitch angle of camera
  157.     D3DXVECTOR3           m_vVelocity;            // Velocity of camera
  158.     bool                  m_bMovementDrag;        // If true, then camera movement will slow to a stop otherwise movement is instant
  159.     D3DXVECTOR3           m_vVelocityDrag;        // Velocity drag force
  160.     FLOAT                 m_fDragTimer;           // Countdown timer to apply drag
  161.     FLOAT                 m_fTotalDragTimeToZero; // Time it takes for velocity to go from full to 0
  162.     D3DXVECTOR2           m_vRotVelocity;         // Velocity of camera
  163.     float                 m_fFOV;                 // Field of view
  164.     float                 m_fAspect;              // Aspect ratio
  165.     float                 m_fNearPlane;           // Near plane
  166.     float                 m_fFarPlane;            // Far plane
  167.     float                 m_fRotationScaler;      // Scaler for rotation
  168.     float                 m_fMoveScaler;          // Scaler for movement
  169.     bool                  m_bInvertPitch;         // Invert the pitch axis
  170.     bool                  m_bEnablePositionMovement; // If true, then the user can translate the camera/model 
  171.     bool                  m_bEnableYAxisMovement; // If true, then camera can move in the y-axis
  172.     bool                  m_bClipToBoundary;      // If true, then the camera will be clipped to the boundary
  173.     D3DXVECTOR3           m_vMinBoundary;         // Min point in clip boundary
  174.     D3DXVECTOR3           m_vMaxBoundary;         // Max point in clip boundary
  175.     bool                  m_bResetCursorAfterMove;// If true, the class will reset the cursor position so that the cursor always has space to move 
  176. };
  177. //-----------------------------------------------------------------------------
  178. // Name: class CFirstPersonCamera
  179. // Desc: Simple first person camera class that moves and rotates.
  180. //       It allows yaw and pitch but not roll.  It uses WM_KEYDOWN and 
  181. //       GetCursorPos() to respond to keyboard and mouse input and updates the 
  182. //       view matrix based on input.  
  183. //-----------------------------------------------------------------------------
  184. class CFirstPersonCamera : public CBaseCamera
  185. {
  186. public:
  187.     CFirstPersonCamera();
  188.     // Call these from client and use Get*Matrix() to read new matrices
  189.     virtual VOID FrameMove( FLOAT fElapsedTime );
  190.     // Functions to get state
  191.     D3DXVECTOR3  GetWorldRight()            { return D3DXVECTOR3( m_mCameraWorld._11, m_mCameraWorld._12, m_mCameraWorld._13 ); } 
  192.     D3DXVECTOR3  GetWorldUp()               { return D3DXVECTOR3( m_mCameraWorld._21, m_mCameraWorld._22, m_mCameraWorld._23 ); }
  193.     D3DXVECTOR3  GetWorldAhead()            { return D3DXVECTOR3( m_mCameraWorld._31, m_mCameraWorld._32, m_mCameraWorld._33 ); }
  194.     D3DXVECTOR3  GetEyePt()                 { return D3DXVECTOR3( m_mCameraWorld._41, m_mCameraWorld._42, m_mCameraWorld._43 ); }
  195. protected:
  196.     D3DXMATRIX m_mCameraWorld;       // World matrix of the camera (inverse of the view matrix)
  197. };
  198. //-----------------------------------------------------------------------------
  199. // Name: class CModelViewerCamera
  200. // Desc: 
  201. //-----------------------------------------------------------------------------
  202. class CModelViewerCamera : public CBaseCamera
  203. {
  204. public:
  205.     CModelViewerCamera();
  206.     // Call these from client and use Get*Matrix() to read new matrices
  207.     virtual LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  208.     virtual VOID FrameMove( FLOAT fElapsedTime );
  209.     // Functions to change behavior
  210.     void Reset(); 
  211.     VOID SetButtonMasks( int nRotateModelButtonMask = MOUSE_LEFT_BUTTON, int nZoomButtonMask = MOUSE_WHEEL, int nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON ) { m_nRotateModelButtonMask = nRotateModelButtonMask, m_nZoomButtonMask = nZoomButtonMask; m_nRotateCameraButtonMask = nRotateCameraButtonMask; }
  212.     VOID SetWindow( int nWidth, int nHeight, float fArcballRadius=0.9f ) { m_WorldArcBall.SetWindow( nWidth, nHeight, fArcballRadius ); m_ViewArcBall.SetWindow( nWidth, nHeight, fArcballRadius ); }
  213.     VOID SetRadius( float fDefaultRadius=5.0f, float fMinRadius=1.0f, float fMaxRadius=FLT_MAX  ) { m_fDefaultRadius = m_fRadius = fDefaultRadius; m_fMinRadius = fMinRadius; m_fMaxRadius = fMaxRadius; }
  214.     VOID SetModelCenter( D3DXVECTOR3 vModelCenter ) { m_vModelCenter = vModelCenter; }
  215.     VOID SetLimitPitch( bool bLimitPitch ) { m_bLimitPitch = bLimitPitch; }
  216.     VOID SetViewQuat( D3DXQUATERNION q ) { m_ViewArcBall.SetQuatNow( q ); }
  217.     VOID SetWorldQuat( D3DXQUATERNION q ) { m_WorldArcBall.SetQuatNow( q ); }
  218.     // Functions to get state
  219.     D3DXMATRIX* GetWorldMatrix() { return &m_mWorld; }
  220. protected:
  221.     CD3DArcBall  m_WorldArcBall;
  222.     CD3DArcBall  m_ViewArcBall;
  223.     D3DXVECTOR3  m_vModelCenter;
  224.     D3DXMATRIX   m_mModelLastRot;        // Last arcball rotation matrix for model 
  225.     D3DXMATRIX   m_mModelRot;            // Rotation matrix of model
  226.     D3DXMATRIX   m_mWorld;               // World matrix of model
  227.     int          m_nRotateModelButtonMask;
  228.     int          m_nZoomButtonMask;
  229.     int          m_nRotateCameraButtonMask;
  230.     bool         m_bLimitPitch;
  231.     float        m_fRadius;              // Distance from the camera to model 
  232.     float        m_fDefaultRadius;       // Distance from the camera to model 
  233.     float        m_fMinRadius;           // Min radius
  234.     float        m_fMaxRadius;           // Max radius
  235. };
  236. #endif