mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-08 16:01:42 +12:00
Qt/Input: Use ellipsis as "mouse deadzone"
This is experimental and smoothens the existing square shaped deadzone
This commit is contained in:
parent
a692adefd7
commit
8eaf76394c
1 changed files with 32 additions and 4 deletions
|
@ -368,16 +368,44 @@ void keyboard_pad_handler::mouseMoveEvent(QMouseEvent* event)
|
||||||
movement_x = m_multi_x * movement_x;
|
movement_x = m_multi_x * movement_x;
|
||||||
movement_y = m_multi_y * movement_y;
|
movement_y = m_multi_y * movement_y;
|
||||||
|
|
||||||
|
int deadzone_x = 0;
|
||||||
|
int deadzone_y = 0;
|
||||||
|
|
||||||
|
if (movement_x == 0 && movement_y != 0)
|
||||||
|
{
|
||||||
|
deadzone_y = m_deadzone_y;
|
||||||
|
}
|
||||||
|
else if (movement_y == 0 && movement_x != 0)
|
||||||
|
{
|
||||||
|
deadzone_x = m_deadzone_x;
|
||||||
|
}
|
||||||
|
else if (movement_x != 0 && movement_y != 0 && m_deadzone_x != 0 && m_deadzone_y != 0)
|
||||||
|
{
|
||||||
|
// Calculate the point on our deadzone ellipsis intersected with the line (0, 0)(movement_x, movement_y)
|
||||||
|
// Ellipsis: 1 = (x²/a²) + (y²/b²) ; where: a = m_deadzone_x and b = m_deadzone_y
|
||||||
|
// Line: y = mx + t ; where: t = 0 and m = (movement_y / movement_x)
|
||||||
|
// Combined: x = +-(a*b)/sqrt(a²m²+b²) ; where +- is always +, since we only want the magnitude
|
||||||
|
|
||||||
|
const double a = m_deadzone_x;
|
||||||
|
const double b = m_deadzone_y;
|
||||||
|
const double m = double(movement_y) / double(movement_x);
|
||||||
|
|
||||||
|
deadzone_x = a * b / std::sqrt(std::pow(a, 2) * std::pow(m, 2) + std::pow(b, 2));
|
||||||
|
deadzone_y = std::abs(m * deadzone_x);
|
||||||
|
}
|
||||||
|
|
||||||
|
input_log.error("movement_x=%d, movement_y=%d => deadzone_x=%d, deadzone_y=%d", movement_x, movement_y, deadzone_x, deadzone_y);
|
||||||
|
|
||||||
if (movement_x < 0)
|
if (movement_x < 0)
|
||||||
{
|
{
|
||||||
Key(mouse::move_right, false);
|
Key(mouse::move_right, false);
|
||||||
Key(mouse::move_left, true, std::min(m_deadzone_x + std::abs(movement_x), 255));
|
Key(mouse::move_left, true, std::min(deadzone_x + std::abs(movement_x), 255));
|
||||||
m_last_mouse_move_left = steady_clock::now();
|
m_last_mouse_move_left = steady_clock::now();
|
||||||
}
|
}
|
||||||
else if (movement_x > 0)
|
else if (movement_x > 0)
|
||||||
{
|
{
|
||||||
Key(mouse::move_left, false);
|
Key(mouse::move_left, false);
|
||||||
Key(mouse::move_right, true, std::min(m_deadzone_x + movement_x, 255));
|
Key(mouse::move_right, true, std::min(deadzone_x + movement_x, 255));
|
||||||
m_last_mouse_move_right = steady_clock::now();
|
m_last_mouse_move_right = steady_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,13 +413,13 @@ void keyboard_pad_handler::mouseMoveEvent(QMouseEvent* event)
|
||||||
if (movement_y < 0)
|
if (movement_y < 0)
|
||||||
{
|
{
|
||||||
Key(mouse::move_down, false);
|
Key(mouse::move_down, false);
|
||||||
Key(mouse::move_up, true, std::min(m_deadzone_y + std::abs(movement_y), 255));
|
Key(mouse::move_up, true, std::min(deadzone_y + std::abs(movement_y), 255));
|
||||||
m_last_mouse_move_up = steady_clock::now();
|
m_last_mouse_move_up = steady_clock::now();
|
||||||
}
|
}
|
||||||
else if (movement_y > 0)
|
else if (movement_y > 0)
|
||||||
{
|
{
|
||||||
Key(mouse::move_up, false);
|
Key(mouse::move_up, false);
|
||||||
Key(mouse::move_down, true, std::min(m_deadzone_y + movement_y, 255));
|
Key(mouse::move_down, true, std::min(deadzone_y + movement_y, 255));
|
||||||
m_last_mouse_move_down = steady_clock::now();
|
m_last_mouse_move_down = steady_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue