From e46f0e084c73420f8c76c514079952ca0acf1ebe 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 000000000..3f4264caa --- /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 ece0ae2bfb07a4576c31b0f2270883c53e1bff45 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 3f4264caa..d0ee64ad7 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 774d7eab64108a8537c0d0db02744f8a11fa4618 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 --- 1 file changed, 3 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 d0ee64ad7..055924087 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 { -- cgit v1.2.3 From 395997178ba3f918671bc665fc7d8392f2e87ccd 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 055924087..b23a7f1cc 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 16aadcc35430261216aee55732c1580139117ee4 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 b23a7f1cc..10786a541 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