Move new camera settings to the Settings Registry and connect them to viewport border elements (#1267)

* ensure the new camera respects changing ui values and move camera settings to the settings registry

* factor out creation of modular camera controller

* small updates before posting PR

* updates following review feedback

* updates following review feedback
This commit is contained in:
Tom Hulton-Harrop
2021-06-14 12:32:35 +01:00
committed by GitHub
parent 259542b3ca
commit 0f09a6d8bf
15 changed files with 562 additions and 290 deletions
@@ -27,14 +27,20 @@ namespace AtomToolsFramework
{
public:
using CameraListBuilder = AZStd::function<void(AzFramework::Cameras&)>;
using CameraPropsBuilder = AZStd::function<void(AzFramework::CameraProps&)>;
//! Sets the camera list builder callback used to populate new ModernViewportCameraControllerInstances
void SetCameraListBuilderCallback(const CameraListBuilder& builder);
//! Sets the camera props builder callback used to populate new ModernViewportCameraControllerInstances
void SetCameraPropsBuilderCallback(const CameraPropsBuilder& builder);
//! Sets up a camera list based on this controller's CameraListBuilderCallback
void SetupCameras(AzFramework::Cameras& cameras);
//! Sets up properties shared across all cameras
void SetupCameraProperies(AzFramework::CameraProps& cameraProps);
private:
CameraListBuilder m_cameraListBuilder;
CameraPropsBuilder m_cameraPropsBuilder;
};
class ModernViewportCameraControllerInstance final
@@ -67,6 +73,7 @@ namespace AtomToolsFramework
AzFramework::Camera m_camera;
AzFramework::Camera m_targetCamera;
AzFramework::CameraSystem m_cameraSystem;
AzFramework::CameraProps m_cameraProps;
AZ::Transform m_transformStart = AZ::Transform::CreateIdentity();
AZ::Transform m_transformEnd = AZ::Transform::CreateIdentity();
@@ -26,7 +26,11 @@
namespace AtomToolsFramework
{
AZ_CVAR(
AZ::Color, ed_cameraSystemOrbitPointColor, AZ::Color::CreateFromRgba(255, 255, 255, 255), nullptr, AZ::ConsoleFunctorFlags::Null,
AZ::Color,
ed_cameraSystemOrbitPointColor,
AZ::Color::CreateFromRgba(255, 255, 255, 255),
nullptr,
AZ::ConsoleFunctorFlags::Null,
"");
AZ_CVAR(float, ed_cameraSystemOrbitPointSize, 0.5f, nullptr, AZ::ConsoleFunctorFlags::Null, "");
@@ -63,6 +67,11 @@ namespace AtomToolsFramework
m_cameraListBuilder = builder;
}
void ModularViewportCameraController::SetCameraPropsBuilderCallback(const CameraPropsBuilder& builder)
{
m_cameraPropsBuilder = builder;
}
void ModularViewportCameraController::SetupCameras(AzFramework::Cameras& cameras)
{
if (m_cameraListBuilder)
@@ -71,11 +80,20 @@ namespace AtomToolsFramework
}
}
void ModularViewportCameraController::SetupCameraProperies(AzFramework::CameraProps& cameraProps)
{
if (m_cameraPropsBuilder)
{
m_cameraPropsBuilder(cameraProps);
}
}
ModernViewportCameraControllerInstance::ModernViewportCameraControllerInstance(
const AzFramework::ViewportId viewportId, ModularViewportCameraController* controller)
: MultiViewportControllerInstanceInterface<ModularViewportCameraController>(viewportId, controller)
{
controller->SetupCameras(m_cameraSystem.m_cameras);
controller->SetupCameraProperies(m_cameraProps);
if (auto viewportContext = RetrieveViewportContext(GetViewportId()))
{
@@ -138,7 +156,7 @@ namespace AtomToolsFramework
if (m_cameraMode == CameraMode::Control)
{
m_targetCamera = m_cameraSystem.StepCamera(m_targetCamera, event.m_deltaTime.count());
m_camera = AzFramework::SmoothCamera(m_camera, m_targetCamera, event.m_deltaTime.count());
m_camera = AzFramework::SmoothCamera(m_camera, m_targetCamera, m_cameraProps, event.m_deltaTime.count());
// if there has been an interpolation, only clear the look at point if it is no longer
// centered in the view (the camera has looked away from it)