From c614f5f534cdb7a083387505aff90e8be94fed73 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Thu, 27 Dec 2018 19:16:37 -0600 Subject: [PATCH] ControllerEmu: Allow analog stick input radius greater than one. Useful for rounded-square inputs of xbox controllers. --- .../Core/DolphinQt/Config/Mapping/MappingIndicator.cpp | 4 ++-- .../ControllerEmu/ControlGroup/AnalogStick.cpp | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp index e6e8c72875..a09b41e5db 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp @@ -138,8 +138,8 @@ void MappingIndicator::DrawCursor(bool tilt) template QPolygonF GetPolygonFromRadiusGetter(F&& radius_getter, double scale) { - // 24 is a multiple of 8 (octagon) and enough points to be visibly pleasing: - constexpr int shape_point_count = 24; + // A multiple of 8 (octagon) and enough points to be visibly pleasing: + constexpr int shape_point_count = 32; QPolygonF shape{shape_point_count}; int p = 0; diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp index 3f766d5e45..9db29909fd 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp @@ -32,8 +32,10 @@ AnalogStick::AnalogStick(const char* const name_, const char* const ui_name_, controls.emplace_back(std::make_unique(Translate, _trans("Modifier"))); // Set default input radius to that of the gate radius (no resizing) + // Allow radius greater than 1.0 for definitions of rounded squares + // This is ideal for Xbox controllers (and probably others) numeric_settings.emplace_back( - std::make_unique(_trans("Input Radius"), GetGateRadiusAtAngle(0.0), 0, 100)); + std::make_unique(_trans("Input Radius"), GetGateRadiusAtAngle(0.0), 0, 140)); // Set default input shape to an octagon (no reshaping) numeric_settings.emplace_back( std::make_unique(_trans("Input Shape"), 0.0, 0, 50)); @@ -97,7 +99,10 @@ ControlState AnalogStick::GetDeadzoneRadiusAtAngle(double ang) const ControlState AnalogStick::GetInputRadiusAtAngle(double ang) const { - return CalculateInputShapeRadiusAtAngle(ang) * numeric_settings[SETTING_INPUT_RADIUS]->GetValue(); + const ControlState radius = + CalculateInputShapeRadiusAtAngle(ang) * numeric_settings[SETTING_INPUT_RADIUS]->GetValue(); + // Clamp within the -1 to +1 square as input radius may be greater than 1.0: + return std::min(radius, SquareStickGate(1).GetRadiusAtAngle(ang)); } ControlState AnalogStick::CalculateInputShapeRadiusAtAngle(double ang) const