circular deadzone

This commit is contained in:
DavidRGriswold 2023-09-02 17:57:46 -03:00
parent 160c4762f0
commit 4e896f32b0
2 changed files with 26 additions and 6 deletions

View file

@ -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()

View file

@ -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;
}
}
}