90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
#include "stdafx.h"
|
|
#include "IResourceFactory.h"
|
|
#include "OrthographicCamera.h"
|
|
|
|
|
|
OrthographicCamera::OrthographicCamera(IEngine& argEngine)
|
|
: BaseCamera(argEngine)
|
|
, m_Width(1.0f)
|
|
, m_Height(1.0f)
|
|
{
|
|
}
|
|
|
|
|
|
OrthographicCamera::~OrthographicCamera()
|
|
{
|
|
m_Engine.get_ResourceFactory().DeleteOrthographicCamera(*const_cast<OrthographicCamera*>(this), true);
|
|
}
|
|
|
|
|
|
void OrthographicCamera::set_Width(float argValue)
|
|
{
|
|
m_Width = argValue;
|
|
m_IsDirty = true;
|
|
}
|
|
|
|
|
|
void OrthographicCamera::set_Height(float argValue)
|
|
{
|
|
m_Height = argValue;
|
|
m_IsDirty = true;
|
|
}
|
|
|
|
|
|
void OrthographicCamera::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();
|
|
|
|
::D3DXMatrixOrthoLH(&projectionMatrix, m_Width, m_Height, 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;
|
|
}
|