001 | #include "Framework.h" |
002 |
003 | using namespace fw; |
004 |
005 | ThirdPersonCamera::ThirdPersonCamera( const std::string& sName) : |
006 | Camera(sName), |
007 | m_fSpeed(30), // Mettre define |
008 | m_bCenterMouse( true ), |
009 | m_bActive( true ), |
010 | m_fDistance(15.0f) // Mettre define |
011 | { |
012 | m_camAngle = D3DXVECTOR2(0, 0); |
013 | } |
014 |
015 | ThirdPersonCamera::~ThirdPersonCamera() |
016 | { |
017 | } |
018 |
019 | void ThirdPersonCamera::SetSpeed( float fSpeed) |
020 | { |
021 | m_fSpeed = fSpeed; |
022 | } |
023 |
024 | void ThirdPersonCamera::SetTarget( const D3DXVECTOR3& target) |
025 | { |
026 | m_lookAt = m_translation - target; |
027 |
028 | BuildView(); |
029 | } |
030 |
031 | void ThirdPersonCamera::Update( float dt) |
032 | { |
033 | if (!m_bActive) |
034 | { |
035 | return ; |
036 | } |
037 |
038 | float x = 0.0f; |
039 | float y = 0.0f; |
040 |
041 | INPUT_MANAGER->GetMouseRelativePosition(x, y); |
042 |
043 | m_camAngle.x += x * CAMERA_SPEED_ROTATE_AROUND * dt; |
044 | m_camAngle.y -= y * CAMERA_SPEED_ROTATE_AROUND * dt; |
045 |
046 | m_camAngle.y = MATHS->Clamp(0.003f, ( float ) D3DX_PI - 0.003f, m_camAngle.y); |
047 |
048 | // Trigonométrie pour faire en sorte que la caméra |
049 | // fasse une rotation autour d'un point |
050 | float cosX = cos (m_camAngle.x); |
051 | float cosY = cos (m_camAngle.y); |
052 | float sinY = sin (m_camAngle.y); |
053 | float sinX = sin (m_camAngle.x); |
054 |
055 | float xf = cosX * sinY; |
056 | float yf = cosY; |
057 | float zf = sinX * sinY; |
058 |
059 | D3DXVECTOR3 finalPos(xf, yf, zf); |
060 |
061 | m_translation = finalPos * m_fDistance; |
062 |
063 | INPUT_MANAGER->GetMouseRelativePosition(x, y); |
064 |
065 | if (m_bCenterMouse) |
066 | { |
067 | INPUT_MANAGER->CenterMouseCursor(); |
068 | } |
069 |
070 | Camera::Update(dt); |
071 | } |
072 |
073 | void ThirdPersonCamera::ToggleCenteredMouseCursor() |
074 | { |
075 | m_bCenterMouse = !m_bCenterMouse; |
076 |
077 | ShowCursor(!m_bCenterMouse); |
078 | } |
079 |
080 | void ThirdPersonCamera::BuildView() |
081 | { |
082 | D3DXMatrixLookAtLH(&m_view, &m_translation, &m_lookAt, &m_up); |
083 |
084 | /* |
085 | D3DXVec3Cross(&m_up, &m_lookAt, &m_right); |
086 | D3DXVec3Normalize(&m_up, &m_up); |
087 |
088 | D3DXVec3Cross(&m_right, &m_up, &m_lookAt); |
089 | D3DXVec3Normalize(&m_right, &m_right); |
090 |
091 | float x = -D3DXVec3Dot(&m_pos, &m_right); |
092 | float y = -D3DXVec3Dot(&m_pos, &m_up); |
093 | float z = -D3DXVec3Dot(&m_pos, &m_lookAt); |
094 |
095 | m_view(0, 0) = m_right.x; |
096 | m_view(1, 0) = m_right.y; |
097 | m_view(2, 0) = m_right.z; |
098 | m_view(3, 0) = x; |
099 |
100 | m_view(0, 1) = m_up.x; |
101 | m_view(1, 1) = m_up.y; |
102 | m_view(2, 1) = m_up.z; |
103 | m_view(3, 1) = y; |
104 |
105 | m_view(0, 2) = m_lookAt.x; |
106 | m_view(1, 2) = m_lookAt.y; |
107 | m_view(2, 2) = m_lookAt.z; |
108 | m_view(3, 2) = z; |
109 |
110 | m_view(0, 3) = 0.0f; |
111 | m_view(1, 3) = 0.0f; |
112 | m_view(2, 3) = 0.0f; |
113 | m_view(3, 3) = 1.0f; |
114 | */ |
115 | } |
116 |
117 | void ThirdPersonCamera::SetActive( bool bActive) |
118 | { |
119 | m_bActive = bActive; |
120 |
121 | ShowCursor(!bActive); |
122 |
123 | if (bActive) |
124 | { |
125 | INPUT_MANAGER->SaveMousePosition(); |
126 | INPUT_MANAGER->CenterMouseCursor(); |
127 | } |
128 | else // On restaure l'ancienne position de la souris |
129 | { |
130 | INPUT_MANAGER->RestoreMousePosition(); |
131 | } |
132 | } |
133 |
134 | bool ThirdPersonCamera::GetActive() |
135 | { |
136 | return m_bActive; |
137 | } |
138 |
139 | void ThirdPersonCamera::SetDistance( float fDistance) |
140 | { |
141 | m_fDistance = fDistance; |
142 | } |
143 | |