explicit Quaternion(FXMVECTOR v) { XMStoreFloat4A(this, v); }
Quaternion& operator = (FXMVECTOR v) { XMStoreFloat4A(this, v); return *this; }
Quaternion(const Vector3& axis, float angle) { XMStoreFloat4A(this, XMQuaternionRotationAxis(axis, angle)); }
Quaternion(float yaw, float pitch, float roll) { XMStoreFloat4A(this, XMQuaternionRotationRollPitchYaw(pitch, yaw, roll)); }
Quaternion() { XMStoreFloat4A(this, XMQuaternionIdentity()); }
void normalise() { XMStoreFloat4A(this, XMQuaternionNormalize(*this)); }
//-------------------------------------------------------------------------------------- // Handles mouse input //-------------------------------------------------------------------------------------- void CALLBACK OnMouse( bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext ) { if( g_bDrawTerrain ) { if( bRightButtonDown ) { if( g_pInspectionTexture != NULL ) { g_pInspectionTexture = NULL; } else { g_pInspectionTexture = g_pTerrainView->GetInspectionTexture(); } g_InspectionSliceIndex = 0; } return; } static BOOL MouseDragging = FALSE; static XMFLOAT4 DragMouseCursorPos( 0, 0, 0, 0 ); static XMFLOAT4 DragCameraPos( 0, 0, 0, 0 ); // vMousePos is the mouse cursor's location on the Z far and near planes in homogenous space XMVECTOR vMousePosFar = XMVectorSet( ( (FLOAT)xPos - g_HalfClientWidthPixels ) / g_HalfClientWidthPixels, ( (FLOAT)yPos - g_HalfClientHeightPixels ) / -g_HalfClientHeightPixels, 1, 1 ); XMMATRIX matView = XMLoadFloat4x4A( &g_matView ); XMMATRIX matViewProj = matView * XMLoadFloat4x4A( &g_matProjection ); XMVECTOR vDet; XMMATRIX matInvViewProj = XMMatrixInverse( &vDet, matViewProj ); // vMouseWorldPos is the location in world space of the mouse cursor on the near plane XMVECTOR vMouseWorldPosFar = XMVector3TransformCoord( vMousePosFar, matInvViewProj ); XMVECTOR vCameraPosWorld = XMLoadFloat4A( &g_CameraPos ); const XMVECTOR vPlaneNormal = XMVectorSet( 0, 1, 0, 0 ); const XMVECTOR vPlaneDistance = XMVectorZero(); XMVECTOR vCameraToMouseWorldFar = vMouseWorldPosFar - vCameraPosWorld; XMVECTOR t = ( vPlaneDistance - XMVector3Dot( vPlaneNormal, vCameraPosWorld ) ) / XMVector3Dot( vPlaneNormal, vCameraToMouseWorldFar ); XMVECTOR vMouseCursorWorld = vCameraPosWorld + t * vCameraToMouseWorldFar; if( bLeftButtonDown ) { if( !MouseDragging ) { MouseDragging = TRUE; XMStoreFloat4( &DragMouseCursorPos, vMouseCursorWorld ); XMStoreFloat4( &DragCameraPos, vCameraPosWorld ); } else { XMVECTOR vDragPos = XMLoadFloat4( &DragMouseCursorPos ); XMVECTOR vCameraDelta = vMouseCursorWorld - vDragPos; vCameraPosWorld -= vCameraDelta; XMStoreFloat4A( &g_CameraPos, vCameraPosWorld ); UpdateViewMatrix(); XMStoreFloat4( &DragCameraPos, vCameraPosWorld ); } } else if( MouseDragging ) { MouseDragging = FALSE; } if( bRightButtonDown ) { ID3D11TiledTexture2D* pCurrentTexture = g_pInspectionTexture; g_pInspectionTexture = NULL; UINT SceneObjectCount = (UINT)g_SceneObjects.size(); for( UINT i = 0; i < SceneObjectCount; ++i ) { const SceneObject* pSO = g_SceneObjects[i]; FLOAT X = pSO->matWorld._41; FLOAT Y = pSO->matWorld._43; FLOAT DeltaX = fabsf( X - XMVectorGetX( vMouseCursorWorld ) ); FLOAT DeltaY = fabsf( Y - XMVectorGetZ( vMouseCursorWorld ) ); if( DeltaX <= 0.5f && DeltaY <= 0.5f ) { g_pInspectionTexture = pSO->Textures[0].pTexture; break; } } if( g_pInspectionTexture != pCurrentTexture ) { g_InspectionSliceIndex = 0; } } if( nMouseWheelDelta != 0 ) { const FLOAT LogMoveSpeed = 0.05f * ( (FLOAT)nMouseWheelDelta / 120.0f ); FLOAT CameraY = XMVectorGetY( vCameraPosWorld ); float LogYPos = logf( CameraY ); LogYPos -= LogMoveSpeed; vCameraPosWorld = XMVectorSetY( vCameraPosWorld, max( 0.001f, expf( LogYPos ) ) ); XMStoreFloat4A( &g_CameraPos, vCameraPosWorld ); UpdateViewMatrix(); } }