Skip to content

Commit 195edcd

Browse files
Added setreg option to enable/disable centering mouse cursor in RobotecSpectatorCamera (#106)
* Added setreg option to enable/disable centering mouse cursor in RobotecSpectatorCamera Signed-off-by: Patryk Antosz <[email protected]> * Update Gems/RobotecSpectatorCamera/Code/Source/SpectatorCamera/SpectatorCameraComponent.cpp Co-authored-by: Michał Pełka <[email protected]> --------- Signed-off-by: Patryk Antosz <[email protected]> Co-authored-by: Michał Pełka <[email protected]>
1 parent c039d4f commit 195edcd

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

Gems/RobotecSpectatorCamera/Code/Source/SpectatorCamera/SpectatorCameraComponent.cpp

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#include "SpectatorCameraComponent.h"
2+
3+
#include "AzCore/Settings/SettingsRegistry.h"
4+
25
#include <AzCore/Component/TransformBus.h>
36
#include <AzCore/Math/MathUtils.h>
47
#include <AzCore/Serialization/EditContext.h>
@@ -7,6 +10,8 @@
710

811
namespace RobotecSpectatorCamera
912
{
13+
constexpr AZStd::string_view CenterTheCursorConfigurationKey = "/O3DE/SpectatorCamera/MoveCursorToTheCenter";
14+
1015
SpectatorCameraComponent::SpectatorCameraComponent(
1116
const RobotecSpectatorCamera::SpectatorCameraConfiguration& spectatorCameraConfiguration)
1217
: m_configuration(spectatorCameraConfiguration)
@@ -31,6 +36,13 @@ namespace RobotecSpectatorCamera
3136
AzFramework::InputChannelEventListener::Connect();
3237

3338
AZ::TransformBus::EventResult(m_currentTransform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM);
39+
40+
auto* registry = AZ::SettingsRegistry::Get();
41+
AZ_Assert(registry, "No Registry available");
42+
if (registry)
43+
{
44+
registry->Get(m_centerTheCursor, CenterTheCursorConfigurationKey);
45+
}
3446
}
3547

3648
void SpectatorCameraComponent::Deactivate()
@@ -106,7 +118,7 @@ namespace RobotecSpectatorCamera
106118
SpectatorCameraConfiguration::OrbitRadiusMax);
107119
}
108120

109-
if (channelId == AzFramework::InputDeviceMouse::Button::Right || m_configuration.m_cameraMode == CameraMode::FreeFlying)
121+
if (channelId == AzFramework::InputDeviceMouse::Button::Right && m_configuration.m_cameraMode == CameraMode::ThirdPerson)
110122
{
111123
AzFramework::SystemCursorState currentCursorState;
112124
AzFramework::InputSystemCursorRequestBus::EventResult(
@@ -131,14 +143,17 @@ namespace RobotecSpectatorCamera
131143
{
132144
m_isRightMouseButtonPressed = false;
133145

134-
// Restore the cursor's original position
135-
AzFramework::InputSystemCursorRequestBus::Event(
136-
AzFramework::InputDeviceMouse::Id,
137-
&AzFramework::InputSystemCursorRequests::SetSystemCursorPositionNormalized,
138-
m_initialMousePosition);
139-
140-
// Update m_lastMousePosition to the restored position to prevent the jump on the next rotation start
141-
m_lastMousePosition = m_initialMousePosition;
146+
if (m_centerTheCursor)
147+
{
148+
// Restore the cursor's original position
149+
AzFramework::InputSystemCursorRequestBus::Event(
150+
AzFramework::InputDeviceMouse::Id,
151+
&AzFramework::InputSystemCursorRequests::SetSystemCursorPositionNormalized,
152+
m_initialMousePosition);
153+
154+
// Update m_lastMousePosition to the restored position to prevent the jump on the next rotation start
155+
m_lastMousePosition = m_initialMousePosition;
156+
}
142157
AzFramework::InputSystemCursorRequestBus::Event(
143158
AzFramework::InputDeviceMouse::Id,
144159
&AzFramework::InputSystemCursorRequests::SetSystemCursorState,
@@ -160,16 +175,23 @@ namespace RobotecSpectatorCamera
160175
AZ::Vector2 currentMousePosition = GetCurrentMousePosition();
161176
AZ::Vector2 mouseDelta = currentMousePosition - m_lastMousePosition;
162177

163-
RotateCameraOnMouse(mouseDelta);
178+
if (m_centerTheCursor)
179+
{
180+
const auto center = AZ::Vector2(0.5f, 0.5f);
164181

165-
const auto center = AZ::Vector2(0.5f, 0.5f);
182+
// Recenter the cursor to avoid edge constraints
183+
AzFramework::InputSystemCursorRequestBus::Event(
184+
AzFramework::InputDeviceMouse::Id, &AzFramework::InputSystemCursorRequests::SetSystemCursorPositionNormalized, center);
166185

167-
// Recenter the cursor to avoid edge constraints
168-
AzFramework::InputSystemCursorRequestBus::Event(
169-
AzFramework::InputDeviceMouse::Id, &AzFramework::InputSystemCursorRequests::SetSystemCursorPositionNormalized, center);
186+
// Then update m_lastMousePosition accordingly
187+
m_lastMousePosition = center;
188+
}
189+
else
190+
{
191+
m_lastMousePosition = currentMousePosition;
192+
}
170193

171-
// Then update m_lastMousePosition accordingly
172-
m_lastMousePosition = center;
194+
RotateCameraOnMouse(mouseDelta);
173195
}
174196
}
175197

@@ -275,6 +297,9 @@ namespace RobotecSpectatorCamera
275297

276298
void SpectatorCameraComponent::ToggleCameraMode()
277299
{
300+
// RMB should be handled only in the ThirdPerson mode. This line fixes problem with such combination:
301+
// RMB pressed -> Key C pressed -> FreeFlying -> RMB released -> Key C pressed -> ThirdPerson -> Camera rotates without pressing RMB
302+
m_isRightMouseButtonPressed = false;
278303
if (m_configuration.m_cameraMode == CameraMode::ThirdPerson)
279304
{
280305
m_configuration.m_cameraMode = CameraMode::FreeFlying;

Gems/RobotecSpectatorCamera/Code/Source/SpectatorCamera/SpectatorCameraComponent.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ namespace RobotecSpectatorCamera
6262
float m_yaw{ 0.0f };
6363
bool m_isRightMouseButtonPressed{ false };
6464
bool m_ignoreNextMovement{ false };
65-
AZ::Vector2 m_initialMousePosition;
65+
bool m_centerTheCursor{ false };
66+
AZ::Vector2 m_initialMousePosition{ AZ::Vector2::CreateZero() };
6667
AZ::Vector2 m_lastMousePosition{ AZ::Vector2::CreateZero() };
6768
AZ::Vector3 m_movement{ AZ::Vector3::CreateZero() };
6869
AZ::Vector2 m_rotation{ AZ::Vector2::CreateZero() };

0 commit comments

Comments
 (0)