October3d55/M/PICOXRPlugin/Source/PICOXRInput/Private/IPXR_HandTracker.h

161 lines
5.6 KiB
C++

// Copyright PICO Technology Co., Ltd. All rights reserved.
// This plugin incorporates portions of the Unreal® Engine. Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "PXR_PluginWrapper.h"
enum class EPICOXRHandTrackingConfidence : uint8;
enum class EPICOXRHandFinger : uint8;
enum class EPICOXRHandJoint : uint8;
enum class EPICOXRHandStage : uint8;
enum class EPICOXRActiveInputDevice : uint8;
enum class EPICOXRHandType : uint8;
#define XR_HAND_JOINT_COUNT_MAX 26
/**
*
*/
class IPXR_HandTracker:public IModularFeature
{
public:
virtual ~IPXR_HandTracker() {}
// Flag bits for XrHandTrackingAimFlagsFB
enum class XrHandTrackingAimFlags:uint64
{
/// Whether the data is valid.
XR_HAND_TRACKING_AIM_COMPUTED_BIT = 0x00000001,
/// Whether the ray appears.
XR_HAND_TRACKING_AIM_VALID_BIT = 0x00000002,
/// Whether the index finger pinches.
XR_HAND_TRACKING_AIM_INDEX_PINCHING_BIT = 0x00000004,
/// Whether the middle finger pinches.
XR_HAND_TRACKING_AIM_MIDDLE_PINCHING_BIT = 0x00000008,
/// Whether the ring finger pinches.
XR_HAND_TRACKING_AIM_RING_PINCHING_BIT = 0x00000010,
/// Whether the little finger pinches.
XR_HAND_TRACKING_AIM_LITTLE_PINCHING_BIT = 0x00000020,
/// Whether the ray touches.
XR_HAND_TRACKING_AIM_RAY_TOUCHED_BIT=0x00000200
};
// Flag bits for XrHandTrackingAimFlagsFB
enum class XrSpaceLocationFlags:uint64
{
XR_SPACE_LOCATION_ORIENTATION_VALID_BIT = 0x00000001,
XR_SPACE_LOCATION_POSITION_VALID_BIT = 0x00000002,
XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT = 0x00000004,
XR_SPACE_LOCATION_POSITION_TRACKED_BIT = 0x00000008
};
struct FPICOXRHandState : public FNoncopyable
{
FPICOXRHandState()
:Radii{}
, SpaceLocationFlags{}
, ReceivedJointPoses(false)
, HandScale(0)
, Status(0)
, PinchStrengthIndex(0)
, PinchStrengthMiddle(0)
, PinchStrengthRing(0)
, PinchStrengthLittle(0)
, TouchStrengthRay(0)
{
}
PxrHandJointsLocations HandJointLocations;
PxrHandAimState AimState;
// Transforms are cached in Unreal Tracking Space
FTransform KeypointTransforms[XR_HAND_JOINT_COUNT_MAX];
float Radii[XR_HAND_JOINT_COUNT_MAX];
uint64 SpaceLocationFlags[XR_HAND_JOINT_COUNT_MAX];
bool ReceivedJointPoses;
float HandScale;
uint64 Status;
FTransform AimPose; //Pose of the interactive ray
float PinchStrengthIndex;
float PinchStrengthMiddle;
float PinchStrengthRing;
float PinchStrengthLittle; //Pinch finger strength
float TouchStrengthRay;
bool GetTransform(EPICOXRHandJoint KeyPoint, FTransform& OutTransform) const
{
check(static_cast<int32>(KeyPoint) < XR_HAND_JOINT_COUNT_MAX);
OutTransform = KeypointTransforms[static_cast<uint32>(KeyPoint)];
return ReceivedJointPoses;
};
const FTransform& GetTransform(EPICOXRHandJoint KeyPoint) const
{
check(static_cast<int32>(KeyPoint) < XR_HAND_JOINT_COUNT_MAX);
return KeypointTransforms[static_cast<uint32>(KeyPoint)];
}
};
virtual FQuat GetBoneRotation(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual FVector GetBoneLocation(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual float GetBoneRadii(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual bool IsBoneOrientationValid(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual bool IsBonePositionValid(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual bool IsBoneOrientationTracked(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual bool IsBonePositionTracked(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) =0;
virtual FTransform GetHandRootPose(const EPICOXRHandType DeviceHand)=0;
virtual float GetHandScale(const EPICOXRHandType DeviceHand) =0;
virtual EPICOXRHandTrackingConfidence GetTrackingConfidence(const EPICOXRHandType DeviceHand) =0;
virtual FTransform GetRayPose(const EPICOXRHandType DeviceHand) =0;
virtual bool IsComputed(const EPICOXRHandType DeviceHand) =0;
virtual bool IsRayValid(const EPICOXRHandType DeviceHand) =0;
virtual bool IsPinchValid(const EPICOXRHandType DeviceHand) =0;
virtual float GetPinchStrength(const EPICOXRHandType DeviceHand)=0;
virtual bool GetFingerIsPinching(const EPICOXRHandType DeviceHand,EPICOXRHandFinger Finger) =0;
virtual float GetFingerPinchStrength(const EPICOXRHandType DeviceHand, EPICOXRHandFinger Finger) =0;
virtual EPICOXRActiveInputDevice GetActiveInputDevice()=0;
virtual void UpdateHandState() =0;
static FName GetModularFeatureName()
{
static FName FeatureName = FName(TEXT("PICOHandTracker"));
return FeatureName;
}
/**
* Returns the device type of the controller.
*
* @return Device type of the controller.
*/
virtual FName GetHandTrackerDeviceTypeName() const = 0;
/**
* Returns true if hand tracking is available and tracking.
*
* @return true/false
*/
virtual bool IsHandTrackingStateValid() const = 0;
/**
* Get the transform and radius (or 0 if radius is not available on this platform) for the given hand keypoint.
*
* @return true if data was fetched
*/
virtual bool GetKeypointState(EPICOXRHandType Hand, EPICOXRHandJoint Keypoint, FTransform& OutTransform, float& OutRadius) const = 0;
protected:
FORCEINLINE FVector PxrBoneVectorToFVector(PxrVector3f pxrVector, float WorldToMeters)
{
//Reference system sdk to Unreal
return FVector(-pxrVector.z, pxrVector.x, pxrVector.y) * WorldToMeters;
}
FORCEINLINE FQuat PxrBoneQuatToFQuat(PxrQuaternionf pxrQuat)
{
return FQuat(-pxrQuat.z, pxrQuat.x, pxrQuat.y, -pxrQuat.w);
}
};