From f6975241878ba0ba3d90b21b2f3fdb183e496eca Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 8 Mar 2026 11:32:17 -0700 Subject: [PATCH] Suppress movement input during 3rd-person camera touch gestures --- LEGO1/lego/legoomni/src/input/legoinputmanager.cpp | 11 +++++++++-- extensions/include/extensions/multiplayer.h | 6 ++++++ .../extensions/multiplayer/thirdpersoncamera.h | 2 ++ extensions/src/multiplayer.cpp | 9 +++++++++ extensions/src/multiplayer/thirdpersoncamera.cpp | 4 ++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index ba49c6b4..f41129ad 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -632,6 +632,15 @@ void LegoInputManager::RemoveJoystick(SDL_JoystickID p_joystickID) MxBool LegoInputManager::HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touchScheme) { + static SDL_FingerID g_finger = (SDL_FingerID) 0; + + if (Extension::Call(IsTouchInputSuppressed).value_or(FALSE)) { + g_finger = 0; + m_touchVirtualThumb = {0, 0}; + m_touchFlags.clear(); + return FALSE; + } + const SDL_TouchFingerEvent& event = p_event->tfinger; m_touchScheme = p_touchScheme; @@ -667,8 +676,6 @@ MxBool LegoInputManager::HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touc } break; case e_gamepad: { - static SDL_FingerID g_finger = (SDL_FingerID) 0; - switch (p_event->type) { case SDL_EVENT_FINGER_DOWN: if (!g_finger) { diff --git a/extensions/include/extensions/multiplayer.h b/extensions/include/extensions/multiplayer.h index 860b9d68..1d0fc5d4 100644 --- a/extensions/include/extensions/multiplayer.h +++ b/extensions/include/extensions/multiplayer.h @@ -67,6 +67,10 @@ class MultiplayerExt { // Forwards SDL events to the third-person camera for orbit controls. static void HandleSDLEvent(SDL_Event* p_event); + // Returns TRUE when a multi-touch camera gesture is active and touch + // movement input should be suppressed. + static MxBool IsTouchInputSuppressed(); + static void SetNetworkManager(Multiplayer::NetworkManager* p_networkManager); static Multiplayer::NetworkManager* GetNetworkManager(); @@ -93,6 +97,7 @@ constexpr auto HandleBeforeSaveLoad = &MultiplayerExt::HandleBeforeSaveLoad; constexpr auto HandleSaveLoaded = &MultiplayerExt::HandleSaveLoaded; constexpr auto CheckRejected = &MultiplayerExt::CheckRejected; constexpr auto HandleSDLEvent = &MultiplayerExt::HandleSDLEvent; +constexpr auto IsTouchInputSuppressed = &MultiplayerExt::IsTouchInputSuppressed; #else constexpr decltype(&MultiplayerExt::HandleCreate) HandleCreate = nullptr; constexpr decltype(&MultiplayerExt::HandleWorldEnable) HandleWorldEnable = nullptr; @@ -108,6 +113,7 @@ constexpr decltype(&MultiplayerExt::HandleBeforeSaveLoad) HandleBeforeSaveLoad = constexpr decltype(&MultiplayerExt::HandleSaveLoaded) HandleSaveLoaded = nullptr; constexpr decltype(&MultiplayerExt::CheckRejected) CheckRejected = nullptr; constexpr decltype(&MultiplayerExt::HandleSDLEvent) HandleSDLEvent = nullptr; +constexpr decltype(&MultiplayerExt::IsTouchInputSuppressed) IsTouchInputSuppressed = nullptr; #endif }; // namespace Extensions diff --git a/extensions/include/extensions/multiplayer/thirdpersoncamera.h b/extensions/include/extensions/multiplayer/thirdpersoncamera.h index 474741fb..6beddd27 100644 --- a/extensions/include/extensions/multiplayer/thirdpersoncamera.h +++ b/extensions/include/extensions/multiplayer/thirdpersoncamera.h @@ -55,6 +55,7 @@ class ThirdPersonCamera { // Free camera input handling void HandleSDLEvent(SDL_Event* p_event); + bool IsTouchGestureActive() const { return m_touchGestureActive; } private: // Orbit camera helpers @@ -96,6 +97,7 @@ class ThirdPersonCamera { float m_orbitDistance; // Touch gesture tracking + bool m_touchGestureActive = false; struct TouchState { SDL_FingerID id[2]; float x[2], y[2]; diff --git a/extensions/src/multiplayer.cpp b/extensions/src/multiplayer.cpp index d7fdc5e7..f6d1aa05 100644 --- a/extensions/src/multiplayer.cpp +++ b/extensions/src/multiplayer.cpp @@ -308,6 +308,15 @@ void MultiplayerExt::HandleSDLEvent(SDL_Event* p_event) } } +MxBool MultiplayerExt::IsTouchInputSuppressed() +{ + if (s_networkManager && s_networkManager->GetThirdPersonCamera().IsActive()) { + return s_networkManager->GetThirdPersonCamera().IsTouchGestureActive() ? TRUE : FALSE; + } + + return FALSE; +} + MxBool MultiplayerExt::CheckRejected() { if (s_networkManager && s_networkManager->WasRejected()) { diff --git a/extensions/src/multiplayer/thirdpersoncamera.cpp b/extensions/src/multiplayer/thirdpersoncamera.cpp index 28bb7425..7b63eb56 100644 --- a/extensions/src/multiplayer/thirdpersoncamera.cpp +++ b/extensions/src/multiplayer/thirdpersoncamera.cpp @@ -558,6 +558,7 @@ void ThirdPersonCamera::HandleSDLEvent(SDL_Event* p_event) m_touch.count++; if (m_touch.count == 2) { + m_touchGestureActive = true; float dx = m_touch.x[1] - m_touch.x[0]; float dy = m_touch.y[1] - m_touch.y[0]; m_touch.initialPinchDist = SDL_sqrtf(dx * dx + dy * dy); @@ -618,6 +619,9 @@ void ThirdPersonCamera::HandleSDLEvent(SDL_Event* p_event) m_touch.y[0] = m_touch.y[1]; } m_touch.count--; + if (m_touch.count == 0) { + m_touchGestureActive = false; + } m_touch.initialPinchDist = 0.0f; break; }