#include "Framework.h" using namespace fw; Camera::Camera(const std::string& sName) : m_sName(sName), m_fNear(CAMERA_NEAR_DEFAULT_VALUE), m_fFar(CAMERA_FAR_DEFAULT_VALUE), m_bIgnoreUpdate(false), m_pCameraSceneNode(nullptr) { D3DXMatrixIdentity(&m_view); D3DXMatrixIdentity(&m_proj); m_translation = D3DXVECTOR3(0.0f, 0.0f, 0.0f); m_up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); m_lookAt = D3DXVECTOR3(0.0f, 0.0f, 1.0f); m_right = D3DXVECTOR3(1.0f, 0.0f, 0.0f); UpdateLens((float)D3DX_PI * 0.25f, (float)D3D10_RENDERER->GetViewportWidth() / (float)D3D10_RENDERER->GetViewportHeight(), m_fNear, m_fFar); BuildView(); } Camera::~Camera() { SAFE_DELETE(m_pCameraSceneNode); } std::string& Camera::GetName() { return m_sName; } void Camera::LookAt(const D3DXVECTOR3& lookAt) { m_lookAt = lookAt; BuildView(); } void Camera::SetIgnoreUpdate(bool bIgnore) { m_bIgnoreUpdate = bIgnore; } bool Camera::GetIgnoreUpdate() { return m_bIgnoreUpdate; } void Camera::SetTarget(const D3DXVECTOR3& target) { D3DXVECTOR3 L = target - m_translation; D3DXVec3Normalize(&L, &L); D3DXVECTOR3 R; D3DXVec3Cross(&R, &m_up, &L); D3DXVec3Normalize(&R, &R); D3DXVECTOR3 U; D3DXVec3Cross(&U, &L, &R); D3DXVec3Normalize(&U, &U); m_up = U; m_lookAt = L; m_right = R; BuildView(); } void Camera::SetTarget(float x, float y, float z) { SetTarget(D3DXVECTOR3(x, y, z)); } D3DXVECTOR3 Camera::GetTarget() { return m_translation - m_lookAt; } D3DXMATRIX* Camera::GetViewMatrix() { return &m_view; } D3DXMATRIX* Camera::GetProjectionMatrix() { return &m_proj; } void Camera::UpdateLens(float fFov, float fAspect, float fNearZ, float fFarZ) { D3DXMatrixPerspectiveFovLH(&m_proj, fFov, fAspect, fNearZ, fFarZ); m_fNear = fNearZ; m_fFar = fFarZ; } void Camera::RebuildProj() { UpdateLens((float)D3DX_PI * 0.25f, (float)SYSTEM->GetCurrentRenderer()->GetViewportWidth() / (float)SYSTEM->GetCurrentRenderer()->GetViewportHeight(), m_fNear, m_fFar); } D3DXVECTOR3 Camera::GetLookAt() { return m_lookAt; } void Camera::SetUpVector(const D3DXVECTOR3& up) { m_up = up; BuildView(); } D3DXVECTOR3 Camera::GetUpVector() { return m_up; } void Camera::Update(float fTimeSinceLastFrame) { //SetTarget(m_constantTarget); BuildView(); } void Camera::BuildView() { D3DXMatrixLookAtLH(&m_view, &m_translation, &m_lookAt, &m_up); } float Camera::GetNearValue() { return m_fNear; } float Camera::GetFarValue() { return m_fFar; } void Camera::OnTransformationChange() { if (m_pCameraSceneNode) { D3DXVECTOR3 pos = GetPosition(); D3DXVECTOR3 rot = GetRotation(); D3DXVECTOR3 scale = GetScale(); m_pCameraSceneNode->SetPosition(pos); m_pCameraSceneNode->SetRotation(rot); m_pCameraSceneNode->SetScale(scale); } }