diff --git a/src/xrEngine/IInputReceiver.h b/src/xrEngine/IInputReceiver.h index c252a02eb0d..a4a24e7f883 100644 --- a/src/xrEngine/IInputReceiver.h +++ b/src/xrEngine/IInputReceiver.h @@ -17,6 +17,7 @@ using Ivector2 = _vector2; class ENGINE_API IInputReceiver { public: + virtual ~IInputReceiver() = default; static void IR_GetLastMouseDelta(Ivector2& p); static void IR_GetMousePosScreen(Ivector2& p); static void IR_GetMousePosReal(SDL_Window* m_sdlWnd, Ivector2& p); @@ -31,16 +32,16 @@ class ENGINE_API IInputReceiver virtual void IR_OnDeactivate(void); virtual void IR_OnActivate(void); - virtual void IR_OnMousePress(int /*btn*/){}; - virtual void IR_OnMouseRelease(int /*btn*/){}; - virtual void IR_OnMouseHold(int /*btn*/){}; - virtual void IR_OnMouseWheel(int /*direction*/){}; - virtual void IR_OnMouseMove(int /*x*/, int /*y*/){}; - virtual void IR_OnMouseStop(int /*x*/, int /*y*/){}; + virtual void IR_OnMousePress(int /*btn*/) {} + virtual void IR_OnMouseRelease(int /*btn*/) {} + virtual void IR_OnMouseHold(int /*btn*/) {} + virtual void IR_OnMouseWheel(int /*x*/, int /*y*/) {} + virtual void IR_OnMouseMove(int /*x*/, int /*y*/) {} + virtual void IR_OnMouseStop(int /*x*/, int /*y*/) {} - virtual void IR_OnKeyboardPress(int /*dik*/){}; - virtual void IR_OnKeyboardRelease(int /*dik*/){}; - virtual void IR_OnKeyboardHold(int /*dik*/){}; + virtual void IR_OnKeyboardPress(int /*dik*/) {} + virtual void IR_OnKeyboardRelease(int /*dik*/) {} + virtual void IR_OnKeyboardHold(int /*dik*/) {} }; ENGINE_API extern float psMouseSens; diff --git a/src/xrEngine/xr_input.cpp b/src/xrEngine/xr_input.cpp index 6604ae796aa..dc49cfa7921 100644 --- a/src/xrEngine/xr_input.cpp +++ b/src/xrEngine/xr_input.cpp @@ -125,6 +125,7 @@ void CInput::MouseUpdate() cbStack.back()->IR_OnMousePress(event.button.button - 1); break; case SDL_MOUSEWHEEL: + mouseMoved = true; timeStamp[2] = dwCurTime + event.wheel.timestamp; timeStamp[3] = dwCurTime + event.wheel.timestamp; offs[2] += event.wheel.y; @@ -152,8 +153,8 @@ void CInput::MouseUpdate() { if (offs[0] || offs[1]) cbStack.back()->IR_OnMouseMove(offs[0], offs[1]); - if (offs[2]) - cbStack.back()->IR_OnMouseWheel(offs[2]); + if (offs[2] || offs[3]) + cbStack.back()->IR_OnMouseWheel(offs[2], offs[3]); } else { diff --git a/src/xrGame/Actor.h b/src/xrGame/Actor.h index 3601bffa4d5..0f748333c09 100644 --- a/src/xrGame/Actor.h +++ b/src/xrGame/Actor.h @@ -431,7 +431,7 @@ class CActor : public CEntityAlive, virtual void IR_OnKeyboardPress(int dik); virtual void IR_OnKeyboardRelease(int dik); virtual void IR_OnKeyboardHold(int dik); - virtual void IR_OnMouseWheel(int direction); + virtual void IR_OnMouseWheel(int x, int y); virtual float GetLookFactor(); public: diff --git a/src/xrGame/ActorInput.cpp b/src/xrGame/ActorInput.cpp index 3e52dad3852..aa519f8a0cd 100644 --- a/src/xrGame/ActorInput.cpp +++ b/src/xrGame/ActorInput.cpp @@ -199,18 +199,18 @@ void CActor::IR_OnKeyboardPress(int cmd) } } -void CActor::IR_OnMouseWheel(int direction) +void CActor::IR_OnMouseWheel(int x, int y) { if (hud_adj_mode) { - g_player_hud->tune(Ivector().set(0, 0, direction)); + g_player_hud->tune(Ivector().set(0, 0, x)); return; } - if (inventory().Action((direction > 0) ? (u16)kWPN_ZOOM_DEC : (u16)kWPN_ZOOM_INC, CMD_START)) + if (inventory().Action((x > 0) ? (u16)kWPN_ZOOM_DEC : (u16)kWPN_ZOOM_INC, CMD_START)) return; - if (direction > 0) + if (x > 0) OnNextWeaponSlot(); else OnPrevWeaponSlot(); diff --git a/src/xrGame/Level.h b/src/xrGame/Level.h index c68a6cc9534..81f5e6555c6 100644 --- a/src/xrGame/Level.h +++ b/src/xrGame/Level.h @@ -298,7 +298,7 @@ class CLevel : public IGame_Level, public IPureClient virtual void IR_OnMouseHold(int btn); virtual void IR_OnMouseMove(int, int); virtual void IR_OnMouseStop(int, int); - virtual void IR_OnMouseWheel(int direction); + virtual void IR_OnMouseWheel(int x, int y); virtual void IR_OnActivate(void); int get_RPID(LPCSTR name); // Game diff --git a/src/xrGame/Level_input.cpp b/src/xrGame/Level_input.cpp index eb9e1aa3e12..d98853f7858 100644 --- a/src/xrGame/Level_input.cpp +++ b/src/xrGame/Level_input.cpp @@ -43,7 +43,7 @@ extern float g_fTimeFactor; #define CURRENT_ENTITY() (game ? ((GameID() == eGameIDSingle) ? CurrentEntity() : CurrentControlEntity()) : NULL) -void CLevel::IR_OnMouseWheel(int direction) +void CLevel::IR_OnMouseWheel(int x, int y) { if (g_bDisableAllInput) return; @@ -51,10 +51,10 @@ void CLevel::IR_OnMouseWheel(int direction) #ifdef INPUT_CALLBACKS /* avo: script callback */ if (g_actor) - g_actor->callback(GameObject::eMouseWheel)(direction); + g_actor->callback(GameObject::eMouseWheel)(x); /* avo: end */ #endif - if (CurrentGameUI()->IR_UIOnMouseWheel(direction)) + if (CurrentGameUI()->IR_UIOnMouseWheel(x, y)) return; if (Device.Paused() #ifdef DEBUG @@ -67,7 +67,7 @@ void CLevel::IR_OnMouseWheel(int direction) { IInputReceiver* IR = smart_cast(smart_cast(CURRENT_ENTITY())); if (IR) - IR->IR_OnMouseWheel(direction); + IR->IR_OnMouseWheel(x, y); } } diff --git a/src/xrGame/MainMenu.cpp b/src/xrGame/MainMenu.cpp index 7103fb7c581..1f44bd7eb04 100644 --- a/src/xrGame/MainMenu.cpp +++ b/src/xrGame/MainMenu.cpp @@ -369,12 +369,12 @@ void CMainMenu::IR_OnKeyboardHold(int dik) CDialogHolder::IR_UIOnKeyboardHold((SDL_Scancode)dik); }; -void CMainMenu::IR_OnMouseWheel(int direction) +void CMainMenu::IR_OnMouseWheel(int x, int y) { if (!IsActive()) return; - CDialogHolder::IR_UIOnMouseWheel(direction); + CDialogHolder::IR_UIOnMouseWheel(x, y); } bool CMainMenu::OnRenderPPUI_query() { return IsActive() && !m_Flags.test(flGameSaveScreenshot) && b_shniaganeed_pp; } diff --git a/src/xrGame/MainMenu.h b/src/xrGame/MainMenu.h index 672826a4112..9577bdfa361 100644 --- a/src/xrGame/MainMenu.h +++ b/src/xrGame/MainMenu.h @@ -150,7 +150,7 @@ class CMainMenu : public IMainMenu, virtual void IR_OnKeyboardRelease(int dik); virtual void IR_OnKeyboardHold(int dik); - virtual void IR_OnMouseWheel(int direction); + virtual void IR_OnMouseWheel(int x, int y); bool OnRenderPPUI_query(); void OnRenderPPUI_main(); diff --git a/src/xrGame/UIDialogHolder.cpp b/src/xrGame/UIDialogHolder.cpp index f9fd7b263f0..eb52fe09f29 100644 --- a/src/xrGame/UIDialogHolder.cpp +++ b/src/xrGame/UIDialogHolder.cpp @@ -339,7 +339,7 @@ bool CDialogHolder::IR_UIOnKeyboardHold(SDL_Scancode dik) return true; } -bool CDialogHolder::IR_UIOnMouseWheel(int direction) +bool CDialogHolder::IR_UIOnMouseWheel(int x, int y) { CUIDialogWnd* TIR = TopInputReceiver(); if (!TIR) @@ -349,7 +349,18 @@ bool CDialogHolder::IR_UIOnMouseWheel(int direction) Fvector2 pos = GetUICursor().GetCursorPosition(); - TIR->OnMouseAction(pos.x, pos.y, (direction > 0) ? WINDOW_MOUSE_WHEEL_UP : WINDOW_MOUSE_WHEEL_DOWN); + // Vertical scroll is in higher priority + EUIMessages wheelMessage; + if (x > 0) + wheelMessage = WINDOW_MOUSE_WHEEL_UP; + else if (x < 0) + wheelMessage = WINDOW_MOUSE_WHEEL_DOWN; + else if (y > 0) + wheelMessage = WINDOW_MOUSE_WHEEL_RIGHT; + else + wheelMessage = WINDOW_MOUSE_WHEEL_LEFT; + + TIR->OnMouseAction(pos.x, pos.y, wheelMessage); return true; } diff --git a/src/xrGame/UIDialogHolder.h b/src/xrGame/UIDialogHolder.h index 4db0648b514..2d85b025a7e 100644 --- a/src/xrGame/UIDialogHolder.h +++ b/src/xrGame/UIDialogHolder.h @@ -62,6 +62,6 @@ class CDialogHolder : public pureFrame virtual bool IR_UIOnKeyboardPress(SDL_Scancode dik); virtual bool IR_UIOnKeyboardRelease(SDL_Scancode dik); virtual bool IR_UIOnMouseMove(int dx, int dy); - virtual bool IR_UIOnMouseWheel(int direction); + virtual bool IR_UIOnMouseWheel(int x, int y); virtual bool IR_UIOnKeyboardHold(SDL_Scancode dik); }; diff --git a/src/xrGame/ui/UIGameTutorial.cpp b/src/xrGame/ui/UIGameTutorial.cpp index b32c8e8bb26..b54f5c1588c 100644 --- a/src/xrGame/ui/UIGameTutorial.cpp +++ b/src/xrGame/ui/UIGameTutorial.cpp @@ -387,10 +387,10 @@ void CUISequencer::IR_OnKeyboardHold(int dik) m_pStoredInputReceiver->IR_OnKeyboardHold(dik); } -void CUISequencer::IR_OnMouseWheel(int direction) +void CUISequencer::IR_OnMouseWheel(int x, int y) { if (!GrabInput() && m_pStoredInputReceiver) - m_pStoredInputReceiver->IR_OnMouseWheel(direction); + m_pStoredInputReceiver->IR_OnMouseWheel(x, y); } void CUISequencer::IR_OnKeyboardPress(int dik) diff --git a/src/xrGame/ui/UIGameTutorial.h b/src/xrGame/ui/UIGameTutorial.h index dabffee8544..733961b3129 100644 --- a/src/xrGame/ui/UIGameTutorial.h +++ b/src/xrGame/ui/UIGameTutorial.h @@ -47,7 +47,7 @@ class CUISequencer : public pureFrame, public pureRender, public IInputReceiver virtual void IR_OnKeyboardRelease(int dik); virtual void IR_OnKeyboardHold(int dik); - virtual void IR_OnMouseWheel(int direction); + virtual void IR_OnMouseWheel(int x, int y); virtual void IR_OnActivate(void); bool Persistent() { return !!m_flags.test(etsPersistent); } fastdelegate::FastDelegate0<> m_on_destroy_event; diff --git a/src/xrGame/ui/UIMessages.h b/src/xrGame/ui/UIMessages.h index 66f80cece85..f2b5287c4d9 100644 --- a/src/xrGame/ui/UIMessages.h +++ b/src/xrGame/ui/UIMessages.h @@ -16,6 +16,8 @@ enum EUIMessages WINDOW_MOUSE_MOVE, WINDOW_MOUSE_WHEEL_UP, WINDOW_MOUSE_WHEEL_DOWN, + WINDOW_MOUSE_WHEEL_LEFT, + WINDOW_MOUSE_WHEEL_RIGHT, WINDOW_LBUTTON_DB_CLICK, WINDOW_KEY_PRESSED, WINDOW_KEY_RELEASED, diff --git a/src/xrGame/ui/UIWindow.cpp b/src/xrGame/ui/UIWindow.cpp index d2827938dc8..1d3f59e50d5 100644 --- a/src/xrGame/ui/UIWindow.cpp +++ b/src/xrGame/ui/UIWindow.cpp @@ -305,6 +305,8 @@ bool CUIWindow::OnMouseAction(float x, float y, EUIMessages mouse_action) case WINDOW_MOUSE_MOVE: OnMouseMove(); break; case WINDOW_MOUSE_WHEEL_DOWN: OnMouseScroll(WINDOW_MOUSE_WHEEL_DOWN); break; case WINDOW_MOUSE_WHEEL_UP: OnMouseScroll(WINDOW_MOUSE_WHEEL_UP); break; + case WINDOW_MOUSE_WHEEL_LEFT: OnMouseScroll(WINDOW_MOUSE_WHEEL_LEFT); break; + case WINDOW_MOUSE_WHEEL_RIGHT: OnMouseScroll(WINDOW_MOUSE_WHEEL_RIGHT); break; case WINDOW_LBUTTON_DOWN: if (OnMouseDown(MOUSE_1)) return true;