Separated Ortho and perspective matrices in camera #221

Merged
maverickdgg merged 5 commits from SP3-141-Camera-System into main 2022-11-18 12:24:19 +08:00
5 changed files with 93 additions and 54 deletions
Showing only changes of commit 7d71390d43 - Show all commits

View File

@ -12,7 +12,7 @@ namespace SHADE
:yaw(0.0f), pitch(0.0f), roll(0.0f)
, width(1920.0f), height(1080.0f), zNear(0.01f), zFar(10000.0f), fov(90.0f), movementSpeed(1.0f), turnSpeed(0.5f)
, perspProj(true), dirtyView(true), dirtyProj(true)
, viewMatrix(), projMatrix()
, viewMatrix(), perspProjMatrix(), orthoProjMatrix()
, position(), offset()
{
ComponentFamily::GetID<SHCameraComponent>();
@ -213,9 +213,22 @@ namespace SHADE
const SHMatrix& SHCameraComponent::GetProjMatrix() const noexcept
{
return projMatrix;
if (perspProj)
return perspProjMatrix;
else
return orthoProjMatrix;
}
const SHMatrix& SHCameraComponent::GetOrthoMatrix() const noexcept
{
return orthoProjMatrix;
}
const SHMatrix& SHCameraComponent::GetPerspectiveMatrix() const noexcept
{
return orthoProjMatrix;
}
//void SHCameraComponent::SetMainCamera(size_t directorCameraIndex) noexcept
//{
// auto system = SHSystemManager::GetSystem<SHCameraSystem>();

View File

@ -29,12 +29,14 @@ namespace SHADE
SHMatrix viewMatrix;
SHMatrix projMatrix;
SHMatrix perspProjMatrix;
SHMatrix orthoProjMatrix;
SHVec3 position;
bool perspProj;
SHVec3 offset;
public:
@ -78,6 +80,8 @@ namespace SHADE
const SHMatrix& GetViewMatrix() const noexcept;
const SHMatrix& GetProjMatrix() const noexcept;
const SHMatrix& GetOrthoMatrix() const noexcept;
const SHMatrix& GetPerspectiveMatrix() const noexcept;
//void SetMainCamera(size_t cameraDirectorIndex = 0) noexcept;

View File

@ -15,36 +15,42 @@ namespace SHADE
}
SHMatrix SHCameraDirector::GetViewMatrix() const noexcept
SHMatrix const& SHCameraDirector::GetViewMatrix() const noexcept
{
return viewMatrix;
}
SHMatrix SHCameraDirector::GetProjMatrix() const noexcept
SHMatrix const& SHCameraDirector::GetProjMatrix() const noexcept
{
return projMatrix;
}
SHMatrix SHCameraDirector::GetVPMatrix() const noexcept
SHMatrix const& SHCameraDirector::GetVPMatrix() const noexcept
{
return projMatrix * viewMatrix;
}
SHCameraComponent* SHCameraDirector::GetMainCameraComponent() noexcept
{
if (mainCameraEID == MAX_EID)
{
auto& dense = SHComponentManager::GetDense<SHCameraComponent>();
if (dense.size() == 0)
{
return nullptr;
}
mainCameraEID = dense[0].GetEID();
}
SHCameraComponent* camComponent = SHComponentManager::GetComponent_s<SHCameraComponent>(mainCameraEID);
if (!camComponent)
{
SHLOG_WARNING("Camera Director warning: Entity does not have a camera");
}
}
void SHCameraDirector::UpdateMatrix() noexcept
{
if (mainCameraEID == MAX_EID)
{
auto& dense = SHComponentManager::GetDense<SHCameraComponent>();
if (dense.size() == 0)
{
return;
}
mainCameraEID = dense[0].GetEID();
}
SHCameraComponent* camComponent = SHComponentManager::GetComponent_s<SHCameraComponent>(mainCameraEID);
if (!camComponent)
{
SHLOG_WARNING("Camera Director warning: Entity does not have a camera");
}
else
SHCameraComponent* camComponent = GetMainCameraComponent();
if(camComponent)
{
viewMatrix = camComponent->GetViewMatrix();
projMatrix = camComponent->GetProjMatrix();
@ -62,6 +68,24 @@ namespace SHADE
mainCameraEID = camera.GetEID();
}
SHMatrix const& SHCameraDirector::GetOrthoMatrix() noexcept
{
SHCameraComponent* camComponent = GetMainCameraComponent();
if (camComponent)
return camComponent->GetOrthoMatrix();
else
return SHMatrix::Identity;
}
SHMatrix const& SHCameraDirector::GetPerspectiveMatrix() noexcept
{
SHCameraComponent* camComponent = GetMainCameraComponent();
if (camComponent)
return camComponent->GetPerspectiveMatrix();
else
return SHMatrix::Identity;
}
}

