From 71075104438efbd706d9e6be3a5e4bc04365c1d6 Mon Sep 17 00:00:00 2001 From: EddyFrc Date: Mon, 15 Jun 2026 19:24:05 +0200 Subject: [PATCH] Bind KeyboardController position data to actual mouse position relative to the render canvas. This makes (or at least should make) the mouse pointer act as the wiimote pointer --- src/gui/wxgui/MainWindow.cpp | 6 ++++++ src/input/InputManager.cpp | 10 ++++++++++ src/input/InputManager.h | 7 +++++++ src/input/api/Keyboard/KeyboardController.cpp | 3 +-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/gui/wxgui/MainWindow.cpp b/src/gui/wxgui/MainWindow.cpp index c1cfc242..ab40fc22 100644 --- a/src/gui/wxgui/MainWindow.cpp +++ b/src/gui/wxgui/MainWindow.cpp @@ -1389,6 +1389,12 @@ void MainWindow::OnMouseMove(wxMouseEvent& event) std::unique_lock lock(instance.m_main_mouse.m_mutex); auto physPos = ToPhys(event.GetPosition()); instance.m_main_mouse.position = { physPos.x, physPos.y }; + auto renderCanvasMouse = m_render_canvas->ScreenToClient(m_mouse_position); + instance.SetMousePositionInRenderBox + ({ + static_cast(renderCanvasMouse.x) / m_render_canvas->m_width, + static_cast(renderCanvasMouse.y) / m_render_canvas->m_height, + }); lock.unlock(); if (!IsFullScreen()) diff --git a/src/input/InputManager.cpp b/src/input/InputManager.cpp index 44973d8d..3ebaa908 100644 --- a/src/input/InputManager.cpp +++ b/src/input/InputManager.cpp @@ -928,6 +928,16 @@ std::optional InputManager::get_right_down_mouse_info(bool* is_pad) return {}; } +glm::vec2 InputManager::GetMousePositionInRenderBox() const +{ + return m_mouseInRenderCanvas; +} + +void InputManager::SetMousePositionInRenderBox(glm::vec2 newMousePosition) +{ + m_mouseInRenderCanvas = newMousePosition; +} + void InputManager::update_thread() { SetThreadName("Input_update"); diff --git a/src/input/InputManager.h b/src/input/InputManager.h index b510474b..9383f5d3 100644 --- a/src/input/InputManager.h +++ b/src/input/InputManager.h @@ -91,10 +91,17 @@ public: glm::ivec2 get_mouse_position(bool pad_window) const; std::optional get_left_down_mouse_info(bool* is_pad); std::optional get_right_down_mouse_info(bool* is_pad); + // Returns the mouse position relative to the render canvas (see MainWindow::m_render_canvas). + // (0, 0) is up left; (1, 1) is down right. The values may be negative or above 1 if the mouse cursor + // is outside the render canvas. At the time of writing this, it is used only for mouse-to-wiimote pointer feature. + glm::vec2 GetMousePositionInRenderBox() const; + void SetMousePositionInRenderBox(glm::vec2 newMousePosition); std::atomic m_mouse_wheel; private: + glm::vec2 m_mouseInRenderCanvas{}; + void update_thread(); std::thread m_update_thread; diff --git a/src/input/api/Keyboard/KeyboardController.cpp b/src/input/api/Keyboard/KeyboardController.cpp index 3c6cd29e..3e2d4022 100644 --- a/src/input/api/Keyboard/KeyboardController.cpp +++ b/src/input/api/Keyboard/KeyboardController.cpp @@ -11,8 +11,7 @@ KeyboardController::KeyboardController() glm::vec2 KeyboardController::get_position() { - // arbitrary values for test purpose - return {0.5, 0.5}; + return InputManager::instance().GetMousePositionInRenderBox(); } std::string KeyboardController::get_button_name(uint64 button) const