Fichier source en cours : FW - ThirdPersonCamera.cpp






Voici le code source cpp :



001    #include "Framework.h"
002 
003using namespace fw;
004 
005ThirdPersonCamera::ThirdPersonCamera(const std::string& sName) :
006Camera(sName),
007m_fSpeed(30), // Mettre define
008m_bCenterMouse(true),
009m_bActive(true),
010m_fDistance(15.0f) // Mettre define
011{
012    m_camAngle = D3DXVECTOR2(0, 0);
013}
014 
015ThirdPersonCamera::~ThirdPersonCamera()
016{
017}
018 
019void ThirdPersonCamera::SetSpeed(float fSpeed)
020{
021    m_fSpeed = fSpeed;
022}
023 
024void ThirdPersonCamera::SetTarget(const D3DXVECTOR3& target)
025{
026    m_lookAt = m_translation - target;
027 
028    BuildView();
029}
030 
031void 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 
073void ThirdPersonCamera::ToggleCenteredMouseCursor()
074{
075    m_bCenterMouse = !m_bCenterMouse;
076 
077    ShowCursor(!m_bCenterMouse);
078}
079 
080void 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 
117void 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 
134bool ThirdPersonCamera::GetActive()
135{
136    return m_bActive;
137}
138 
139void ThirdPersonCamera::SetDistance(float fDistance)
140{
141    m_fDistance = fDistance;
142}
143