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