Add customization point for begin/end of camera behaviors (hide cursor with RMB look) (#1758)

* add customization points for begin/end of camera input to all cursor customization

Signed-off-by: hultonha <hultonha@amazon.co.uk>

* remove cursor experiments, use cursor bus

Signed-off-by: hultonha <hultonha@amazon.co.uk>

* run clang-format

Signed-off-by: hultonha <hultonha@amazon.co.uk>

* add additional unit tests for new camera behaviors

Signed-off-by: hultonha <hultonha@amazon.co.uk>

* update test name to use snake_case to increase readability

Signed-off-by: hultonha <hultonha@amazon.co.uk>
This commit is contained in:
Tom Hulton-Harrop
2021-07-02 18:17:44 +01:00
committed by GitHub
parent 9f61ed426c
commit dafe9f6690
4 changed files with 203 additions and 21 deletions
+149 -12
View File
@@ -1,6 +1,6 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project
*
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
@@ -36,8 +36,8 @@ namespace UnitTest
m_cameraSystem = AZStd::make_shared<AzFramework::CameraSystem>();
auto firstPersonRotateCamera = AZStd::make_shared<AzFramework::RotateCameraInput>(AzFramework::InputDeviceMouse::Button::Right);
auto firstPersonTranslateCamera = AZStd::make_shared<AzFramework::TranslateCameraInput>(AzFramework::LookTranslation);
m_firstPersonRotateCamera = AZStd::make_shared<AzFramework::RotateCameraInput>(AzFramework::InputDeviceMouse::Button::Right);
m_firstPersonTranslateCamera = AZStd::make_shared<AzFramework::TranslateCameraInput>(AzFramework::LookTranslation);
auto orbitCamera = AZStd::make_shared<AzFramework::OrbitCameraInput>();
auto orbitRotateCamera = AZStd::make_shared<AzFramework::RotateCameraInput>(AzFramework::InputDeviceMouse::Button::Left);
@@ -46,37 +46,174 @@ namespace UnitTest
orbitCamera->m_orbitCameras.AddCamera(orbitRotateCamera);
orbitCamera->m_orbitCameras.AddCamera(orbitTranslateCamera);
m_cameraSystem->m_cameras.AddCamera(firstPersonRotateCamera);
m_cameraSystem->m_cameras.AddCamera(firstPersonTranslateCamera);
m_cameraSystem->m_cameras.AddCamera(m_firstPersonRotateCamera);
m_cameraSystem->m_cameras.AddCamera(m_firstPersonTranslateCamera);
m_cameraSystem->m_cameras.AddCamera(orbitCamera);
}
void TearDown() override
{
m_firstPersonRotateCamera.reset();
m_firstPersonTranslateCamera.reset();
m_cameraSystem->m_cameras.Clear();
m_cameraSystem.reset();
AllocatorsTestFixture::TearDown();
}
AZStd::shared_ptr<AzFramework::RotateCameraInput> m_firstPersonRotateCamera;
AZStd::shared_ptr<AzFramework::TranslateCameraInput> m_firstPersonTranslateCamera;
};
TEST_F(CameraInputFixture, BeginEndOrbitCameraConsumesCorrectEvents)
TEST_F(CameraInputFixture, Begin_and_end_orbit_camera_consumes_correct_events)
{
// begin orbit camera
const bool consumed1 = HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{AzFramework::InputDeviceKeyboard::Key::ModifierAltL, AzFramework::InputChannel::State::Began});
const bool consumed1 = HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::ModifierAltL,
AzFramework::InputChannel::State::Began });
// begin listening for orbit rotate (click detector) - event is not consumed
const bool consumed2 = HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{AzFramework::InputDeviceMouse::Button::Left, AzFramework::InputChannel::State::Began});
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Left, AzFramework::InputChannel::State::Began });
// begin orbit rotate (mouse has moved sufficient distance to initiate)
const bool consumed3 = HandleEventAndUpdate(AzFramework::HorizontalMotionEvent{5});
const bool consumed3 = HandleEventAndUpdate(AzFramework::HorizontalMotionEvent{ 5 });
// end orbit (mouse up) - event is not consumed
const bool consumed4 = HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{AzFramework::InputDeviceMouse::Button::Left, AzFramework::InputChannel::State::Ended});
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Left, AzFramework::InputChannel::State::Ended });
const auto allConsumed = AZStd::vector<bool>{consumed1, consumed2, consumed3, consumed4};
const auto allConsumed = AZStd::vector<bool>{ consumed1, consumed2, consumed3, consumed4 };
using ::testing::ElementsAre;
EXPECT_THAT(allConsumed, ElementsAre(true, false, true, false));
}
TEST_F(CameraInputFixture, Begin_camera_input_notifies_activation_began_callback_for_translate_camera)
{
bool activationBegan = false;
m_firstPersonTranslateCamera->SetActivationBeganFn(
[&activationBegan]
{
activationBegan = true;
});
HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW,
AzFramework::InputChannel::State::Began });
EXPECT_TRUE(activationBegan);
}
TEST_F(CameraInputFixture, Begin_camera_input_notifies_activation_began_callback_after_delta_for_rotate_camera)
{
bool activationBegan = false;
m_firstPersonRotateCamera->SetActivationBeganFn(
[&activationBegan]
{
activationBegan = true;
});
HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Right, AzFramework::InputChannel::State::Began });
HandleEventAndUpdate(AzFramework::HorizontalMotionEvent{ 20 }); // must move input device
EXPECT_TRUE(activationBegan);
}
TEST_F(CameraInputFixture, Begin_camera_input_does_not_notify_activation_began_callback_with_no_delta_for_rotate_camera)
{
bool activationBegan = false;
m_firstPersonRotateCamera->SetActivationBeganFn(
[&activationBegan]
{
activationBegan = true;
});
HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Right, AzFramework::InputChannel::State::Began });
EXPECT_FALSE(activationBegan);
}
TEST_F(CameraInputFixture, End_camera_input_notifies_activation_end_callback_after_delta_for_rotate_camera)
{
bool activationEnded = false;
m_firstPersonRotateCamera->SetActivationEndedFn(
[&activationEnded]
{
activationEnded = true;
});
HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Right, AzFramework::InputChannel::State::Began });
HandleEventAndUpdate(AzFramework::HorizontalMotionEvent{ 20 });
HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Right, AzFramework::InputChannel::State::Ended });
EXPECT_TRUE(activationEnded);
}
TEST_F(CameraInputFixture, End_camera_input_does_not_notify_activation_began_or_end_callback_with_no_delta_for_rotate_camera)
{
bool activationBegan = false;
m_firstPersonRotateCamera->SetActivationBeganFn(
[&activationBegan]
{
activationBegan = true;
});
bool activationEnded = false;
m_firstPersonRotateCamera->SetActivationEndedFn(
[&activationEnded]
{
activationEnded = true;
});
HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Right, AzFramework::InputChannel::State::Began });
HandleEventAndUpdate(
AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceMouse::Button::Right, AzFramework::InputChannel::State::Ended });
EXPECT_FALSE(activationBegan);
EXPECT_FALSE(activationEnded);
}
TEST_F(CameraInputFixture, End_camera_input_notifies_activation_began_or_end_callback_with_translate_camera)
{
bool activationBegan = false;
m_firstPersonTranslateCamera->SetActivationBeganFn(
[&activationBegan]
{
activationBegan = true;
});
bool activationEnded = false;
m_firstPersonTranslateCamera->SetActivationEndedFn(
[&activationEnded]
{
activationEnded = true;
});
HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW,
AzFramework::InputChannel::State::Began });
HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW,
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)
{
bool activationEnded = false;
m_firstPersonTranslateCamera->SetActivationEndedFn(
[&activationEnded]
{
activationEnded = true;
});
HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::AlphanumericW,
AzFramework::InputChannel::State::Began });
m_cameraSystem->m_cameras.Clear();
EXPECT_TRUE(activationEnded);
}
} // namespace UnitTest