diff --git a/SteamController/Devices/SteamAction.cs b/SteamController/Devices/SteamAction.cs index e376fe6..7fc57e3 100644 --- a/SteamController/Devices/SteamAction.cs +++ b/SteamController/Devices/SteamAction.cs @@ -257,7 +257,7 @@ namespace SteamController.Devices Absolute, AbsoluteTime, Delta, - DeltaTime + DeltaTime, } public class SteamAxis : SteamAction @@ -274,6 +274,7 @@ namespace SteamController.Devices public short Deadzone { get; internal set; } public short MinChange { get; internal set; } public DeltaValueMode DeltaValueMode { get; internal set; } = DeltaValueMode.Absolute; + public SteamAxis? PartnerAxis { get; internal set; } public short Value { @@ -292,7 +293,10 @@ namespace SteamController.Devices public static implicit operator bool(SteamAxis button) => button.Active; public static implicit operator short(SteamAxis button) { - return Math.Abs(button.Value) > button.Deadzone ? button.Value : (short)0; + int pValue = button.PartnerAxis?.Value ?? button.Value; + // get circular deadzone reference + int dzValue = pValue == button.Value ? button.Value : (int)Math.Sqrt(pValue * pValue + button.Value * button.Value); + return dzValue > button.Deadzone ? button.Value : (short)0; } public bool Active @@ -305,33 +309,41 @@ namespace SteamController.Devices get { return GetDeltaValue(-1, 1, DeltaValueMode); } } + + public double GetDeltaValue(double min, double max, DeltaValueMode mode) { + int value = 0; + int pValue = PartnerAxis?.Value ?? Value; + + // get circular deadzone reference + int dzValue = (int)Math.Sqrt(pValue * pValue + Value * Value); switch (mode) { case DeltaValueMode.Absolute: - if (Math.Abs(Value) < Deadzone) + if (Math.Abs(dzValue) < Deadzone) return 0.0; value = Value; break; case DeltaValueMode.AbsoluteTime: - if (Math.Abs(Value) < Deadzone) + + if (Math.Abs(dzValue) < Deadzone) return 0.0; value = (int)(Value * (Controller?.DeltaTime ?? 0.0)); break; case DeltaValueMode.Delta: value = Value - LastValue; - if (Math.Abs(Value) < MinChange) + if (Math.Abs(value) < MinChange) return 0.0; break; case DeltaValueMode.DeltaTime: value = Value - LastValue; - if (Math.Abs(Value) < MinChange) + if (Math.Abs(value) < MinChange) return 0.0; value = (int)(value * (Controller?.DeltaTime ?? 0.0)); break; @@ -341,7 +353,9 @@ namespace SteamController.Devices return 0.0; double factor = (double)(value - short.MinValue) / (short.MaxValue - short.MinValue); + return factor * (max - min) + min; + } internal override void Reset() diff --git a/SteamController/Devices/SteamButtons.cs b/SteamController/Devices/SteamButtons.cs index 1a5704f..392201f 100644 --- a/SteamController/Devices/SteamButtons.cs +++ b/SteamController/Devices/SteamButtons.cs @@ -71,6 +71,12 @@ namespace SteamController.Devices LeftThumbX.VirtualRight = BtnVirtualLeftThumbRight; LeftThumbY.VirtualLeft = BtnVirtualLeftThumbDown; LeftThumbY.VirtualRight = BtnVirtualLeftThumbUp; + + // set partner axes for circle deadzone + LeftThumbX.PartnerAxis = LeftThumbY; + LeftThumbY.PartnerAxis = LeftThumbX; + RightThumbX.PartnerAxis = RightThumbY; + RightThumbY.PartnerAxis = RightThumbX; } } }