#include "stdafx.h" #include "IResourceFactory.h" #include "PerspectiveCamera.h" PerspectiveCamera::PerspectiveCamera(IEngine& argEngine) : BaseCamera(argEngine) , m_Fov(90.0f) { } PerspectiveCamera::~PerspectiveCamera() { m_Engine.get_ResourceFactory().DeletePerspectiveCamera(*const_cast(this), true); } void PerspectiveCamera::set_Fov(float argFov) { m_Fov = argFov; m_IsDirty = true; } void PerspectiveCamera::Update(bool argForceUpdate) { BaseCamera::Update(argForceUpdate); D3DXMATRIXA16 projectionMatrix; D3DXMATRIXA16 viewMatrix; D3DXVECTOR3 worldPos = this->get_WorldPosition(); D3DXVECTOR3 worldDirection = this->get_WorldDirection(); D3DXVECTOR3 worldUpDirection = this->get_WorldUpDirection(); ::D3DXMatrixPerspectiveFovLH(&projectionMatrix, static_cast(D3DXToRadian(m_Fov)), m_AspectRatio, m_NearClip, m_FarClip); ::D3DXMatrixLookAtLH(&viewMatrix, &worldPos, &(worldPos + worldDirection), &worldUpDirection); m_ProjectionMatrix = projectionMatrix; m_ViewMatrix = viewMatrix; // generate view frustum D3DXMATRIXA16 viewProjection = viewMatrix * projectionMatrix; // Left plane m_Frustum.Plane[0].a = viewProjection._14 + viewProjection._11; m_Frustum.Plane[0].b = viewProjection._24 + viewProjection._21; m_Frustum.Plane[0].c = viewProjection._34 + viewProjection._31; m_Frustum.Plane[0].d = viewProjection._44 + viewProjection._41; // Right plane m_Frustum.Plane[1].a = viewProjection._14 - viewProjection._11; m_Frustum.Plane[1].b = viewProjection._24 - viewProjection._21; m_Frustum.Plane[1].c = viewProjection._34 - viewProjection._31; m_Frustum.Plane[1].d = viewProjection._44 - viewProjection._41; // Top plane m_Frustum.Plane[2].a = viewProjection._14 - viewProjection._12; m_Frustum.Plane[2].b = viewProjection._24 - viewProjection._22; m_Frustum.Plane[2].c = viewProjection._34 - viewProjection._32; m_Frustum.Plane[2].d = viewProjection._44 - viewProjection._42; // Bottom plane m_Frustum.Plane[3].a = viewProjection._14 + viewProjection._12; m_Frustum.Plane[3].b = viewProjection._24 + viewProjection._22; m_Frustum.Plane[3].c = viewProjection._34 + viewProjection._32; m_Frustum.Plane[3].d = viewProjection._44 + viewProjection._42; // Near plane m_Frustum.Plane[4].a = viewProjection._13; m_Frustum.Plane[4].b = viewProjection._23; m_Frustum.Plane[4].c = viewProjection._33; m_Frustum.Plane[4].d = viewProjection._43; // Far plane m_Frustum.Plane[5].a = viewProjection._14 - viewProjection._13; m_Frustum.Plane[5].b = viewProjection._24 - viewProjection._23; m_Frustum.Plane[5].c = viewProjection._34 - viewProjection._33; m_Frustum.Plane[5].d = viewProjection._44 - viewProjection._43; }