Files
bluflame/aiwaz/Aiwaz/Resources/Camera/PerspectiveCamera.cpp
2026-04-18 22:31:51 +02:00

81 lines
2.7 KiB
C++

#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<PerspectiveCamera*>(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<float>(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;
}