From 7cd64de6aeccf5467ded1b62217047cbf5dae597 Mon Sep 17 00:00:00 2001 From: minenice55 Date: Thu, 6 Jul 2023 21:35:51 -0400 Subject: [PATCH] JSL polling via event --- Assets/Plugins/JSL/JoyShockLibrary.cs | 2 +- .../SettingsMenu/ControllerSetup.prefab | 199 ++++++++++++--- .../ControllerTypes/InputJoyshock.cs | 234 ++++++++++++------ .../ControllerTypes/InputKeyboard.cs | 37 ++- Assets/Scripts/InputSystem/InputController.cs | 17 +- Assets/Scripts/InputSystem/PlayerInput.cs | 18 ++ .../SettingsDialog/Tabs/ControllerSettings.cs | 2 +- 7 files changed, 392 insertions(+), 117 deletions(-) diff --git a/Assets/Plugins/JSL/JoyShockLibrary.cs b/Assets/Plugins/JSL/JoyShockLibrary.cs index 4f87bacb8..e703134c1 100644 --- a/Assets/Plugins/JSL/JoyShockLibrary.cs +++ b/Assets/Plugins/JSL/JoyShockLibrary.cs @@ -137,7 +137,7 @@ public static class JSL [DllImport("JoyShockLibrary")] public static extern void JslDisconnectAndDisposeAll(); [DllImport("JoyShockLibrary")] - public static extern void JslStillConnected(int deviceId); + public static extern bool JslStillConnected(int deviceId); [DllImport("JoyShockLibrary", CallingConvention = CallingConvention.Cdecl)] public static extern JOY_SHOCK_STATE JslGetSimpleState(int deviceId); diff --git a/Assets/Resources/Prefabs/Editor/SettingsMenu/ControllerSetup.prefab b/Assets/Resources/Prefabs/Editor/SettingsMenu/ControllerSetup.prefab index 53efd3a9f..9ca90f727 100644 --- a/Assets/Resources/Prefabs/Editor/SettingsMenu/ControllerSetup.prefab +++ b/Assets/Resources/Prefabs/Editor/SettingsMenu/ControllerSetup.prefab @@ -29,6 +29,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454531700437} m_Father: {fileID: 3918594454557351925} @@ -162,6 +163,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454598345480} m_Father: {fileID: 3918594455428278210} @@ -250,6 +252,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.9998709, y: 0.9998709, z: 0.9998709} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454521024533} - {fileID: 3918594455780710548} @@ -316,6 +319,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1.0000798, y: 1.0000798, z: 1.0000798} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455809915007} m_RootOrder: 3 @@ -450,6 +454,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1.0000798, y: 1.0000798, z: 1.0000798} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454393827276} m_RootOrder: 0 @@ -586,6 +591,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.999721, y: 0.999721, z: 0.999721} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454379110541} m_RootOrder: 0 @@ -665,6 +671,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454988680239} - {fileID: 3918594455644130455} @@ -823,6 +830,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.9998709, y: 0.9998709, z: 0.9998709} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454379110541} - {fileID: 3918594455983756500} @@ -960,6 +968,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454792429615} - {fileID: 3918594455236935870} @@ -1092,6 +1101,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454557351925} - {fileID: 3918594455809915007} @@ -1143,7 +1153,7 @@ MonoBehaviour: m_ChildControlWidth: 0 m_ChildControlHeight: 0 m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 + m_ChildScaleHeight: 1 m_ReverseArrangement: 0 --- !u!1 &3918594454606926957 GameObject: @@ -1171,6 +1181,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455132415350} m_Father: {fileID: 3918594455644130455} @@ -1209,6 +1220,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594456381758635} m_RootOrder: 0 @@ -1284,6 +1296,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455259951552} m_RootOrder: 2 @@ -1418,6 +1431,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454563211272} m_RootOrder: 0 @@ -1553,6 +1567,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594456381758635} m_Father: {fileID: 3918594455428278210} @@ -1678,13 +1693,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 1 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -89.66667} + m_AnchoredPosition: {x: 512, y: -69.66667} m_SizeDelta: {x: 198.33331, y: 115.333336} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594454983356897 @@ -1754,6 +1770,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594456231380559} m_Father: {fileID: 3918594454549251010} @@ -1843,6 +1860,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454606926956} m_RootOrder: 0 @@ -1919,6 +1937,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455777867990} - {fileID: 3918594455724056079} @@ -2052,6 +2071,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454563211272} m_RootOrder: 1 @@ -2126,6 +2146,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455555356347} - {fileID: 3918594455678953489} @@ -2214,6 +2235,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1.0000798, y: 1.0000798, z: 1.0000798} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454393827276} m_RootOrder: 2 @@ -2349,6 +2371,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455428278210} - {fileID: 3918594456072477009} @@ -2455,6 +2478,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454383525696} - {fileID: 3918594454902271391} @@ -2562,13 +2586,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 3 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -74.888885} + m_AnchoredPosition: {x: 512, y: -42.888905} m_SizeDelta: {x: 153.66667, y: 78.666664} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594455474526704 @@ -2637,6 +2662,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455259951552} m_RootOrder: 0 @@ -2712,13 +2738,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 5 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -116} + m_AnchoredPosition: {x: 512, y: -84.000015} m_SizeDelta: {x: 202, y: 140} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594455571216814 @@ -2787,13 +2814,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 2 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -71.33333} + m_AnchoredPosition: {x: 512, y: -39.333347} m_SizeDelta: {x: 154, y: 78.666664} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594455640061323 @@ -2863,6 +2891,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454606926956} m_Father: {fileID: 3918594454549251010} @@ -2988,6 +3017,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455259951552} m_RootOrder: 1 @@ -3063,13 +3093,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 7 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -116} + m_AnchoredPosition: {x: 512, y: -84.000015} m_SizeDelta: {x: 208.33333, y: 144.66667} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594455700716069 @@ -3138,6 +3169,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455165826550} m_RootOrder: 1 @@ -3272,6 +3304,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455165826550} m_RootOrder: 0 @@ -3348,6 +3381,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455818177326} - {fileID: 3918594456368854930} @@ -3480,6 +3514,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.9998709, y: 0.9998709, z: 0.9998709} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455814386336} - {fileID: 3918594454563211272} @@ -3547,6 +3582,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1.0000798, y: 1.0000798, z: 1.0000798} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455809915007} m_RootOrder: 0 @@ -3681,6 +3717,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455780710548} m_RootOrder: 0 @@ -3756,6 +3793,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594456218978263} m_RootOrder: 0 @@ -3890,6 +3928,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594456072477009} m_RootOrder: 0 @@ -4024,6 +4063,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594454557351925} m_RootOrder: 1 @@ -4158,6 +4198,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455960776193} m_Father: {fileID: 3918594455367347237} @@ -4234,13 +4275,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 6 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -98.333336} + m_AnchoredPosition: {x: 512, y: -66.33336} m_SizeDelta: {x: 209.66667, y: 132.66667} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594456177472899 @@ -4309,13 +4351,14 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3918594456218978263} - m_RootOrder: 4 + m_Father: {fileID: 9026175551012134334} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 571, y: -109} + m_AnchoredPosition: {x: 512, y: -77.000015} m_SizeDelta: {x: 142, y: 154} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594456187747141 @@ -4368,6 +4411,7 @@ GameObject: - component: {fileID: 3918594456218978261} - component: {fileID: 3918594456218978262} - component: {fileID: 3918594456218978260} + - component: {fileID: 7064734900293365887} m_Layer: 5 m_Name: ControllerDisplay m_TagString: Untagged @@ -4385,22 +4429,17 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.9998709, y: 0.9998709, z: 0.9998709} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455881004028} - - {fileID: 3918594454983356899} - - {fileID: 3918594455640061333} - - {fileID: 3918594455474526706} - - {fileID: 3918594456187747143} - - {fileID: 3918594455571216808} - - {fileID: 3918594456177472909} - - {fileID: 3918594455700716071} + - {fileID: 9026175551012134334} m_Father: {fileID: 3918594454598345480} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1142, y: 200} + m_AnchoredPosition: {x: 591, y: 0} + m_SizeDelta: {x: 1142, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3918594456218978261 CanvasRenderer: @@ -4455,7 +4494,7 @@ MonoBehaviour: m_Padding: m_Left: 0 m_Right: 0 - m_Top: 0 + m_Top: 8 m_Bottom: 0 m_ChildAlignment: 1 m_Spacing: 0 @@ -4466,6 +4505,20 @@ MonoBehaviour: m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 m_ReverseArrangement: 0 +--- !u!114 &7064734900293365887 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3918594456218978256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 1 --- !u!1 &3918594456231380552 GameObject: m_ObjectHideFlags: 0 @@ -4492,6 +4545,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594455259951552} m_Father: {fileID: 3918594454988680239} @@ -4530,6 +4584,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3918594455780710548} m_RootOrder: 1 @@ -4662,6 +4717,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3918594454634310521} m_Father: {fileID: 3918594454902271391} @@ -4672,3 +4728,82 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &8203640970610497511 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9026175551012134334} + - component: {fileID: 9113777502962941725} + - component: {fileID: 4639420071325041271} + m_Layer: 5 + m_Name: BindingList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9026175551012134334 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8203640970610497511} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3918594454983356899} + - {fileID: 3918594455640061333} + - {fileID: 3918594455474526706} + - {fileID: 3918594456187747143} + - {fileID: 3918594455571216808} + - {fileID: 3918594456177472909} + - {fileID: 3918594455700716071} + m_Father: {fileID: 3918594456218978263} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1024, y: 256} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &9113777502962941725 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8203640970610497511} + m_CullTransparentMesh: 1 +--- !u!114 &4639420071325041271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8203640970610497511} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 12 + m_Bottom: 0 + m_ChildAlignment: 1 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 diff --git a/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs b/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs index 5644bd2a3..e7ce572a5 100644 --- a/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs +++ b/Assets/Scripts/InputSystem/ControllerTypes/InputJoyshock.cs @@ -13,7 +13,11 @@ namespace HeavenStudio.InputSystem.Loaders [LoadOrder(1)] public static InputController[] Initialize() { + InputJoyshock.joyshocks = new(); PlayerInput.PlayerInputCleanUp += DisposeJoyshocks; + PlayerInput.PlayerInputRefresh.Add(Refresh); + + InputJoyshock.JslEventInit(); InputController[] controllers; int jslDevicesFound = 0; @@ -54,6 +58,35 @@ namespace HeavenStudio.InputSystem.Loaders { JslDisconnectAndDisposeAll(); } + + public static InputController[] Refresh() + { + InputJoyshock.joyshocks.Clear(); + InputController[] controllers; + int jslDevicesFound = 0; + int jslDevicesConnected = 0; + int[] jslDeviceHandles; + + jslDevicesFound = JslConnectDevices(); + if (jslDevicesFound > 0) + { + jslDeviceHandles = new int[jslDevicesFound]; + jslDevicesConnected = JslGetConnectedDeviceHandles(jslDeviceHandles, jslDevicesFound); + + controllers = new InputController[jslDevicesConnected]; + foreach (int i in jslDeviceHandles) + { + Debug.Log("Setting up JoyShock: ( Handle " + i + ", type " + JslGetControllerType(i) + " )"); + InputJoyshock joyshock = new InputJoyshock(i); + joyshock.SetPlayer(null); + joyshock.InitializeController(); + controllers[i] = joyshock; + } + return controllers; + } + Debug.Log("No JoyShocks found."); + return null; + } } } @@ -126,6 +159,8 @@ namespace HeavenStudio.InputSystem ButtonMaskPlus, }; + public static Dictionary joyshocks; + float stickDeadzone = 0.5f; int joyshockHandle; @@ -133,9 +168,11 @@ namespace HeavenStudio.InputSystem int splitType; int lightbarColour; string joyshockName; + double totalReportDt; //buttons, sticks, triggers - JOY_SHOCK_STATE joyBtStateCurrent, joyBtStateLast; + JoyshockButtonState[] buttonStates = new JoyshockButtonState[11]; + JOY_SHOCK_STATE joyBtStateCurrent; //gyro and accelerometer IMU_STATE joyImuStateCurrent, joyImuStateLast; //touchpad @@ -143,17 +180,69 @@ namespace HeavenStudio.InputSystem InputJoyshock otherHalf; + public struct JoyshockButtonState + { + public double time; // time passed since state + public bool pressed; // true if button is down + public bool isDelta; // true if the button changed state since last frame + } + + public struct TimestampedState + { + public double timestamp; + public JOY_SHOCK_STATE input; + } + + protected List inputStack; // asynnc input events / polling should feed into this dict + protected List lastInputStack; // when processing input copy the inputStack to this dict + protected bool wantClearInputStack = false; // strobe from main thread to clear the input stack + protected double reportTime = 0; // same timeline as Time.timeSinceStartup + protected double lastReportTime = 0; // same timeline as Time.timeSinceStartup + public InputJoyshock(int handle) { joyshockHandle = handle; } + public static void JslEventInit() + { + JslSetCallback(JslEventCallback); + } + + static void JslEventCallback(int handle, JOY_SHOCK_STATE state, JOY_SHOCK_STATE lastState, + IMU_STATE imuState, IMU_STATE lastImuState, float deltaTime) + { + if (!joyshocks.ContainsKey(handle)) return; + InputJoyshock js = joyshocks[handle]; + if (js == null) return; + if (js.inputStack == null) return; + + if (js.wantClearInputStack) + { + js.inputStack.Clear(); + js.wantClearInputStack = false; + js.totalReportDt = (js.lastReportTime*2) - js.reportTime; + js.lastReportTime = js.reportTime; + } + js.totalReportDt += deltaTime; + js.inputStack.Add(new TimestampedState + { + timestamp = js.totalReportDt, + input = state + }); + } + public override void InitializeController() { + inputStack = new(); + lastInputStack = new(); + + buttonStates = new JoyshockButtonState[11]; joyBtStateCurrent = new JOY_SHOCK_STATE(); - joyBtStateLast = new JOY_SHOCK_STATE(); + joyImuStateCurrent = new IMU_STATE(); joyImuStateLast = new IMU_STATE(); + joyTouchStateCurrent = new TOUCH_STATE(); joyTouchStateLast = new TOUCH_STATE(); @@ -163,23 +252,60 @@ namespace HeavenStudio.InputSystem joyshockName = joyShockNames[type]; splitType = JslGetControllerSplitType(joyshockHandle); + + joyshocks.Add(joyshockHandle, this); } public override void UpdateState() { - //buttons - joyBtStateLast = joyBtStateCurrent; - joyBtStateCurrent = JslGetSimpleState(joyshockHandle); + lastInputStack = new(inputStack); + wantClearInputStack = true; + reportTime = Time.realtimeSinceStartupAsDouble; - //gyro and accelerometer - joyImuStateLast = joyImuStateCurrent; - joyImuStateCurrent = JslGetIMUState(joyshockHandle); + // Debug.Log($"=== updating state for {joyshockName} id {joyshockHandle} ==="); + for (int i = 0; i < buttonStates.Length; i++) + { + buttonStates[i].isDelta = false; + } + foreach(TimestampedState state in lastInputStack) + { + // Debug.Log($"checking state at {state.timestamp} ({reportTime - state.timestamp}s ago), input {state.input.buttons}"); + joyBtStateCurrent = state.input; - //touchpad - joyTouchStateLast = joyTouchStateCurrent; - joyTouchStateCurrent = JslGetTouchState(joyshockHandle); + for (int i = 0; i < buttonStates.Length; i++) + { + JoyshockButtonState st = buttonStates[i]; + int bt = mappings[i]; + if (otherHalf == null) + { + switch (splitType) + { + case SplitLeft: + bt = mappingsSplitLeft[i]; + break; + case SplitRight: + bt = mappingsSplitRight[i]; + break; + default: + break; + } + } - //stick direction state + if (bt != -1) + { + bool pressed = BitwiseUtils.WantCurrent(state.input.buttons, 1 << bt); + if (pressed != st.pressed && !st.isDelta) + { + Debug.Log($"button {i} ({bt}) state changed to {pressed}, was {st.pressed} (time {reportTime - state.timestamp}s ago)"); + buttonStates[i].pressed = pressed; + buttonStates[i].isDelta = true; + buttonStates[i].time = reportTime - state.timestamp; + } + } + } + } + + //stick direction state, only handled on update //split controllers will need to be rotated to compensate //left rotates counterclockwise, right rotates clockwise, all by 90 degrees float xAxis = 0f; @@ -215,6 +341,8 @@ namespace HeavenStudio.InputSystem directionStateCurrent |= ((xAxis >= stickDeadzone) ? (1 << ((int) InputDirection.Right)) : 0); directionStateCurrent |= ((xAxis <= -stickDeadzone) ? (1 << ((int) InputDirection.Left)) : 0); //Debug.Log("stick direction: " + directionStateCurrent + "| x axis: " + xAxis + " y axis: " + yAxis); + + lastInputStack.Clear(); } public override string GetDeviceName() @@ -248,9 +376,26 @@ namespace HeavenStudio.InputSystem return features; } + public override bool GetIsConnected() + { + return JslStillConnected(joyshockHandle); + } + + public override bool GetIsPoorConnection() + { + return false; + } + public override int GetLastButtonDown() { - return BitwiseUtils.FirstSetBit(joyBtStateCurrent.buttons & joyBtStateLast.buttons); + for (int i = 0; i < buttonStates.Length; i++) + { + if (buttonStates[i].pressed && buttonStates[i].isDelta) + { + return i; + } + } + return -1; } public override KeyCode GetLastKeyDown() @@ -260,71 +405,17 @@ namespace HeavenStudio.InputSystem public override bool GetButton(int button) { - int bt = 0; - if (otherHalf == null) - { - if (splitType == SplitLeft) - { - bt = mappingsSplitLeft[button]; - } - else if (splitType == SplitRight) - { - bt = mappingsSplitRight[button]; - } - else - { - bt = mappings[button]; - } - return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, 1 << bt); - } - bt = mappings[button]; - return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, 1 << bt) || BitwiseUtils.WantCurrent(otherHalf.joyBtStateCurrent.buttons, 1 << bt); + return buttonStates[button].pressed; } public override bool GetButtonDown(int button) { - int bt = 0; - if (otherHalf == null) - { - if (splitType == SplitLeft) - { - bt = mappingsSplitLeft[button]; - } - else if (splitType == SplitRight) - { - bt = mappingsSplitRight[button]; - } - else - { - bt = mappings[button]; - } - return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << bt); - } - bt = mappings[button]; - return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << bt) || BitwiseUtils.WantCurrentAndNotLast(otherHalf.joyBtStateCurrent.buttons, otherHalf.joyBtStateLast.buttons, 1 << bt); + return buttonStates[button].pressed && buttonStates[button].isDelta; } public override bool GetButtonUp(int button) { - int bt = 0; - if (otherHalf == null) - { - if (splitType == SplitLeft) - { - bt = mappingsSplitLeft[button]; - } - else if (splitType == SplitRight) - { - bt = mappingsSplitRight[button]; - } - else - { - bt = mappings[button]; - } - return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << bt); - } - bt = mappings[button]; - return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << bt) || BitwiseUtils.WantNotCurrentAndLast(otherHalf.joyBtStateCurrent.buttons, otherHalf.joyBtStateLast.buttons, 1 << bt); + return (!buttonStates[button].pressed) && buttonStates[button].isDelta; } public override float GetAxis(InputAxis axis) @@ -354,7 +445,6 @@ namespace HeavenStudio.InputSystem public override bool GetHatDirection(InputDirection direction) { - //todo: check analogue stick hat direction too int bt; switch (direction) { @@ -378,7 +468,6 @@ namespace HeavenStudio.InputSystem public override bool GetHatDirectionDown(InputDirection direction) { - //todo: check analogue stick hat direction too int bt; switch (direction) { @@ -402,7 +491,6 @@ namespace HeavenStudio.InputSystem public override bool GetHatDirectionUp(InputDirection direction) { - //todo: check analogue stick hat direction too int bt; switch (direction) { diff --git a/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs b/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs index 375d7b7bd..94812ad7f 100644 --- a/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs +++ b/Assets/Scripts/InputSystem/ControllerTypes/InputKeyboard.cs @@ -1,3 +1,5 @@ +using System; +using System.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -10,6 +12,16 @@ namespace HeavenStudio.InputSystem.Loaders { [LoadOrder(0)] public static InputController[] Initialize() + { + PlayerInput.PlayerInputRefresh.Add(Refresh); + + InputKeyboard keyboard = new InputKeyboard(); + keyboard.SetPlayer(1); + keyboard.InitializeController(); + return new InputController[] { keyboard }; + } + + public static InputController[] Refresh() { InputKeyboard keyboard = new InputKeyboard(); keyboard.SetPlayer(1); @@ -23,7 +35,10 @@ namespace HeavenStudio.InputSystem { public class InputKeyboard : InputController { - static KeyCode[] keyCodes = (KeyCode[]) System.Enum.GetValues(typeof(UnityEngine.KeyCode)); + private static readonly KeyCode[] keyCodes = Enum.GetValues(typeof(KeyCode)) + .Cast() + .Where(k => ((int)k < (int)KeyCode.Mouse0)) + .ToArray(); //FUTURE: remappable controls //KeyCode[] mappings = new KeyCode[Enum.GetNames(typeof(ButtonsPad)).Length]; @@ -65,6 +80,16 @@ namespace HeavenStudio.InputSystem return InputFeatures.Readable_StringInput | InputFeatures.Style_Pad | InputFeatures.Style_Baton; } + public override bool GetIsConnected() + { + return true; + } + + public override bool GetIsPoorConnection() + { + return false; + } + public override int GetLastButtonDown() { return 0; @@ -72,9 +97,13 @@ namespace HeavenStudio.InputSystem public override KeyCode GetLastKeyDown() { - for(KeyCode i = keyCodes[1]; i <= KeyCode.Menu; i++) { - if (Input.GetKeyDown(i)) - return i; + if (Input.anyKeyDown) + { + for (KeyCode i = keyCodes[1]; i <= KeyCode.Menu; i++) + { + if (Input.GetKeyDown(i)) + return i; + } } return KeyCode.None; } diff --git a/Assets/Scripts/InputSystem/InputController.cs b/Assets/Scripts/InputSystem/InputController.cs index a7fc62c0c..d986773c2 100644 --- a/Assets/Scripts/InputSystem/InputController.cs +++ b/Assets/Scripts/InputSystem/InputController.cs @@ -120,10 +120,10 @@ namespace HeavenStudio.InputSystem //FUTURE: buttons used in Heaven Studio gameplay ("Form Baton" / WiiMote Style) public enum ButtonsBaton : int { - BatonS = 0, //-- all these... - BatonE = 1, // | - BatonW = 2, // | - BatonN = 3, //-- + BatonS = 0, //-- all these... + BatonE = 1, // | + BatonW = 2, // | + BatonN = 3, //-- BatonFace = 4, // < ...map to this, but are directional BatonTrigger = 5, // should never be used alone Baton1 = 6, @@ -139,11 +139,14 @@ namespace HeavenStudio.InputSystem TouchTap = 2, TouchFlick = 3, TouchButtonL = 4, - TouchButtonR = 4, + TouchButtonR = 5, } // FUTURE: Move Style needs to be implemented per-game (maybe implement checks for common actions?) - + + protected int currentInputFlags = 0; + protected int lastInputFlags = 0; + protected int? playerNum; protected int directionStateCurrent = 0; protected int directionStateLast = 0; @@ -153,6 +156,8 @@ namespace HeavenStudio.InputSystem public abstract string GetDeviceName(); // Get the name of the controller public abstract InputFeatures GetFeatures(); // Get the features of the controller + public abstract bool GetIsConnected(); + public abstract bool GetIsPoorConnection(); public abstract int GetLastButtonDown(); // Get the last button down public abstract KeyCode GetLastKeyDown(); // Get the last key down (used for keyboards and other devices that use Keycode) diff --git a/Assets/Scripts/InputSystem/PlayerInput.cs b/Assets/Scripts/InputSystem/PlayerInput.cs index 8a349fe3e..642b66308 100644 --- a/Assets/Scripts/InputSystem/PlayerInput.cs +++ b/Assets/Scripts/InputSystem/PlayerInput.cs @@ -36,8 +36,12 @@ namespace HeavenStudio public delegate void InputControllerDispose(); public static event InputControllerDispose PlayerInputCleanUp; + public delegate InputController[] InputControllerRefresh(); + public static List PlayerInputRefresh; + static List loadRunners; static void BuildLoadRunnerList() { + PlayerInputRefresh = new(); loadRunners = System.Reflection.Assembly.GetExecutingAssembly() .GetTypes() .Where(x => x.Namespace == "HeavenStudio.InputSystem.Loaders" && x.GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static) != null) @@ -66,6 +70,20 @@ namespace HeavenStudio return inputDevices.Count; } + + public static int RefreshInputControllers() + { + inputDevices = new List(); + if (PlayerInputRefresh != null) { + foreach (InputControllerRefresh runner in PlayerInputRefresh) { + InputController[] controllers = runner(); + if (controllers != null) { + inputDevices.AddRange(controllers); + } + } + } + return inputDevices.Count; + } public static int GetNumControllersConnected() { diff --git a/Assets/Scripts/UI/SettingsDialog/Tabs/ControllerSettings.cs b/Assets/Scripts/UI/SettingsDialog/Tabs/ControllerSettings.cs index e883751b6..7270366c8 100644 --- a/Assets/Scripts/UI/SettingsDialog/Tabs/ControllerSettings.cs +++ b/Assets/Scripts/UI/SettingsDialog/Tabs/ControllerSettings.cs @@ -147,7 +147,7 @@ namespace HeavenStudio.Editor public void SearchAndConnectControllers() { - int connected = PlayerInput.InitInputControllers(); + int connected = PlayerInput.RefreshInputControllers(); numConnectedLabel.text = "Connected: " + connected; currentControllerLabel.text = "Current Controller: " + PlayerInput.GetInputController(1).GetDeviceName(); PopulateControllersDropdown();