|
13 | 13 | #include "DSAdvance.h" |
14 | 14 | #include <thread> |
15 | 15 | #include <atlstr.h> |
| 16 | +#include <chrono> |
16 | 17 |
|
17 | 18 | #pragma comment(lib, "winmm.lib") |
18 | 19 |
|
@@ -468,7 +469,7 @@ void MainTextUpdate() { |
468 | 469 |
|
469 | 470 | int main(int argc, char **argv) |
470 | 471 | { |
471 | | - SetConsoleTitle("DSAdvance 0.8.7"); |
| 472 | + SetConsoleTitle("DSAdvance 0.9"); |
472 | 473 | // Config parameters |
473 | 474 | CIniReader IniFile("Config.ini"); |
474 | 475 |
|
@@ -505,18 +506,17 @@ int main(int argc, char **argv) |
505 | 506 | bool MotionWheelPitch = IniFile.ReadBoolean("Motion", "WheelPitch", false); |
506 | 507 | bool MotionWheelRoll = IniFile.ReadBoolean("Motion", "WheelRoll", true); |
507 | 508 | int WheelInvertPitch = IniFile.ReadBoolean("Motion", "WheelInvertPitch", false) ? -1 : 1; |
508 | | - float MotionSensX = IniFile.ReadFloat("Motion", "MouseSensX", 3) / 10.0f;; |
509 | | - float MotionSensY = IniFile.ReadFloat("Motion", "MouseSensY", 3) / 10.0f;; |
510 | | - float JoySensX = IniFile.ReadFloat("Motion", "JoySensX", 3); |
511 | | - float JoySensY = IniFile.ReadFloat("Motion", "JoySensY", 3); |
| 509 | + float MotionSensX = IniFile.ReadFloat("Motion", "MouseSensX", 100) * 0.135f; |
| 510 | + float MotionSensY = IniFile.ReadFloat("Motion", "MouseSensY", 90) * 0.135f; |
| 511 | + float JoySensX = IniFile.ReadFloat("Motion", "JoySensX", 100) * 0.0205; |
| 512 | + float JoySensY = IniFile.ReadFloat("Motion", "JoySensY", 90) * 0.0205; |
512 | 513 | float CustomMulSens = 1; |
513 | 514 |
|
514 | 515 | int ScreenShotKey = VK_GAMEBAR_SCREENSHOT; |
515 | 516 | int MicCustomKey = KeyNameToKeyCode(IniFile.ReadString("Gamepad", "MicCustomKey", "NONE")); |
516 | 517 | if (MicCustomKey == 0) AppStatus.ScreenshotMode = ScreenShotXboxGameBarMode; // If not set, then hide this mode |
517 | 518 | else ScreenShotKey = MicCustomKey; |
518 | 519 |
|
519 | | - |
520 | 520 | int ExternalPedalsCOMPort = IniFile.ReadInteger("ExternalPedals", "COMPort", 0); |
521 | 521 | if (ExternalPedalsCOMPort != 0) { |
522 | 522 | char sPortName[32]; |
@@ -605,6 +605,11 @@ int main(int argc, char **argv) |
605 | 605 | XUSB_REPORT report; |
606 | 606 |
|
607 | 607 | TouchpadTouch FirstTouch, SecondTouch; |
| 608 | + |
| 609 | + auto previous_time = std::chrono::high_resolution_clock::now(); |
| 610 | + float x_smoothed = 0; |
| 611 | + float y_smoothed = 0; |
| 612 | + EulerAngles PreviousAngles = {0, 0, 0}, DeltaAnges; |
608 | 613 |
|
609 | 614 | while (! ( GetAsyncKeyState(VK_LMENU) & 0x8000 && GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) ) |
610 | 615 | { |
@@ -902,17 +907,39 @@ int main(int argc, char **argv) |
902 | 907 | report.sThumbLX = MotionWheelRoll ? ToLeftStick(OffsetYPR(RadToDeg(MotionAngles.Roll), RadToDeg(AnglesOffset.Roll)) * -1, MotionWheelAngle) : report.sThumbLX = ToLeftStick(OffsetYPR(RadToDeg(MotionAngles.Yaw), RadToDeg(AnglesOffset.Yaw)) * -1, MotionWheelAngle); |
903 | 908 | if (MotionWheelPitch) report.sThumbLY = ToLeftStick(OffsetYPR(RadToDeg(MotionAngles.Pitch), RadToDeg(AnglesOffset.Pitch)) * WheelInvertPitch, MotionWheelAngle); |
904 | 909 | } else if (GamepadActionMode == MotionAimingMode || GamepadActionMode == MotionAimingModeOnlyPressed) { // Motion aiming [--X}] |
905 | | - float DeltaX = OffsetYPR(RadToDeg(MotionAngles.Yaw), RadToDeg(AnglesOffset.Yaw)) * -1; |
906 | | - float DeltaY = OffsetYPR(RadToDeg(MotionAngles.Pitch), RadToDeg(AnglesOffset.Pitch)) * -1; |
| 910 | + |
| 911 | + // Low-pass filter |
| 912 | + const float smoothing_factor = 0.2f; // BT, USB - 0.2 good, default 0.5 |
| 913 | + x_smoothed = RadToDeg(MotionAngles.Yaw - PreviousAngles.Yaw) * smoothing_factor + x_smoothed * (1 - smoothing_factor); |
| 914 | + y_smoothed = RadToDeg(MotionAngles.Pitch - PreviousAngles.Pitch) * smoothing_factor + y_smoothed * (1 - smoothing_factor); |
| 915 | + |
| 916 | + float deltaX = x_smoothed; |
| 917 | + float deltaY = y_smoothed; |
| 918 | + |
| 919 | + // Cursor movement speed |
| 920 | + auto current_time = std::chrono::high_resolution_clock::now(); |
| 921 | + std::chrono::duration<double> elapsed_time = current_time - previous_time; |
| 922 | + float delta_time = elapsed_time.count(); |
| 923 | + previous_time = current_time; |
| 924 | + |
| 925 | + float max_cursor_speed = 100.0f; // Maximum speed of cursor movement |
| 926 | + float deltaXY = sqrt(deltaX * deltaX + deltaY * deltaY); |
| 927 | + if (deltaXY > max_cursor_speed * delta_time) { |
| 928 | + deltaX *= max_cursor_speed * delta_time / deltaXY; |
| 929 | + deltaY *= max_cursor_speed * delta_time / deltaXY; |
| 930 | + } |
| 931 | + |
| 932 | + PreviousAngles.Yaw = MotionAngles.Yaw; |
| 933 | + PreviousAngles.Pitch = MotionAngles.Pitch; |
| 934 | + |
907 | 935 | if (GamepadActionMode == MotionAimingMode || (GamepadActionMode == MotionAimingModeOnlyPressed && InputState.lTrigger > 0) ) |
908 | 936 | if (AppStatus.AimMode == AimMouseMode) |
909 | | - MouseMove(RadToDeg(DeltaX) * MotionSensX * CustomMulSens, RadToDeg(DeltaY) * MotionSensY * CustomMulSens); |
| 937 | + MouseMove(deltaX * -1.0f * MotionSensX * CustomMulSens, deltaY * -1.0f * MotionSensY * CustomMulSens); |
910 | 938 | else { |
911 | | - report.sThumbRX = std::clamp((int)(ClampFloat((DeltaX) * JoySensX * CustomMulSens, -1, 1) * 32767 + report.sThumbRX), -32767, 32767); |
912 | | - report.sThumbRY = std::clamp((int)(ClampFloat(-(DeltaY) * JoySensY * CustomMulSens, -1, 1) * 32767 + report.sThumbRY), -32767, 32767); |
| 939 | + report.sThumbRX = std::clamp((int)(ClampFloat(-(deltaX) * JoySensX * CustomMulSens, -1, 1) * 32767 + report.sThumbRX), -32767, 32767); |
| 940 | + report.sThumbRY = std::clamp((int)(ClampFloat(deltaY * JoySensY * CustomMulSens, -1, 1) * 32767 + report.sThumbRY), -32767, 32767); |
913 | 941 | } |
914 | 942 |
|
915 | | - AnglesOffset = MotionAngles; // Not the best way but it works |
916 | 943 | } else if (GamepadActionMode == TouchpadSticksMode) { // [-_-] Touchpad sticks |
917 | 944 |
|
918 | 945 | if (TouchState.t0Down) { |
|
0 commit comments