diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp index 984526e373..6d8c019fec 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp +++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp @@ -12,11 +12,16 @@ #include "CameraInput.h" +#include #include #include #include #include +AZ_CVAR( + float, ed_newCameraSystemDefaultPlaneHeight, 34.0f, nullptr, AZ::ConsoleFunctorFlags::Null, + "What is the default height of the ground plane to do intersection tests against when orbiting"); + namespace AzFramework { bool CameraSystem::HandleEvents(const InputEvent& event) @@ -373,9 +378,11 @@ namespace AzFramework if (Beginning()) { float hit_distance = 0.0f; - if (AZ::Plane::CreateFromNormalAndPoint(AZ::Vector3::CreateAxisZ(), AZ::Vector3::CreateZero()) - .CastRay(targetCamera.Translation(), targetCamera.Rotation().GetBasisY() * m_props.m_maxOrbitDistance, hit_distance)) + if (AZ::Plane::CreateFromNormalAndPoint( + AZ::Vector3::CreateAxisZ(), AZ::Vector3::CreateAxisZ(ed_newCameraSystemDefaultPlaneHeight)) + .CastRay(targetCamera.Translation(), targetCamera.Rotation().GetBasisY(), hit_distance)) { + hit_distance = AZStd::min(hit_distance, m_props.m_maxOrbitDistance); nextCamera.m_lookDist = -hit_distance; nextCamera.m_lookAt = targetCamera.Translation() + targetCamera.Rotation().GetBasisY() * hit_distance; } diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h index cbfe603c83..3491453ff1 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h @@ -12,6 +12,7 @@ #pragma once +#include #include #include #include @@ -25,6 +26,22 @@ namespace AzFramework { struct WindowSize; + // to be moved + class ModernViewportCameraControllerRequests : public AZ::EBusTraits + { + public: + using BusIdType = AzFramework::ViewportId; ///< ViewportId - used to address requests to this EBus. + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; + + virtual void SetTargetCameraTransform(const AZ::Transform& transform) = 0; + + protected: + ~ModernViewportCameraControllerRequests() = default; + }; + + using ModernViewportCameraControllerRequestBus = AZ::EBus; + struct Camera { AZ::Vector3 m_lookAt = AZ::Vector3::CreateZero(); //!< Position of camera when m_lookDist is zero, @@ -411,7 +428,7 @@ namespace AzFramework struct Props { - float m_defaultOrbitDistance = 15.0f; + float m_defaultOrbitDistance = 60.0f; float m_maxOrbitDistance = 100.0f; } m_props; }; diff --git a/Code/Sandbox/Editor/CryEditDoc.cpp b/Code/Sandbox/Editor/CryEditDoc.cpp index 8819c8b382..00e5a3b85b 100644 --- a/Code/Sandbox/Editor/CryEditDoc.cpp +++ b/Code/Sandbox/Editor/CryEditDoc.cpp @@ -28,6 +28,7 @@ #include #include #include +#include // AzToolsFramework #include @@ -669,13 +670,21 @@ void CCryEditDoc::SerializeViewSettings(CXmlArchive& xmlAr) CViewport* pVP = GetIEditor()->GetViewManager()->GetView(i); + Matrix34 tm = Matrix34::CreateRotationXYZ(va); + tm.SetTranslation(vp); + if (pVP) { - Matrix34 tm = Matrix34::CreateRotationXYZ(va); - tm.SetTranslation(vp); pVP->SetViewTM(tm); } + if (auto viewportContext = AZ::Interface::Get()->GetDefaultViewportContext()) + { + AzFramework::ModernViewportCameraControllerRequestBus::Event( + viewportContext->GetId(), &AzFramework::ModernViewportCameraControllerRequestBus::Events::SetTargetCameraTransform, + LYTransformToAZTransform(tm)); + } + // Load grid. auto gridName = QString("Grid%1").arg(useOldViewFormat ? "" : QString::number(i)); XmlNodeRef gridNode = xmlAr.root->newChild(gridName.toUtf8().constData()); diff --git a/Code/Sandbox/Editor/ModernViewportCameraController.cpp b/Code/Sandbox/Editor/ModernViewportCameraController.cpp index 09fd5be2e9..f94f067a21 100644 --- a/Code/Sandbox/Editor/ModernViewportCameraController.cpp +++ b/Code/Sandbox/Editor/ModernViewportCameraController.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -42,17 +41,8 @@ namespace SandboxEditor return viewportContext; } - struct ModernViewportCameraControllerInstance::Impl - { - AzFramework::Camera m_camera; - AzFramework::Camera m_targetCamera; - AzFramework::SmoothProps m_smoothProps; - AzFramework::CameraSystem m_cameraSystem; - }; - ModernViewportCameraControllerInstance::ModernViewportCameraControllerInstance(const AzFramework::ViewportId viewportId) : MultiViewportControllerInstanceInterface(viewportId) - , m_impl(AZStd::make_unique()) { // LYN-2315 TODO - move setup out of constructor, pass cameras in auto firstPersonRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Right); @@ -72,27 +62,29 @@ namespace SandboxEditor orbitCamera->m_orbitCameras.AddCamera(orbitDollyMoveCamera); orbitCamera->m_orbitCameras.AddCamera(orbitPanCamera); - m_impl->m_cameraSystem.m_cameras.AddCamera(firstPersonRotateCamera); - m_impl->m_cameraSystem.m_cameras.AddCamera(firstPersonPanCamera); - m_impl->m_cameraSystem.m_cameras.AddCamera(firstPersonTranslateCamera); - m_impl->m_cameraSystem.m_cameras.AddCamera(firstPersonWheelCamera); - m_impl->m_cameraSystem.m_cameras.AddCamera(orbitCamera); + m_cameraSystem.m_cameras.AddCamera(firstPersonRotateCamera); + m_cameraSystem.m_cameras.AddCamera(firstPersonPanCamera); + m_cameraSystem.m_cameras.AddCamera(firstPersonTranslateCamera); + m_cameraSystem.m_cameras.AddCamera(firstPersonWheelCamera); + m_cameraSystem.m_cameras.AddCamera(orbitCamera); if (const auto viewportContext = RetrieveViewportContext(viewportId)) { // set position but not orientation - m_impl->m_targetCamera.m_lookAt = viewportContext->GetCameraTransform().GetTranslation(); + m_targetCamera.m_lookAt = viewportContext->GetCameraTransform().GetTranslation(); // LYN-2315 TODO https://www.geometrictools.com/Documentation/EulerAngles.pdf - m_impl->m_camera = m_impl->m_targetCamera; + m_camera = m_targetCamera; } AzFramework::ViewportDebugDisplayEventBus::Handler::BusConnect(AzToolsFramework::GetEntityContextId()); + AzFramework::ModernViewportCameraControllerRequestBus::Handler::BusConnect(viewportId); } ModernViewportCameraControllerInstance::~ModernViewportCameraControllerInstance() { + AzFramework::ModernViewportCameraControllerRequestBus::Handler::BusDisconnect(); AzFramework::ViewportDebugDisplayEventBus::Handler::BusDisconnect(); } @@ -101,18 +93,18 @@ namespace SandboxEditor AzFramework::WindowSize windowSize; AzFramework::WindowRequestBus::EventResult( windowSize, event.m_windowHandle, &AzFramework::WindowRequestBus::Events::GetClientAreaSize); - return m_impl->m_cameraSystem.HandleEvents(AzFramework::BuildInputEvent(event.m_inputChannel, windowSize)); + return m_cameraSystem.HandleEvents(AzFramework::BuildInputEvent(event.m_inputChannel, windowSize)); } void ModernViewportCameraControllerInstance::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) { if (auto viewportContext = RetrieveViewportContext(GetViewportId())) { - m_impl->m_targetCamera = m_impl->m_cameraSystem.StepCamera(m_impl->m_targetCamera, event.m_deltaTime.count()); - m_impl->m_camera = - AzFramework::SmoothCamera(m_impl->m_camera, m_impl->m_targetCamera, m_impl->m_smoothProps, event.m_deltaTime.count()); + m_targetCamera = m_cameraSystem.StepCamera(m_targetCamera, event.m_deltaTime.count()); + m_camera = + AzFramework::SmoothCamera(m_camera, m_targetCamera, m_smoothProps, event.m_deltaTime.count()); - viewportContext->SetCameraTransform(m_impl->m_camera.Transform()); + viewportContext->SetCameraTransform(m_camera.Transform()); } } @@ -122,7 +114,12 @@ namespace SandboxEditor if (ed_newCameraSystemDebug) { debugDisplay.SetColor(AZ::Colors::White); - debugDisplay.DrawWireSphere(m_impl->m_targetCamera.m_lookAt, 0.5f); + debugDisplay.DrawWireSphere(m_targetCamera.m_lookAt, 0.5f); } } + + void ModernViewportCameraControllerInstance::SetTargetCameraTransform(const AZ::Transform& transform) + { + m_targetCamera.m_lookAt = transform.GetTranslation(); + } } // namespace SandboxEditor diff --git a/Code/Sandbox/Editor/ModernViewportCameraController.h b/Code/Sandbox/Editor/ModernViewportCameraController.h index 57fdd1cb55..a3d4f8cea6 100644 --- a/Code/Sandbox/Editor/ModernViewportCameraController.h +++ b/Code/Sandbox/Editor/ModernViewportCameraController.h @@ -13,12 +13,14 @@ #pragma once #include +#include #include namespace SandboxEditor { class ModernViewportCameraControllerInstance final : public AzFramework::MultiViewportControllerInstanceInterface, - private AzFramework::ViewportDebugDisplayEventBus::Handler + private AzFramework::ViewportDebugDisplayEventBus::Handler, + private AzFramework::ModernViewportCameraControllerRequestBus::Handler { public: explicit ModernViewportCameraControllerInstance(AzFramework::ViewportId viewportId); @@ -28,12 +30,17 @@ namespace SandboxEditor bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override; void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override; - // AzFramework::ViewportDebugDisplayEventBus ... + // AzFramework::ViewportDebugDisplayEventBus overrides ... void DisplayViewport(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override; + // ModernViewportCameraControllerRequestBus overrides ... + void SetTargetCameraTransform(const AZ::Transform& transform) override; + private: - struct Impl; - AZStd::unique_ptr m_impl; + AzFramework::Camera m_camera; + AzFramework::Camera m_targetCamera; + AzFramework::SmoothProps m_smoothProps; + AzFramework::CameraSystem m_cameraSystem; }; using ModernViewportCameraController = AzFramework::MultiViewportController;