DXUTmisc.cpp
资源名称:Direct3D.rar [点击查看]
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:130k
源码类别:
DirextX编程
开发平台:
Visual C++
- //--------------------------------------------------------------------------------------
- // Clamps pV to lie inside m_vMinBoundary & m_vMaxBoundary
- //--------------------------------------------------------------------------------------
- void CBaseCamera::ConstrainToBoundary( D3DXVECTOR3* pV )
- {
- // Constrain vector to a bounding box
- pV->x = __max(pV->x, m_vMinBoundary.x);
- pV->y = __max(pV->y, m_vMinBoundary.y);
- pV->z = __max(pV->z, m_vMinBoundary.z);
- pV->x = __min(pV->x, m_vMaxBoundary.x);
- pV->y = __min(pV->y, m_vMaxBoundary.y);
- pV->z = __min(pV->z, m_vMaxBoundary.z);
- }
- //--------------------------------------------------------------------------------------
- // Maps a windows virtual key to an enum
- //--------------------------------------------------------------------------------------
- D3DUtil_CameraKeys CBaseCamera::MapKey( UINT nKey )
- {
- // This could be upgraded to a method that's user-definable but for
- // simplicity, we'll use a hardcoded mapping.
- switch( nKey )
- {
- case VK_CONTROL: return CAM_CONTROLDOWN;
- case VK_LEFT: return CAM_STRAFE_LEFT;
- case VK_RIGHT: return CAM_STRAFE_RIGHT;
- case VK_UP: return CAM_MOVE_FORWARD;
- case VK_DOWN: return CAM_MOVE_BACKWARD;
- case VK_PRIOR: return CAM_MOVE_UP; // pgup
- case VK_NEXT: return CAM_MOVE_DOWN; // pgdn
- case 'A': return CAM_STRAFE_LEFT;
- case 'D': return CAM_STRAFE_RIGHT;
- case 'W': return CAM_MOVE_FORWARD;
- case 'S': return CAM_MOVE_BACKWARD;
- case 'Q': return CAM_MOVE_DOWN;
- case 'E': return CAM_MOVE_UP;
- case VK_NUMPAD4: return CAM_STRAFE_LEFT;
- case VK_NUMPAD6: return CAM_STRAFE_RIGHT;
- case VK_NUMPAD8: return CAM_MOVE_FORWARD;
- case VK_NUMPAD2: return CAM_MOVE_BACKWARD;
- case VK_NUMPAD9: return CAM_MOVE_UP;
- case VK_NUMPAD3: return CAM_MOVE_DOWN;
- case VK_HOME: return CAM_RESET;
- }
- return CAM_UNKNOWN;
- }
- //--------------------------------------------------------------------------------------
- // Reset the camera's position back to the default
- //--------------------------------------------------------------------------------------
- VOID CBaseCamera::Reset()
- {
- SetViewParams( &m_vDefaultEye, &m_vDefaultLookAt );
- }
- //--------------------------------------------------------------------------------------
- // Constructor
- //--------------------------------------------------------------------------------------
- CFirstPersonCamera::CFirstPersonCamera() :
- m_nActiveButtonMask( 0x07 )
- {
- m_bRotateWithoutButtonDown = false;
- }
- //--------------------------------------------------------------------------------------
- // Update the view matrix based on user input & elapsed time
- //--------------------------------------------------------------------------------------
- VOID CFirstPersonCamera::FrameMove( FLOAT fElapsedTime )
- {
- if( DXUTGetGlobalTimer()->IsStopped() )
- fElapsedTime = 1.0f / DXUTGetFPS();
- if( IsKeyDown(m_aKeys[CAM_RESET]) )
- Reset();
- // Get keyboard/mouse/gamepad input
- GetInput( m_bEnablePositionMovement, (m_nActiveButtonMask & m_nCurrentButtonMask) || m_bRotateWithoutButtonDown, true, m_bResetCursorAfterMove );
- // Get amount of velocity based on the keyboard input and drag (if any)
- UpdateVelocity( fElapsedTime );
- // Simple euler method to calculate position delta
- D3DXVECTOR3 vPosDelta = m_vVelocity * fElapsedTime;
- // If rotating the camera
- if( (m_nActiveButtonMask & m_nCurrentButtonMask) ||
- m_bRotateWithoutButtonDown ||
- m_vGamePadRightThumb.x != 0 ||
- m_vGamePadRightThumb.z != 0 )
- {
- // Update the pitch & yaw angle based on mouse movement
- float fYawDelta = m_vRotVelocity.x;
- float fPitchDelta = m_vRotVelocity.y;
- // Invert pitch if requested
- if( m_bInvertPitch )
- fPitchDelta = -fPitchDelta;
- m_fCameraPitchAngle += fPitchDelta;
- m_fCameraYawAngle += fYawDelta;
- // Limit pitch to straight up or straight down
- m_fCameraPitchAngle = __max( -D3DX_PI/2.0f, m_fCameraPitchAngle );
- m_fCameraPitchAngle = __min( +D3DX_PI/2.0f, m_fCameraPitchAngle );
- }
- // Make a rotation matrix based on the camera's yaw & pitch
- D3DXMATRIX mCameraRot;
- D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, m_fCameraPitchAngle, 0 );
- // Transform vectors based on camera's rotation matrix
- D3DXVECTOR3 vWorldUp, vWorldAhead;
- D3DXVECTOR3 vLocalUp = D3DXVECTOR3(0,1,0);
- D3DXVECTOR3 vLocalAhead = D3DXVECTOR3(0,0,1);
- D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mCameraRot );
- D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mCameraRot );
- // Transform the position delta by the camera's rotation
- D3DXVECTOR3 vPosDeltaWorld;
- if( !m_bEnableYAxisMovement )
- {
- // If restricting Y movement, do not include pitch
- // when transforming position delta vector.
- D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, 0.0f, 0.0f );
- }
- D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot );
- // Move the eye position
- m_vEye += vPosDeltaWorld;
- if( m_bClipToBoundary )
- ConstrainToBoundary( &m_vEye );
- // Update the lookAt position based on the eye position
- m_vLookAt = m_vEye + vWorldAhead;
- // Update the view matrix
- D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp );
- D3DXMatrixInverse( &m_mCameraWorld, NULL, &m_mView );
- }
- //--------------------------------------------------------------------------------------
- // Enable or disable each of the mouse buttons for rotation drag.
- //--------------------------------------------------------------------------------------
- void CFirstPersonCamera::SetRotateButtons( bool bLeft, bool bMiddle, bool bRight, bool bRotateWithoutButtonDown )
- {
- m_nActiveButtonMask = ( bLeft ? MOUSE_LEFT_BUTTON : 0 ) |
- ( bMiddle ? MOUSE_MIDDLE_BUTTON : 0 ) |
- ( bRight ? MOUSE_RIGHT_BUTTON : 0 );
- m_bRotateWithoutButtonDown = bRotateWithoutButtonDown;
- }
- //--------------------------------------------------------------------------------------
- // Constructor
- //--------------------------------------------------------------------------------------
- CModelViewerCamera::CModelViewerCamera()
- {
- D3DXMatrixIdentity( &m_mWorld );
- D3DXMatrixIdentity( &m_mModelRot );
- D3DXMatrixIdentity( &m_mModelLastRot );
- D3DXMatrixIdentity( &m_mCameraRotLast );
- m_vModelCenter = D3DXVECTOR3(0,0,0);
- m_fRadius = 5.0f;
- m_fDefaultRadius = 5.0f;
- m_fMinRadius = 1.0f;
- m_fMaxRadius = FLT_MAX;
- m_bLimitPitch = false;
- m_bEnablePositionMovement = false;
- m_bAttachCameraToModel = false;
- m_nRotateModelButtonMask = MOUSE_LEFT_BUTTON;
- m_nZoomButtonMask = MOUSE_WHEEL;
- m_nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON;
- m_bDragSinceLastUpdate = true;
- }
- //--------------------------------------------------------------------------------------
- // Update the view matrix & the model's world matrix based
- // on user input & elapsed time
- //--------------------------------------------------------------------------------------
- VOID CModelViewerCamera::FrameMove( FLOAT fElapsedTime )
- {
- if( IsKeyDown(m_aKeys[CAM_RESET]) )
- Reset();
- // If no dragged has happend since last time FrameMove is called,
- // and no camera key is held down, then no need to handle again.
- if( !m_bDragSinceLastUpdate && 0 == m_cKeysDown )
- return;
- m_bDragSinceLastUpdate = false;
- // Get keyboard/mouse/gamepad input
- GetInput( m_bEnablePositionMovement, m_nCurrentButtonMask != 0, true, false );
- // Get amount of velocity based on the keyboard input and drag (if any)
- UpdateVelocity( fElapsedTime );
- // Simple euler method to calculate position delta
- D3DXVECTOR3 vPosDelta = m_vVelocity * fElapsedTime;
- // Change the radius from the camera to the model based on wheel scrolling
- if( m_nMouseWheelDelta && m_nZoomButtonMask == MOUSE_WHEEL )
- m_fRadius -= m_nMouseWheelDelta * m_fRadius * 0.1f;
- m_fRadius = __min( m_fMaxRadius, m_fRadius );
- m_fRadius = __max( m_fMinRadius, m_fRadius );
- m_nMouseWheelDelta = 0;
- // Get the inverse of the arcball's rotation matrix
- D3DXMATRIX mCameraRot;
- D3DXMatrixInverse( &mCameraRot, NULL, m_ViewArcBall.GetRotationMatrix() );
- // Transform vectors based on camera's rotation matrix
- D3DXVECTOR3 vWorldUp, vWorldAhead;
- D3DXVECTOR3 vLocalUp = D3DXVECTOR3(0,1,0);
- D3DXVECTOR3 vLocalAhead = D3DXVECTOR3(0,0,1);
- D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mCameraRot );
- D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mCameraRot );
- // Transform the position delta by the camera's rotation
- D3DXVECTOR3 vPosDeltaWorld;
- D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot );
- // Move the lookAt position
- m_vLookAt += vPosDeltaWorld;
- if( m_bClipToBoundary )
- ConstrainToBoundary( &m_vLookAt );
- // Update the eye point based on a radius away from the lookAt position
- m_vEye = m_vLookAt - vWorldAhead * m_fRadius;
- // Update the view matrix
- D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp );
- D3DXMATRIX mInvView;
- D3DXMatrixInverse( &mInvView, NULL, &m_mView );
- mInvView._41 = mInvView._42 = mInvView._43 = 0;
- D3DXMATRIX mModelLastRotInv;
- D3DXMatrixInverse(&mModelLastRotInv, NULL, &m_mModelLastRot);
- // Accumulate the delta of the arcball's rotation in view space.
- // Note that per-frame delta rotations could be problematic over long periods of time.
- D3DXMATRIX mModelRot;
- mModelRot = *m_WorldArcBall.GetRotationMatrix();
- m_mModelRot *= m_mView * mModelLastRotInv * mModelRot * mInvView;
- if( m_ViewArcBall.IsBeingDragged() && m_bAttachCameraToModel && !IsKeyDown(m_aKeys[CAM_CONTROLDOWN]) )
- {
- // Attach camera to model by inverse of the model rotation
- D3DXMATRIX mCameraLastRotInv;
- D3DXMatrixInverse(&mCameraLastRotInv, NULL, &m_mCameraRotLast);
- D3DXMATRIX mCameraRotDelta = mCameraLastRotInv * mCameraRot; // local to world matrix
- m_mModelRot *= mCameraRotDelta;
- }
- m_mCameraRotLast = mCameraRot;
- m_mModelLastRot = mModelRot;
- // Since we're accumulating delta rotations, we need to orthonormalize
- // the matrix to prevent eventual matrix skew
- D3DXVECTOR3* pXBasis = (D3DXVECTOR3*) &m_mModelRot._11;
- D3DXVECTOR3* pYBasis = (D3DXVECTOR3*) &m_mModelRot._21;
- D3DXVECTOR3* pZBasis = (D3DXVECTOR3*) &m_mModelRot._31;
- D3DXVec3Normalize( pXBasis, pXBasis );
- D3DXVec3Cross( pYBasis, pZBasis, pXBasis );
- D3DXVec3Normalize( pYBasis, pYBasis );
- D3DXVec3Cross( pZBasis, pXBasis, pYBasis );
- // Translate the rotation matrix to the same position as the lookAt position
- m_mModelRot._41 = m_vLookAt.x;
- m_mModelRot._42 = m_vLookAt.y;
- m_mModelRot._43 = m_vLookAt.z;
- // Translate world matrix so its at the center of the model
- D3DXMATRIX mTrans;
- D3DXMatrixTranslation( &mTrans, -m_vModelCenter.x, -m_vModelCenter.y, -m_vModelCenter.z );
- m_mWorld = mTrans * m_mModelRot;
- }
- void CModelViewerCamera::SetDragRect( RECT &rc )
- {
- CBaseCamera::SetDragRect( rc );
- m_WorldArcBall.SetOffset( rc.left, rc.top );
- m_ViewArcBall.SetOffset( rc.left, rc.top );
- SetWindow( rc.right - rc.left, rc.bottom - rc.top );
- }
- //--------------------------------------------------------------------------------------
- // Reset the camera's position back to the default
- //--------------------------------------------------------------------------------------
- VOID CModelViewerCamera::Reset()
- {
- CBaseCamera::Reset();
- D3DXMatrixIdentity( &m_mWorld );
- D3DXMatrixIdentity( &m_mModelRot );
- D3DXMatrixIdentity( &m_mModelLastRot );
- D3DXMatrixIdentity( &m_mCameraRotLast );
- m_fRadius = m_fDefaultRadius;
- m_WorldArcBall.Reset();
- m_ViewArcBall.Reset();
- }
- //--------------------------------------------------------------------------------------
- // Override for setting the view parameters
- //--------------------------------------------------------------------------------------
- void CModelViewerCamera::SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt )
- {
- CBaseCamera::SetViewParams( pvEyePt, pvLookatPt );
- // Propogate changes to the member arcball
- D3DXQUATERNION quat;
- D3DXMATRIXA16 mRotation;
- D3DXVECTOR3 vUp(0,1,0);
- D3DXMatrixLookAtLH( &mRotation, pvEyePt, pvLookatPt, &vUp );
- D3DXQuaternionRotationMatrix( &quat, &mRotation );
- m_ViewArcBall.SetQuatNow( quat );
- // Set the radius according to the distance
- D3DXVECTOR3 vEyeToPoint;
- D3DXVec3Subtract( &vEyeToPoint, pvLookatPt, pvEyePt );
- SetRadius( D3DXVec3Length( &vEyeToPoint ) );
- // View information changed. FrameMove should be called.
- m_bDragSinceLastUpdate = true;
- }
- void CModelViewerCamera::SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt, D3DXVECTOR3* pvUpVec )
- {
- CBaseCamera::SetViewParams( pvEyePt, pvLookatPt, pvUpVec );
- // Propogate changes to the member arcball
- D3DXQUATERNION quat;
- D3DXMATRIXA16 mRotation;
- // D3DXVECTOR3 vUp(0,1,0);
- D3DXMatrixLookAtLH( &mRotation, pvEyePt, pvLookatPt, pvUpVec );
- D3DXQuaternionRotationMatrix( &quat, &mRotation );
- m_ViewArcBall.SetQuatNow( quat );
- // Set the radius according to the distance
- D3DXVECTOR3 vEyeToPoint;
- D3DXVec3Subtract( &vEyeToPoint, pvLookatPt, pvEyePt );
- SetRadius( D3DXVec3Length( &vEyeToPoint ) );
- // View information changed. FrameMove should be called.
- m_bDragSinceLastUpdate = true;
- }
- //--------------------------------------------------------------------------------------
- // Call this from your message proc so this class can handle window messages
- //--------------------------------------------------------------------------------------
- LRESULT CModelViewerCamera::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- CBaseCamera::HandleMessages( hWnd, uMsg, wParam, lParam );
- if( ( (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON) ||
- ( (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON) ||
- ( (uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON) )
- {
- int iMouseX = (short)LOWORD(lParam);
- int iMouseY = (short)HIWORD(lParam);
- m_WorldArcBall.OnBegin( iMouseX, iMouseY );
- }
- if( ( (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON) ||
- ( (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON) ||
- ( (uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON) )
- {
- int iMouseX = (short)LOWORD(lParam);
- int iMouseY = (short)HIWORD(lParam);
- m_ViewArcBall.OnBegin( iMouseX, iMouseY );
- }
- if( uMsg == WM_MOUSEMOVE )
- {
- int iMouseX = (short)LOWORD(lParam);
- int iMouseY = (short)HIWORD(lParam);
- m_WorldArcBall.OnMove( iMouseX, iMouseY );
- m_ViewArcBall.OnMove( iMouseX, iMouseY );
- }
- if( (uMsg == WM_LBUTTONUP && m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON) ||
- (uMsg == WM_MBUTTONUP && m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON) ||
- (uMsg == WM_RBUTTONUP && m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON) )
- {
- m_WorldArcBall.OnEnd();
- }
- if( (uMsg == WM_LBUTTONUP && m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON) ||
- (uMsg == WM_MBUTTONUP && m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON) ||
- (uMsg == WM_RBUTTONUP && m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON) )
- {
- m_ViewArcBall.OnEnd();
- }
- if( uMsg == WM_CAPTURECHANGED )
- {
- if( (HWND)lParam != hWnd )
- {
- if( (m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON) ||
- (m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON) ||
- (m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON) )
- {
- m_WorldArcBall.OnEnd();
- }
- if( (m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON) ||
- (m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON) ||
- (m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON) )
- {
- m_ViewArcBall.OnEnd();
- }
- }
- }
- if( uMsg == WM_LBUTTONDOWN ||
- uMsg == WM_LBUTTONDBLCLK ||
- uMsg == WM_MBUTTONDOWN ||
- uMsg == WM_MBUTTONDBLCLK ||
- uMsg == WM_RBUTTONDOWN ||
- uMsg == WM_RBUTTONDBLCLK ||
- uMsg == WM_LBUTTONUP ||
- uMsg == WM_MBUTTONUP ||
- uMsg == WM_RBUTTONUP ||
- uMsg == WM_MOUSEWHEEL ||
- uMsg == WM_MOUSEMOVE )
- {
- m_bDragSinceLastUpdate = true;
- }
- return FALSE;
- }
- //--------------------------------------------------------------------------------------
- // Desc: Returns a view matrix for rendering to a face of a cubemap.
- //--------------------------------------------------------------------------------------
- D3DXMATRIX DXUTGetCubeMapViewMatrix( DWORD dwFace )
- {
- D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
- D3DXVECTOR3 vLookDir;
- D3DXVECTOR3 vUpDir;
- switch( dwFace )
- {
- case D3DCUBEMAP_FACE_POSITIVE_X:
- vLookDir = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
- vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
- break;
- case D3DCUBEMAP_FACE_NEGATIVE_X:
- vLookDir = D3DXVECTOR3(-1.0f, 0.0f, 0.0f );
- vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
- break;
- case D3DCUBEMAP_FACE_POSITIVE_Y:
- vLookDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
- vUpDir = D3DXVECTOR3( 0.0f, 0.0f,-1.0f );
- break;
- case D3DCUBEMAP_FACE_NEGATIVE_Y:
- vLookDir = D3DXVECTOR3( 0.0f,-1.0f, 0.0f );
- vUpDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
- break;
- case D3DCUBEMAP_FACE_POSITIVE_Z:
- vLookDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
- vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
- break;
- case D3DCUBEMAP_FACE_NEGATIVE_Z:
- vLookDir = D3DXVECTOR3( 0.0f, 0.0f,-1.0f );
- vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
- break;
- }
- // Set the view transform for this cubemap surface
- D3DXMATRIXA16 mView;
- D3DXMatrixLookAtLH( &mView, &vEyePt, &vLookDir, &vUpDir );
- return mView;
- }
- //--------------------------------------------------------------------------------------
- // Returns the string for the given D3DFORMAT.
- //--------------------------------------------------------------------------------------
- LPCWSTR DXUTD3DFormatToString( D3DFORMAT format, bool bWithPrefix )
- {
- WCHAR* pstr = NULL;
- switch( format )
- {
- case D3DFMT_UNKNOWN: pstr = L"D3DFMT_UNKNOWN"; break;
- case D3DFMT_R8G8B8: pstr = L"D3DFMT_R8G8B8"; break;
- case D3DFMT_A8R8G8B8: pstr = L"D3DFMT_A8R8G8B8"; break;
- case D3DFMT_X8R8G8B8: pstr = L"D3DFMT_X8R8G8B8"; break;
- case D3DFMT_R5G6B5: pstr = L"D3DFMT_R5G6B5"; break;
- case D3DFMT_X1R5G5B5: pstr = L"D3DFMT_X1R5G5B5"; break;
- case D3DFMT_A1R5G5B5: pstr = L"D3DFMT_A1R5G5B5"; break;
- case D3DFMT_A4R4G4B4: pstr = L"D3DFMT_A4R4G4B4"; break;
- case D3DFMT_R3G3B2: pstr = L"D3DFMT_R3G3B2"; break;
- case D3DFMT_A8: pstr = L"D3DFMT_A8"; break;
- case D3DFMT_A8R3G3B2: pstr = L"D3DFMT_A8R3G3B2"; break;
- case D3DFMT_X4R4G4B4: pstr = L"D3DFMT_X4R4G4B4"; break;
- case D3DFMT_A2B10G10R10: pstr = L"D3DFMT_A2B10G10R10"; break;
- case D3DFMT_A8B8G8R8: pstr = L"D3DFMT_A8B8G8R8"; break;
- case D3DFMT_X8B8G8R8: pstr = L"D3DFMT_X8B8G8R8"; break;
- case D3DFMT_G16R16: pstr = L"D3DFMT_G16R16"; break;
- case D3DFMT_A2R10G10B10: pstr = L"D3DFMT_A2R10G10B10"; break;
- case D3DFMT_A16B16G16R16: pstr = L"D3DFMT_A16B16G16R16"; break;
- case D3DFMT_A8P8: pstr = L"D3DFMT_A8P8"; break;
- case D3DFMT_P8: pstr = L"D3DFMT_P8"; break;
- case D3DFMT_L8: pstr = L"D3DFMT_L8"; break;
- case D3DFMT_A8L8: pstr = L"D3DFMT_A8L8"; break;
- case D3DFMT_A4L4: pstr = L"D3DFMT_A4L4"; break;
- case D3DFMT_V8U8: pstr = L"D3DFMT_V8U8"; break;
- case D3DFMT_L6V5U5: pstr = L"D3DFMT_L6V5U5"; break;
- case D3DFMT_X8L8V8U8: pstr = L"D3DFMT_X8L8V8U8"; break;
- case D3DFMT_Q8W8V8U8: pstr = L"D3DFMT_Q8W8V8U8"; break;
- case D3DFMT_V16U16: pstr = L"D3DFMT_V16U16"; break;
- case D3DFMT_A2W10V10U10: pstr = L"D3DFMT_A2W10V10U10"; break;
- case D3DFMT_UYVY: pstr = L"D3DFMT_UYVY"; break;
- case D3DFMT_YUY2: pstr = L"D3DFMT_YUY2"; break;
- case D3DFMT_DXT1: pstr = L"D3DFMT_DXT1"; break;
- case D3DFMT_DXT2: pstr = L"D3DFMT_DXT2"; break;
- case D3DFMT_DXT3: pstr = L"D3DFMT_DXT3"; break;
- case D3DFMT_DXT4: pstr = L"D3DFMT_DXT4"; break;
- case D3DFMT_DXT5: pstr = L"D3DFMT_DXT5"; break;
- case D3DFMT_D16_LOCKABLE: pstr = L"D3DFMT_D16_LOCKABLE"; break;
- case D3DFMT_D32: pstr = L"D3DFMT_D32"; break;
- case D3DFMT_D15S1: pstr = L"D3DFMT_D15S1"; break;
- case D3DFMT_D24S8: pstr = L"D3DFMT_D24S8"; break;
- case D3DFMT_D24X8: pstr = L"D3DFMT_D24X8"; break;
- case D3DFMT_D24X4S4: pstr = L"D3DFMT_D24X4S4"; break;
- case D3DFMT_D16: pstr = L"D3DFMT_D16"; break;
- case D3DFMT_L16: pstr = L"D3DFMT_L16"; break;
- case D3DFMT_VERTEXDATA: pstr = L"D3DFMT_VERTEXDATA"; break;
- case D3DFMT_INDEX16: pstr = L"D3DFMT_INDEX16"; break;
- case D3DFMT_INDEX32: pstr = L"D3DFMT_INDEX32"; break;
- case D3DFMT_Q16W16V16U16: pstr = L"D3DFMT_Q16W16V16U16"; break;
- case D3DFMT_MULTI2_ARGB8: pstr = L"D3DFMT_MULTI2_ARGB8"; break;
- case D3DFMT_R16F: pstr = L"D3DFMT_R16F"; break;
- case D3DFMT_G16R16F: pstr = L"D3DFMT_G16R16F"; break;
- case D3DFMT_A16B16G16R16F: pstr = L"D3DFMT_A16B16G16R16F"; break;
- case D3DFMT_R32F: pstr = L"D3DFMT_R32F"; break;
- case D3DFMT_G32R32F: pstr = L"D3DFMT_G32R32F"; break;
- case D3DFMT_A32B32G32R32F: pstr = L"D3DFMT_A32B32G32R32F"; break;
- case D3DFMT_CxV8U8: pstr = L"D3DFMT_CxV8U8"; break;
- default: pstr = L"Unknown format"; break;
- }
- if( bWithPrefix || wcsstr( pstr, L"D3DFMT_" )== NULL )
- return pstr;
- else
- return pstr + lstrlen( L"D3DFMT_" );
- }
- //--------------------------------------------------------------------------------------
- // Outputs to the debug stream a formatted Unicode string with a variable-argument list.
- //--------------------------------------------------------------------------------------
- VOID DXUTOutputDebugStringW( LPCWSTR strMsg, ... )
- {
- #if defined(DEBUG) || defined(_DEBUG)
- WCHAR strBuffer[512];
- va_list args;
- va_start(args, strMsg);
- StringCchVPrintfW( strBuffer, 512, strMsg, args );
- strBuffer[511] = L' ';
- va_end(args);
- OutputDebugString( strBuffer );
- #else
- UNREFERENCED_PARAMETER(strMsg);
- #endif
- }
- //--------------------------------------------------------------------------------------
- // Outputs to the debug stream a formatted MBCS string with a variable-argument list.
- //--------------------------------------------------------------------------------------
- VOID DXUTOutputDebugStringA( LPCSTR strMsg, ... )
- {
- #if defined(DEBUG) || defined(_DEBUG)
- CHAR strBuffer[512];
- va_list args;
- va_start(args, strMsg);
- StringCchVPrintfA( strBuffer, 512, strMsg, args );
- strBuffer[511] = ' ';
- va_end(args);
- OutputDebugStringA( strBuffer );
- #else
- UNREFERENCED_PARAMETER(strMsg);
- #endif
- }
- //--------------------------------------------------------------------------------------
- CDXUTLineManager::CDXUTLineManager()
- {
- m_pd3dDevice = NULL;
- m_pD3DXLine = NULL;
- }
- //--------------------------------------------------------------------------------------
- CDXUTLineManager::~CDXUTLineManager()
- {
- OnDeletedDevice();
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::OnCreatedDevice( IDirect3DDevice9* pd3dDevice )
- {
- m_pd3dDevice = pd3dDevice;
- HRESULT hr;
- hr = D3DXCreateLine( m_pd3dDevice, &m_pD3DXLine );
- if( FAILED(hr) )
- return hr;
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::OnResetDevice()
- {
- if( m_pD3DXLine )
- m_pD3DXLine->OnResetDevice();
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::OnRender()
- {
- HRESULT hr;
- if( NULL == m_pD3DXLine )
- return E_INVALIDARG;
- bool bDrawingHasBegun = false;
- float fLastWidth = 0.0f;
- bool bLastAntiAlias = false;
- for( int i=0; i<m_LinesList.GetSize(); i++ )
- {
- LINE_NODE* pLineNode = m_LinesList.GetAt(i);
- if( pLineNode )
- {
- if( !bDrawingHasBegun ||
- fLastWidth != pLineNode->fWidth ||
- bLastAntiAlias != pLineNode->bAntiAlias )
- {
- if( bDrawingHasBegun )
- {
- hr = m_pD3DXLine->End();
- if( FAILED(hr) )
- return hr;
- }
- m_pD3DXLine->SetWidth( pLineNode->fWidth );
- m_pD3DXLine->SetAntialias( pLineNode->bAntiAlias );
- fLastWidth = pLineNode->fWidth;
- bLastAntiAlias = pLineNode->bAntiAlias;
- hr = m_pD3DXLine->Begin();
- if( FAILED(hr) )
- return hr;
- bDrawingHasBegun = true;
- }
- hr = m_pD3DXLine->Draw( pLineNode->pVertexList, pLineNode->dwVertexListCount, pLineNode->Color );
- if( FAILED(hr) )
- return hr;
- }
- }
- if( bDrawingHasBegun )
- {
- hr = m_pD3DXLine->End();
- if( FAILED(hr) )
- return hr;
- }
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::OnLostDevice()
- {
- if( m_pD3DXLine )
- m_pD3DXLine->OnLostDevice();
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::OnDeletedDevice()
- {
- RemoveAllLines();
- SAFE_RELEASE( m_pD3DXLine );
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::AddLine( int* pnLineID, D3DXVECTOR2* pVertexList, DWORD dwVertexListCount, D3DCOLOR Color, float fWidth, float fScaleRatio, bool bAntiAlias )
- {
- if( pVertexList == NULL || dwVertexListCount == 0 )
- return E_INVALIDARG;
- LINE_NODE* pLineNode = new LINE_NODE;
- if( pLineNode == NULL )
- return E_OUTOFMEMORY;
- ZeroMemory( pLineNode, sizeof(LINE_NODE) );
- pLineNode->nLineID = m_LinesList.GetSize();
- pLineNode->Color = Color;
- pLineNode->fWidth = fWidth;
- pLineNode->bAntiAlias = bAntiAlias;
- pLineNode->dwVertexListCount = dwVertexListCount;
- if( pnLineID )
- *pnLineID = pLineNode->nLineID;
- pLineNode->pVertexList = new D3DXVECTOR2[dwVertexListCount];
- if( pLineNode->pVertexList == NULL )
- {
- delete pLineNode;
- return E_OUTOFMEMORY;
- }
- for( DWORD i=0; i<dwVertexListCount; i++ )
- {
- pLineNode->pVertexList[i] = pVertexList[i] * fScaleRatio;
- }
- m_LinesList.Add( pLineNode );
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::AddRect( int* pnLineID, RECT rc, D3DCOLOR Color, float fWidth, float fScaleRatio, bool bAntiAlias )
- {
- if( fWidth > 2.0f )
- {
- D3DXVECTOR2 vertexList[8];
- vertexList[0].x = (float)rc.left;
- vertexList[0].y = (float)rc.top - (fWidth/2.0f);
- vertexList[1].x = (float)rc.left;
- vertexList[1].y = (float)rc.bottom + (fWidth/2.0f);
- vertexList[2].x = (float)rc.left;
- vertexList[2].y = (float)rc.bottom - 0.5f;
- vertexList[3].x = (float)rc.right;
- vertexList[3].y = (float)rc.bottom - 0.5f;
- vertexList[4].x = (float)rc.right;
- vertexList[4].y = (float)rc.bottom + (fWidth/2.0f);
- vertexList[5].x = (float)rc.right;
- vertexList[5].y = (float)rc.top - (fWidth/2.0f);
- vertexList[6].x = (float)rc.right;
- vertexList[6].y = (float)rc.top;
- vertexList[7].x = (float)rc.left;
- vertexList[7].y = (float)rc.top;
- return AddLine( pnLineID, vertexList, 8, Color, fWidth, fScaleRatio, bAntiAlias );
- }
- else
- {
- D3DXVECTOR2 vertexList[5];
- vertexList[0].x = (float)rc.left;
- vertexList[0].y = (float)rc.top;
- vertexList[1].x = (float)rc.left;
- vertexList[1].y = (float)rc.bottom;
- vertexList[2].x = (float)rc.right;
- vertexList[2].y = (float)rc.bottom;
- vertexList[3].x = (float)rc.right;
- vertexList[3].y = (float)rc.top;
- vertexList[4].x = (float)rc.left;
- vertexList[4].y = (float)rc.top;
- return AddLine( pnLineID, vertexList, 5, Color, fWidth, fScaleRatio, bAntiAlias );
- }
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::RemoveLine( int nLineID )
- {
- for( int i=0; i<m_LinesList.GetSize(); i++ )
- {
- LINE_NODE* pLineNode = m_LinesList.GetAt(i);
- if( pLineNode && pLineNode->nLineID == nLineID )
- {
- SAFE_DELETE_ARRAY( pLineNode->pVertexList );
- delete pLineNode;
- m_LinesList.SetAt(i, NULL);
- }
- }
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTLineManager::RemoveAllLines()
- {
- for( int i=0; i<m_LinesList.GetSize(); i++ )
- {
- LINE_NODE* pLineNode = m_LinesList.GetAt(i);
- if( pLineNode )
- {
- SAFE_DELETE_ARRAY( pLineNode->pVertexList );
- delete pLineNode;
- }
- }
- m_LinesList.RemoveAll();
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- CDXUTTextHelper::CDXUTTextHelper( ID3DXFont* pFont, ID3DXSprite* pSprite, int nLineHeight )
- {
- m_pFont = pFont;
- m_pSprite = pSprite;
- m_clr = D3DXCOLOR(1,1,1,1);
- m_pt.x = 0;
- m_pt.y = 0;
- m_nLineHeight = nLineHeight;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTTextHelper::DrawFormattedTextLine( const WCHAR* strMsg, ... )
- {
- WCHAR strBuffer[512];
- va_list args;
- va_start(args, strMsg);
- StringCchVPrintf( strBuffer, 512, strMsg, args );
- strBuffer[511] = L' ';
- va_end(args);
- return DrawTextLine( strBuffer );
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTTextHelper::DrawTextLine( const WCHAR* strMsg )
- {
- if( NULL == m_pFont )
- return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG );
- HRESULT hr;
- RECT rc;
- SetRect( &rc, m_pt.x, m_pt.y, 0, 0 );
- hr = m_pFont->DrawText( m_pSprite, strMsg, -1, &rc, DT_NOCLIP, m_clr );
- if( FAILED(hr) )
- return DXTRACE_ERR_MSGBOX( L"DrawText", hr );
- m_pt.y += m_nLineHeight;
- return S_OK;
- }
- HRESULT CDXUTTextHelper::DrawFormattedTextLine( RECT &rc, DWORD dwFlags, const WCHAR* strMsg, ... )
- {
- WCHAR strBuffer[512];
- va_list args;
- va_start(args, strMsg);
- StringCchVPrintf( strBuffer, 512, strMsg, args );
- strBuffer[511] = L' ';
- va_end(args);
- return DrawTextLine( rc, dwFlags, strBuffer );
- }
- HRESULT CDXUTTextHelper::DrawTextLine( RECT &rc, DWORD dwFlags, const WCHAR* strMsg )
- {
- if( NULL == m_pFont )
- return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG );
- HRESULT hr;
- hr = m_pFont->DrawText( m_pSprite, strMsg, -1, &rc, dwFlags, m_clr );
- if( FAILED(hr) )
- return DXTRACE_ERR_MSGBOX( L"DrawText", hr );
- m_pt.y += m_nLineHeight;
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- void CDXUTTextHelper::Begin()
- {
- if( m_pSprite )
- m_pSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );
- }
- void CDXUTTextHelper::End()
- {
- if( m_pSprite )
- m_pSprite->End();
- }
- //--------------------------------------------------------------------------------------
- IDirect3DDevice9* CDXUTDirectionWidget::s_pd3dDevice = NULL;
- ID3DXEffect* CDXUTDirectionWidget::s_pEffect = NULL;
- ID3DXMesh* CDXUTDirectionWidget::s_pMesh = NULL;
- //--------------------------------------------------------------------------------------
- CDXUTDirectionWidget::CDXUTDirectionWidget()
- {
- m_fRadius = 1.0f;
- m_vDefaultDir = D3DXVECTOR3(0,1,0);
- m_vCurrentDir = m_vDefaultDir;
- m_nRotateMask = MOUSE_RIGHT_BUTTON;
- D3DXMatrixIdentity( &m_mView );
- D3DXMatrixIdentity( &m_mRot );
- D3DXMatrixIdentity( &m_mRotSnapshot );
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTDirectionWidget::StaticOnCreateDevice( IDirect3DDevice9* pd3dDevice )
- {
- HRESULT hr;
- s_pd3dDevice = pd3dDevice;
- const char* g_strBuffer =
- "float4 g_MaterialDiffuseColor; // Material's diffuse colorrn"
- "float3 g_LightDir; // Light's direction in world spacern"
- "float4x4 g_mWorld; // World matrix for objectrn"
- "float4x4 g_mWorldViewProjection; // World * View * Projection matrixrn"
- "rn"
- "struct VS_OUTPUTrn"
- "{rn"
- " float4 Position : POSITION; // vertex positionrn"
- " float4 Diffuse : COLOR0; // vertex diffuse colorrn"
- "};rn"
- "rn"
- "VS_OUTPUT RenderWith1LightNoTextureVS( float4 vPos : POSITION,rn"
- " float3 vNormal : NORMAL )rn"
- "{rn"
- " VS_OUTPUT Output;rn"
- "rn"
- " // Transform the position from object space to homogeneous projection spacern"
- " Output.Position = mul(vPos, g_mWorldViewProjection);rn"
- "rn"
- " // Transform the normal from object space to world spacern"
- " float3 vNormalWorldSpace;rn"
- " vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space)rn"
- "rn"
- " // Compute simple directional lighting equationrn"
- " Output.Diffuse.rgb = g_MaterialDiffuseColor * max(0,dot(vNormalWorldSpace, g_LightDir));rn"
- " Output.Diffuse.a = 1.0f;rn"
- "rn"
- " return Output;rn"
- "}rn"
- "rn"
- "float4 RenderWith1LightNoTexturePS( float4 Diffuse : COLOR0 ) : COLOR0rn"
- "{rn"
- " return Diffuse;rn"
- "}rn"
- "rn"
- "technique RenderWith1LightNoTexturern"
- "{rn"
- " pass P0rn"
- " {rn"
- " VertexShader = compile vs_1_1 RenderWith1LightNoTextureVS();rn"
- " PixelShader = compile ps_1_1 RenderWith1LightNoTexturePS();rn"
- " }rn"
- "}rn"
- "";
- UINT dwBufferSize = (UINT)strlen(g_strBuffer) + 1;
- V_RETURN( D3DXCreateEffect( s_pd3dDevice, g_strBuffer, dwBufferSize, NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &s_pEffect, NULL ) );
- // Load the mesh with D3DX and get back a ID3DXMesh*. For this
- // sample we'll ignore the X file's embedded materials since we know
- // exactly the model we're loading. See the mesh samples such as
- // "OptimizedMesh" for a more generic mesh loading example.
- V_RETURN( DXUTCreateArrowMeshFromInternalArray( s_pd3dDevice, &s_pMesh ) );
- // Optimize the mesh for this graphics card's vertex cache
- // so when rendering the mesh's triangle list the vertices will
- // cache hit more often so it won't have to re-execute the vertex shader
- // on those vertices so it will improve perf.
- DWORD* rgdwAdjacency = new DWORD[s_pMesh->GetNumFaces() * 3];
- if( rgdwAdjacency == NULL )
- return E_OUTOFMEMORY;
- V( s_pMesh->GenerateAdjacency(1e-6f,rgdwAdjacency) );
- V( s_pMesh->OptimizeInplace(D3DXMESHOPT_VERTEXCACHE, rgdwAdjacency, NULL, NULL, NULL) );
- delete []rgdwAdjacency;
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTDirectionWidget::OnResetDevice( const D3DSURFACE_DESC* pBackBufferSurfaceDesc )
- {
- m_ArcBall.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- void CDXUTDirectionWidget::StaticOnLostDevice()
- {
- if( s_pEffect )
- s_pEffect->OnLostDevice();
- }
- //--------------------------------------------------------------------------------------
- void CDXUTDirectionWidget::StaticOnDestroyDevice()
- {
- SAFE_RELEASE(s_pEffect);
- SAFE_RELEASE(s_pMesh);
- }
- //--------------------------------------------------------------------------------------
- LRESULT CDXUTDirectionWidget::HandleMessages( HWND hWnd, UINT uMsg,
- WPARAM wParam, LPARAM lParam )
- {
- switch( uMsg )
- {
- case WM_LBUTTONDOWN:
- case WM_MBUTTONDOWN:
- case WM_RBUTTONDOWN:
- {
- if( ((m_nRotateMask & MOUSE_LEFT_BUTTON) != 0 && uMsg == WM_LBUTTONDOWN) ||
- ((m_nRotateMask & MOUSE_MIDDLE_BUTTON) != 0 && uMsg == WM_MBUTTONDOWN) ||
- ((m_nRotateMask & MOUSE_RIGHT_BUTTON) != 0 && uMsg == WM_RBUTTONDOWN) )
- {
- int iMouseX = (int)(short)LOWORD(lParam);
- int iMouseY = (int)(short)HIWORD(lParam);
- m_ArcBall.OnBegin( iMouseX, iMouseY );
- SetCapture(hWnd);
- }
- return TRUE;
- }
- case WM_MOUSEMOVE:
- {
- if( m_ArcBall.IsBeingDragged() )
- {
- int iMouseX = (int)(short)LOWORD(lParam);
- int iMouseY = (int)(short)HIWORD(lParam);
- m_ArcBall.OnMove( iMouseX, iMouseY );
- UpdateLightDir();
- }
- return TRUE;
- }
- case WM_LBUTTONUP:
- case WM_MBUTTONUP:
- case WM_RBUTTONUP:
- {
- if( ((m_nRotateMask & MOUSE_LEFT_BUTTON) != 0 && uMsg == WM_LBUTTONUP) ||
- ((m_nRotateMask & MOUSE_MIDDLE_BUTTON) != 0 && uMsg == WM_MBUTTONUP) ||
- ((m_nRotateMask & MOUSE_RIGHT_BUTTON) != 0 && uMsg == WM_RBUTTONUP) )
- {
- m_ArcBall.OnEnd();
- ReleaseCapture();
- }
- UpdateLightDir();
- return TRUE;
- }
- case WM_CAPTURECHANGED:
- {
- if( (HWND)lParam != hWnd )
- {
- if( (m_nRotateMask & MOUSE_LEFT_BUTTON) ||
- (m_nRotateMask & MOUSE_MIDDLE_BUTTON) ||
- (m_nRotateMask & MOUSE_RIGHT_BUTTON) )
- {
- m_ArcBall.OnEnd();
- ReleaseCapture();
- }
- }
- return TRUE;
- }
- }
- return 0;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTDirectionWidget::OnRender( D3DXCOLOR color, const D3DXMATRIX* pmView,
- const D3DXMATRIX* pmProj, const D3DXVECTOR3* pEyePt )
- {
- m_mView = *pmView;
- // Render the light spheres so the user can visually see the light dir
- UINT iPass, cPasses;
- D3DXMATRIX mRotate;
- D3DXMATRIX mScale;
- D3DXMATRIX mTrans;
- D3DXMATRIXA16 mWorldViewProj;
- HRESULT hr;
- V( s_pEffect->SetTechnique( "RenderWith1LightNoTexture" ) );
- V( s_pEffect->SetVector( "g_MaterialDiffuseColor", (D3DXVECTOR4*)&color ) );
- D3DXVECTOR3 vEyePt;
- D3DXVec3Normalize( &vEyePt, pEyePt );
- V( s_pEffect->SetValue( "g_LightDir", &vEyePt, sizeof(D3DXVECTOR3) ) );
- // Rotate arrow model to point towards origin
- D3DXMATRIX mRotateA, mRotateB;
- D3DXVECTOR3 vAt = D3DXVECTOR3(0,0,0);
- D3DXVECTOR3 vUp = D3DXVECTOR3(0,1,0);
- D3DXMatrixRotationX( &mRotateB, D3DX_PI );
- D3DXMatrixLookAtLH( &mRotateA, &m_vCurrentDir, &vAt, &vUp );
- D3DXMatrixInverse( &mRotateA, NULL, &mRotateA );
- mRotate = mRotateB * mRotateA;
- D3DXVECTOR3 vL = m_vCurrentDir * m_fRadius * 1.0f;
- D3DXMatrixTranslation( &mTrans, vL.x, vL.y, vL.z );
- D3DXMatrixScaling( &mScale, m_fRadius*0.2f, m_fRadius*0.2f, m_fRadius*0.2f );
- D3DXMATRIX mWorld = mRotate * mScale * mTrans;
- mWorldViewProj = mWorld * (m_mView) * (*pmProj);
- V( s_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProj ) );
- V( s_pEffect->SetMatrix( "g_mWorld", &mWorld ) );
- for( int iSubset=0; iSubset<2; iSubset++ )
- {
- V( s_pEffect->Begin(&cPasses, 0) );
- for (iPass = 0; iPass < cPasses; iPass++)
- {
- V( s_pEffect->BeginPass(iPass) );
- V( s_pMesh->DrawSubset(iSubset) );
- V( s_pEffect->EndPass() );
- }
- V( s_pEffect->End() );
- }
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- HRESULT CDXUTDirectionWidget::UpdateLightDir()
- {
- D3DXMATRIX mInvView;
- D3DXMatrixInverse(&mInvView, NULL, &m_mView);
- mInvView._41 = mInvView._42 = mInvView._43 = 0;
- D3DXMATRIX mLastRotInv;
- D3DXMatrixInverse(&mLastRotInv, NULL, &m_mRotSnapshot);
- D3DXMATRIX mRot = *m_ArcBall.GetRotationMatrix();
- m_mRotSnapshot = mRot;
- // Accumulate the delta of the arcball's rotation in view space.
- // Note that per-frame delta rotations could be problematic over long periods of time.
- m_mRot *= m_mView * mLastRotInv * mRot * mInvView;
- // Since we're accumulating delta rotations, we need to orthonormalize
- // the matrix to prevent eventual matrix skew
- D3DXVECTOR3* pXBasis = (D3DXVECTOR3*) &m_mRot._11;
- D3DXVECTOR3* pYBasis = (D3DXVECTOR3*) &m_mRot._21;
- D3DXVECTOR3* pZBasis = (D3DXVECTOR3*) &m_mRot._31;
- D3DXVec3Normalize( pXBasis, pXBasis );
- D3DXVec3Cross( pYBasis, pZBasis, pXBasis );
- D3DXVec3Normalize( pYBasis, pYBasis );
- D3DXVec3Cross( pZBasis, pXBasis, pYBasis );
- // Transform the default direction vector by the light's rotation matrix
- D3DXVec3TransformNormal( &m_vCurrentDir, &m_vDefaultDir, &m_mRot );
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- // Direct3D9 dynamic linking support -- calls top-level D3D9 APIs with graceful
- // failure if APIs are not present.
- //--------------------------------------------------------------------------------------
- // Function prototypes
- typedef IDirect3D9* (WINAPI * LPDIRECT3DCREATE9) (UINT);
- typedef INT (WINAPI * LPD3DPERF_BEGINEVENT)(D3DCOLOR, LPCWSTR);
- typedef INT (WINAPI * LPD3DPERF_ENDEVENT)(void);
- typedef VOID (WINAPI * LPD3DPERF_SETMARKER)(D3DCOLOR, LPCWSTR);
- typedef VOID (WINAPI * LPD3DPERF_SETREGION)(D3DCOLOR, LPCWSTR);
- typedef BOOL (WINAPI * LPD3DPERF_QUERYREPEATFRAME)(void);
- typedef VOID (WINAPI * LPD3DPERF_SETOPTIONS)( DWORD dwOptions );
- typedef DWORD (WINAPI * LPD3DPERF_GETSTATUS)( void );
- // Module and function pointers
- static HMODULE s_hModD3D9 = NULL;
- static LPDIRECT3DCREATE9 s_DynamicDirect3DCreate9 = NULL;
- static LPD3DPERF_BEGINEVENT s_DynamicD3DPERF_BeginEvent = NULL;
- static LPD3DPERF_ENDEVENT s_DynamicD3DPERF_EndEvent = NULL;
- static LPD3DPERF_SETMARKER s_DynamicD3DPERF_SetMarker = NULL;
- static LPD3DPERF_SETREGION s_DynamicD3DPERF_SetRegion = NULL;
- static LPD3DPERF_QUERYREPEATFRAME s_DynamicD3DPERF_QueryRepeatFrame = NULL;
- static LPD3DPERF_SETOPTIONS s_DynamicD3DPERF_SetOptions = NULL;
- static LPD3DPERF_GETSTATUS s_DynamicD3DPERF_GetStatus = NULL;
- // Ensure function pointers are initialized
- static bool DXUT_EnsureD3DAPIs( void )
- {
- // If module is non-NULL, this function has already been called. Note
- // that this doesn't guarantee that all D3D9 procaddresses were found.
- if( s_hModD3D9 != NULL )
- return true;
- // This may fail if DirectX 9 isn't installed
- WCHAR wszPath[MAX_PATH+1];
- if( !::GetSystemDirectory( wszPath, MAX_PATH+1 ) )
- return false;
- StringCchCat( wszPath, MAX_PATH, L"\d3d9.dll" );
- s_hModD3D9 = LoadLibrary( wszPath );
- if( s_hModD3D9 == NULL )
- return false;
- s_DynamicDirect3DCreate9 = (LPDIRECT3DCREATE9)GetProcAddress( s_hModD3D9, "Direct3DCreate9" );
- s_DynamicD3DPERF_BeginEvent = (LPD3DPERF_BEGINEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_BeginEvent" );
- s_DynamicD3DPERF_EndEvent = (LPD3DPERF_ENDEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_EndEvent" );
- s_DynamicD3DPERF_SetMarker = (LPD3DPERF_SETMARKER)GetProcAddress( s_hModD3D9, "D3DPERF_SetMarker" );
- s_DynamicD3DPERF_SetRegion = (LPD3DPERF_SETREGION)GetProcAddress( s_hModD3D9, "D3DPERF_SetRegion" );
- s_DynamicD3DPERF_QueryRepeatFrame = (LPD3DPERF_QUERYREPEATFRAME)GetProcAddress( s_hModD3D9, "D3DPERF_QueryRepeatFrame" );
- s_DynamicD3DPERF_SetOptions = (LPD3DPERF_SETOPTIONS)GetProcAddress( s_hModD3D9, "D3DPERF_SetOptions" );
- s_DynamicD3DPERF_GetStatus = (LPD3DPERF_GETSTATUS)GetProcAddress( s_hModD3D9, "D3DPERF_GetStatus" );
- return true;
- }
- IDirect3D9 * WINAPI DXUT_Dynamic_Direct3DCreate9(UINT SDKVersion)
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicDirect3DCreate9 != NULL )
- return s_DynamicDirect3DCreate9( SDKVersion );
- else
- return NULL;
- }
- int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_BeginEvent != NULL )
- return s_DynamicD3DPERF_BeginEvent( col, wszName );
- else
- return -1;
- }
- int WINAPI DXUT_Dynamic_D3DPERF_EndEvent( void )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_EndEvent != NULL )
- return s_DynamicD3DPERF_EndEvent();
- else
- return -1;
- }
- void WINAPI DXUT_Dynamic_D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_SetMarker != NULL )
- s_DynamicD3DPERF_SetMarker( col, wszName );
- }
- void WINAPI DXUT_Dynamic_D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_SetRegion != NULL )
- s_DynamicD3DPERF_SetRegion( col, wszName );
- }
- BOOL WINAPI DXUT_Dynamic_D3DPERF_QueryRepeatFrame( void )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_QueryRepeatFrame != NULL )
- return s_DynamicD3DPERF_QueryRepeatFrame();
- else
- return FALSE;
- }
- void WINAPI DXUT_Dynamic_D3DPERF_SetOptions( DWORD dwOptions )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_SetOptions != NULL )
- s_DynamicD3DPERF_SetOptions( dwOptions );
- }
- DWORD WINAPI DXUT_Dynamic_D3DPERF_GetStatus( void )
- {
- if( DXUT_EnsureD3DAPIs() && s_DynamicD3DPERF_GetStatus != NULL )
- return s_DynamicD3DPERF_GetStatus();
- else
- return 0;
- }
- //--------------------------------------------------------------------------------------
- // Trace a string description of a decl
- //--------------------------------------------------------------------------------------
- void DXUTTraceDecl( D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE] )
- {
- int iDecl=0;
- for( iDecl=0; iDecl<MAX_FVF_DECL_SIZE; iDecl++ )
- {
- if( decl[iDecl].Stream == 0xFF )
- break;
- DXUTOutputDebugString( L"decl[%d]=Stream:%d, Offset:%d, %s, %s, %s, UsageIndex:%dn", iDecl,
- decl[iDecl].Stream,
- decl[iDecl].Offset,
- DXUTTraceD3DDECLTYPEtoString( decl[iDecl].Type ),
- DXUTTraceD3DDECLMETHODtoString( decl[iDecl].Method ),
- DXUTTraceD3DDECLUSAGEtoString( decl[iDecl].Usage ),
- decl[iDecl].UsageIndex );
- }
- DXUTOutputDebugString( L"decl[%d]=D3DDECL_ENDn", iDecl );
- }
- //--------------------------------------------------------------------------------------
- WCHAR* DXUTTraceD3DDECLTYPEtoString( BYTE t )
- {
- switch( t )
- {
- case D3DDECLTYPE_FLOAT1: return L"D3DDECLTYPE_FLOAT1";
- case D3DDECLTYPE_FLOAT2: return L"D3DDECLTYPE_FLOAT2";
- case D3DDECLTYPE_FLOAT3: return L"D3DDECLTYPE_FLOAT3";
- case D3DDECLTYPE_FLOAT4: return L"D3DDECLTYPE_FLOAT4";
- case D3DDECLTYPE_D3DCOLOR: return L"D3DDECLTYPE_D3DCOLOR";
- case D3DDECLTYPE_UBYTE4: return L"D3DDECLTYPE_UBYTE4";
- case D3DDECLTYPE_SHORT2: return L"D3DDECLTYPE_SHORT2";
- case D3DDECLTYPE_SHORT4: return L"D3DDECLTYPE_SHORT4";
- case D3DDECLTYPE_UBYTE4N: return L"D3DDECLTYPE_UBYTE4N";
- case D3DDECLTYPE_SHORT2N: return L"D3DDECLTYPE_SHORT2N";
- case D3DDECLTYPE_SHORT4N: return L"D3DDECLTYPE_SHORT4N";
- case D3DDECLTYPE_USHORT2N: return L"D3DDECLTYPE_USHORT2N";
- case D3DDECLTYPE_USHORT4N: return L"D3DDECLTYPE_USHORT4N";
- case D3DDECLTYPE_UDEC3: return L"D3DDECLTYPE_UDEC3";
- case D3DDECLTYPE_DEC3N: return L"D3DDECLTYPE_DEC3N";
- case D3DDECLTYPE_FLOAT16_2: return L"D3DDECLTYPE_FLOAT16_2";
- case D3DDECLTYPE_FLOAT16_4: return L"D3DDECLTYPE_FLOAT16_4";
- case D3DDECLTYPE_UNUSED: return L"D3DDECLTYPE_UNUSED";
- default: return L"D3DDECLTYPE Unknown";
- }
- }
- WCHAR* DXUTTraceD3DDECLMETHODtoString( BYTE m )
- {
- switch( m )
- {
- case D3DDECLMETHOD_DEFAULT: return L"D3DDECLMETHOD_DEFAULT";
- case D3DDECLMETHOD_PARTIALU: return L"D3DDECLMETHOD_PARTIALU";
- case D3DDECLMETHOD_PARTIALV: return L"D3DDECLMETHOD_PARTIALV";
- case D3DDECLMETHOD_CROSSUV: return L"D3DDECLMETHOD_CROSSUV";
- case D3DDECLMETHOD_UV: return L"D3DDECLMETHOD_UV";
- case D3DDECLMETHOD_LOOKUP: return L"D3DDECLMETHOD_LOOKUP";
- case D3DDECLMETHOD_LOOKUPPRESAMPLED: return L"D3DDECLMETHOD_LOOKUPPRESAMPLED";
- default: return L"D3DDECLMETHOD Unknown";
- }
- }
- WCHAR* DXUTTraceD3DDECLUSAGEtoString( BYTE u )
- {
- switch( u )
- {
- case D3DDECLUSAGE_POSITION: return L"D3DDECLUSAGE_POSITION";
- case D3DDECLUSAGE_BLENDWEIGHT: return L"D3DDECLUSAGE_BLENDWEIGHT";
- case D3DDECLUSAGE_BLENDINDICES: return L"D3DDECLUSAGE_BLENDINDICES";
- case D3DDECLUSAGE_NORMAL: return L"D3DDECLUSAGE_NORMAL";
- case D3DDECLUSAGE_PSIZE: return L"D3DDECLUSAGE_PSIZE";
- case D3DDECLUSAGE_TEXCOORD: return L"D3DDECLUSAGE_TEXCOORD";
- case D3DDECLUSAGE_TANGENT: return L"D3DDECLUSAGE_TANGENT";
- case D3DDECLUSAGE_BINORMAL: return L"D3DDECLUSAGE_BINORMAL";
- case D3DDECLUSAGE_TESSFACTOR: return L"D3DDECLUSAGE_TESSFACTOR";
- case D3DDECLUSAGE_POSITIONT: return L"D3DDECLUSAGE_POSITIONT";
- case D3DDECLUSAGE_COLOR: return L"D3DDECLUSAGE_COLOR";
- case D3DDECLUSAGE_FOG: return L"D3DDECLUSAGE_FOG";
- case D3DDECLUSAGE_DEPTH: return L"D3DDECLUSAGE_DEPTH";
- case D3DDECLUSAGE_SAMPLE: return L"D3DDECLUSAGE_SAMPLE";
- default: return L"D3DDECLUSAGE Unknown";
- }
- }
- //--------------------------------------------------------------------------------------
- // Multimon API handling for OSes with or without multimon API support
- //--------------------------------------------------------------------------------------
- #define DXUT_PRIMARY_MONITOR ((HMONITOR)0x12340042)
- typedef HMONITOR (WINAPI* LPMONITORFROMWINDOW)(HWND, DWORD);
- typedef BOOL (WINAPI* LPGETMONITORINFO)(HMONITOR, LPMONITORINFO);
- BOOL DXUTGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo)
- {
- static bool s_bInited = false;
- static LPGETMONITORINFO s_pFnGetMonitorInfo = NULL;
- if( !s_bInited )
- {
- s_bInited = true;
- HMODULE hUser32 = GetModuleHandle( L"USER32" );
- if (hUser32 )
- {
- OSVERSIONINFOA osvi = {0}; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionExA((OSVERSIONINFOA*)&osvi);
- bool bNT = (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId);
- s_pFnGetMonitorInfo = (LPGETMONITORINFO) (bNT ? GetProcAddress(hUser32,"GetMonitorInfoW") : GetProcAddress(hUser32,"GetMonitorInfoA"));
- }
- }
- if( s_pFnGetMonitorInfo )
- return s_pFnGetMonitorInfo(hMonitor, lpMonitorInfo);
- RECT rcWork;
- if ((hMonitor == DXUT_PRIMARY_MONITOR) && lpMonitorInfo && (lpMonitorInfo->cbSize >= sizeof(MONITORINFO)) && SystemParametersInfoA(SPI_GETWORKAREA, 0, &rcWork, 0))
- {
- lpMonitorInfo->rcMonitor.left = 0;
- lpMonitorInfo->rcMonitor.top = 0;
- lpMonitorInfo->rcMonitor.right = GetSystemMetrics(SM_CXSCREEN);
- lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics(SM_CYSCREEN);
- lpMonitorInfo->rcWork = rcWork;
- lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY;
- return TRUE;
- }
- return FALSE;
- }
- HMONITOR DXUTMonitorFromWindow(HWND hWnd, DWORD dwFlags)
- {
- static bool s_bInited = false;
- static LPMONITORFROMWINDOW s_pFnGetMonitorFronWindow = NULL;
- if( !s_bInited )
- {
- s_bInited = true;
- HMODULE hUser32 = GetModuleHandle( L"USER32" );
- if (hUser32 ) s_pFnGetMonitorFronWindow = (LPMONITORFROMWINDOW) GetProcAddress(hUser32,"MonitorFromWindow");
- }
- if( s_pFnGetMonitorFronWindow )
- return s_pFnGetMonitorFronWindow(hWnd, dwFlags);
- if (dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST))
- return DXUT_PRIMARY_MONITOR;
- return NULL;
- }
- //--------------------------------------------------------------------------------------
- // Get the desktop resolution of an adapter. This isn't the same as the current resolution
- // from GetAdapterDisplayMode since the device might be fullscreen
- //--------------------------------------------------------------------------------------
- void DXUTGetDesktopResolution( UINT AdapterOrdinal, UINT* pWidth, UINT* pHeight )
- {
- CD3DEnumeration* pd3dEnum = DXUTGetEnumeration();
- CD3DEnumAdapterInfo* pAdapterInfo = pd3dEnum->GetAdapterInfo( AdapterOrdinal );
- DEVMODE devMode;
- ZeroMemory( &devMode, sizeof(DEVMODE) );
- devMode.dmSize = sizeof(DEVMODE);
- WCHAR strDeviceName[256];
- MultiByteToWideChar( CP_ACP, 0, pAdapterInfo->AdapterIdentifier.DeviceName, -1, strDeviceName, 256 );
- strDeviceName[255] = 0;
- EnumDisplaySettings( strDeviceName, ENUM_REGISTRY_SETTINGS, &devMode );
- if( pWidth )
- *pWidth = devMode.dmPelsWidth;
- if( pHeight )
- *pHeight = devMode.dmPelsHeight;
- }
- //--------------------------------------------------------------------------------------
- IDirect3DDevice9* DXUTCreateRefDevice( HWND hWnd, bool bNullRef )
- {
- HRESULT hr;
- IDirect3D9* pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION );
- if( NULL == pD3D )
- return NULL;
- D3DDISPLAYMODE Mode;
- pD3D->GetAdapterDisplayMode(0, &Mode);
- D3DPRESENT_PARAMETERS pp;
- ZeroMemory( &pp, sizeof(D3DPRESENT_PARAMETERS) );
- pp.BackBufferWidth = 1;
- pp.BackBufferHeight = 1;
- pp.BackBufferFormat = Mode.Format;
- pp.BackBufferCount = 1;
- pp.SwapEffect = D3DSWAPEFFECT_COPY;
- pp.Windowed = TRUE;
- pp.hDeviceWindow = hWnd;
- IDirect3DDevice9* pd3dDevice = NULL;
- hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, bNullRef ? D3DDEVTYPE_NULLREF : D3DDEVTYPE_REF,
- hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &pd3dDevice );
- SAFE_RELEASE( pD3D );
- return pd3dDevice;
- }
- typedef DWORD (WINAPI* LPXINPUTGETSTATE)(DWORD dwUserIndex, XINPUT_STATE* pState );
- typedef DWORD (WINAPI* LPXINPUTSETSTATE)(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration );
- typedef DWORD (WINAPI* LPXINPUTGETCAPABILITIES)( DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities );
- //--------------------------------------------------------------------------------------
- // Does extra processing on XInput data to make it slightly more convenient to use
- //--------------------------------------------------------------------------------------
- HRESULT DXUTGetGamepadState( DWORD dwPort, DXUT_GAMEPAD* pGamePad, bool bThumbstickDeadZone, bool bSnapThumbstickToCardinals )
- {
- if( dwPort >= DXUT_MAX_CONTROLLERS || pGamePad == NULL )
- return E_FAIL;
- static LPXINPUTGETSTATE s_pXInputGetState = NULL;
- static LPXINPUTGETCAPABILITIES s_pXInputGetCapabilities = NULL;
- if( NULL == s_pXInputGetState || NULL == s_pXInputGetCapabilities )
- {
- WCHAR wszPath[MAX_PATH];
- if( GetSystemDirectory( wszPath, MAX_PATH ) )
- {
- StringCchCat( wszPath, MAX_PATH, L"\" );
- StringCchCat( wszPath, MAX_PATH, XINPUT_DLL );
- HINSTANCE hInst = LoadLibrary( wszPath );
- if( hInst )
- {
- s_pXInputGetState = (LPXINPUTGETSTATE)GetProcAddress( hInst, "XInputGetState" );
- s_pXInputGetCapabilities = (LPXINPUTGETCAPABILITIES)GetProcAddress( hInst, "XInputGetCapabilities" );
- }
- }
- }
- if( s_pXInputGetState == NULL )
- return E_FAIL;
- XINPUT_STATE InputState;
- DWORD dwResult = s_pXInputGetState( dwPort, &InputState );
- // Track insertion and removals
- BOOL bWasConnected = pGamePad->bConnected;
- pGamePad->bConnected = (dwResult == ERROR_SUCCESS);
- pGamePad->bRemoved = ( bWasConnected && !pGamePad->bConnected );
- pGamePad->bInserted = ( !bWasConnected && pGamePad->bConnected );
- // Don't update rest of the state if not connected
- if( !pGamePad->bConnected )
- return S_OK;
- // Store the capabilities of the device
- if( pGamePad->bInserted )
- {
- ZeroMemory( pGamePad, sizeof(DXUT_GAMEPAD) );
- pGamePad->bConnected = true;
- pGamePad->bInserted = true;
- if( s_pXInputGetCapabilities )
- s_pXInputGetCapabilities( dwPort, XINPUT_DEVTYPE_GAMEPAD, &pGamePad->caps );
- }
- // Copy gamepad to local structure (assumes that XINPUT_GAMEPAD at the front in CONTROLER_STATE)
- memcpy( pGamePad, &InputState.Gamepad, sizeof(XINPUT_GAMEPAD) );
- if( bSnapThumbstickToCardinals )
- {
- // Apply deadzone to each axis independantly to slightly snap to up/down/left/right
- if( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE )
- pGamePad->sThumbLX = 0;
- if( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE )
- pGamePad->sThumbLY = 0;
- if( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE )
- pGamePad->sThumbRX = 0;
- if( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE )
- pGamePad->sThumbRY = 0;
- }
- else if( bThumbstickDeadZone )
- {
- // Apply deadzone if centered
- if( (pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) &&
- (pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) )
- {
- pGamePad->sThumbLX = 0;
- pGamePad->sThumbLY = 0;
- }
- if( (pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) &&
- (pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) )
- {
- pGamePad->sThumbRX = 0;
- pGamePad->sThumbRY = 0;
- }
- }
- // Convert [-1,+1] range
- pGamePad->fThumbLX = pGamePad->sThumbLX / 32767.0f;
- pGamePad->fThumbLY = pGamePad->sThumbLY / 32767.0f;
- pGamePad->fThumbRX = pGamePad->sThumbRX / 32767.0f;
- pGamePad->fThumbRY = pGamePad->sThumbRY / 32767.0f;
- // Get the boolean buttons that have been pressed since the last call.
- // Each button is represented by one bit.
- pGamePad->wPressedButtons = ( pGamePad->wLastButtons ^ pGamePad->wButtons ) & pGamePad->wButtons;
- pGamePad->wLastButtons = pGamePad->wButtons;
- // Figure out if the left trigger has been pressed or released
- bool bPressed = ( pGamePad->bLeftTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD );
- pGamePad->bPressedLeftTrigger = ( bPressed ) ? !pGamePad->bLastLeftTrigger : false;
- pGamePad->bLastLeftTrigger = bPressed;
- // Figure out if the right trigger has been pressed or released
- bPressed = ( pGamePad->bRightTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD );
- pGamePad->bPressedRightTrigger = ( bPressed ) ? !pGamePad->bLastRightTrigger : false;
- pGamePad->bLastRightTrigger = bPressed;
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- // Don't pause the game or deactive the window without first stopping rumble otherwise
- // the controller will continue to rumble
- //--------------------------------------------------------------------------------------
- HRESULT DXUTStopRumbleOnAllControllers()
- {
- static LPXINPUTSETSTATE s_pXInputSetState = NULL;
- if( NULL == s_pXInputSetState )
- {
- WCHAR wszPath[MAX_PATH];
- if( GetSystemDirectory( wszPath, MAX_PATH ) )
- {
- StringCchCat( wszPath, MAX_PATH, L"\" );
- StringCchCat( wszPath, MAX_PATH, XINPUT_DLL );
- HINSTANCE hInst = LoadLibrary( wszPath );
- if( hInst )
- s_pXInputSetState = (LPXINPUTSETSTATE)GetProcAddress( hInst, "XInputSetState" );
- }
- }
- if( s_pXInputSetState == NULL )
- return E_FAIL;
- XINPUT_VIBRATION vibration;
- vibration.wLeftMotorSpeed = 0;
- vibration.wRightMotorSpeed = 0;
- for( int iUserIndex=0; iUserIndex<DXUT_MAX_CONTROLLERS; iUserIndex++ )
- s_pXInputSetState( iUserIndex, &vibration );
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- // Helper function to launch the Media Center UI after the program terminates
- //--------------------------------------------------------------------------------------
- bool DXUTReLaunchMediaCenter()
- {
- // Skip if not running on a Media Center
- if( GetSystemMetrics( 87 ) == 0 ) // SM_MEDIACENTER == 87, but is only defined if _WIN32_WINNT >= 0x0501
- return false;
- // Get the path to Media Center
- WCHAR szExpandedPath[MAX_PATH];
- if( !ExpandEnvironmentStrings( L"%SystemRoot%\ehome\ehshell.exe", szExpandedPath, MAX_PATH) )
- return false;
- // Skip if ehshell.exe doesn't exist
- if( GetFileAttributes( szExpandedPath ) == 0xFFFFFFFF )
- return false;
- // Launch ehshell.exe
- INT_PTR result = (INT_PTR)ShellExecute( NULL, TEXT("open"), szExpandedPath, NULL, NULL, SW_SHOWNORMAL);
- return (result > 32);
- }