From 8e75b24045907680203a0359eedb5602cdcdd491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Freire?= Date: Wed, 19 Feb 2025 10:18:07 +0100 Subject: [PATCH 1/4] Change XboxGamepadMacOS layout DPAD default state to 0 --- .../InputSystem/Plugins/XInput/XboxGamepadMacOS.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs index c57bfe3e8b..07226c3035 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs @@ -149,7 +149,7 @@ public enum Button [InputControl(name = "rightTrigger", format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=0.01560998")] [FieldOffset(11)] public ushort rightTrigger; - [InputControl(name = "dpad", format = "BIT", layout = "Dpad", sizeInBits = 4, defaultState = 8)] + [InputControl(name = "dpad", format = "BIT", layout = "Dpad", sizeInBits = 4)] [InputControl(name = "dpad/up", format = "BIT", layout = "DiscreteButton", parameters = "minValue=8,maxValue=2,nullValue=0,wrapAtValue=9", bit = 0, sizeInBits = 4)] [InputControl(name = "dpad/right", format = "BIT", layout = "DiscreteButton", parameters = "minValue=2,maxValue=4", bit = 0, sizeInBits = 4)] [InputControl(name = "dpad/down", format = "BIT", layout = "DiscreteButton", parameters = "minValue=4,maxValue=6", bit = 0, sizeInBits = 4)] @@ -241,7 +241,7 @@ public enum Button [InputControl(name = "rightTrigger", format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=0.01560998")] [FieldOffset(11)] public ushort rightTrigger; - [InputControl(name = "dpad", format = "BIT", layout = "Dpad", sizeInBits = 4, defaultState = 8)] + [InputControl(name = "dpad", format = "BIT", layout = "Dpad", sizeInBits = 4)] [InputControl(name = "dpad/up", format = "BIT", layout = "DiscreteButton", parameters = "minValue=8,maxValue=2,nullValue=0,wrapAtValue=9", bit = 0, sizeInBits = 4)] [InputControl(name = "dpad/right", format = "BIT", layout = "DiscreteButton", parameters = "minValue=2,maxValue=4", bit = 0, sizeInBits = 4)] [InputControl(name = "dpad/down", format = "BIT", layout = "DiscreteButton", parameters = "minValue=4,maxValue=6", bit = 0, sizeInBits = 4)] From 8545eede1390e6e47ebbbee29b755613cfae1c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Freire?= Date: Fri, 28 Mar 2025 16:06:13 +0100 Subject: [PATCH 2/4] Update CHANGELOG --- Packages/com.unity.inputsystem/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index ca61e1ec1c..0a7ecaf744 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -14,6 +14,7 @@ however, it has to be formatted properly to pass verification tests. - Fixed an analytics event being invoked twice when the Save button in the Actions view was pressed. [ISXB-1378](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1378) - Fixed an issue causing a number of errors to be displayed when using `InputTestFixture` in playmode tests with domain reloading disabled on playmode entry. [ISXB-1446](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1446) - Fixed issue where user was not prompted to save changes when loading a second input actions asset into an already opened editor. [ISXB-1343](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1343) +- Fixed an issue on macOS which didn't detect up-left DPAD presses for Xbox controllers. [ISXB-810](https://issuetracker.unity3d.com/issues/macos-d-pad-upper-left-corner-is-not-logged-with-the-xbox-controller) ## [1.14.0] - 2025-03-20 From eb7f2ce3184b8aa15c818ebb13b7565b0ae64790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Freire?= Date: Fri, 28 Mar 2025 15:05:43 +0100 Subject: [PATCH 3/4] Set left and right sticks default state to avoid test failures The default state for zero value of sticks was not being set through default state. We only set a defaultState if there's at least a control with defaultState set. Otherwise, we seem to be bypassing it. For some reason, it seems we were deriving the default state of the sticks through the parameters control have but I cannot say for sure without spending much more time on this. --- .../Tests/InputSystem/Plugins/XInputTests.cs | 18 +++++++--- .../Plugins/XInput/XboxGamepadMacOS.cs | 34 ++++++++++--------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Assets/Tests/InputSystem/Plugins/XInputTests.cs b/Assets/Tests/InputSystem/Plugins/XInputTests.cs index 051a48791f..09cb430f74 100644 --- a/Assets/Tests/InputSystem/Plugins/XInputTests.cs +++ b/Assets/Tests/InputSystem/Plugins/XInputTests.cs @@ -5,6 +5,7 @@ using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.Utilities; using System.Runtime.InteropServices; +using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.HID; using UnityEngine.InputSystem.Processors; @@ -208,7 +209,7 @@ public void Devices_SupportWirelessXboxOneAndSeriesControllerOnOSX(int vendorId, } // Disable tests in standalone builds from 2022.1+ see UUM-19622 -#if !UNITY_STANDALONE_OSX || !TEMP_DISABLE_STANDALONE_OSX_XINPUT_TEST +// #if !UNITY_STANDALONE_OSX || !TEMP_DISABLE_STANDALONE_OSX_XINPUT_TEST [Test] [Category("Devices")] public void Devices_SupportXboxWirelessControllerOnOSX() @@ -242,6 +243,8 @@ public void Devices_SupportXboxWirelessControllerOnOSX() InputSystem.Update(); + Assert.That(gamepad.leftStick.x.IsActuated()); + Assert.That(gamepad.leftStick.x.ReadValue(), Is.EqualTo(0.9999).Within(0.001)); Assert.That(gamepad.leftStick.y.ReadValue(), Is.EqualTo(0.9999).Within(0.001)); Assert.That(gamepad.leftStick.up.ReadValue(), Is.EqualTo(0.9999).Within(0.001)); @@ -268,10 +271,17 @@ public void Devices_SupportXboxWirelessControllerOnOSX() AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithButton(XInputControllerWirelessOSXState.Button.Y), gamepad.yButton); AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithButton(XInputControllerWirelessOSXState.Button.Y), gamepad.buttonNorth); - AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(5), gamepad.dpad.down); AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(1), gamepad.dpad.up); - AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(7), gamepad.dpad.left); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(2), gamepad.dpad.up, gamepad.dpad.right); AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(3), gamepad.dpad.right); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(4), gamepad.dpad.down, gamepad.dpad.right); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(5), gamepad.dpad.down); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(6), gamepad.dpad.down, gamepad.dpad.left); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(7), gamepad.dpad.left); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(8), gamepad.dpad.up, gamepad.dpad.left); + // No Dpad button pressed when the value is 0 + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithDpad(0)); + AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithButton(XInputControllerWirelessOSXState.Button.LeftThumbstickPress), gamepad.leftStickButton); AssertButtonPress(gamepad, XInputControllerWirelessOSXState.defaultState.WithButton(XInputControllerWirelessOSXState.Button.RightThumbstickPress), gamepad.rightStickButton); @@ -306,7 +316,7 @@ public void Devices_SupportXboxWirelessControllerOnOSX() #endif // TEMP_DISABLE_STANDALONE_OSX_XINPUT_TEST -#endif +// #endif #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN || UNITY_WSA diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs index 07226c3035..5cdec5258f 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/XInput/XboxGamepadMacOS.cs @@ -106,6 +106,7 @@ public XInputControllerOSXState WithButton(Button button) [StructLayout(LayoutKind.Explicit)] internal struct XInputControllerWirelessOSXState : IInputStateTypeInfo { + const ushort k_StickZeroValue = 32767; public static FourCC kFormat => new FourCC('H', 'I', 'D'); public enum Button @@ -125,20 +126,20 @@ public enum Button private byte padding; [InputControl(name = "leftStick", layout = "Stick", format = "VC2S")] - [InputControl(name = "leftStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "leftStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "leftStick/left", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "leftStick/right", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1")] - [InputControl(name = "leftStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "leftStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "leftStick/up", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "leftStick/down", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1,invert=false")] [FieldOffset(1)] public ushort leftStickX; [FieldOffset(3)] public ushort leftStickY; [InputControl(name = "rightStick", layout = "Stick", format = "VC2S")] - [InputControl(name = "rightStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "rightStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "rightStick/left", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "rightStick/right", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1")] - [InputControl(name = "rightStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "rightStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "rightStick/up", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "rightStick/down", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1,invert=false")] [FieldOffset(5)] public ushort rightStickX; @@ -188,16 +189,17 @@ public XInputControllerWirelessOSXState WithDpad(byte value) public static XInputControllerWirelessOSXState defaultState => new XInputControllerWirelessOSXState { - rightStickX = 32767, - rightStickY = 32767, - leftStickX = 32767, - leftStickY = 32767 + rightStickX = k_StickZeroValue, + rightStickY = k_StickZeroValue, + leftStickX = k_StickZeroValue, + leftStickY = k_StickZeroValue }; } [StructLayout(LayoutKind.Explicit)] internal struct XInputControllerWirelessOSXStateV2 : IInputStateTypeInfo { + const ushort k_StickZeroValue = 32767; public static FourCC kFormat => new FourCC('H', 'I', 'D'); public enum Button @@ -217,20 +219,20 @@ public enum Button private byte padding; [InputControl(name = "leftStick", layout = "Stick", format = "VC2S")] - [InputControl(name = "leftStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "leftStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "leftStick/left", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "leftStick/right", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1")] - [InputControl(name = "leftStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "leftStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "leftStick/up", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "leftStick/down", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1,invert=false")] [FieldOffset(1)] public ushort leftStickX; [FieldOffset(3)] public ushort leftStickY; [InputControl(name = "rightStick", layout = "Stick", format = "VC2S")] - [InputControl(name = "rightStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "rightStick/x", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "rightStick/left", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "rightStick/right", offset = 0, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1")] - [InputControl(name = "rightStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5")] + [InputControl(name = "rightStick/y", offset = 2, format = "USHT", parameters = "invert,normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5", defaultState = k_StickZeroValue)] [InputControl(name = "rightStick/up", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0,clampMax=0.5,invert")] [InputControl(name = "rightStick/down", offset = 2, format = "USHT", parameters = "normalize,normalizeMin=0,normalizeMax=1,normalizeZero=0.5,clamp=1,clampMin=0.5,clampMax=1,invert=false")] [FieldOffset(5)] public ushort rightStickX; @@ -280,10 +282,10 @@ public XInputControllerWirelessOSXStateV2 WithDpad(byte value) public static XInputControllerWirelessOSXStateV2 defaultState => new XInputControllerWirelessOSXStateV2 { - rightStickX = 32767, - rightStickY = 32767, - leftStickX = 32767, - leftStickY = 32767 + rightStickX = k_StickZeroValue, + rightStickY = k_StickZeroValue, + leftStickX = k_StickZeroValue, + leftStickY = k_StickZeroValue }; } } From f2906850318aa7662ab9c4143fe38ce532b140eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Freire?= Date: Fri, 28 Mar 2025 15:12:05 +0100 Subject: [PATCH 4/4] Make test run in all Unity versions This test was previously enabled for 2021 LTS only due to a bug. But the bug was already fixed so I decided to make sure this runs on all Unity versions. --- Assets/Tests/InputSystem/Plugins/XInputTests.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Assets/Tests/InputSystem/Plugins/XInputTests.cs b/Assets/Tests/InputSystem/Plugins/XInputTests.cs index 09cb430f74..1e122c0466 100644 --- a/Assets/Tests/InputSystem/Plugins/XInputTests.cs +++ b/Assets/Tests/InputSystem/Plugins/XInputTests.cs @@ -208,8 +208,6 @@ public void Devices_SupportWirelessXboxOneAndSeriesControllerOnOSX(int vendorId, Assert.That(gamepad.startButton.isPressed); } -// Disable tests in standalone builds from 2022.1+ see UUM-19622 -// #if !UNITY_STANDALONE_OSX || !TEMP_DISABLE_STANDALONE_OSX_XINPUT_TEST [Test] [Category("Devices")] public void Devices_SupportXboxWirelessControllerOnOSX() @@ -316,9 +314,6 @@ public void Devices_SupportXboxWirelessControllerOnOSX() #endif // TEMP_DISABLE_STANDALONE_OSX_XINPUT_TEST -// #endif - - #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN || UNITY_WSA [Test] [Category("Devices")]