From a41ced099c9a5258641ff0891a19ecf182a1c447 Mon Sep 17 00:00:00 2001 From: Marcus Minhorst Date: Mon, 7 Jul 2025 21:55:51 -0400 Subject: [PATCH] Implemented rawps2 stubs --- src/common/platform/win32/i_rawps2.cpp | 68 +++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/src/common/platform/win32/i_rawps2.cpp b/src/common/platform/win32/i_rawps2.cpp index a76e02f45..09bb314b0 100644 --- a/src/common/platform/win32/i_rawps2.cpp +++ b/src/common/platform/win32/i_rawps2.cpp @@ -137,6 +137,9 @@ protected: float Value; float DeadZone; float Multiplier; + float DigitalThreshold; + EJoyCurve ResponseCurvePreset; + CubicBezier ResponseCurve; EJoyAxis GameAxis; uint8_t ButtonValue; }; @@ -144,6 +147,8 @@ protected: { EJoyAxis GameAxis; float Multiplier; + float DigitalThreshold; + EJoyCurve ResponseCurvePreset; }; enum { @@ -364,11 +369,11 @@ static const char *AxisNames[] = FRawPS2Controller::DefaultAxisConfig FRawPS2Controller::DefaultAxes[NUM_AXES] = { - // Game axis, multiplier - { JOYAXIS_Side, JOYSENSITIVITY_DEFAULT }, // ThumbLX - { JOYAXIS_Forward, JOYSENSITIVITY_DEFAULT }, // ThumbLY - { JOYAXIS_Yaw, JOYSENSITIVITY_DEFAULT }, // ThumbRX - { JOYAXIS_Pitch, JOYSENSITIVITY_DEFAULT }, // ThumbRY + // Game axis, multiplier, digital threshold, response curve A, response curve B + { JOYAXIS_Side, JOYSENSITIVITY_DEFAULT, JOYTHRESH_STICK_X, JOYCURVE_DEFAULT }, // ThumbLX + { JOYAXIS_Forward, JOYSENSITIVITY_DEFAULT, JOYTHRESH_STICK_Y, JOYCURVE_DEFAULT }, // ThumbLY + { JOYAXIS_Yaw, JOYSENSITIVITY_DEFAULT, JOYTHRESH_STICK_X, JOYCURVE_DEFAULT }, // ThumbRX + { JOYAXIS_Pitch, JOYSENSITIVITY_DEFAULT, JOYTHRESH_STICK_Y, JOYCURVE_DEFAULT }, // ThumbRY }; // CODE -------------------------------------------------------------------- @@ -559,11 +564,16 @@ void FRawPS2Controller::ProcessThumbstick(int value1, AxisInfo *axis1, int value axisval2 = value2 * (2.0 / 255) - 1.0; axisval1 = Joy_RemoveDeadZone(axisval1, axis1->DeadZone, NULL); axisval2 = Joy_RemoveDeadZone(axisval2, axis2->DeadZone, NULL); + axisval1 = Joy_ApplyResponseCurveBezier(axis1->ResponseCurve, axisval1); + axisval2 = Joy_ApplyResponseCurveBezier(axis2->ResponseCurve, axisval2); axis1->Value = float(axisval1); axis2->Value = float(axisval2); // We store all four buttons in the first axis and ignore the second. - buttonstate = Joy_XYAxesToButtons(axisval1, axisval2); + buttonstate = Joy_XYAxesToButtons( + (abs(axisval1) < axis1->DigitalThreshold) ? 0 : axisval1, + (abs(axisval2) < axis2->DigitalThreshold) ? 0 : axisval2 + ); Joy_GenerateButtonEvents(axis1->ButtonValue, buttonstate, 4, base); axis1->ButtonValue = buttonstate; } @@ -801,7 +811,11 @@ float FRawPS2Controller::GetAxisScale(int axis) float FRawPS2Controller::GetAxisDigitalThreshold(int axis) { - return 0; + if (unsigned(axis) < NUM_AXES) + { + return Axes[axis].DigitalThreshold; + } + return JOYTHRESH_DEFAULT; } //========================================================================== @@ -812,6 +826,10 @@ float FRawPS2Controller::GetAxisDigitalThreshold(int axis) EJoyCurve FRawPS2Controller::GetAxisResponseCurve(int axis) { + if (unsigned(axis) < NUM_AXES) + { + return Axes[axis].ResponseCurvePreset; + } return JOYCURVE_DEFAULT; } @@ -823,6 +841,10 @@ EJoyCurve FRawPS2Controller::GetAxisResponseCurve(int axis) float FRawPS2Controller::GetAxisResponseCurvePoint(int axis, int point) { + if (unsigned(axis) < NUM_AXES && unsigned(point) < 4) + { + return Axes[axis].ResponseCurve.pts[point]; + } return 0; } @@ -876,6 +898,10 @@ void FRawPS2Controller::SetAxisScale(int axis, float scale) void FRawPS2Controller::SetAxisDigitalThreshold(int axis, float threshold) { + if (unsigned(axis) < NUM_AXES) + { + Axes[axis].DigitalThreshold = threshold; + } } //========================================================================== @@ -886,6 +912,13 @@ void FRawPS2Controller::SetAxisDigitalThreshold(int axis, float threshold) void FRawPS2Controller::SetAxisResponseCurve(int axis, EJoyCurve preset) { + if (unsigned(axis) < NUM_AXES) + { + if (preset >= NUM_JOYCURVE || preset < JOYCURVE_CUSTOM) return; + Axes[axis].ResponseCurvePreset = preset; + if (preset == JOYCURVE_CUSTOM) return; + Axes[axis].ResponseCurve = JOYCURVE[preset]; + } } //========================================================================== @@ -896,6 +929,11 @@ void FRawPS2Controller::SetAxisResponseCurve(int axis, EJoyCurve preset) void FRawPS2Controller::SetAxisResponseCurvePoint(int axis, int point, float value) { + if (unsigned(axis) < NUM_AXES && unsigned(point) < 4) + { + Axes[axis].ResponseCurvePreset = JOYCURVE_CUSTOM; + Axes[axis].ResponseCurve.pts[point] = value; + } } //=========================================================================== @@ -906,6 +944,10 @@ void FRawPS2Controller::SetAxisResponseCurvePoint(int axis, int point, float val bool FRawPS2Controller::IsAxisDeadZoneDefault(int axis) { + if (unsigned(axis) < NUM_AXES) + { + return Axes[axis].DeadZone == JOYDEADZONE_DEFAULT; + } return true; } @@ -917,6 +959,10 @@ bool FRawPS2Controller::IsAxisDeadZoneDefault(int axis) bool FRawPS2Controller::IsAxisScaleDefault(int axis) { + if (unsigned(axis) < NUM_AXES) + { + return Axes[axis].Multiplier == DefaultAxes[axis].Multiplier; + } return true; } @@ -928,6 +974,10 @@ bool FRawPS2Controller::IsAxisScaleDefault(int axis) bool FRawPS2Controller::IsAxisDigitalThresholdDefault(int axis) { + if (unsigned(axis) < NUM_AXES) + { + return Axes[axis].DigitalThreshold == DefaultAxes[axis].DigitalThreshold; + } return true; } @@ -939,6 +989,10 @@ bool FRawPS2Controller::IsAxisDigitalThresholdDefault(int axis) bool FRawPS2Controller::IsAxisResponseCurveDefault(int axis) { + if (unsigned(axis) < NUM_AXES) + { + return Axes[axis].ResponseCurvePreset == DefaultAxes[axis].ResponseCurvePreset; + } return true; }