diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.cpp index 347e077af3..78dbcd6230 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.cpp @@ -22,8 +22,10 @@ namespace EMStudio::ViewportUtil constexpr AZStd::string_view CameraTranslateUpIdSetting = "/Amazon/Preferences/Editor/Camera/CameraTranslateUpId"; constexpr AZStd::string_view CameraTranslateDownIdSetting = "/Amazon/Preferences/Editor/Camera/CameraTranslateUpDownId"; constexpr AZStd::string_view CameraTranslateBoostIdSetting = "/Amazon/Preferences/Editor/Camera/TranslateBoostId"; + constexpr AZStd::string_view CameraOrbitIdSetting = "/Amazon/Preferences/Editor/Camera/OrbitId"; + constexpr AZStd::string_view CameraDefaultOrbitDistanceSetting = "/Amazon/Preferences/Editor/Camera/DefaultOrbitDistance"; - AzFramework::TranslateCameraInputChannelIds BuildTranslateCameraInputChannelIds() + AzFramework::TranslateCameraInputChannelIds TranslateCameraInputChannelIds() { AzFramework::TranslateCameraInputChannelIds translateCameraInputChannelIds; translateCameraInputChannelIds.m_leftChannelId = @@ -64,7 +66,23 @@ namespace EMStudio::ViewportUtil return GetRegistry(CameraTranslateSmoothingSetting, true); } - AzFramework::InputChannelId BuildRotateCameraInputId() + float CameraDefaultOrbitDistance() + { + return aznumeric_cast(GetRegistry(CameraDefaultOrbitDistanceSetting, 5.0)); + } + + AzFramework::InputChannelId RotateCameraInputChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraOrbitLookIdSetting, AZStd::string("mouse_button_right")).c_str()); + } + + AzFramework::InputChannelId OrbitCameraInputChannelId() + { + return AzFramework::InputChannelId( + GetRegistry(CameraOrbitIdSetting, AZStd::string("keyboard_key_modifier_alt_l")).c_str()); + } + + AzFramework::InputChannelId OrbitLookCameraInputChannelId() { return AzFramework::InputChannelId(GetRegistry(CameraOrbitLookIdSetting, AZStd::string("mouse_button_left")).c_str()); } diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.h index 5fa14a8aae..4fca274866 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportSettings.h @@ -31,7 +31,10 @@ namespace EMStudio::ViewportUtil float CameraTranslateSmoothness(); bool CameraRotateSmoothingEnabled(); bool CameraTranslateSmoothingEnabled(); + float CameraDefaultOrbitDistance(); - AzFramework::TranslateCameraInputChannelIds BuildTranslateCameraInputChannelIds(); - AzFramework::InputChannelId BuildRotateCameraInputId(); + AzFramework::TranslateCameraInputChannelIds TranslateCameraInputChannelIds(); + AzFramework::InputChannelId RotateCameraInputChannelId(); + AzFramework::InputChannelId OrbitCameraInputChannelId(); + AzFramework::InputChannelId OrbitLookCameraInputChannelId(); } diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.cpp index c1c891ad97..45c0061771 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.cpp @@ -64,17 +64,31 @@ namespace EMStudio void AnimViewportWidget::SetupCameras() { - m_rotateCamera = AZStd::make_shared(EMStudio::ViewportUtil::BuildRotateCameraInputId()); + m_rotateCamera = AZStd::make_shared(EMStudio::ViewportUtil::RotateCameraInputChannelId()); - const auto translateCameraInputChannelIds = EMStudio::ViewportUtil::BuildTranslateCameraInputChannelIds(); + const auto translateCameraInputChannelIds = EMStudio::ViewportUtil::TranslateCameraInputChannelIds(); m_translateCamera = AZStd::make_shared( translateCameraInputChannelIds, AzFramework::LookTranslation, AzFramework::TranslatePivotLook); m_translateCamera.get()->m_translateSpeedFn = [] { return 3.0f; }; + m_lookScrollCamera = AZStd::make_shared(); + m_orbitCamera = AZStd::make_shared(EMStudio::ViewportUtil::OrbitCameraInputChannelId()); + m_orbitCamera->SetPivotFn( + [this](const AZ::Vector3& position, const AZ::Vector3& direction) + { + if (m_orbitCamera->Beginning()) + { + m_defaultOrbitPoint = position + direction * EMStudio::ViewportUtil::CameraDefaultOrbitDistance(); + } + return m_defaultOrbitPoint; + }); + m_orbitRotateCamera = AZStd::make_shared(EMStudio::ViewportUtil::OrbitLookCameraInputChannelId()); m_orbitDollyScrollCamera = AZStd::make_shared(); + m_orbitCamera->m_orbitCameras.AddCamera(m_orbitRotateCamera); + m_orbitCamera->m_orbitCameras.AddCamera(m_orbitDollyScrollCamera); } void AnimViewportWidget::SetupCameraController() @@ -122,7 +136,8 @@ namespace EMStudio { cameras.AddCamera(m_rotateCamera); cameras.AddCamera(m_translateCamera); - cameras.AddCamera(m_orbitDollyScrollCamera); + cameras.AddCamera(m_lookScrollCamera); + cameras.AddCamera(m_orbitCamera); }); GetControllerList()->Add(controller); } diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.h index 261c78c755..b66e002c68 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AnimViewportWidget.h @@ -54,8 +54,13 @@ namespace EMStudio AtomRenderPlugin* m_plugin; AZStd::unique_ptr m_renderer; + AZStd::shared_ptr m_rotateCamera; AZStd::shared_ptr m_translateCamera; + AZStd::shared_ptr m_lookScrollCamera; AZStd::shared_ptr m_orbitDollyScrollCamera; + AZStd::shared_ptr m_orbitCamera; + AZStd::shared_ptr m_orbitRotateCamera; + AZ::Vector3 m_defaultOrbitPoint = AZ::Vector3::CreateZero(); }; }