Giant_Beast_2025/Plugins/MetaXR/Source/OculusXRInput/Private/OculusXRInputHandTrackingExtensionPlugin.h

91 lines
4.2 KiB
C++

// Copyright (c) Meta Platforms, Inc. and affiliates.
#pragma once
#include "khronos/openxr/openxr.h"
#include "CoreMinimal.h"
#include "IOculusXRInputModule.h"
#include "IOpenXRExtensionPlugin.h"
#include "OculusXRInputHandTrackingTypes.h"
#include "OculusXRInputState.h"
namespace OculusXRInput
{
class FHandTrackingExtensionPlugin : public IOpenXRExtensionPlugin, public IInputDevice
{
public:
FHandTrackingExtensionPlugin()
{
HandControllerStates.Add(EOculusXRHandType::HandLeft, FOculusHandControllerState(EControllerHand::Left));
HandControllerStates.Add(EOculusXRHandType::HandRight, FOculusHandControllerState(EControllerHand::Right));
memset(XrLeftHandJointLocations, 0, sizeof(XrLeftHandJointLocations));
memset(XrRightHandJointLocations, 0, sizeof(XrRightHandJointLocations));
memset(XrLeftHandJointVelocities, 0, sizeof(XrLeftHandJointVelocities));
memset(XrRightHandJointVelocities, 0, sizeof(XrRightHandJointVelocities));
}
void RegisterOpenXRExtensionPlugin()
{
RegisterOpenXRExtensionModularFeature();
}
// IInputDevice
virtual void SetMessageHandler(const TSharedRef<FGenericApplicationMessageHandler>& InMessageHandler) override;
void Tick(float DeltaTime) override {};
void SendControllerEvents() override {};
virtual bool Exec(UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar) override;
void SetChannelValue(int32 ControllerId, FForceFeedbackChannelType ChannelType, float Value) override {};
void SetChannelValues(int32 ControllerId, const FForceFeedbackValues& Values) override {};
// IOpenXRExtensionPlugin
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual bool GetOptionalExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual const void* OnGetSystem(XrInstance InInstance, const void* InNext) override;
virtual const void* OnCreateInstance(class IOpenXRHMDModule* InModule, const void* InNext) override;
virtual void PostCreateInstance(XrInstance InInstance) override;
virtual const void* OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext) override;
virtual const void* OnBeginSession(XrSession InSession, const void* InNext) override;
virtual void UpdateDeviceLocations(XrSession InSession, XrTime DisplayTime, XrSpace TrackingSpace) override;
virtual void OnDestroySession(XrSession InSession) override;
virtual bool IsHandTrackingAvailable();
virtual bool IsHandTrackingActive();
virtual bool GetSkeleton(EOculusXRHandType HandType, TSharedPtr<FHandSkeleton> Skeleton);
virtual bool GetMesh(EOculusXRHandType HandType, TSharedPtr<FHandMesh> Mesh);
TMap<EOculusXRHandType, FOculusHandControllerState> HandControllerStates;
bool bIsInitialized = false;
private:
virtual void SendControllerButtonPressed(FName Key, bool IsPressed, FPlatformUserId UserId, FInputDeviceId DeviceId);
XrHandJointLocationEXT XrLeftHandJointLocations[XR_HAND_JOINT_COUNT_EXT];
XrHandJointLocationEXT XrRightHandJointLocations[XR_HAND_JOINT_COUNT_EXT];
XrHandJointVelocityEXT XrLeftHandJointVelocities[XR_HAND_JOINT_COUNT_EXT];
XrHandJointVelocityEXT XrRightHandJointVelocities[XR_HAND_JOINT_COUNT_EXT];
PFN_xrGetHandMeshFB xrGetHandMeshFB = nullptr;
PFN_xrLocateHandJointsEXT xrLocateHandJointsEXT = nullptr;
PFN_xrCreateHandTrackerEXT xrCreateHandTrackerEXT = nullptr;
PFN_xrDestroyHandTrackerEXT xrDestroyHandTrackerEXT = nullptr;
virtual XrPosef TransformXrHandJointPose(EOculusXRHandType HandType, XrHandJointEXT Joint, XrPosef JointPose, XrPosef RootPose, bool ApplyRootPose);
virtual XrHandJointEXT MapBoneToXrHandJoint(EHandBoneId Bone);
virtual EHandBoneId MapXrHandJointToBone(XrHandJointEXT Joint);
virtual FVector XrPoseVectorToFVector(XrVector3f XrVector);
virtual FQuat XrPoseQuatToFQuat(XrQuaternionf XrQuat);
virtual FQuat XrBoneQuatToFQuat(XrQuaternionf XrQuat);
bool bExtHandTrackingMeshAvailable = false;
bool bHandTrackingAvailable = false;
bool bHandTrackingActive = false;
TSharedPtr<FGenericApplicationMessageHandler> MessageHandler;
TMap<EOculusXRHandType, XrHandTrackerEXT> OculusHandTrackers;
XrInstance Instance = XR_NULL_HANDLE;
FInternalHandsState InternalHandsState;
};
} // namespace OculusXRInput