diff --git a/Gems/Camera/Code/Source/CameraComponentController.cpp b/Gems/Camera/Code/Source/CameraComponentController.cpp index b8e5738145..5b2e26b897 100644 --- a/Gems/Camera/Code/Source/CameraComponentController.cpp +++ b/Gems/Camera/Code/Source/CameraComponentController.cpp @@ -151,7 +151,12 @@ namespace Camera void CameraComponentController::SetShouldActivateFunction(AZStd::function shouldActivateFunction) { - m_shouldActivateFn = shouldActivateFunction; + m_shouldActivateFn = AZStd::move(shouldActivateFunction); + } + + void CameraComponentController::SetIsLockedFunction(AZStd::function isLockedFunction) + { + m_isLockedFn = AZStd::move(isLockedFunction); } void CameraComponentController::Reflect(AZ::ReflectContext* context) @@ -195,10 +200,11 @@ namespace Camera { m_onViewMatrixChanged = AZ::Event::Handler([this](const AZ::Matrix4x4&) { - if (!m_updatingTransformFromEntity) + if (!m_updatingTransformFromEntity && !m_isLockedFn()) { AZ::TransformBus::Event(m_entityId, &AZ::TransformInterface::SetWorldTM, m_atomCamera->GetCameraTransform()); } + }); } diff --git a/Gems/Camera/Code/Source/CameraComponentController.h b/Gems/Camera/Code/Source/CameraComponentController.h index 5eca6b1711..09af7529dc 100644 --- a/Gems/Camera/Code/Source/CameraComponentController.h +++ b/Gems/Camera/Code/Source/CameraComponentController.h @@ -70,6 +70,9 @@ namespace Camera //! Used by the Editor to disable undesirable camera changes in edit mode. void SetShouldActivateFunction(AZStd::function shouldActivateFunction); + //! Defines a callback for determining whether this camera is currently locked by its transform. + void SetIsLockedFunction(AZStd::function isLockedFunction); + // Controller interface static void Reflect(AZ::ReflectContext* context); static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); @@ -136,5 +139,6 @@ namespace Camera bool m_isActiveView = false; AZStd::function m_shouldActivateFn; + AZStd::function m_isLockedFn = []{ return false; }; }; } // namespace Camera diff --git a/Gems/Camera/Code/Source/EditorCameraComponent.cpp b/Gems/Camera/Code/Source/EditorCameraComponent.cpp index cf32fdedff..4f97f27eba 100644 --- a/Gems/Camera/Code/Source/EditorCameraComponent.cpp +++ b/Gems/Camera/Code/Source/EditorCameraComponent.cpp @@ -18,6 +18,7 @@ #include #include +#include namespace Camera { @@ -41,6 +42,16 @@ namespace Camera return isInGameMode; }); + // Only allow our camera to move when the transform is not locked. + m_controller.SetIsLockedFunction([this]() + { + bool locked = false; + AzToolsFramework::Components::TransformComponentMessages::Bus::EventResult( + locked, GetEntityId(), &AzToolsFramework::Components::TransformComponentMessages::IsTransformLocked); + + return locked; + }); + // Call base class activate, which in turn calls Activate on our controller. EditorCameraComponentBase::Activate();