diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-14 11:47:30 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-14 18:14:46 +0200 |
commit | 1d8b1da9a68a47e6b222e8d80dc8e546e52e4dcc (patch) | |
tree | 2bbcf25de732bd8a81363f452e08520087b024b5 /proto-mouse/ftnoir_protocol_mouse.cpp | |
parent | a8da0d997048007d3feb2e3814ba93bbfd4d4ef8 (diff) |
proto/mouse: guard against +181 -> -179 wraparound
Always use the shorter way around.
This also adds a sensitivity param.
Issue: #370
Diffstat (limited to 'proto-mouse/ftnoir_protocol_mouse.cpp')
-rw-r--r-- | proto-mouse/ftnoir_protocol_mouse.cpp | 123 |
1 files changed, 91 insertions, 32 deletions
diff --git a/proto-mouse/ftnoir_protocol_mouse.cpp b/proto-mouse/ftnoir_protocol_mouse.cpp index c0a0a868..73616785 100644 --- a/proto-mouse/ftnoir_protocol_mouse.cpp +++ b/proto-mouse/ftnoir_protocol_mouse.cpp @@ -6,48 +6,107 @@ */ #include "ftnoir_protocol_mouse.h" #include "opentrack/plugin-api.hpp" +#include <cmath> +#include <algorithm> #include <windows.h> #ifndef MOUSEEVENTF_MOVE_NOCOALESCE # define MOUSEEVENTF_MOVE_NOCOALESCE 0x2000 #endif -void FTNoIR_Protocol::pose(const double *headpose ) { - RECT desktop; - const HWND hDesktop = GetDesktopWindow(); - if (hDesktop != NULL && GetWindowRect(hDesktop, &desktop)) { - // XXX TODO remove axis selector, use mapping window's - // axis selection. Mention in UI axis used. -sh 20140920 - int axis_x = s.Mouse_X; - int axis_y = s.Mouse_Y; - - int mouse_x = 0, mouse_y = 0; - - if (axis_x > 0 && axis_x <= 6) - mouse_x = headpose[axis_x-1] / (axis_x <= 3 ? 100 : 180) * 10 * desktop.right/2; - - if (axis_y > 0 && axis_y <= 6) - mouse_y = headpose[axis_y-1] / (axis_y <= 3 ? 100 : 180) * 10 * desktop.bottom/2; - - MOUSEINPUT mi; - mi.dx = mouse_x - last_x; - mi.dy = mouse_y - last_y; - mi.mouseData = 0; - mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_MOVE_NOCOALESCE; - mi.time = 0; - mi.dwExtraInfo = 0; - INPUT input; - input.type = INPUT_MOUSE; - input.mi = mi; - (void) SendInput(1, &input, sizeof(INPUT)); - - last_x = mouse_x; - last_y = mouse_y; +void FTNoIR_Protocol::pose(const double *headpose) +{ + // XXX TODO remove axis selector, use mapping window's + // axis selection. Mention in UI axis used. -sh 20140920 + const int axis_x = s.Mouse_X - 1; + const int axis_y = s.Mouse_Y - 1; + + int mouse_x = 0, mouse_y = 0; + + static constexpr double invert[] = + { + 1., 1., 1., + 1., -1., 1. + }; + + if (axis_x >= 0 && axis_x < 6) + { + mouse_x = get_value(headpose[axis_x] * invert[axis_x], + last_pos_x, + last_x, + axis_x >= 3, + static_cast<slider_value>(s.sensitivity_x)); + } + + if (axis_y >= 0 && axis_y < 6) + mouse_y = get_value(headpose[axis_y] * invert[axis_y], + last_pos_y, + last_y, + axis_y >= 3, + static_cast<slider_value>(s.sensitivity_y)); + + MOUSEINPUT mi; + mi.dx = mouse_x; + mi.dy = mouse_y; + mi.mouseData = 0; + mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_MOVE_NOCOALESCE; + mi.time = 0; + mi.dwExtraInfo = 0; + INPUT input; + input.type = INPUT_MOUSE; + input.mi = mi; + (void) SendInput(1, &input, sizeof(INPUT)); + + last_x = mouse_x; + last_y = mouse_y; +} + +QString FTNoIR_Protocol::game_name() +{ + return "Mouse tracker"; +} + +double FTNoIR_Protocol::get_rotation(double val, double last_pos) +{ + using std::fmod; + using std::fabs; + using std::copysign; + using std::min; + + const double x_1 = val - last_pos; + + if (x_1 > 180) + return 360 - x_1; + else if (x_1 < -180) + return 360 + x_1; + else + return x_1; +} + +int FTNoIR_Protocol::get_value(double val, double& last_pos, int& last_px, bool is_rotation, double sensitivity) +{ + static constexpr double c = 1e-1; + + if (is_rotation) + { + const double rot_delta = get_rotation(val, last_pos); + + last_pos = val; + last_px = int(rot_delta * c * sensitivity); } + else + { + val -= last_pos; + + last_pos = val; + last_px = int(val * c * sensitivity / 100 - last_px); + } + + return last_px; } bool FTNoIR_Protocol::correct() -{ +{ return true; } |