From 56a8fee35ad65e42da901c7458f414d71166bea6 Mon Sep 17 00:00:00 2001 From: german Date: Tue, 17 Nov 2020 22:55:09 -0600 Subject: Implement full mouse support --- src/input_common/mouse/mouse_input.cpp | 125 +++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/input_common/mouse/mouse_input.cpp (limited to 'src/input_common/mouse/mouse_input.cpp') diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp new file mode 100644 index 0000000000..3f4264caaf --- /dev/null +++ b/src/input_common/mouse/mouse_input.cpp @@ -0,0 +1,125 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "common/logging/log.h" +#include "common/math_util.h" +#include "common/param_package.h" +#include "input_common/mouse/mouse_input.h" + +namespace MouseInput { + +Mouse::Mouse() { + update_thread = std::thread(&Mouse::UpdateThread, this); +} + +Mouse::~Mouse() { + update_thread_running = false; + if (update_thread.joinable()) { + update_thread.join(); + } +} + +void Mouse::UpdateThread() { + constexpr int update_time = 10; + while (update_thread_running) { + for (MouseInfo& info : mouse_info) { + Common::Vec3f angular_direction = {-info.tilt_direction.y, 0.0f, + -info.tilt_direction.x}; + + info.motion.SetGyroscope(angular_direction * info.tilt_speed); + info.motion.UpdateRotation(update_time * 1000); + info.motion.UpdateOrientation(update_time * 1000); + info.tilt_speed = 0; + info.data.motion = info.motion.GetMotion(); + } + if (configuring) { + UpdateYuzuSettings(); + } + std::this_thread::sleep_for(std::chrono::milliseconds(update_time)); + } +} + +void Mouse::UpdateYuzuSettings() { + MouseStatus pad_status{}; + if (buttons != 0) { + pad_status.button = last_button; + mouse_queue.Push(pad_status); + } +} + +void Mouse::PressButton(int x, int y, int button_) { + if (button_ >= static_cast(mouse_info.size())) { + return; + } + + int button = 1 << button_; + buttons |= static_cast(button); + last_button = static_cast(button_); + + mouse_info[button_].mouse_origin = Common::MakeVec(x, y); + mouse_info[button_].last_mouse_position = Common::MakeVec(x, y); + mouse_info[button_].data.pressed = true; +} + +void Mouse::MouseMove(int x, int y) { + for (MouseInfo& info : mouse_info) { + if (info.data.pressed) { + auto mouse_move = Common::MakeVec(x, y) - info.mouse_origin; + auto mouse_change = Common::MakeVec(x, y) - info.last_mouse_position; + info.last_mouse_position = Common::MakeVec(x, y); + info.data.axis = {mouse_move.x, -mouse_move.y}; + + if (mouse_change.x == 0 && mouse_change.y == 0) { + info.tilt_speed = 0; + } else { + info.tilt_direction = mouse_change.Cast(); + info.tilt_speed = info.tilt_direction.Normalize() * info.sensitivity; + } + } + } +} + +void Mouse::ReleaseButton(int button_) { + if (button_ >= static_cast(mouse_info.size())) { + return; + } + + int button = 1 << button_; + buttons &= static_cast(0xFF - button); + + mouse_info[button_].tilt_speed = 0; + mouse_info[button_].data.pressed = false; + mouse_info[button_].data.axis = {0, 0}; +} + +void Mouse::BeginConfiguration() { + buttons = 0; + last_button = MouseButton::Undefined; + mouse_queue.Clear(); + configuring = true; +} + +void Mouse::EndConfiguration() { + buttons = 0; + last_button = MouseButton::Undefined; + mouse_queue.Clear(); + configuring = false; +} + +Common::SPSCQueue& Mouse::GetMouseQueue() { + return mouse_queue; +} + +const Common::SPSCQueue& Mouse::GetMouseQueue() const { + return mouse_queue; +} + +MouseData& Mouse::GetMouseState(std::size_t button) { + return mouse_info[button].data; +} + +const MouseData& Mouse::GetMouseState(std::size_t button) const { + return mouse_info[button].data; +} +} // namespace MouseInput -- cgit v1.2.3 From 544417cd49fd88366ec7273bd9c3f3a0aceaa626 Mon Sep 17 00:00:00 2001 From: german Date: Mon, 30 Nov 2020 17:53:43 -0600 Subject: Fix implicit conversion in mouse input --- src/input_common/mouse/mouse_input.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/input_common/mouse/mouse_input.cpp') diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp index 3f4264caaf..d0ee64ad75 100644 --- a/src/input_common/mouse/mouse_input.cpp +++ b/src/input_common/mouse/mouse_input.cpp @@ -54,12 +54,13 @@ void Mouse::PressButton(int x, int y, int button_) { } int button = 1 << button_; + const auto button_index = static_cast(button_); buttons |= static_cast(button); last_button = static_cast(button_); - mouse_info[button_].mouse_origin = Common::MakeVec(x, y); - mouse_info[button_].last_mouse_position = Common::MakeVec(x, y); - mouse_info[button_].data.pressed = true; + mouse_info[button_index].mouse_origin = Common::MakeVec(x, y); + mouse_info[button_index].last_mouse_position = Common::MakeVec(x, y); + mouse_info[button_index].data.pressed = true; } void Mouse::MouseMove(int x, int y) { @@ -86,11 +87,12 @@ void Mouse::ReleaseButton(int button_) { } int button = 1 << button_; + const auto button_index = static_cast(button_); buttons &= static_cast(0xFF - button); - mouse_info[button_].tilt_speed = 0; - mouse_info[button_].data.pressed = false; - mouse_info[button_].data.axis = {0, 0}; + mouse_info[button_index].tilt_speed = 0; + mouse_info[button_index].data.pressed = false; + mouse_info[button_index].data.axis = {0, 0}; } void Mouse::BeginConfiguration() { -- cgit v1.2.3 From 09b2703682fc5cf17d22dbab4db98f954db5ede3 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 3 Dec 2020 10:25:10 -0500 Subject: mouse_input: Remove unused includes --- src/input_common/mouse/mouse_input.cpp | 3 --- src/input_common/mouse/mouse_input.h | 7 +++---- 2 files changed, 3 insertions(+), 7 deletions(-) (limited to 'src/input_common/mouse/mouse_input.cpp') diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp index d0ee64ad75..055924087b 100644 --- a/src/input_common/mouse/mouse_input.cpp +++ b/src/input_common/mouse/mouse_input.cpp @@ -2,9 +2,6 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. -#include "common/logging/log.h" -#include "common/math_util.h" -#include "common/param_package.h" #include "input_common/mouse/mouse_input.h" namespace MouseInput { diff --git a/src/input_common/mouse/mouse_input.h b/src/input_common/mouse/mouse_input.h index 761663334b..6fc95a49e8 100644 --- a/src/input_common/mouse/mouse_input.h +++ b/src/input_common/mouse/mouse_input.h @@ -4,15 +4,14 @@ #pragma once -#include -#include +#include #include #include -#include + #include "common/common_types.h" #include "common/threadsafe_queue.h" +#include "common/vector_math.h" #include "core/frontend/input.h" -#include "input_common/main.h" #include "input_common/motion_input.h" namespace MouseInput { -- cgit v1.2.3 From f8b5b65d6b34d992d4c90d41169487544e666cb0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 3 Dec 2020 10:30:49 -0500 Subject: mouse_input: Remove two casts and amend some formatting Removes the use of two static casts and improves the readability of some vectors slightly. --- src/input_common/mouse/mouse_input.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'src/input_common/mouse/mouse_input.cpp') diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp index 055924087b..b23a7f1cc4 100644 --- a/src/input_common/mouse/mouse_input.cpp +++ b/src/input_common/mouse/mouse_input.cpp @@ -21,8 +21,11 @@ void Mouse::UpdateThread() { constexpr int update_time = 10; while (update_thread_running) { for (MouseInfo& info : mouse_info) { - Common::Vec3f angular_direction = {-info.tilt_direction.y, 0.0f, - -info.tilt_direction.x}; + const Common::Vec3f angular_direction{ + -info.tilt_direction.y, + 0.0f, + -info.tilt_direction.x, + }; info.motion.SetGyroscope(angular_direction * info.tilt_speed); info.motion.UpdateRotation(update_time * 1000); @@ -46,14 +49,14 @@ void Mouse::UpdateYuzuSettings() { } void Mouse::PressButton(int x, int y, int button_) { - if (button_ >= static_cast(mouse_info.size())) { + const auto button_index = static_cast(button_); + if (button_index >= mouse_info.size()) { return; } - int button = 1 << button_; - const auto button_index = static_cast(button_); + const auto button = 1U << button_index; buttons |= static_cast(button); - last_button = static_cast(button_); + last_button = static_cast(button_index); mouse_info[button_index].mouse_origin = Common::MakeVec(x, y); mouse_info[button_index].last_mouse_position = Common::MakeVec(x, y); @@ -63,8 +66,8 @@ void Mouse::PressButton(int x, int y, int button_) { void Mouse::MouseMove(int x, int y) { for (MouseInfo& info : mouse_info) { if (info.data.pressed) { - auto mouse_move = Common::MakeVec(x, y) - info.mouse_origin; - auto mouse_change = Common::MakeVec(x, y) - info.last_mouse_position; + const auto mouse_move = Common::MakeVec(x, y) - info.mouse_origin; + const auto mouse_change = Common::MakeVec(x, y) - info.last_mouse_position; info.last_mouse_position = Common::MakeVec(x, y); info.data.axis = {mouse_move.x, -mouse_move.y}; @@ -79,12 +82,12 @@ void Mouse::MouseMove(int x, int y) { } void Mouse::ReleaseButton(int button_) { - if (button_ >= static_cast(mouse_info.size())) { + const auto button_index = static_cast(button_); + if (button_index >= mouse_info.size()) { return; } - int button = 1 << button_; - const auto button_index = static_cast(button_); + const auto button = 1U << button_index; buttons &= static_cast(0xFF - button); mouse_info[button_index].tilt_speed = 0; -- cgit v1.2.3 From 11e20efc1d3a231356abfa0e3ccc49c5dca40001 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 3 Dec 2020 10:32:57 -0500 Subject: mouse_input: Invert conditional in UpdateYuzuSettings() Allows the struct to be constructed in place. --- src/input_common/mouse/mouse_input.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/input_common/mouse/mouse_input.cpp') diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp index b23a7f1cc4..10786a5413 100644 --- a/src/input_common/mouse/mouse_input.cpp +++ b/src/input_common/mouse/mouse_input.cpp @@ -41,11 +41,13 @@ void Mouse::UpdateThread() { } void Mouse::UpdateYuzuSettings() { - MouseStatus pad_status{}; - if (buttons != 0) { - pad_status.button = last_button; - mouse_queue.Push(pad_status); + if (buttons == 0) { + return; } + + mouse_queue.Push(MouseStatus{ + .button = last_button, + }); } void Mouse::PressButton(int x, int y, int button_) { -- cgit v1.2.3