Skip to content

Commit 01b1749

Browse files
committed
Improvement: more smooth aiming
1 parent 02969fd commit 01b1749

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

README.RU.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
* [JoyShockLibrary](https://github.com/JibbSmart/JoyShockLibrary) за классную библиотеку геймпадов, позволяющую легко получить вращение контроллера. Также используется некоторый код из этой библиотеки.
8282
* [Пользователям Reddit](https://www.reddit.com/r/gamedev/comments/jumvi5/dualsense_haptics_leds_and_more_hid_output_report/) за детальное описание выходного USB пакета DualSense.
8383
* DS4Windows[[1]](https://github.com/Jays2Kings/DS4Windows)[[2]](https://github.com/Ryochan7/DS4Windows) за уровень заряда батареи.
84+
* ChatGPT за улучшения прицеливания.
8485

8586
## Обратная связь
8687
`r57zone[собака]gmail.com`

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ In some games, for example, Max Payne or Crysis 2, unfortunately, this does not
7878
* [JoyShockLibrary](https://github.com/JibbSmart/JoyShockLibrary) for a cool gamepad library that makes it easy to get controller rotation. Also some code from this library is used.
7979
* For [Reddit users](https://www.reddit.com/r/gamedev/comments/jumvi5/dualsense_haptics_leds_and_more_hid_output_report/) for a detailed description of the DualSense USB output packet.
8080
* DS4Windows[[1]](https://github.com/Jays2Kings/DS4Windows)[[2]](https://github.com/Ryochan7/DS4Windows) for the battery level.
81+
* DS4Windows[[1]](https://github.com/Jays2Kings/DS4Windows)[[2]](https://github.com/Ryochan7/DS4Windows) for the battery level.
82+
* ChatGPT for improved aiming.
8183

8284
## Feedback
8385
`r57zone[at]gmail.com`

Source/DSAdvance/DSAdvance.cpp

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "DSAdvance.h"
1414
#include <thread>
1515
#include <atlstr.h>
16+
#include <chrono>
1617

1718
#pragma comment(lib, "winmm.lib")
1819

@@ -468,7 +469,7 @@ void MainTextUpdate() {
468469

469470
int main(int argc, char **argv)
470471
{
471-
SetConsoleTitle("DSAdvance 0.8.7");
472+
SetConsoleTitle("DSAdvance 0.9");
472473
// Config parameters
473474
CIniReader IniFile("Config.ini");
474475

@@ -505,18 +506,17 @@ int main(int argc, char **argv)
505506
bool MotionWheelPitch = IniFile.ReadBoolean("Motion", "WheelPitch", false);
506507
bool MotionWheelRoll = IniFile.ReadBoolean("Motion", "WheelRoll", true);
507508
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;
512513
float CustomMulSens = 1;
513514

514515
int ScreenShotKey = VK_GAMEBAR_SCREENSHOT;
515516
int MicCustomKey = KeyNameToKeyCode(IniFile.ReadString("Gamepad", "MicCustomKey", "NONE"));
516517
if (MicCustomKey == 0) AppStatus.ScreenshotMode = ScreenShotXboxGameBarMode; // If not set, then hide this mode
517518
else ScreenShotKey = MicCustomKey;
518519

519-
520520
int ExternalPedalsCOMPort = IniFile.ReadInteger("ExternalPedals", "COMPort", 0);
521521
if (ExternalPedalsCOMPort != 0) {
522522
char sPortName[32];
@@ -605,6 +605,11 @@ int main(int argc, char **argv)
605605
XUSB_REPORT report;
606606

607607
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;
608613

609614
while (! ( GetAsyncKeyState(VK_LMENU) & 0x8000 && GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) )
610615
{
@@ -902,17 +907,39 @@ int main(int argc, char **argv)
902907
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);
903908
if (MotionWheelPitch) report.sThumbLY = ToLeftStick(OffsetYPR(RadToDeg(MotionAngles.Pitch), RadToDeg(AnglesOffset.Pitch)) * WheelInvertPitch, MotionWheelAngle);
904909
} 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+
907935
if (GamepadActionMode == MotionAimingMode || (GamepadActionMode == MotionAimingModeOnlyPressed && InputState.lTrigger > 0) )
908936
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);
910938
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);
913941
}
914942

915-
AnglesOffset = MotionAngles; // Not the best way but it works
916943
} else if (GamepadActionMode == TouchpadSticksMode) { // [-_-] Touchpad sticks
917944

918945
if (TouchState.t0Down) {

0 commit comments

Comments
 (0)