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

190 lines
7.2 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 "GenericPlatform/IInputInterface.h"
#include "XRMotionControllerBase.h"
#include "IInputDevice.h"
#include "IHapticDevice.h"
#include "IPXR_HandTracker.h"
#include "PXR_HMDRuntimeSettings.h"
#include "PXR_HMD.h"
#define ButtonEventNum 12
enum class EPICOXRHandJoint : uint8;
struct EPICOButton
{
enum Type
{
RockerX,
RockerY,
Home,
App,
Rocker,
VolumeUp,
VolumeDown,
Trigger,
Power,
AorX,
BorY,
Grip,
RockerUp,
RockerDown,
RockerLeft,
RockerRight,
ButtonCount
};
};
struct EPICOHandButton
{
enum Type
{
Pinch,
ButtonCount
};
};
struct EPICOTouchButton
{
enum Type
{
AorX,
BorY,
Rocker,
Trigger,
Thumbrest,
ButtonCount
};
};
struct EPICOXRControllerHandness
{
enum Type
{
LeftController,
RightController,
ControllerCount
};
};
class FPICOXRHMD;
class UPICOXRHandComponent;
class FPICOXRInput : public IInputDevice, public IPXR_HandTracker, public FXRMotionControllerBase, public IHapticDevice, public TSharedFromThis<FPICOXRInput>
{
public:
FPICOXRInput();
virtual ~FPICOXRInput();
static void PreInit();
// IInputDevice overrides
virtual void Tick(float DeltaTime) override;
virtual void SendControllerEvents() override;
virtual void SetMessageHandler(const TSharedRef<FGenericApplicationMessageHandler>& InMessageHandler) override;
virtual bool Exec(UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar) override;
virtual void SetChannelValue(int32 ControllerId, FForceFeedbackChannelType ChannelType, float Value) override;
virtual void SetChannelValues(int32 ControllerId, const FForceFeedbackValues& values) override;
// IPXR_HandTracker overrides
virtual FQuat GetBoneRotation(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual FVector GetBoneLocation(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual float GetBoneRadii(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual bool IsBoneOrientationValid(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual bool IsBonePositionValid(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual bool IsBoneOrientationTracked(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual bool IsBonePositionTracked(const EPICOXRHandType DeviceHand, const EPICOXRHandJoint BoneId) override;
virtual FTransform GetHandRootPose(const EPICOXRHandType DeviceHand) override;
virtual float GetHandScale(const EPICOXRHandType DeviceHand) override;
virtual EPICOXRHandTrackingConfidence GetTrackingConfidence(const EPICOXRHandType DeviceHand) override;
virtual FTransform GetRayPose(const EPICOXRHandType DeviceHand) override;
virtual bool IsComputed(const EPICOXRHandType DeviceHand) override;
virtual bool IsRayValid(const EPICOXRHandType DeviceHand) override;
virtual bool IsPinchValid(const EPICOXRHandType DeviceHand) override;
virtual float GetPinchStrength(const EPICOXRHandType DeviceHand) override;
virtual bool GetFingerIsPinching(const EPICOXRHandType DeviceHand,const EPICOXRHandFinger Finger) override;
virtual float GetFingerPinchStrength(const EPICOXRHandType DeviceHand, const EPICOXRHandFinger Finger) override;
virtual EPICOXRActiveInputDevice GetActiveInputDevice() override;
virtual bool IsHandTrackingStateValid() const override;
virtual bool GetKeypointState(EPICOXRHandType Hand, EPICOXRHandJoint Keypoint, FTransform& OutTransform, float& OutRadius) const override;
virtual FName GetHandTrackerDeviceTypeName() const override;
virtual void UpdateHandState() override;
// IMotionController overrides
virtual FName GetMotionControllerDeviceTypeName() const override;
virtual bool GetControllerOrientationAndPosition(const int32 ControllerIndex, const FName MotionSource, FRotator& OutOrientation, FVector& OutPosition, float WorldToMetersScale) const override;
virtual ETrackingStatus GetControllerTrackingStatus(const int32 ControllerIndex, const FName MotionSource) const override;
// IHapticDevice overrides
IHapticDevice* GetHapticDevice() override { return (IHapticDevice*)this; }
virtual void SetHapticFeedbackValues(int32 ControllerId, int32 Hand, const FHapticFeedbackValues& Values) override;
virtual void GetHapticFrequencyRange(float& MinFrequency, float& MaxFrequency) const override;
virtual float GetHapticAmplitudeScale() const override;
FPICOXRHMD* GetPICOXRHMD();
int32 UPxr_GetControllerPower(int32 Handness);
bool UPxr_GetControllerConnectState(int32 Handness);
bool UPxr_GetControllerMainInputHandle(int32& Handness);
bool UPxr_SetControllerMainInputHandle(int32 inHandness);
void OnControllerMainChangedDelegate(int32 Handness);
void OnControllerConnectChangedDelegate(int32 Handness, int32 State);
bool UPxr_GetControllerEnableHomeKey();
bool GetPredictedLocationAndRotation(EControllerHand DeviceHand, float PredictedTime, FRotator& OutOrientation, FVector& OutPosition) const;
static FVector OriginOffsetL;
static FVector OriginOffsetR;
const FPICOXRHandState& GetLeftHandState() const;
const FPICOXRHandState& GetRightHandState() const;
private:
//HandTracking
void SetAppHandTrackingEnabled(bool Enabled);
static void AddNonExistingKey(const TArray<FKey> &ExistAllKeys,const FKeyDetails& KeyDetails);
FPICOXRHandState HandStates[2];
EPICOXRHandType SkeletonType;
bool bHandTrackingAvailable;
static void RegisterKeys();
void SetKeyMapping();
void ProcessButtonEvent();
void ProcessButtonAxis();
void UpdateConnectState();
void GetControllerSensorData(const FGameSettings* InSettings, EControllerHand DeviceHand, float WorldToMetersScale, double inPredictedTime, FVector SourcePosition, FQuat SourceOrientation, FRotator& OutOrientation, FVector& OutPosition) const;
FPICOXRHMD* PICOXRHMD;
TSharedRef<FGenericApplicationMessageHandler> MessageHandler;
bool LeftConnectState;
bool RightConnectState;
FName Buttons[(int32)EPICOXRControllerHandness::ControllerCount][(int32)EPICOButton::ButtonCount];
FName TouchButtons[(int32)EPICOXRControllerHandness::ControllerCount][(int32)EPICOTouchButton::ButtonCount];
FName HandButtons[(int32)EPICOXRControllerHandness::ControllerCount][(int32)EPICOHandButton::ButtonCount];
int32 LastHandButtonState[(int32)EPICOXRControllerHandness::ControllerCount][(int32)EPICOHandButton::ButtonCount];
int32 LastLeftControllerButtonState[EPICOButton::ButtonCount] = {0};
int32 LastRightControllerButtonState[EPICOButton::ButtonCount] = {0};
int32 LastLeftTouchButtonState[EPICOTouchButton::ButtonCount] = {0};
int32 LastRightTouchButtonState[EPICOTouchButton::ButtonCount] = {0};
int32 LeftControllerPower;
int32 RightControllerPower;
FVector2D LeftControllerTouchPoint;
FVector2D RightControllerTouchPoint;
float LeftControllerTriggerValue;
float RightControllerTriggerValue;
float LeftControllerGripValue;
float RightControllerGripValue;
uint32_t MainControllerHandle;
PxrControllerType ControllerType;
UPICOXRSettings* Settings;
int CurrentVersion;
float CurrentFramePredictedTime;
};