/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* Licensed under the Oculus SDK License Agreement (the "License");
* you may not use the Oculus SDK except in compliance with the License,
* which is provided at the time of installation or download, or which
* otherwise accompanies this software in either electronic or hard copy form.
*
* You may obtain a copy of the License at
*
* https://developer.oculus.com/licenses/oculussdk/
*
* Unless required by applicable law or agreed to in writing, the Oculus SDK
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using UnityEngine;
using System;
namespace Oculus.Interaction.Input
{
///
/// The Interaction SDK's fundamental concept of a tracked hand, exposing data such as wrist and tracked joint poses. This
/// interface encapsulates the core capabilities common to all hand tracking solutions supported by the Interaction SDK. Where
/// possible, you should use this interface instead of concrete alternatives such as , which are less
/// general and portable.
///
public interface IHand
{
///
/// Indicates whether the tracked hand is - or -handed.
///
Handedness Handedness { get; }
///
/// Indicates whether hand tracking is available and has valid data. Note that, because this reflects both the general
/// availability and present validity of hand tracking data, this value can vary from frame to frame depending on whether
/// the system is currently able to track the hand. This is a valid API to check in order to determine whether up-to-date
/// hand tracking is available at a given moment.
///
bool IsConnected { get; }
///
/// Indicates whether the system has high confidence in the validity of its most recent hand tracking data. In order for this
/// value to be true, and must also be true.
///
bool IsHighConfidence { get; }
///
/// Indicates whether the current hand is the dominant hand. The availability of this feature depends on whether or not the
/// platform provides a way to determine whether the user is left- or right-handed.
///
bool IsDominantHand { get; }
///
/// Indicates the detected scale of the tracked hand relative to the default tracked hand size.
///
float Scale { get; }
///
/// Checks whether a particular finger is considered to be pinching. How a given finger is determined to be pinching is an
/// implementation detail which can vary by finger/platform and is not part of the contract of this method, which merely
/// provides a unified way to query for the semantic concept of a "pinch".
///
/// The finger to check for pinching behavior
/// Whether or not the requested finger is considered to be pinching
bool GetFingerIsPinching(HandFinger finger);
///
/// A convenience method to check for the most commonly-desired pinching behavior. Calling this method is equivalent to
/// calling with the argument .
///
/// Whether or not the index finger is considered to be pinching
bool GetIndexFingerIsPinching();
///
/// Checks whether a valid "pointer pose" is currently available. See for details
/// on what a pointer pose is.
///
bool IsPointerPoseValid { get; }
///
/// Attempts to return a valid "pointer pose" for the hand. A "pointer pose" is a world-space pose (position and orientation)
/// intended to be used as a directional input, conceptually comparable to "pointing at something." However, the nature of
/// this pose and its relationship to the hand are not part of the contract of this method; it may or may not correspond to
/// a "direction of pointing," and in many implementations it corresponds more closely to a "direction of reaching out."
/// These details can vary, but in all cases this method provides a unified way to query for the semantic concept of a
/// "pointer."
///
/// A valid world-space pointer pose if one could be calculated, identity otherwise
/// True if the pose argument was populated with a valid pointer pose, false otherwise
bool GetPointerPose(out Pose pose);
///
/// Attempts to return the world-space pose of the requested hand joint.
///
/// The joint for which the pose is being requested
/// A valid world-space joint pose if one is available, identity otherwise
/// True if the pose argument was populated with a valid joint pose, false otherwise
bool GetJointPose(HandJointId handJointId, out Pose pose);
///
/// Attempts to return the pose of the requested hand joint in "local" space. This "local" space is loosely defined and can
/// vary by platform (in some implementations, each joint is relative to a given parent joint), so the exact nature of what is
/// returned by this method is not guaranteed. In general, it is recommended to use
/// or instead
/// where possible.
///
/// The joint for which the pose is being requested
/// A valid "local" space joint pose if one is available, identity otherwise
/// True if the pose argument was populated with a valid joint pose, false otherwise
bool GetJointPoseLocal(HandJointId handJointId, out Pose pose);
///
/// Retrieves all "local" space joint poses for this hand. The values returned by this method are the same as those returned
/// by calling repeatedly, but as a batched query this method can be
/// more efficient if many joint poses are needed.
///
/// The array of all "local" joint poses if available, or an empty array otherwise
/// True if the poses collection was correctly populated, false otherwise
bool GetJointPosesLocal(out ReadOnlyHandJointPoses localJointPoses);
///
/// Attempts to return the pose of the requested hand joint in wrist space. Wrist space is strongly defined as a transform
/// space located and oriented according to . This space is of uniform scale across
/// hand sizes, meaning all tracked hands are the same size in wrist space, and wrist space itself must be multipled by
/// in order to correctly reflect the observed size of the tracked hands in world space.
///
/// The joint for which the pose is being requested
/// A valid wrist space joint pose if available, false otherwise
/// True if the pose argument was populated with a valid joint pose, false otherwise
bool GetJointPoseFromWrist(HandJointId handJointId, out Pose pose);
///
/// Retrieves all wrist space joint poses for this hand. The values returned by this method are the same as those returned
/// by calling repeatedly, but as a batched query this method can
/// be more efficient if many joint poses are needed.
///
/// The array of all wrist space joint poses if available, or an empty array otherwise
/// True if the poses collection was correctly populated, false otherwise
bool GetJointPosesFromWrist(out ReadOnlyHandJointPoses jointPosesFromWrist);
///
/// Attempts to return the pose of the palm in "local" space. This "local" space is loosely defined and can vary by platform;
/// in some implementations, it can be considered for this method in particular to be synonymous with wrist space.
///
/// The "local" palm position and orientation if available, identity otherwise
/// True if the pose argument was populated with a valid palm pose, false otherwise
bool GetPalmPoseLocal(out Pose pose);
///
/// Queries whether the tracking data for a particular finger is high- or low-confidence.
///
/// The finger to be checked for high-confidence tracking data
/// True if the system is confident in its tracking data for the requested finger, false otherwise
bool GetFingerIsHighConfidence(HandFinger finger);
///
/// Queries the strength with which a particular finger is considered to be pinching. "Strength" in this case is an
/// indication of how similar or different the finger's pose is to what could be considered a pinch; a finger with its
/// tip far from the thumb will likely have a pinch strength at or near 0, while a finger with its tip touching the thumb
/// will likely have a pinch strength at or near 1.
///
/// The finger to be checked for pinch strength
/// A number from 0 to 1 indicating how far or close, respectively, the finger is from pinching
float GetFingerPinchStrength(HandFinger finger);
///
/// Indicates whether the hand is currently tracked such that tracking poses are available for the hand root and finger
/// joints. Note that this property being true does not necessarily mean that a valid pointer pose is available;
/// may be false while valid tracking data is available.
///
bool IsTrackedDataValid { get; }
///
/// Attempts to retrieve the pose of the wrist joint in world space. This is a convenience method and is identical to calling
/// with the argument .
///
/// A void world space pose for the wrist joint if available, identity otherwise
/// True if the pose argument was populated with a valid joint pose, false otherwise
bool GetRootPose(out Pose pose);
///
/// Indicator which is incremented every time new tracked hand data becomes available.
///
int CurrentDataVersion { get; }
///
/// Event indicating that has been incremented and thus the hand can be queried for
/// potentially new data.
///
event Action WhenHandUpdated;
}
}