2using System.Reflection;
3using System.Runtime.InteropServices;
5using UnityEngine.Events;
29 private VRControllerState_t previousControllerState =
new();
30 private VRControllerState_t currentControllerState =
new();
32 private UnityAction<TrackedDevicePose_t[]> _onNewPosesAction;
33 private UnityAction<int, EVRButtonId, bool> _onButtonPressedAction;
34 private UnityAction<int> _onTrackedDeviceRoleChangedAction;
40 Role.LeftHand =>
"Left Hand",
41 Role.RightHand =>
"Right Hand",
46 public void TriggerHapticPulse(ushort durationMicroSec = 500, EVRButtonId buttonId = EVRButtonId.k_EButton_SteamVR_Touchpad)
51 if (OpenVR.System ==
null)
return;
53 var axisId = (uint)buttonId - (uint)EVRButtonId.k_EButton_Axis0;
54 OpenVR.System.TriggerHapticPulse((uint)
DeviceIndex, axisId, (char)durationMicroSec);
58 private void OnDeviceConnected(
int index,
bool connected)
60 if (OpenVR.System ==
null)
return;
62 var roleIndex = FindIndexForRole();
71 private void OnTrackedDeviceRoleChanged(
int index)
76 private int FindIndexForRole()
78 if (OpenVR.System ==
null)
return -1;
80 ETrackedControllerRole trackedRole = ETrackedControllerRole.Invalid;
84 trackedRole = ETrackedControllerRole.LeftHand;
break;
86 trackedRole = ETrackedControllerRole.RightHand;
break;
89 if (trackedRole == ETrackedControllerRole.LeftHand || trackedRole == ETrackedControllerRole.RightHand)
91 return (
int)OpenVR.System.GetTrackedDeviceIndexForControllerRole(trackedRole);
104 var deviceClass = OpenVR.System.GetTrackedDeviceClass((uint)
DeviceIndex);
105 if (deviceClass != ETrackedDeviceClass.Controller && deviceClass != ETrackedDeviceClass.GenericTracker)
return;
110 if (OpenVR.System.GetControllerState((uint)
DeviceIndex, ref previousControllerState, (uint)Marshal.SizeOf(typeof(VRControllerState_t))))
113 (previousControllerState, currentControllerState) = (currentControllerState, previousControllerState);
114 Debug.Log($
"Device {DeviceIndex}: Buttons pressed = {currentControllerState.ulButtonPressed}, touched = {currentControllerState.ulButtonTouched}");
118 if ((currentControllerState.ulButtonPressed & (ulong)buttonMask) != 0)
121 if ((previousControllerState.ulButtonPressed & (ulong)buttonMask) == 0)
132 else if ((previousControllerState.ulButtonPressed & (ulong)buttonMask) != 0)
139 if ((currentControllerState.ulButtonTouched & (ulong)buttonMask) != 0)
142 if ((previousControllerState.ulButtonTouched & (ulong)buttonMask) == 0)
153 else if ((previousControllerState.ulButtonTouched & (ulong)buttonMask) != 0)
165 return currentControllerState.rAxis0.ToVector2();
170 return currentControllerState.rAxis1.ToVector2();
175 return currentControllerState.rAxis2.ToVector2();
180 return currentControllerState.rAxis3.ToVector2();
185 return currentControllerState.rAxis4.ToVector2();
189 private void OnNewPoses(TrackedDevicePose_t[] poses)
198 if (i < 0 || poses.Length <= i)
202 if (!poses[i].bDeviceIsConnected)
205 if (!poses[i].bPoseIsValid)
214 transform.position =
origin.transform.TransformPoint(pose.pos);
215 transform.rotation = origin.rotation * pose.rot;
219 transform.localPosition = pose.pos;
220 transform.localRotation = pose.rot;
226 _onNewPosesAction += OnNewPoses;
228 _onTrackedDeviceRoleChangedAction += OnTrackedDeviceRoleChanged;
234 SetOrigin(FindFirstObjectByType<Vive_Manager>().transform);
242 private void OnEnable()
252 private void OnDisable()
254 OVRT_Events.NewPoses.RemoveListener(_onNewPosesAction);
255 OVRT_Events.ButtonPressed.RemoveListener(_onButtonPressedAction);
261 private void UpdateIndex()
270 private void OnDrawGizmos()
275 Gizmos.DrawMesh(ViveDebugRenderer.indexControllerLeftMesh, transform.position, transform.rotation);
279 Gizmos.DrawMesh(ViveDebugRenderer.indexControllerRightMesh, transform.position, transform.rotation);
287 System = 1ul << (int)EVRButtonId.k_EButton_System,
289 Grip = 1ul << (int)EVRButtonId.k_EButton_Grip,
290 Axis0 = 1ul << (
int)EVRButtonId.k_EButton_Axis0,
291 Axis1 = 1ul << (int)EVRButtonId.k_EButton_Axis1,
292 Axis2 = 1ul << (
int)EVRButtonId.k_EButton_Axis2,
293 Axis3 = 1ul << (int)EVRButtonId.k_EButton_Axis3,
294 Axis4 = 1ul << (
int)EVRButtonId.k_EButton_Axis4,
295 Touchpad = 1ul << (int)EVRButtonId.k_EButton_SteamVR_Touchpad,
296 Trigger = 1ul << (
int)EVRButtonId.k_EButton_SteamVR_Trigger
static UnityEvent< int > TrackedDeviceRoleChanged
static UnityEvent< int, bool > TrackedDeviceConnected
static UnityEvent< TrackedDevicePose_t[]> NewPoses
static UnityEvent< int, EVRButtonId, bool > ButtonPressed
UnityAction< int, bool > _onDeviceConnectedAction
UnityEvent< int > onDeviceIndexChanged
Maps tracked OpenVR poses to transform by device index.
Vector2 GetTrackpadAxis()
void SetOrigin(Transform t)
UnityEvent< ViveControllerButton > onButtonTouchHeld
UnityEvent< ViveControllerButton > onButtonPressed
UnityEvent< ViveControllerButton > onButtonTouchReleased
UnityEvent< ViveControllerButton > onButtonHeld
Vector2 GetJoystickAxis()
void TriggerHapticPulse(ushort durationMicroSec=500, EVRButtonId buttonId=EVRButtonId.k_EButton_SteamVR_Touchpad)
UnityEvent< ViveControllerButton > onButtonReleased
static string GetReadableRoleName(Role r)
UnityEvent< ViveControllerButton > onButtonTouchPressed