parent
d4fe63722a
commit
64002c6f2b
|
@ -93,6 +93,7 @@ namespace Sandbox
|
||||||
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BeginRoutine>();
|
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BeginRoutine>();
|
||||||
|
|
||||||
SHSystemManager::RegisterRoutine<SHCameraSystem, SHCameraSystem::EditorCameraUpdate>();
|
SHSystemManager::RegisterRoutine<SHCameraSystem, SHCameraSystem::EditorCameraUpdate>();
|
||||||
|
SHSystemManager::RegisterRoutine<SHCameraSystem, SHCameraSystem::CameraSystemUpdate>();
|
||||||
|
|
||||||
#ifdef SHEDITOR
|
#ifdef SHEDITOR
|
||||||
SHSystemManager::RegisterRoutine<SHEditor, SHEditor::EditorRoutine>();
|
SHSystemManager::RegisterRoutine<SHEditor, SHEditor::EditorRoutine>();
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "Physics/Components/SHColliderComponent.h"
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
#include "Camera/SHCameraComponent.h"
|
||||||
|
|
||||||
using namespace SHADE;
|
using namespace SHADE;
|
||||||
|
|
||||||
|
@ -166,6 +167,10 @@ namespace Sandbox
|
||||||
transformShowcase.SetWorldPosition({ 3.0f, -1.0f, -1.0f });
|
transformShowcase.SetWorldPosition({ 3.0f, -1.0f, -1.0f });
|
||||||
transformShowcase.SetLocalScale({ 5.0f, 5.0f, 5.0f });
|
transformShowcase.SetLocalScale({ 5.0f, 5.0f, 5.0f });
|
||||||
scriptEngine->AddScript(raccoonShowcase, "RaccoonShowcase");
|
scriptEngine->AddScript(raccoonShowcase, "RaccoonShowcase");
|
||||||
|
|
||||||
|
SHComponentManager::AddComponent<SHCameraComponent>(0);
|
||||||
|
SHComponentManager::RemoveComponent <SHRigidBodyComponent>(0);
|
||||||
|
SHComponentManager::RemoveComponent <SHColliderComponent>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SBTestScene::Update(float dt)
|
void SBTestScene::Update(float dt)
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
#include "SHCameraComponent.h"
|
#include "SHCameraComponent.h"
|
||||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
|
#include "SHCameraSystem.h"
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
SHCameraComponent::SHCameraComponent()
|
SHCameraComponent::SHCameraComponent()
|
||||||
:yaw(0.0f), pitch(0.0f), roll(0.0f)
|
: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(1.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)
|
, perspProj(true), dirtyView(true), dirtyProj(true)
|
||||||
, viewMatrix(), projMatrix()
|
, viewMatrix(), projMatrix()
|
||||||
, position()
|
, position()
|
||||||
|
@ -22,33 +24,69 @@ namespace SHADE
|
||||||
void SHCameraComponent::SetYaw(float yaw) noexcept
|
void SHCameraComponent::SetYaw(float yaw) noexcept
|
||||||
{
|
{
|
||||||
this->yaw = yaw;
|
this->yaw = yaw;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 rotation = transform->GetWorldRotation();
|
||||||
|
transform->SetWorldRotation(SHVec3{rotation.x,yaw, rotation.z});
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCameraComponent::SetPitch(float pitch) noexcept
|
void SHCameraComponent::SetPitch(float pitch) noexcept
|
||||||
{
|
{
|
||||||
this->pitch = pitch;
|
this->pitch = pitch;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 rotation = transform->GetWorldRotation();
|
||||||
|
transform->SetWorldRotation(SHVec3{ pitch,rotation.y, rotation.z });
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCameraComponent::SetRoll(float roll) noexcept
|
void SHCameraComponent::SetRoll(float roll) noexcept
|
||||||
{
|
{
|
||||||
this->roll = roll;
|
this->roll = roll;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 rotation = transform->GetWorldRotation();
|
||||||
|
transform->SetWorldRotation(SHVec3{ rotation.x,rotation.y, roll});
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
void SHCameraComponent::SetPositionX(float x) noexcept
|
void SHCameraComponent::SetPositionX(float x) noexcept
|
||||||
{
|
{
|
||||||
position.x = x;
|
position.x = x;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 position = transform->GetWorldPosition();
|
||||||
|
transform->SetWorldRotation(SHVec3{ x,position.y, position.z});
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
void SHCameraComponent::SetPositionY(float y) noexcept
|
void SHCameraComponent::SetPositionY(float y) noexcept
|
||||||
{
|
{
|
||||||
position.y = y;
|
position.y = y;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 position = transform->GetWorldPosition();
|
||||||
|
transform->SetWorldRotation(SHVec3{ position.x,y, position.z });
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
void SHCameraComponent::SetPositionZ(float z) noexcept
|
void SHCameraComponent::SetPositionZ(float z) noexcept
|
||||||
{
|
{
|
||||||
position.z = z;
|
position.z = z;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 position = transform->GetWorldPosition();
|
||||||
|
transform->SetWorldRotation(SHVec3{ position.x,position.y, z });
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
void SHCameraComponent::SetPosition(float x,float y, float z) noexcept
|
void SHCameraComponent::SetPosition(float x,float y, float z) noexcept
|
||||||
|
@ -56,11 +94,23 @@ namespace SHADE
|
||||||
position.x = x;
|
position.x = x;
|
||||||
position.y = y;
|
position.y = y;
|
||||||
position.z = z;
|
position.z = z;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 position = transform->GetWorldPosition();
|
||||||
|
transform->SetWorldRotation(SHVec3{ x,y, z });
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
void SHCameraComponent::SetPosition(SHVec3& pos) noexcept
|
void SHCameraComponent::SetPosition(SHVec3& pos) noexcept
|
||||||
{
|
{
|
||||||
this->position = pos;
|
this->position = pos;
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(GetEID()))
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(GetEID());
|
||||||
|
SHVec3 position = transform->GetWorldPosition();
|
||||||
|
transform->SetWorldRotation(pos);
|
||||||
|
}
|
||||||
dirtyView = true;
|
dirtyView = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,4 +178,12 @@ namespace SHADE
|
||||||
return projMatrix;
|
return projMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHCameraComponent::SetMainCamera(size_t directorCameraIndex) noexcept
|
||||||
|
{
|
||||||
|
auto system = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
system->GetDirector(directorCameraIndex)->SetMainCamera(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,8 @@ namespace SHADE
|
||||||
const SHMatrix& GetViewMatrix() const noexcept;
|
const SHMatrix& GetViewMatrix() const noexcept;
|
||||||
const SHMatrix& GetProjMatrix() const noexcept;
|
const SHMatrix& GetProjMatrix() const noexcept;
|
||||||
|
|
||||||
|
void SetMainCamera(size_t cameraDirectorIndex = 0) noexcept;
|
||||||
|
|
||||||
|
|
||||||
float movementSpeed;
|
float movementSpeed;
|
||||||
SHVec3 turnSpeed;
|
SHVec3 turnSpeed;
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHCameraDirector.h"
|
||||||
|
#include "SHCameraComponent.h"
|
||||||
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
|
#include "Tools/SHLog.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
SHCameraDirector::SHCameraDirector()
|
||||||
|
:mainCameraEID(MAX_EID), transitionCameraEID(MAX_EID)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHMatrix SHCameraDirector::GetViewMatrix() const noexcept
|
||||||
|
{
|
||||||
|
return viewMatrix;
|
||||||
|
}
|
||||||
|
SHMatrix SHCameraDirector::GetProjMatrix() const noexcept
|
||||||
|
{
|
||||||
|
return projMatrix;
|
||||||
|
}
|
||||||
|
SHMatrix SHCameraDirector::GetVPMatrix() const noexcept
|
||||||
|
{
|
||||||
|
return projMatrix * viewMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
viewMatrix = camComponent->GetViewMatrix();
|
||||||
|
projMatrix = camComponent->GetProjMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCameraDirector::SetMainCamera(SHCameraComponent& camera) noexcept
|
||||||
|
{
|
||||||
|
if (SHEntityManager::IsValidEID(camera.GetEID()) == false)
|
||||||
|
{
|
||||||
|
SHLOG_WARNING("Camera Director Warning: Attempting to set an invalid entity as main camera.")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mainCameraEID = camera.GetEID();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SH_API.h"
|
||||||
|
#include "ECS_Base/Entity/SHEntity.h"
|
||||||
|
#include "Math/SHMatrix.h"
|
||||||
|
#include "Resource/Handle.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHCameraComponent;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SH_API SHCameraDirector
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SHCameraDirector();
|
||||||
|
~SHCameraDirector() = default;
|
||||||
|
|
||||||
|
|
||||||
|
EntityID mainCameraEID;
|
||||||
|
EntityID transitionCameraEID;
|
||||||
|
|
||||||
|
SHMatrix GetViewMatrix() const noexcept;
|
||||||
|
SHMatrix GetProjMatrix() const noexcept;
|
||||||
|
SHMatrix GetVPMatrix() const noexcept;
|
||||||
|
void UpdateMatrix() noexcept;
|
||||||
|
void SetMainCamera(SHCameraComponent& cam) noexcept;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SHMatrix viewMatrix;
|
||||||
|
SHMatrix projMatrix;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Handle<SHCameraDirector> DirectorHandle;
|
||||||
|
|
||||||
|
}
|
|
@ -2,67 +2,115 @@
|
||||||
#include "SHCameraSystem.h"
|
#include "SHCameraSystem.h"
|
||||||
#include "Math/SHMathHelpers.h"
|
#include "Math/SHMathHelpers.h"
|
||||||
#include "Input/SHInputManager.h"
|
#include "Input/SHInputManager.h"
|
||||||
|
#include "Math/Vector/SHVec2.h"
|
||||||
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
void SHCameraSystem::UpdateEditorCamera(double dt) noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
auto& camera = editorCamera;
|
||||||
|
SHVec3 view, right, UP;
|
||||||
|
GetCameraAxis(camera, view, right, UP);
|
||||||
|
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::A))
|
||||||
|
{
|
||||||
|
camera.position -= right * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::D))
|
||||||
|
{
|
||||||
|
camera.position += right * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::W))
|
||||||
|
{
|
||||||
|
camera.position += view * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::S))
|
||||||
|
{
|
||||||
|
camera.position -= view * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::Q))
|
||||||
|
{
|
||||||
|
camera.position += UP * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::E))
|
||||||
|
{
|
||||||
|
camera.position -= UP * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::RMB))
|
||||||
|
{
|
||||||
|
double mouseX, mouseY;
|
||||||
|
SHInputManager::GetMouseVelocity(&mouseX, &mouseY);
|
||||||
|
|
||||||
|
//std::cout << camera.yaw << std::endl;
|
||||||
|
|
||||||
|
camera.pitch -= mouseY * dt * camera.turnSpeed.x;
|
||||||
|
camera.yaw -= mouseX * dt * camera.turnSpeed.y;
|
||||||
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateCameraComponent(editorCamera);
|
||||||
|
}
|
||||||
void SHCameraSystem::EditorCameraUpdate::Execute(double dt) noexcept
|
void SHCameraSystem::EditorCameraUpdate::Execute(double dt) noexcept
|
||||||
{
|
{
|
||||||
SHCameraSystem* system = static_cast<SHCameraSystem*>(GetSystem());
|
SHCameraSystem* system = static_cast<SHCameraSystem*>(GetSystem());
|
||||||
auto& camera = system->editorCamera;
|
auto& camera = system->editorCamera;
|
||||||
SHVec3 target{ 0.0f,0.0f,-1.0f };
|
SHVec3 view, right, UP;
|
||||||
SHVec3 up = { 0.0f,1.0f,0.0f };
|
system->GetCameraAxis(camera, view, right, UP);
|
||||||
|
|
||||||
|
|
||||||
SHVec3::RotateY(target, SHMath::DegreesToRadians(camera.yaw));
|
|
||||||
SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch));
|
|
||||||
target += camera.position;
|
|
||||||
////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll));
|
|
||||||
|
|
||||||
//target = SHVec3::Normalise(target);
|
|
||||||
|
|
||||||
SHVec3::RotateZ(up, camera.roll);
|
|
||||||
up = SHVec3::Normalise(up);
|
|
||||||
|
|
||||||
|
|
||||||
SHVec3 view = target - camera.position; view = SHVec3::Normalise(view);
|
|
||||||
SHVec3 right = SHVec3::Cross(view, up); right = SHVec3::Normalise(right);
|
|
||||||
const SHVec3 UP = SHVec3::Cross(view, right);
|
|
||||||
|
|
||||||
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::A))
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::A))
|
||||||
{
|
{
|
||||||
system->editorCamera.position -= right * dt * camera.movementSpeed;
|
//std::cout << "Camera movement: "<<right.x<<", " << right.y << std::endl;
|
||||||
system->editorCamera.dirtyView = true;
|
camera.position -= right * dt * camera.movementSpeed;
|
||||||
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::D))
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::D))
|
||||||
{
|
{
|
||||||
system->editorCamera.position += right * dt * camera.movementSpeed;
|
camera.position += right * dt * camera.movementSpeed;
|
||||||
system->editorCamera.dirtyView = true;
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::W))
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::W))
|
||||||
{
|
{
|
||||||
system->editorCamera.position += view * dt * camera.movementSpeed;
|
camera.position += view * dt * camera.movementSpeed;
|
||||||
system->editorCamera.dirtyView = true;
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::S))
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::S))
|
||||||
{
|
{
|
||||||
system->editorCamera.position -= view * dt * camera.movementSpeed;
|
camera.position -= view * dt * camera.movementSpeed;
|
||||||
system->editorCamera.dirtyView = true;
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::Q))
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::Q))
|
||||||
{
|
{
|
||||||
system->editorCamera.position += UP * dt * camera.movementSpeed;
|
camera.position += UP * dt * camera.movementSpeed;
|
||||||
system->editorCamera.dirtyView = true;
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::E))
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::E))
|
||||||
{
|
{
|
||||||
system->editorCamera.position -= UP * dt * camera.movementSpeed;
|
camera.position -= UP * dt * camera.movementSpeed;
|
||||||
system->editorCamera.dirtyView = true;
|
camera.dirtyView = true;
|
||||||
|
}
|
||||||
|
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::RMB))
|
||||||
|
{
|
||||||
|
double mouseX, mouseY;
|
||||||
|
SHInputManager::GetMouseVelocity(&mouseX,&mouseY);
|
||||||
|
|
||||||
|
//std::cout << camera.yaw << std::endl;
|
||||||
|
|
||||||
|
camera.pitch -= mouseY * dt * camera.turnSpeed.x;
|
||||||
|
camera.yaw -= mouseX * dt * camera.turnSpeed.y;
|
||||||
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//std::cout << "Camera position: " << camera.position.x << " " << camera.position.y << std::endl;
|
||||||
system->UpdateCameraComponent(system->editorCamera);
|
system->UpdateCameraComponent(system->editorCamera);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,26 +136,26 @@ namespace SHADE
|
||||||
|
|
||||||
void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept
|
void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept
|
||||||
{
|
{
|
||||||
|
if (SHComponentManager::HasComponent<SHTransformComponent>(camera.GetEID()) == true && &camera != &editorCamera)
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(camera.GetEID());
|
||||||
|
SHVec3 rotation = transform->GetWorldRotation();
|
||||||
|
camera.pitch = SHMath::RadiansToDegrees(rotation.x);
|
||||||
|
camera.yaw = SHMath::RadiansToDegrees(rotation.y);
|
||||||
|
camera.roll = SHMath::RadiansToDegrees(rotation.z);
|
||||||
|
camera.position = transform->GetWorldPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (camera.dirtyView)
|
if (camera.dirtyView)
|
||||||
{
|
{
|
||||||
SHVec3 target{ 0.0f,0.0f,-1.0f };
|
|
||||||
SHVec3 up = { 0.0f,1.0f,0.0f };
|
SHVec3 view, right, UP;
|
||||||
|
|
||||||
|
|
||||||
|
//ClampCameraRotation(camera);
|
||||||
|
|
||||||
SHVec3::RotateY(target, SHMath::DegreesToRadians(camera.yaw));
|
GetCameraAxis(camera, view, right, UP);
|
||||||
SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch));
|
|
||||||
target += camera.position;
|
|
||||||
////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll));
|
|
||||||
|
|
||||||
//target = SHVec3::Normalise(target);
|
|
||||||
|
|
||||||
SHVec3::RotateZ(up, camera.roll);
|
|
||||||
up = SHVec3::Normalise(up);
|
|
||||||
|
|
||||||
|
|
||||||
SHVec3 view = target - camera.position; view = SHVec3::Normalise(view);
|
|
||||||
SHVec3 right = SHVec3::Cross(view, up); right = SHVec3::Normalise(right);
|
|
||||||
const SHVec3 UP = SHVec3::Cross(view, right);
|
|
||||||
|
|
||||||
camera.viewMatrix = SHMatrix::Identity;
|
camera.viewMatrix = SHMatrix::Identity;
|
||||||
camera.viewMatrix(0, 0) = right[0];
|
camera.viewMatrix(0, 0) = right[0];
|
||||||
|
@ -143,38 +191,100 @@ namespace SHADE
|
||||||
camera.projMatrix(3, 2) = 1.0f;
|
camera.projMatrix(3, 2) = 1.0f;
|
||||||
camera.projMatrix(2, 3) = -(camera.zFar * camera.zNear) / (camera.zFar - camera.zNear);
|
camera.projMatrix(2, 3) = -(camera.zFar * camera.zNear) / (camera.zFar - camera.zNear);
|
||||||
|
|
||||||
//const float fov_rad = SHMath::DegreesToRadians(camera.fov);
|
|
||||||
//const float focal_length = 1.0f / tan(fov_rad * 0.5f);
|
|
||||||
|
|
||||||
//camera.projMatrix(0,0) = focal_length / camera.GetAspectRatio();
|
|
||||||
//camera.projMatrix(1,1) = -focal_length;
|
|
||||||
//camera.projMatrix(2,2) = camera.zNear / (camera.zFar - camera.zNear);
|
|
||||||
//camera.projMatrix(2,3) = camera.zFar * (camera.zNear / (camera.zFar - camera.zNear));
|
|
||||||
//camera.projMatrix(3,2) = -1.0f;
|
|
||||||
//camera.projMatrix(3,3) = 0.0f;
|
|
||||||
|
|
||||||
//camera.projMatrix = SHMatrix::Inverse(camera.projMatrix);
|
|
||||||
|
|
||||||
camera.dirtyProj = false;
|
camera.dirtyProj = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const float R = camera.width * 0.5f;
|
//const float R = camera.width * 0.5f;
|
||||||
const float L = -R;
|
//const float L = -R;
|
||||||
const float T = camera.height * 0.5f;
|
//const float T = camera.height * 0.5f;
|
||||||
const float B = -T;
|
//const float B = -T;
|
||||||
|
|
||||||
camera.projMatrix = SHMatrix::Identity;
|
//camera.projMatrix = SHMatrix::Identity;
|
||||||
camera.projMatrix(0, 0) = 2.0f / (R - L);
|
//camera.projMatrix(0, 0) = 2.0f / (R - L);
|
||||||
camera.projMatrix(1, 1) = 2.0f / (B - T);
|
//camera.projMatrix(1, 1) = 2.0f / (B - T);
|
||||||
camera.projMatrix(2, 2) = 1.0f / (camera.zFar - camera.zNear);
|
//camera.projMatrix(2, 2) = 1.0f / (camera.zFar - camera.zNear);
|
||||||
camera.projMatrix(3, 0) = -(R + L) / (R - L);
|
//camera.projMatrix(3, 0) = -(R + L) / (R - L);
|
||||||
camera.projMatrix(3, 1) = -(B + T) / (B - T);
|
//camera.projMatrix(3, 1) = -(B + T) / (B - T);
|
||||||
camera.projMatrix(3, 2) = -camera.zNear / (camera.zFar - camera.zNear);
|
//camera.projMatrix(3, 2) = -camera.zNear / (camera.zFar - camera.zNear);
|
||||||
|
|
||||||
camera.dirtyProj = false;
|
camera.dirtyProj = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHCameraSystem::GetCameraAxis(SHCameraComponent const& camera, SHVec3& forward, SHVec3& right, SHVec3& upVec) const noexcept
|
||||||
|
{
|
||||||
|
SHVec3 target{ 0.0f,0.0f,-1.0f };
|
||||||
|
SHVec3 up = { 0.0f,1.0f,0.0f };
|
||||||
|
|
||||||
|
|
||||||
|
target = SHVec3::RotateY(target, SHMath::DegreesToRadians(camera.yaw));
|
||||||
|
target =SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch));
|
||||||
|
target += camera.position;
|
||||||
|
////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll));
|
||||||
|
|
||||||
|
//target = SHVec3::Normalise(target);
|
||||||
|
|
||||||
|
SHVec3::RotateZ(up, camera.roll);
|
||||||
|
up = SHVec3::Normalise(up);
|
||||||
|
|
||||||
|
|
||||||
|
forward = target - camera.position; forward = SHVec3::Normalise(forward);
|
||||||
|
right = SHVec3::Cross(forward, up); right = SHVec3::Normalise(right);
|
||||||
|
upVec = SHVec3::Cross(forward, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCameraSystem::CameraSystemUpdate::Execute(double dt) noexcept
|
||||||
|
{
|
||||||
|
SHCameraSystem* system = static_cast<SHCameraSystem*>(GetSystem());
|
||||||
|
auto& dense = SHComponentManager::GetDense<SHCameraComponent>();
|
||||||
|
for (auto& cam : dense)
|
||||||
|
{
|
||||||
|
system->UpdateCameraComponent(cam);
|
||||||
|
}
|
||||||
|
for (auto& handle : system->directorHandleList)
|
||||||
|
{
|
||||||
|
handle->UpdateMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DirectorHandle SHCameraSystem::CreateDirector() noexcept
|
||||||
|
{
|
||||||
|
auto handle = directorLibrary.Create();
|
||||||
|
directorHandleList.emplace_back(handle);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
DirectorHandle SHCameraSystem::GetDirector(size_t index) noexcept
|
||||||
|
{
|
||||||
|
if (index < directorHandleList.size())
|
||||||
|
{
|
||||||
|
return directorHandleList[index];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return CreateDirector();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void SHCameraSystem::ClampCameraRotation(SHCameraComponent& camera) noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (camera.pitch > 85)
|
||||||
|
camera.SetPitch(85);
|
||||||
|
if (camera.pitch < -85)
|
||||||
|
camera.SetPitch(-85);
|
||||||
|
if (camera.roll > 85)
|
||||||
|
camera.SetRoll(85);
|
||||||
|
if (camera.roll < -85)
|
||||||
|
camera.SetRoll(-85);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,10 @@
|
||||||
#include "ECS_Base/System/SHSystem.h"
|
#include "ECS_Base/System/SHSystem.h"
|
||||||
#include "SHCameraComponent.h"
|
#include "SHCameraComponent.h"
|
||||||
#include "ECS_Base/System/SHSystemRoutine.h"
|
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||||
|
#include "Resource/ResourceLibrary.h"
|
||||||
|
#include "SHCameraDirector.h"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SH_API SHCameraSystem final : public SHSystem
|
class SH_API SHCameraSystem final : public SHSystem
|
||||||
|
@ -14,8 +15,9 @@ namespace SHADE
|
||||||
//A camera component that represents editor camera.
|
//A camera component that represents editor camera.
|
||||||
//This is not tied to any entity. Hence this EID should not be used.
|
//This is not tied to any entity. Hence this EID should not be used.
|
||||||
SHCameraComponent editorCamera;
|
SHCameraComponent editorCamera;
|
||||||
|
|
||||||
|
|
||||||
|
ResourceLibrary<SHCameraDirector> directorLibrary;
|
||||||
|
std::vector<DirectorHandle> directorHandleList;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SHCameraSystem(void) = default;
|
SHCameraSystem(void) = default;
|
||||||
|
@ -34,12 +36,27 @@ namespace SHADE
|
||||||
};
|
};
|
||||||
friend class EditorCameraUpdate;
|
friend class EditorCameraUpdate;
|
||||||
|
|
||||||
SHCameraComponent* GetEditorCamera (void) noexcept;
|
class SH_API CameraSystemUpdate final: public SHSystemRoutine
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", false) {};
|
||||||
|
virtual void Execute(double dt)noexcept override final;
|
||||||
|
};
|
||||||
|
friend class CameraSystemUpdate;
|
||||||
|
|
||||||
|
|
||||||
|
SHCameraComponent* GetEditorCamera (void) noexcept;
|
||||||
|
void GetCameraAxis(SHCameraComponent const& camera, SHVec3& forward, SHVec3& right, SHVec3& up) const noexcept;
|
||||||
|
DirectorHandle CreateDirector() noexcept;
|
||||||
|
DirectorHandle GetDirector(size_t index) noexcept;
|
||||||
|
void ClampCameraRotation(SHCameraComponent& camera) noexcept;
|
||||||
|
void UpdateEditorCamera(double dt) noexcept;
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void UpdateCameraComponent(SHCameraComponent& camera) noexcept;
|
void UpdateCameraComponent(SHCameraComponent& camera) noexcept;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,7 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
auto windowDims = window->GetWindowSize();
|
auto windowDims = window->GetWindowSize();
|
||||||
|
|
||||||
|
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
|
||||||
// Set Up Cameras
|
// Set Up Cameras
|
||||||
screenCamera = resourceManager.Create<SHCamera>();
|
screenCamera = resourceManager.Create<SHCamera>();
|
||||||
|
@ -198,6 +199,8 @@ namespace SHADE
|
||||||
worldRenderer = worldViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], worldRenderGraph);
|
worldRenderer = worldViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], worldRenderGraph);
|
||||||
worldRenderer->SetCamera(worldCamera);
|
worldRenderer->SetCamera(worldCamera);
|
||||||
|
|
||||||
|
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
||||||
|
|
||||||
auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl");
|
auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl");
|
||||||
auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl");
|
auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl");
|
||||||
|
|
||||||
|
@ -335,21 +338,7 @@ namespace SHADE
|
||||||
|
|
||||||
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
|
||||||
#ifdef SHEDITOR
|
|
||||||
|
|
||||||
auto editorSystem = SHSystemManager::GetSystem<SHEditor>();
|
|
||||||
if (editorSystem->editorState != SHEditor::State::PLAY)
|
|
||||||
{
|
|
||||||
worldRenderer->SetViewProjectionMatrix(SHMatrix::Transpose(cameraSystem->GetEditorCamera()->GetProjMatrix() * cameraSystem->GetEditorCamera()->GetViewMatrix()));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// main camera
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
// main camera
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// For every viewport
|
// For every viewport
|
||||||
for (int vpIndex = 0; vpIndex < static_cast<int>(viewports.size()); ++vpIndex)
|
for (int vpIndex = 0; vpIndex < static_cast<int>(viewports.size()); ++vpIndex)
|
||||||
|
@ -399,7 +388,22 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// bind camera data
|
// bind camera data
|
||||||
|
//renderers[renIndex]->UpdateDataAndBind(currentCmdBuffer, frameIndex);
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
if (renderers[renIndex] == worldRenderer)
|
||||||
|
{
|
||||||
|
auto editorSystem = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
if (editorSystem->editorState != SHEditor::State::PLAY)
|
||||||
|
worldRenderer->UpdateDataAndBind(currentCmdBuffer, frameIndex, SHMatrix::Transpose(cameraSystem->GetEditorCamera()->GetProjMatrix() * cameraSystem->GetEditorCamera()->GetViewMatrix()));
|
||||||
|
else
|
||||||
|
renderers[renIndex]->UpdateDataAndBind(currentCmdBuffer, frameIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
renderers[renIndex]->UpdateDataAndBind(currentCmdBuffer, frameIndex);
|
||||||
|
#else
|
||||||
renderers[renIndex]->UpdateDataAndBind(currentCmdBuffer, frameIndex);
|
renderers[renIndex]->UpdateDataAndBind(currentCmdBuffer, frameIndex);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Draw first
|
// Draw first
|
||||||
renderers[renIndex]->Draw(frameIndex, descPool);
|
renderers[renIndex]->Draw(frameIndex, descPool);
|
||||||
|
|
|
@ -21,6 +21,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
||||||
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
|
#include "Camera/SHCameraDirector.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -65,6 +66,11 @@ namespace SHADE
|
||||||
camera = _camera;
|
camera = _camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderer::SetCameraDirector(Handle<SHCameraDirector> director) noexcept
|
||||||
|
{
|
||||||
|
cameraDirector = director;
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* Drawing Functions */
|
/* Drawing Functions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -75,17 +81,24 @@ namespace SHADE
|
||||||
|
|
||||||
void SHRenderer::UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) noexcept
|
void SHRenderer::UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) noexcept
|
||||||
{
|
{
|
||||||
if (camera)
|
if (camera && cameraDirector)
|
||||||
{
|
{
|
||||||
//cpuCameraData.viewProjectionMatrix = camera->GetViewProjectionMatrix();
|
UpdateDataAndBind(cmdBuffer, frameIndex, SHMatrix::Transpose(cameraDirector->GetVPMatrix()));
|
||||||
cameraBuffer->WriteToMemory(&cpuCameraData, sizeof(SHShaderCameraData), 0, cameraDataAlignedSize * frameIndex);
|
|
||||||
|
|
||||||
std::array<uint32_t, 1> dynamicOffsets{ frameIndex * cameraDataAlignedSize };
|
|
||||||
|
|
||||||
cmdBuffer->BindDescriptorSet(cameraDescriptorSet, SH_PIPELINE_TYPE::GRAPHICS, SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS, std::span{ dynamicOffsets.data(), 1 });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderer::UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex, SHMatrix exteriorMatrix) noexcept
|
||||||
|
{
|
||||||
|
SetViewProjectionMatrix(exteriorMatrix);
|
||||||
|
|
||||||
|
//cpuCameraData.viewProjectionMatrix = camera->GetViewProjectionMatrix();
|
||||||
|
cameraBuffer->WriteToMemory(&cpuCameraData, sizeof(SHShaderCameraData), 0, cameraDataAlignedSize * frameIndex);
|
||||||
|
|
||||||
|
std::array<uint32_t, 1> dynamicOffsets{ frameIndex * cameraDataAlignedSize };
|
||||||
|
|
||||||
|
cmdBuffer->BindDescriptorSet(cameraDescriptorSet, SH_PIPELINE_TYPE::GRAPHICS, SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS, std::span{ dynamicOffsets.data(), 1 });
|
||||||
|
}
|
||||||
|
|
||||||
void SHRenderer::UpdateCameraDataToBuffer(void) noexcept
|
void SHRenderer::UpdateCameraDataToBuffer(void) noexcept
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ namespace SHADE
|
||||||
class SHGraphicsGlobalData;
|
class SHGraphicsGlobalData;
|
||||||
class SHVkDescriptorPool;
|
class SHVkDescriptorPool;
|
||||||
class SHVkBuffer;
|
class SHVkBuffer;
|
||||||
|
class SHCameraDirector;
|
||||||
|
|
||||||
struct SHShaderCameraData
|
struct SHShaderCameraData
|
||||||
{
|
{
|
||||||
|
@ -71,12 +72,14 @@ namespace SHADE
|
||||||
/* Camera Registration */
|
/* Camera Registration */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
void SetCamera(Handle<SHCamera> _camera);
|
void SetCamera(Handle<SHCamera> _camera);
|
||||||
|
void SetCameraDirector (Handle<SHCameraDirector> director) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Drawing Functions */
|
/* Drawing Functions */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
void Draw(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool) noexcept;
|
void Draw(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool) noexcept;
|
||||||
void UpdateDataAndBind (Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) noexcept;
|
void UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) noexcept;
|
||||||
|
void UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex, SHMatrix exteriorMatrix) noexcept;
|
||||||
void UpdateCameraDataToBuffer (void) noexcept;
|
void UpdateCameraDataToBuffer (void) noexcept;
|
||||||
void SetViewProjectionMatrix (SHMatrix const& vpMatrix) noexcept;
|
void SetViewProjectionMatrix (SHMatrix const& vpMatrix) noexcept;
|
||||||
|
|
||||||
|
@ -99,6 +102,8 @@ namespace SHADE
|
||||||
Handle<SHVkDescriptorSetGroup> cameraDescriptorSet;
|
Handle<SHVkDescriptorSetGroup> cameraDescriptorSet;
|
||||||
Handle<SHVkBuffer> cameraBuffer;
|
Handle<SHVkBuffer> cameraBuffer;
|
||||||
|
|
||||||
|
Handle<SHCameraDirector> cameraDirector;
|
||||||
|
|
||||||
// we really only need 1 copy even though we need %swapchainImages copies for
|
// we really only need 1 copy even though we need %swapchainImages copies for
|
||||||
// GPU.
|
// GPU.
|
||||||
SHShaderCameraData cpuCameraData;
|
SHShaderCameraData cpuCameraData;
|
||||||
|
|
Loading…
Reference in New Issue