mirror of
https://github.com/ayufan/steam-deck-tools.git
synced 2026-02-11 01:54:24 +01:00
circular deadzone
This commit is contained in:
parent
160c4762f0
commit
4e896f32b0
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue