From 45b83e49da99ed40a322d78a627296f09eb8a68c Mon Sep 17 00:00:00 2001 From: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com> Date: Mon, 5 Jul 2021 13:08:05 +0100 Subject: [PATCH] Move camera properties from CVars to the Settings Registry (#1766) * updates to camera inputs Signed-off-by: hultonha * update test names to include types Signed-off-by: hultonha * move all camera input controls to the settings registry Signed-off-by: hultonha * small fixes before PR Signed-off-by: hultonha --- Code/Editor/EditorViewportSettings.cpp | 149 +++++++++++++++++- Code/Editor/EditorViewportSettings.h | 42 ++++- Code/Editor/EditorViewportWidget.cpp | 38 ++--- .../AzFramework/Viewport/CameraInput.cpp | 119 +++----------- .../AzFramework/Viewport/CameraInput.h | 31 +++- Code/Framework/Tests/CameraInputTests.cpp | 54 ++++--- 6 files changed, 287 insertions(+), 146 deletions(-) diff --git a/Code/Editor/EditorViewportSettings.cpp b/Code/Editor/EditorViewportSettings.cpp index 5a852c0ae5..ce7a6f9888 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. - * + * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ @@ -30,6 +30,19 @@ namespace SandboxEditor constexpr AZStd::string_view CameraPanSpeedSetting = "/Amazon/Preferences/Editor/Camera/PanSpeed"; constexpr AZStd::string_view CameraRotateSmoothnessSetting = "/Amazon/Preferences/Editor/Camera/RotateSmoothness"; constexpr AZStd::string_view CameraTranslateSmoothnessSetting = "/Amazon/Preferences/Editor/Camera/TranslateSmoothness"; + constexpr AZStd::string_view CameraTranslateForwardIdSetting = "/Amazon/Preferences/Editor/Camera/CameraTranslateForwardId"; + constexpr AZStd::string_view CameraTranslateBackwardIdSetting = "/Amazon/Preferences/Editor/Camera/CameraTranslateBackwardId"; + constexpr AZStd::string_view CameraTranslateLeftIdSetting = "/Amazon/Preferences/Editor/Camera/CameraTranslateLeftId"; + constexpr AZStd::string_view CameraTranslateRightIdSetting = "/Amazon/Preferences/Editor/Camera/CameraTranslateRightId"; + 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 CameraFreeLookIdSetting = "/Amazon/Preferences/Editor/Camera/FreeLookId"; + constexpr AZStd::string_view CameraFreePanIdSetting = "/Amazon/Preferences/Editor/Camera/FreePanId"; + constexpr AZStd::string_view CameraOrbitLookIdSetting = "/Amazon/Preferences/Editor/Camera/OrbitLookId"; + constexpr AZStd::string_view CameraOrbitDollyIdSetting = "/Amazon/Preferences/Editor/Camera/OrbitDollyId"; + constexpr AZStd::string_view CameraOrbitPanIdSetting = "/Amazon/Preferences/Editor/Camera/OrbitPanId"; template void SetRegistry(const AZStd::string_view setting, T&& value) @@ -244,4 +257,138 @@ namespace SandboxEditor { SetRegistry(CameraTranslateSmoothnessSetting, smoothness); } + + AzFramework::InputChannelId CameraTranslateForwardChannelId() + { + return AzFramework::InputChannelId( + GetRegistry(CameraTranslateForwardIdSetting, AZStd::string("keyboard_key_alphanumeric_W")).c_str()); + } + + void SetCameraTranslateForwardChannelId(AZStd::string_view cameraTranslateForwardId) + { + SetRegistry(CameraTranslateForwardIdSetting, cameraTranslateForwardId); + } + + AzFramework::InputChannelId CameraTranslateBackwardChannelId() + { + return AzFramework::InputChannelId( + GetRegistry(CameraTranslateBackwardIdSetting, AZStd::string("keyboard_key_alphanumeric_S")).c_str()); + } + + void SetCameraTranslateBackwardChannelId(AZStd::string_view cameraTranslateBackwardId) + { + SetRegistry(CameraTranslateBackwardIdSetting, cameraTranslateBackwardId); + } + + AzFramework::InputChannelId CameraTranslateLeftChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraTranslateLeftIdSetting, AZStd::string("keyboard_key_alphanumeric_A")).c_str()); + } + + void SetCameraTranslateLeftChannelId(AZStd::string_view cameraTranslateLeftId) + { + SetRegistry(CameraTranslateLeftIdSetting, cameraTranslateLeftId); + } + + AzFramework::InputChannelId CameraTranslateRightChannelId() + { + return AzFramework::InputChannelId( + GetRegistry(CameraTranslateRightIdSetting, AZStd::string("keyboard_key_alphanumeric_D")).c_str()); + } + + void SetCameraTranslateRightChannelId(AZStd::string_view cameraTranslateRightId) + { + SetRegistry(CameraTranslateRightIdSetting, cameraTranslateRightId); + } + + AzFramework::InputChannelId CameraTranslateUpChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraTranslateUpIdSetting, AZStd::string("keyboard_key_alphanumeric_E")).c_str()); + } + + void SetCameraTranslateUpChannelId(AZStd::string_view cameraTranslateUpId) + { + SetRegistry(CameraTranslateUpIdSetting, cameraTranslateUpId); + } + + AzFramework::InputChannelId CameraTranslateDownChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraTranslateDownIdSetting, AZStd::string("keyboard_key_alphanumeric_Q")).c_str()); + } + + void SetCameraTranslateDownChannelId(AZStd::string_view cameraTranslateDownId) + { + SetRegistry(CameraTranslateDownIdSetting, cameraTranslateDownId); + } + + AzFramework::InputChannelId CameraTranslateBoostChannelId() + { + return AzFramework::InputChannelId( + GetRegistry(CameraTranslateBoostIdSetting, AZStd::string("keyboard_key_modifier_shift_l")).c_str()); + } + + void SetCameraTranslateBoostChannelId(AZStd::string_view cameraTranslateBoostId) + { + SetRegistry(CameraTranslateDownIdSetting, cameraTranslateBoostId); + } + + AzFramework::InputChannelId CameraOrbitChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraOrbitIdSetting, AZStd::string("keyboard_key_modifier_alt_l")).c_str()); + } + + void SetCameraOrbitChannelChannelId(AZStd::string_view cameraOrbitId) + { + SetRegistry(CameraOrbitIdSetting, cameraOrbitId); + } + + AzFramework::InputChannelId CameraFreeLookChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraFreeLookIdSetting, AZStd::string("mouse_button_right")).c_str()); + } + + void SetCameraFreeLookChannelId(AZStd::string_view cameraFreeLookId) + { + SetRegistry(CameraFreeLookIdSetting, cameraFreeLookId); + } + + AzFramework::InputChannelId CameraFreePanChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraFreePanIdSetting, AZStd::string("mouse_button_middle")).c_str()); + } + + void SetCameraFreePanChannelId(AZStd::string_view cameraFreePanId) + { + SetRegistry(CameraFreePanIdSetting, cameraFreePanId); + } + + AzFramework::InputChannelId CameraOrbitLookChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraOrbitLookIdSetting, AZStd::string("mouse_button_left")).c_str()); + } + + void SetCameraOrbitLookChannelId(AZStd::string_view cameraOrbitLookId) + { + SetRegistry(CameraOrbitLookIdSetting, cameraOrbitLookId); + } + + AzFramework::InputChannelId CameraOrbitDollyChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraOrbitDollyIdSetting, AZStd::string("mouse_button_right")).c_str()); + } + + void SetCameraOrbitDollyChannelId(AZStd::string_view cameraOrbitDollyId) + { + SetRegistry(CameraOrbitDollyIdSetting, cameraOrbitDollyId); + } + + AzFramework::InputChannelId CameraOrbitPanChannelId() + { + return AzFramework::InputChannelId(GetRegistry(CameraOrbitPanIdSetting, AZStd::string("mouse_button_middle")).c_str()); + } + + void SetCameraOrbitPanChannelId(AZStd::string_view cameraOrbitPanId) + { + SetRegistry(CameraOrbitPanIdSetting, cameraOrbitPanId); + } } // namespace SandboxEditor diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index 718782ccd5..5744111ff3 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -1,6 +1,6 @@ /* * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. - * + * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ @@ -11,6 +11,7 @@ #include #include +#include namespace SandboxEditor { @@ -78,6 +79,45 @@ namespace SandboxEditor SANDBOX_API float CameraTranslateSmoothness(); SANDBOX_API void SetCameraTranslateSmoothness(float smoothness); + SANDBOX_API AzFramework::InputChannelId CameraTranslateForwardChannelId(); + SANDBOX_API void SetCameraTranslateForwardChannelId(AZStd::string_view cameraTranslateForwardId); + + SANDBOX_API AzFramework::InputChannelId CameraTranslateBackwardChannelId(); + SANDBOX_API void SetCameraTranslateBackwardChannelId(AZStd::string_view cameraTranslateBackwardId); + + SANDBOX_API AzFramework::InputChannelId CameraTranslateLeftChannelId(); + SANDBOX_API void SetCameraTranslateLeftChannelId(AZStd::string_view cameraTranslateLeftId); + + SANDBOX_API AzFramework::InputChannelId CameraTranslateRightChannelId(); + SANDBOX_API void SetCameraTranslateRightChannelId(AZStd::string_view cameraTranslateRightId); + + SANDBOX_API AzFramework::InputChannelId CameraTranslateUpChannelId(); + SANDBOX_API void SetCameraTranslateUpChannelId(AZStd::string_view cameraTranslateUpId); + + SANDBOX_API AzFramework::InputChannelId CameraTranslateDownChannelId(); + SANDBOX_API void SetCameraTranslateDownChannelId(AZStd::string_view cameraTranslateDownId); + + SANDBOX_API AzFramework::InputChannelId CameraTranslateBoostChannelId(); + SANDBOX_API void SetCameraTranslateBoostChannelId(AZStd::string_view cameraTranslateBoostId); + + SANDBOX_API AzFramework::InputChannelId CameraOrbitChannelId(); + SANDBOX_API void SetCameraOrbitChannelChannelId(AZStd::string_view cameraOrbitId); + + SANDBOX_API AzFramework::InputChannelId CameraFreeLookChannelId(); + SANDBOX_API void SetCameraFreeLookChannelId(AZStd::string_view cameraFreeLookId); + + SANDBOX_API AzFramework::InputChannelId CameraFreePanChannelId(); + SANDBOX_API void SetCameraFreePanChannelId(AZStd::string_view cameraFreePanId); + + SANDBOX_API AzFramework::InputChannelId CameraOrbitLookChannelId(); + SANDBOX_API void SetCameraOrbitLookChannelId(AZStd::string_view cameraOrbitLookId); + + SANDBOX_API AzFramework::InputChannelId CameraOrbitDollyChannelId(); + SANDBOX_API void SetCameraOrbitDollyChannelId(AZStd::string_view cameraOrbitDollyId); + + SANDBOX_API AzFramework::InputChannelId CameraOrbitPanChannelId(); + SANDBOX_API void SetCameraOrbitPanChannelId(AZStd::string_view cameraOrbitPanId); + //! Return if the new editor camera system is enabled or not. //! @note This is implemented in EditorViewportWidget.cpp SANDBOX_API bool UsingNewCameraSystem(); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 0e03cf67cb..cc9a5e5355 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -113,15 +113,6 @@ namespace SandboxEditor EditorViewportWidget* EditorViewportWidget::m_pPrimaryViewport = nullptr; -namespace AzFramework -{ - extern InputChannelId CameraFreeLookButton; - extern InputChannelId CameraFreePanButton; - extern InputChannelId CameraOrbitLookButton; - extern InputChannelId CameraOrbitDollyButton; - extern InputChannelId CameraOrbitPanButton; -} // namespace AzFramework - #if AZ_TRAIT_OS_PLATFORM_APPLE void StopFixedCursorMode(); void StartFixedCursorMode(QObject *viewport); @@ -1236,8 +1227,6 @@ bool EditorViewportWidget::ShowingWorldSpace() AZStd::shared_ptr CreateModularViewportCameraController( AzFramework::ViewportId viewportId) { - AzFramework::ReloadCameraKeyBindings(); - auto controller = AZStd::make_shared(); controller->SetCameraPropsBuilderCallback( [](AzFramework::CameraProps& cameraProps) @@ -1267,7 +1256,7 @@ AZStd::shared_ptr CreateMod viewportId, &AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Events::EndCursorCapture); }; - auto firstPersonRotateCamera = AZStd::make_shared(AzFramework::CameraFreeLookButton); + auto firstPersonRotateCamera = AZStd::make_shared(SandboxEditor::CameraFreeLookChannelId()); firstPersonRotateCamera->m_rotateSpeedFn = [] { return SandboxEditor::CameraRotateSpeed(); @@ -1276,7 +1265,7 @@ AZStd::shared_ptr CreateMod firstPersonRotateCamera->SetActivationEndedFn(showCursor); auto firstPersonPanCamera = - AZStd::make_shared(AzFramework::CameraFreePanButton, AzFramework::LookPan); + AZStd::make_shared(SandboxEditor::CameraFreePanChannelId(), AzFramework::LookPan); firstPersonPanCamera->m_panSpeedFn = [] { return SandboxEditor::CameraPanSpeed(); @@ -1290,7 +1279,17 @@ AZStd::shared_ptr CreateMod return SandboxEditor::CameraPanInvertedY(); }; - auto firstPersonTranslateCamera = AZStd::make_shared(AzFramework::LookTranslation); + AzFramework::TranslateCameraInputChannels translateCameraInputChannels; + translateCameraInputChannels.m_leftChannelId = SandboxEditor::CameraTranslateLeftChannelId(); + translateCameraInputChannels.m_rightChannelId = SandboxEditor::CameraTranslateRightChannelId(); + translateCameraInputChannels.m_forwardChannelId = SandboxEditor::CameraTranslateForwardChannelId(); + translateCameraInputChannels.m_backwardChannelId = SandboxEditor::CameraTranslateBackwardChannelId(); + translateCameraInputChannels.m_upChannelId = SandboxEditor::CameraTranslateUpChannelId(); + translateCameraInputChannels.m_downChannelId = SandboxEditor::CameraTranslateDownChannelId(); + translateCameraInputChannels.m_boostChannelId = SandboxEditor::CameraTranslateBoostChannelId(); + + auto firstPersonTranslateCamera = + AZStd::make_shared(AzFramework::LookTranslation, translateCameraInputChannels); firstPersonTranslateCamera->m_translateSpeedFn = [] { return SandboxEditor::CameraTranslateSpeed(); @@ -1306,7 +1305,7 @@ AZStd::shared_ptr CreateMod return SandboxEditor::CameraScrollSpeed(); }; - auto orbitCamera = AZStd::make_shared(); + auto orbitCamera = AZStd::make_shared(SandboxEditor::CameraOrbitChannelId()); orbitCamera->SetLookAtFn( [viewportId](const AZ::Vector3& position, const AZ::Vector3& direction) -> AZStd::optional { @@ -1343,7 +1342,7 @@ AZStd::shared_ptr CreateMod return {}; }); - auto orbitRotateCamera = AZStd::make_shared(AzFramework::CameraOrbitLookButton); + auto orbitRotateCamera = AZStd::make_shared(SandboxEditor::CameraOrbitLookChannelId()); orbitRotateCamera->m_rotateSpeedFn = [] { return SandboxEditor::CameraRotateSpeed(); @@ -1353,7 +1352,8 @@ AZStd::shared_ptr CreateMod return SandboxEditor::CameraOrbitYawRotationInverted(); }; - auto orbitTranslateCamera = AZStd::make_shared(AzFramework::OrbitTranslation); + auto orbitTranslateCamera = + AZStd::make_shared(AzFramework::OrbitTranslation, translateCameraInputChannels); orbitTranslateCamera->m_translateSpeedFn = [] { return SandboxEditor::CameraTranslateSpeed(); @@ -1370,13 +1370,13 @@ AZStd::shared_ptr CreateMod }; auto orbitDollyMoveCamera = - AZStd::make_shared(AzFramework::CameraOrbitDollyButton); + AZStd::make_shared(SandboxEditor::CameraOrbitDollyChannelId()); orbitDollyMoveCamera->m_cursorSpeedFn = [] { return SandboxEditor::CameraDollyMotionSpeed(); }; - auto orbitPanCamera = AZStd::make_shared(AzFramework::CameraOrbitPanButton, AzFramework::OrbitPan); + auto orbitPanCamera = AZStd::make_shared(SandboxEditor::CameraOrbitPanChannelId(), AzFramework::OrbitPan); orbitPanCamera->m_panSpeedFn = [] { return SandboxEditor::CameraPanSpeed(); diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp index a12069c712..e42f65d682 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp +++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp @@ -26,85 +26,6 @@ namespace AzFramework AZ_CVAR(float, ed_cameraSystemMinOrbitDistance, 10.0f, nullptr, AZ::ConsoleFunctorFlags::Null, ""); AZ_CVAR(float, ed_cameraSystemMaxOrbitDistance, 50.0f, nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR( - AZ::CVarFixedString, ed_cameraSystemTranslateForwardKey, "keyboard_key_alphanumeric_W", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR( - AZ::CVarFixedString, - ed_cameraSystemTranslateBackwardKey, - "keyboard_key_alphanumeric_S", - nullptr, - AZ::ConsoleFunctorFlags::Null, - ""); - AZ_CVAR( - AZ::CVarFixedString, ed_cameraSystemTranslateLeftKey, "keyboard_key_alphanumeric_A", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR( - AZ::CVarFixedString, ed_cameraSystemTranslateRightKey, "keyboard_key_alphanumeric_D", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemTranslateUpKey, "keyboard_key_alphanumeric_E", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR( - AZ::CVarFixedString, ed_cameraSystemTranslateDownKey, "keyboard_key_alphanumeric_Q", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR( - AZ::CVarFixedString, ed_cameraSystemTranslateBoostKey, "keyboard_key_modifier_shift_l", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemOrbitKey, "keyboard_key_modifier_alt_l", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemFreeLookButton, "mouse_button_right", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemFreePanButton, "mouse_button_middle", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemOrbitLookButton, "mouse_button_left", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemOrbitDollyButton, "mouse_button_right", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - AZ_CVAR(AZ::CVarFixedString, ed_cameraSystemOrbitPanButton, "mouse_button_middle", nullptr, AZ::ConsoleFunctorFlags::Null, ""); - - static InputChannelId CameraTranslateForwardId; - static InputChannelId CameraTranslateBackwardId; - static InputChannelId CameraTranslateLeftId; - static InputChannelId CameraTranslateRightId; - static InputChannelId CameraTranslateDownId; - static InputChannelId CameraTranslateUpId; - static InputChannelId CameraTranslateBoostId; - static InputChannelId CameraOrbitId; - - // externed elsewhere - InputChannelId CameraFreeLookButton; - InputChannelId CameraFreePanButton; - InputChannelId CameraOrbitLookButton; - InputChannelId CameraOrbitDollyButton; - InputChannelId CameraOrbitPanButton; - - void ReloadCameraKeyBindings() - { - const AZ::CVarFixedString& forward = ed_cameraSystemTranslateForwardKey; - CameraTranslateForwardId = InputChannelId(forward.c_str()); - const AZ::CVarFixedString& backward = ed_cameraSystemTranslateBackwardKey; - CameraTranslateBackwardId = InputChannelId(backward.c_str()); - const AZ::CVarFixedString& left = ed_cameraSystemTranslateLeftKey; - CameraTranslateLeftId = InputChannelId(left.c_str()); - const AZ::CVarFixedString& right = ed_cameraSystemTranslateRightKey; - CameraTranslateRightId = InputChannelId(right.c_str()); - const AZ::CVarFixedString& down = ed_cameraSystemTranslateDownKey; - CameraTranslateDownId = InputChannelId(down.c_str()); - const AZ::CVarFixedString& up = ed_cameraSystemTranslateUpKey; - CameraTranslateUpId = InputChannelId(up.c_str()); - const AZ::CVarFixedString& boost = ed_cameraSystemTranslateBoostKey; - CameraTranslateBoostId = InputChannelId(boost.c_str()); - const AZ::CVarFixedString& orbit = ed_cameraSystemOrbitKey; - CameraOrbitId = InputChannelId(orbit.c_str()); - const AZ::CVarFixedString& freeLook = ed_cameraSystemFreeLookButton; - CameraFreeLookButton = InputChannelId(freeLook.c_str()); - const AZ::CVarFixedString& freePan = ed_cameraSystemFreePanButton; - CameraFreePanButton = InputChannelId(freePan.c_str()); - const AZ::CVarFixedString& orbitLook = ed_cameraSystemOrbitLookButton; - CameraOrbitLookButton = InputChannelId(orbitLook.c_str()); - const AZ::CVarFixedString& orbitDolly = ed_cameraSystemOrbitDollyButton; - CameraOrbitDollyButton = InputChannelId(orbitDolly.c_str()); - const AZ::CVarFixedString& orbitPan = ed_cameraSystemOrbitPanButton; - CameraOrbitPanButton = InputChannelId(orbitPan.c_str()); - } - - static void ReloadCameraKeyBindingsConsole(const AZ::ConsoleCommandContainer&) - { - ReloadCameraKeyBindings(); - } - - AZ_CONSOLEFREEFUNC(ReloadCameraKeyBindingsConsole, AZ::ConsoleFunctorFlags::Null, "Reload keybindings for the modern camera system"); - //! return -1.0f if inverted, 1.0f otherwise constexpr static float Invert(const bool invert) { @@ -289,7 +210,7 @@ namespace AzFramework }); } - RotateCameraInput::RotateCameraInput(const InputChannelId rotateChannelId) + RotateCameraInput::RotateCameraInput(const InputChannelId& rotateChannelId) : m_rotateChannelId(rotateChannelId) { m_rotateSpeedFn = []() constexpr @@ -372,7 +293,7 @@ namespace AzFramework return nextCamera; } - PanCameraInput::PanCameraInput(const InputChannelId panChannelId, PanAxesFn panAxesFn) + PanCameraInput::PanCameraInput(const InputChannelId& panChannelId, PanAxesFn panAxesFn) : m_panAxesFn(AZStd::move(panAxesFn)) , m_panChannelId(panChannelId) { @@ -433,34 +354,35 @@ namespace AzFramework return nextCamera; } - TranslateCameraInput::TranslationType TranslateCameraInput::TranslationFromKey(InputChannelId channelId) + TranslateCameraInput::TranslationType TranslateCameraInput::TranslationFromKey( + const InputChannelId& channelId, const TranslateCameraInputChannels& translateCameraInputChannels) { - if (channelId == CameraTranslateForwardId) + if (channelId == translateCameraInputChannels.m_forwardChannelId) { return TranslationType::Forward; } - if (channelId == CameraTranslateBackwardId) + if (channelId == translateCameraInputChannels.m_backwardChannelId) { return TranslationType::Backward; } - if (channelId == CameraTranslateLeftId) + if (channelId == translateCameraInputChannels.m_leftChannelId) { return TranslationType::Left; } - if (channelId == CameraTranslateRightId) + if (channelId == translateCameraInputChannels.m_rightChannelId) { return TranslationType::Right; } - if (channelId == CameraTranslateDownId) + if (channelId == translateCameraInputChannels.m_downChannelId) { return TranslationType::Down; } - if (channelId == CameraTranslateUpId) + if (channelId == translateCameraInputChannels.m_upChannelId) { return TranslationType::Up; } @@ -468,8 +390,10 @@ namespace AzFramework return TranslationType::Nil; } - TranslateCameraInput::TranslateCameraInput(TranslationAxesFn translationAxesFn) + TranslateCameraInput::TranslateCameraInput( + TranslationAxesFn translationAxesFn, const TranslateCameraInputChannels& translateCameraInputChannels) : m_translationAxesFn(AZStd::move(translationAxesFn)) + , m_translateCameraInputChannels(translateCameraInputChannels) { m_translateSpeedFn = []() constexpr { @@ -489,13 +413,13 @@ namespace AzFramework { if (input->m_state == InputChannel::State::Began) { - m_translation |= TranslationFromKey(input->m_channelId); + m_translation |= TranslationFromKey(input->m_channelId, m_translateCameraInputChannels); if (m_translation != TranslationType::Nil) { BeginActivation(); } - if (input->m_channelId == CameraTranslateBoostId) + if (input->m_channelId == m_translateCameraInputChannels.m_boostChannelId) { m_boost = true; } @@ -503,12 +427,12 @@ namespace AzFramework // ensure we don't process end events in the idle state else if (input->m_state == InputChannel::State::Ended && !Idle()) { - m_translation &= ~(TranslationFromKey(input->m_channelId)); + m_translation &= ~(TranslationFromKey(input->m_channelId, m_translateCameraInputChannels)); if (m_translation == TranslationType::Nil) { EndActivation(); } - if (input->m_channelId == CameraTranslateBoostId) + if (input->m_channelId == m_translateCameraInputChannels.m_boostChannelId) { m_boost = false; } @@ -580,11 +504,16 @@ namespace AzFramework m_boost = false; } + OrbitCameraInput::OrbitCameraInput(const InputChannelId& orbitChannelId) + : m_orbitChannelId(orbitChannelId) + { + } + bool OrbitCameraInput::HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, const float scrollDelta) { if (const auto* input = AZStd::get_if(&event)) { - if (input->m_channelId == CameraOrbitId) + if (input->m_channelId == m_orbitChannelId) { if (input->m_state == InputChannel::State::Began) { @@ -697,7 +626,7 @@ namespace AzFramework return nextCamera; } - OrbitDollyCursorMoveCameraInput::OrbitDollyCursorMoveCameraInput(const InputChannelId dollyChannelId) + OrbitDollyCursorMoveCameraInput::OrbitDollyCursorMoveCameraInput(const InputChannelId& dollyChannelId) : m_dollyChannelId(dollyChannelId) { m_cursorSpeedFn = []() constexpr diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h index 1ec84475b5..da4a78f479 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h @@ -18,9 +18,6 @@ namespace AzFramework { - //! Updates camera key bindings that can be overridden with AZ console vars (invoke from console to update). - void ReloadCameraKeyBindings(); - //! Returns Euler angles (pitch, roll, yaw) for the incoming orientation. //! @note Order of rotation is Z, Y, X. AZ::Vector3 EulerAngles(const AZ::Matrix3x3& orientation); @@ -276,7 +273,7 @@ namespace AzFramework class RotateCameraInput : public CameraInput { public: - explicit RotateCameraInput(InputChannelId rotateChannelId); + explicit RotateCameraInput(const InputChannelId& rotateChannelId); // CameraInput overrides ... bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override; @@ -327,7 +324,7 @@ namespace AzFramework class PanCameraInput : public CameraInput { public: - PanCameraInput(InputChannelId panChannelId, PanAxesFn panAxesFn); + PanCameraInput(const InputChannelId& panChannelId, PanAxesFn panAxesFn); // CameraInput overrides ... bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override; @@ -373,11 +370,24 @@ namespace AzFramework return AZ::Matrix3x3::CreateFromColumns(basisX, basisY, basisZ); } + //! Groups all camera translation inputs. + struct TranslateCameraInputChannels + { + InputChannelId m_forwardChannelId; + InputChannelId m_backwardChannelId; + InputChannelId m_leftChannelId; + InputChannelId m_rightChannelId; + InputChannelId m_downChannelId; + InputChannelId m_upChannelId; + InputChannelId m_boostChannelId; + }; + //! A camera input to handle discrete events that can translate the camera (translate in three axes). class TranslateCameraInput : public CameraInput { public: - explicit TranslateCameraInput(TranslationAxesFn translationAxesFn); + explicit TranslateCameraInput( + TranslationAxesFn translationAxesFn, const TranslateCameraInputChannels& translateCameraInputChannels); // CameraInput overrides ... bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override; @@ -444,10 +454,12 @@ namespace AzFramework } //! Converts from a generic input channel id to a concrete translation type (based on the user's key mappings). - static TranslationType TranslationFromKey(InputChannelId channelId); + TranslationType TranslationFromKey( + const InputChannelId& channelId, const TranslateCameraInputChannels& translateCameraInputChannels); TranslationType m_translation = TranslationType::Nil; //!< Types of translation the camera input is under. TranslationAxesFn m_translationAxesFn; //!< Builder for translation axes. + TranslateCameraInputChannels m_translateCameraInputChannels; //!< Input channel ids that map to internal translation types. bool m_boost = false; //!< Is the translation speed currently being multiplied/scaled upwards. }; @@ -468,7 +480,7 @@ namespace AzFramework class OrbitDollyCursorMoveCameraInput : public CameraInput { public: - explicit OrbitDollyCursorMoveCameraInput(InputChannelId dollyChannelId); + explicit OrbitDollyCursorMoveCameraInput(const InputChannelId& dollyChannelId); // CameraInput overrides ... bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override; @@ -500,6 +512,8 @@ namespace AzFramework public: using LookAtFn = AZStd::function(const AZ::Vector3& position, const AZ::Vector3& direction)>; + explicit OrbitCameraInput(const InputChannelId& orbitChannelId); + // CameraInput overrides ... bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override; Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override; @@ -511,6 +525,7 @@ namespace AzFramework void SetLookAtFn(const LookAtFn& lookAtFn); private: + InputChannelId m_orbitChannelId; //!< Input channel to begin the orbit camera input. LookAtFn m_lookAtFn; //!< The look-at behavior to use for this orbit camera (how is the look-at point calculated/retrieved). }; diff --git a/Code/Framework/Tests/CameraInputTests.cpp b/Code/Framework/Tests/CameraInputTests.cpp index 0639c2582a..77ae6fe9be 100644 --- a/Code/Framework/Tests/CameraInputTests.cpp +++ b/Code/Framework/Tests/CameraInputTests.cpp @@ -32,16 +32,25 @@ namespace UnitTest { AllocatorsTestFixture::SetUp(); - AzFramework::ReloadCameraKeyBindings(); - m_cameraSystem = AZStd::make_shared(); - m_firstPersonRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Right); - m_firstPersonTranslateCamera = AZStd::make_shared(AzFramework::LookTranslation); + m_translateCameraInputChannels.m_leftChannelId = AzFramework::InputChannelId("keyboard_key_alphanumeric_A"); + m_translateCameraInputChannels.m_rightChannelId = AzFramework::InputChannelId("keyboard_key_alphanumeric_D"); + m_translateCameraInputChannels.m_forwardChannelId = AzFramework::InputChannelId("keyboard_key_alphanumeric_W"); + m_translateCameraInputChannels.m_backwardChannelId = AzFramework::InputChannelId("keyboard_key_alphanumeric_S"); + m_translateCameraInputChannels.m_upChannelId = AzFramework::InputChannelId("keyboard_key_alphanumeric_E"); + m_translateCameraInputChannels.m_downChannelId = AzFramework::InputChannelId("keyboard_key_alphanumeric_Q"); + m_translateCameraInputChannels.m_boostChannelId = AzFramework::InputChannelId("keyboard_key_modifier_shift_l"); - auto orbitCamera = AZStd::make_shared(); + m_firstPersonRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Right); + m_firstPersonTranslateCamera = + AZStd::make_shared(AzFramework::LookTranslation, m_translateCameraInputChannels); + + auto orbitCamera = + AZStd::make_shared(AzFramework::InputChannelId("keyboard_key_modifier_alt_l")); auto orbitRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Left); - auto orbitTranslateCamera = AZStd::make_shared(AzFramework::OrbitTranslation); + auto orbitTranslateCamera = + AZStd::make_shared(AzFramework::OrbitTranslation, m_translateCameraInputChannels); orbitCamera->m_orbitCameras.AddCamera(orbitRotateCamera); orbitCamera->m_orbitCameras.AddCamera(orbitTranslateCamera); @@ -62,11 +71,12 @@ namespace UnitTest AllocatorsTestFixture::TearDown(); } + AzFramework::TranslateCameraInputChannels m_translateCameraInputChannels; AZStd::shared_ptr m_firstPersonRotateCamera; AZStd::shared_ptr m_firstPersonTranslateCamera; }; - TEST_F(CameraInputFixture, Begin_and_end_orbit_camera_consumes_correct_events) + TEST_F(CameraInputFixture, Begin_and_end_OrbitCameraInput_consumes_correct_events) { // begin orbit camera const bool consumed1 = HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::ModifierAltL, @@ -86,7 +96,7 @@ namespace UnitTest EXPECT_THAT(allConsumed, ElementsAre(true, false, true, false)); } - TEST_F(CameraInputFixture, Begin_camera_input_notifies_activation_began_callback_for_translate_camera) + TEST_F(CameraInputFixture, Begin_CameraInput_notifies_ActivationBeganFn_for_TranslateCameraInput) { bool activationBegan = false; m_firstPersonTranslateCamera->SetActivationBeganFn( @@ -95,13 +105,13 @@ namespace UnitTest activationBegan = true; }); - HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW, - AzFramework::InputChannel::State::Began }); + HandleEventAndUpdate( + AzFramework::DiscreteInputEvent{ m_translateCameraInputChannels.m_forwardChannelId, AzFramework::InputChannel::State::Began }); EXPECT_TRUE(activationBegan); } - TEST_F(CameraInputFixture, Begin_camera_input_notifies_activation_began_callback_after_delta_for_rotate_camera) + TEST_F(CameraInputFixture, Begin_CameraInput_notifies_ActivationBeganFn_after_delta_for_RotateCameraInput) { bool activationBegan = false; m_firstPersonRotateCamera->SetActivationBeganFn( @@ -117,7 +127,7 @@ namespace UnitTest EXPECT_TRUE(activationBegan); } - TEST_F(CameraInputFixture, Begin_camera_input_does_not_notify_activation_began_callback_with_no_delta_for_rotate_camera) + TEST_F(CameraInputFixture, Begin_CameraInput_does_not_notify_ActivationBeganFn_with_no_delta_for_RotateCameraInput) { bool activationBegan = false; m_firstPersonRotateCamera->SetActivationBeganFn( @@ -132,7 +142,7 @@ namespace UnitTest EXPECT_FALSE(activationBegan); } - TEST_F(CameraInputFixture, End_camera_input_notifies_activation_end_callback_after_delta_for_rotate_camera) + TEST_F(CameraInputFixture, End_CameraInput_notifies_ActivationEndFn_after_delta_for_RotateCameraInput) { bool activationEnded = false; m_firstPersonRotateCamera->SetActivationEndedFn( @@ -150,7 +160,7 @@ namespace UnitTest EXPECT_TRUE(activationEnded); } - TEST_F(CameraInputFixture, End_camera_input_does_not_notify_activation_began_or_end_callback_with_no_delta_for_rotate_camera) + TEST_F(CameraInputFixture, End_CameraInput_does_not_notify_ActivationBeganFn_or_ActivationBeganFn_with_no_delta_for_RotateCameraInput) { bool activationBegan = false; m_firstPersonRotateCamera->SetActivationBeganFn( @@ -175,7 +185,7 @@ namespace UnitTest EXPECT_FALSE(activationEnded); } - TEST_F(CameraInputFixture, End_camera_input_notifies_activation_began_or_end_callback_with_translate_camera) + TEST_F(CameraInputFixture, End_CameraInput_notifies_ActivationBeganFn_or_ActivationEndFn_with_TranslateCamera) { bool activationBegan = false; m_firstPersonTranslateCamera->SetActivationBeganFn( @@ -191,16 +201,16 @@ namespace UnitTest activationEnded = true; }); - HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW, - AzFramework::InputChannel::State::Began }); - HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW, - AzFramework::InputChannel::State::Ended }); + HandleEventAndUpdate( + AzFramework::DiscreteInputEvent{ m_translateCameraInputChannels.m_forwardChannelId, AzFramework::InputChannel::State::Began }); + HandleEventAndUpdate( + AzFramework::DiscreteInputEvent{ m_translateCameraInputChannels.m_forwardChannelId, AzFramework::InputChannel::State::Ended }); EXPECT_TRUE(activationBegan); EXPECT_TRUE(activationEnded); } - TEST_F(CameraInputFixture, End_activation_called_for_camera_input_if_active_when_cameras_are_cleared) + TEST_F(CameraInputFixture, End_activation_called_for_CameraInput_if_active_when_cameras_are_cleared) { bool activationEnded = false; m_firstPersonTranslateCamera->SetActivationEndedFn( @@ -209,8 +219,8 @@ namespace UnitTest activationEnded = true; }); - HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW, - AzFramework::InputChannel::State::Began }); + HandleEventAndUpdate( + AzFramework::DiscreteInputEvent{ m_translateCameraInputChannels.m_forwardChannelId, AzFramework::InputChannel::State::Began }); m_cameraSystem->m_cameras.Clear();