View File

@ -23,20 +23,20 @@ namespace SHADE
EntityID transitionCameraEID;
SHMatrix GetViewMatrix() const noexcept;
SHMatrix GetProjMatrix() const noexcept;
SHMatrix GetVPMatrix() const noexcept;
SHMatrix const& GetViewMatrix() const noexcept;
SHMatrix const& GetProjMatrix() const noexcept;
SHMatrix const& GetVPMatrix() const noexcept;
void UpdateMatrix() noexcept;
void SetMainCamera(SHCameraComponent& cam) noexcept;
SHMatrix const& GetOrthoMatrix() noexcept;
SHMatrix const& GetPerspectiveMatrix() noexcept;
private:
SHMatrix viewMatrix;
SHMatrix projMatrix;
SHCameraComponent* GetMainCameraComponent() noexcept;
protected:
SHMatrix viewMatrix;
SHMatrix projMatrix;
};
typedef Handle<SHCameraDirector> DirectorHandle;

View File

@ -214,24 +214,22 @@ namespace SHADE
}
if (camera.dirtyProj == true)
{
if (camera.perspProj == true)
{
//Perspective projection matrix.
const float ASPECT_RATIO = (camera.GetAspectRatio());
const float TAN_HALF_FOV = tan(SHMath::DegreesToRadians(camera.fov) * 0.5f);
camera.projMatrix = SHMatrix::Identity;
camera.projMatrix(0, 0) = 1.0f / (ASPECT_RATIO * TAN_HALF_FOV);
camera.projMatrix(1, 1) = 1.0f / TAN_HALF_FOV;
camera.projMatrix(2, 2) = camera.zFar / (camera.zFar - camera.zNear);
camera.projMatrix(3, 3) = 0.0f;
camera.perspProjMatrix = SHMatrix::Identity;
camera.perspProjMatrix(0, 0) = 1.0f / (ASPECT_RATIO * TAN_HALF_FOV);
camera.perspProjMatrix(1, 1) = 1.0f / TAN_HALF_FOV;
camera.perspProjMatrix(2, 2) = camera.zFar / (camera.zFar - camera.zNear);
camera.perspProjMatrix(3, 3) = 0.0f;
camera.perspProjMatrix(3, 2) = 1.0f;
camera.perspProjMatrix(2, 3) = -(camera.zFar * camera.zNear) / (camera.zFar - camera.zNear);
//Orthographic projection matrix
camera.projMatrix(3, 2) = 1.0f;
camera.projMatrix(2, 3) = -(camera.zFar * camera.zNear) / (camera.zFar - camera.zNear);
camera.dirtyProj = false;
}
else
{
const float right = camera.GetWidth() * 0.5f;
const float left = -right;
const float top = camera.GetHeight() * 0.5f;
@ -239,20 +237,20 @@ namespace SHADE
const float n = camera.GetNear();
const float f = camera.GetFar();
camera.projMatrix = SHMatrix::Identity;
camera.projMatrix(0, 0) = 2.0f / (right - left);
camera.projMatrix(1, 1) = 2.0f / (btm - top);
camera.projMatrix(2, 2) = 1.0f / (f-n);
camera.projMatrix(0, 3) = -(right + left) / (right - left);
camera.projMatrix(1, 3) = -(btm + top) / (btm - top);
camera.projMatrix(2, 3) = -n / (f-n);
camera.projMatrix(3, 3) = 1.0f;
camera.orthoProjMatrix = SHMatrix::Identity;
camera.orthoProjMatrix(0, 0) = 2.0f / (right - left);
camera.orthoProjMatrix(1, 1) = 2.0f / (btm - top);
camera.orthoProjMatrix(2, 2) = 1.0f / (f-n);
camera.orthoProjMatrix(0, 3) = -(right + left) / (right - left);
camera.orthoProjMatrix(1, 3) = -(btm + top) / (btm - top);
camera.orthoProjMatrix(2, 3) = -n / (f-n);
camera.orthoProjMatrix(3, 3) = 1.0f;
camera.projMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar());
camera.orthoProjMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar());
//camera.projMatrix.Transpose();
camera.dirtyProj = false;
}
}
}