mixedreality/com.microsoft.mixedreality..../Core/Providers/Hands/HandJointUtils.cs

73 lines
2.7 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Utilities;
namespace Microsoft.MixedReality.Toolkit.Input
{
public static class HandJointUtils
{
/// <summary>
/// Tries to get the pose of the requested joint for the first controller with the specified handedness.
/// </summary>
/// <param name="joint">The requested joint</param>
/// <param name="handedness">The specific hand of interest. This should be either Handedness.Left or Handedness.Right</param>
/// <param name="pose">The output pose data</param>
public static bool TryGetJointPose(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose)
{
return TryGetJointPose<IMixedRealityHand>(joint, handedness, out pose);
}
/// <summary>
/// Try to find the first matching hand controller of the given type and return the pose of the requested joint for that hand.
/// </summary>
public static bool TryGetJointPose<T>(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose) where T : class, IMixedRealityHand
{
T hand = FindHand<T>(handedness);
if (hand != null)
{
return hand.TryGetJoint(joint, out pose);
}
pose = MixedRealityPose.ZeroIdentity;
return false;
}
/// <summary>
/// Find the first detected hand controller with matching handedness.
/// </summary>
/// <remarks>
/// The given handedness should be either Handedness.Left or Handedness.Right.
/// </remarks>
public static IMixedRealityHand FindHand(Handedness handedness)
{
return FindHand<IMixedRealityHand>(handedness);
}
/// <summary>
/// Find the first detected hand controller of the given type with matching handedness.
/// </summary>
public static T FindHand<T>(Handedness handedness) where T : class, IMixedRealityHand
{
System.Collections.Generic.HashSet<IMixedRealityController> controllers = CoreServices.InputSystem?.DetectedControllers;
if (controllers == null)
{
return null;
}
foreach (IMixedRealityController detectedController in controllers)
{
if (detectedController is T hand)
{
if (detectedController.ControllerHandedness.IsMatch(handedness))
{
return hand;
}
}
}
return null;
}
}
}