diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 6ddadec1..acc408fd 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -26,6 +26,11 @@ class LegoCameraController; class LegoControlManager; class LegoWorld; +namespace Extensions +{ +class MultiplayerExt; +} + extern MxS32 g_clickedObjectId; extern const char* g_clickedAtom; @@ -178,6 +183,8 @@ class LegoInputManager : public MxPresenter { // SYNTHETIC: LEGO1 0x1005b8d0 // LegoInputManager::`scalar deleting destructor' + friend class Extensions::MultiplayerExt; + private: void InitializeHaptics(); @@ -204,6 +211,7 @@ class LegoInputManager : public MxPresenter { TouchScheme m_touchScheme = e_none; SDL_Point m_touchVirtualThumb = {0, 0}; SDL_FPoint m_touchVirtualThumbOrigin; + SDL_FingerID m_touchFinger = 0; std::map m_touchFlags; std::map> m_keyboards; std::map> m_mice; diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index f41129ad..d84368c8 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -323,6 +323,12 @@ MxBool LegoInputManager::ProcessOneEvent(LegoEventNotificationParam& p_param) } else { if (!Lego()->IsPaused()) { + if ((p_param.GetModifier() & LegoEventNotificationParam::c_rButtonState) && + !(p_param.GetModifier() & LegoEventNotificationParam::c_lButtonState) && + Extension::Call(IsThirdPersonCameraActive).value_or(FALSE)) { + return FALSE; + } + processRoi = TRUE; if (m_unk0x335 != 0) { @@ -632,12 +638,7 @@ 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(); + if (Extension::Call(HandleTouchInput).value_or(FALSE)) { return FALSE; } @@ -678,22 +679,22 @@ MxBool LegoInputManager::HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touc case e_gamepad: { switch (p_event->type) { case SDL_EVENT_FINGER_DOWN: - if (!g_finger) { - g_finger = event.fingerID; + if (!m_touchFinger) { + m_touchFinger = event.fingerID; m_touchVirtualThumb = {0, 0}; m_touchVirtualThumbOrigin = {event.x, event.y}; } break; case SDL_EVENT_FINGER_UP: case SDL_EVENT_FINGER_CANCELED: - if (event.fingerID == g_finger) { - g_finger = 0; + if (event.fingerID == m_touchFinger) { + m_touchFinger = 0; m_touchVirtualThumb = {0, 0}; m_touchVirtualThumbOrigin = {0, 0}; } break; case SDL_EVENT_FINGER_MOTION: - if (event.fingerID == g_finger) { + if (event.fingerID == m_touchFinger) { const float thumbstickRadius = 0.25f; const float deltaX = SDL_clamp(event.x - m_touchVirtualThumbOrigin.x, -thumbstickRadius, thumbstickRadius); diff --git a/extensions/include/extensions/multiplayer.h b/extensions/include/extensions/multiplayer.h index a184308c..df5d9389 100644 --- a/extensions/include/extensions/multiplayer.h +++ b/extensions/include/extensions/multiplayer.h @@ -66,9 +66,12 @@ 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(); + // Returns TRUE when the third-person camera is active. + static MxBool IsThirdPersonCameraActive(); + + // Suppresses touch input when a multi-touch camera gesture is active. + // Returns TRUE if the caller should return early. + static MxBool HandleTouchInput(); static void SetNetworkManager(Multiplayer::NetworkManager* p_networkManager); static Multiplayer::NetworkManager* GetNetworkManager(); @@ -95,7 +98,8 @@ 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; +constexpr auto IsThirdPersonCameraActive = &MultiplayerExt::IsThirdPersonCameraActive; +constexpr auto HandleTouchInput = &MultiplayerExt::HandleTouchInput; #else constexpr decltype(&MultiplayerExt::HandleCreate) HandleCreate = nullptr; constexpr decltype(&MultiplayerExt::HandleWorldEnable) HandleWorldEnable = nullptr; @@ -110,7 +114,8 @@ 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; +constexpr decltype(&MultiplayerExt::IsThirdPersonCameraActive) IsThirdPersonCameraActive = nullptr; +constexpr decltype(&MultiplayerExt::HandleTouchInput) HandleTouchInput = nullptr; #endif }; // namespace Extensions diff --git a/extensions/src/multiplayer.cpp b/extensions/src/multiplayer.cpp index f8508e1d..bc44558c 100644 --- a/extensions/src/multiplayer.cpp +++ b/extensions/src/multiplayer.cpp @@ -11,6 +11,7 @@ #include "legoentity.h" #include "legoeventnotificationparam.h" #include "legogamestate.h" +#include "legoinputmanager.h" #include "legopathactor.h" #include "misc.h" #include "roi/legoroi.h" @@ -299,10 +300,24 @@ void MultiplayerExt::HandleSDLEvent(SDL_Event* p_event) } } -MxBool MultiplayerExt::IsTouchInputSuppressed() +MxBool MultiplayerExt::IsThirdPersonCameraActive() { if (s_networkManager && s_networkManager->GetThirdPersonCamera().IsActive()) { - return s_networkManager->GetThirdPersonCamera().IsTouchGestureActive() ? TRUE : FALSE; + return TRUE; + } + + return FALSE; +} + +MxBool MultiplayerExt::HandleTouchInput() +{ + if (s_networkManager && s_networkManager->GetThirdPersonCamera().IsActive() && + s_networkManager->GetThirdPersonCamera().IsTouchGestureActive()) { + LegoInputManager* im = InputManager(); + im->m_touchFinger = 0; + im->m_touchVirtualThumb = {0, 0}; + im->m_touchFlags.clear(); + return TRUE; } return FALSE;