VR4Medical/ICI/Library/PackageCache/com.unity.xr.hands@b137b9cef9d8/Tests/Runtime/TestHandProvider.cs
2025-07-29 13:45:50 +03:00

106 lines
3.9 KiB
C#

using Unity.Collections;
using UnityEngine;
using UnityEngine.Scripting;
using UnityEngine.XR.Hands;
using UnityEngine.XR.Hands.ProviderImplementation;
[Preserve]
class TestHandProvider : XRHandSubsystemProvider
{
public TestHandProvider()
{
leftHandJointsTrackingStates = new XRHandJointTrackingState[XRHandJointID.EndMarker.ToIndex()];
rightHandJointsTrackingStates = new XRHandJointTrackingState[XRHandJointID.EndMarker.ToIndex()];
System.Array.Fill(leftHandJointsTrackingStates, XRHandJointTrackingState.Pose | XRHandJointTrackingState.HighFidelityPose);
System.Array.Fill(rightHandJointsTrackingStates, XRHandJointTrackingState.Pose | XRHandJointTrackingState.HighFidelityPose);
}
public int numStartCalls { get; private set; }
public int numStopCalls { get; private set; }
public int numDestroyCalls { get; private set; }
public int numGetHandLayoutCalls { get; private set; }
public int numTryUpdateHandsCalls { get; private set; }
public XRHandSubsystem.UpdateType mostRecentUpdateType { get; private set; }
public bool leftHandIsTracked { get; set; } = true;
public bool rightHandIsTracked { get; set; } = true;
public XRHandJointTrackingState[] leftHandJointsTrackingStates { get; set; }
public XRHandJointTrackingState[] rightHandJointsTrackingStates { get; set; }
public override void Start()
{
leftHandIsTracked = true;
rightHandIsTracked = true;
++numStartCalls;
}
public override void Stop()
{
++numStopCalls;
}
public override void Destroy()
{
++numDestroyCalls;
}
public override void GetHandLayout(NativeArray<bool> jointsInLayout)
{
++numGetHandLayoutCalls;
for (int jointIndex = 0; jointIndex < jointsInLayout.Length; ++jointIndex)
jointsInLayout[jointIndex] = TestHandData.jointsInLayout[jointIndex];
}
public override XRHandSubsystem.UpdateSuccessFlags TryUpdateHands(
XRHandSubsystem.UpdateType updateType,
ref Pose leftHandRootPose,
NativeArray<XRHandJoint> leftHandJoints,
ref Pose rightHandRootPose,
NativeArray<XRHandJoint> rightHandJoints)
{
mostRecentUpdateType = updateType;
++numTryUpdateHandsCalls;
leftHandRootPose = TestHandData.leftRoot;
rightHandRootPose = TestHandData.rightRoot;
for (int jointIndex = 0; jointIndex < TestHandData.jointsInLayout.Length; ++jointIndex)
{
if (!TestHandData.jointsInLayout[jointIndex])
continue;
XRHandJointTrackingState leftHandTrackingState =
leftHandIsTracked ? leftHandJointsTrackingStates[jointIndex] : XRHandJointTrackingState.None;
XRHandJointTrackingState rightHandTrackingState =
rightHandIsTracked ? rightHandJointsTrackingStates[jointIndex] : XRHandJointTrackingState.None;
leftHandJoints[jointIndex] = XRHandProviderUtility.CreateJoint(
Handedness.Left,
leftHandTrackingState,
XRHandJointIDUtility.FromIndex(jointIndex),
TestHandData.leftHand[jointIndex]);
rightHandJoints[jointIndex] = XRHandProviderUtility.CreateJoint(
Handedness.Right,
rightHandTrackingState,
XRHandJointIDUtility.FromIndex(jointIndex),
TestHandData.rightHand[jointIndex]);
}
var successFlags = XRHandSubsystem.UpdateSuccessFlags.All;
if (!leftHandIsTracked)
successFlags &= ~XRHandSubsystem.UpdateSuccessFlags.LeftHandJoints & ~XRHandSubsystem.UpdateSuccessFlags.LeftHandRootPose;
if (!rightHandIsTracked)
successFlags &= ~XRHandSubsystem.UpdateSuccessFlags.RightHandJoints & ~XRHandSubsystem.UpdateSuccessFlags.RightHandRootPose;
return successFlags;
}
public static string descriptorId => "Test-Hands";
}