/****************************************************************************** * Copyright (C) Ultraleap, Inc. 2011-2021. * * * * Use subject to the terms of the Apache License 2.0 available at * * http://www.apache.org/licenses/LICENSE-2.0, or another agreement * * between Ultraleap and you, your company or other organization. * ******************************************************************************/ #pragma once #include "BodyStateDeviceConfig.h" #include "BodyStateHMDSnapshot.h" #include "BodyStateInputInterface.h" #include "IInputDevice.h" #include "IXRTrackingSystem.h" #include "LeapC.h" #include "LeapComponent.h" #include "LeapImage.h" #include "LeapLiveLink.h" #include "LeapUtility.h" #include "LeapWrapper.h" #include "OpenXRToLeapWrapper.h" #include "SceneViewExtension.h" #include "UltraleapTrackingData.h" #include "IUltraleapTrackingPlugin.h" /** * Stores raw controller data and custom toggles */ class FUltraleapTrackingInputDevice : public IInputDevice, public LeapWrapperCallbackInterface, public IBodyStateDeviceManagerRawInterface { public: FUltraleapTrackingInputDevice(const TSharedRef& MessageHandler); virtual ~FUltraleapTrackingInputDevice(); /** Tick the interface (e.g. check for new controllers) */ virtual void Tick(float DeltaTime) override; /** Poll for controller state and send events if needed */ virtual void SendControllerEvents() override; /** Set which MessageHandler will get the events from SendControllerEvents. */ virtual void SetMessageHandler(const TSharedRef& InMessageHandler) override; /** Exec handler to allow console commands to be passed through for debugging */ virtual bool Exec(UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar) override { return false; } /** * IForceFeedbackSystem pass through functions */ virtual void SetChannelValue(int32 ControllerId, FForceFeedbackChannelType ChannelType, float Value) override { } virtual void SetChannelValues(int32 ControllerId, const FForceFeedbackValues& values) override { } TSharedRef MessageHandler; void AddEventDelegate(const ULeapComponent* EventDelegate); void RemoveEventDelegate(const ULeapComponent* EventDelegate); void ShutdownLeap(); void AreHandsVisible(bool& LeftHandIsVisible, bool& RightHandIsVisible, const FString& DeviceSerial); void LatestFrame(FLeapFrameData& OutFrameconst, const FString& DeviceSerial); void SetSwizzles(ELeapQuatSwizzleAxisB ToX, ELeapQuatSwizzleAxisB ToY, ELeapQuatSwizzleAxisB ToZ, ELeapQuatSwizzleAxisB ToW, const TArray& DeviceSerials); // Policy and toggles void SetLeapPolicy(ELeapPolicyFlag Flag, bool Enable, const TArray& DeviceSerials); void SetTrackingMode(ELeapMode Flag, const TArray& DeviceSerials); virtual void OnDeviceDetach(); FCriticalSection LeapSection; void SetOptions(const FLeapOptions& Options, const TArray& DeviceSerials); FLeapOptions GetOptions(const FString& DeviceSerial); FLeapStats GetStats(const FString& DeviceSerial); const TArray& GetAttachedDevices() { return AttachedDevices; } ILeapConnector* GetConnector() { return Connector; } void PostEarlyInit(); // IBodyStateDeviceManagerRawInterface implementation virtual int32 RequestCombinedDevice( const TArray& DeviceSerials, const enum EBSDeviceCombinerClass CombinerClass) override; virtual int32 GetDefaultDeviceID() override; private: // Private UProperties TArray EventDelegates; // delegate storage // Private utility methods void CallFunctionOnComponents(TFunction InFunction); // lambda multi-cast convenience wrapper bool EmitKeyUpEventForKey(FKey Key, int32 User, bool Repeat); bool EmitKeyDownEventForKey(FKey Key, int32 User, bool Repeat); bool EmitAnalogInputEventForKey(FKey Key, float Value, int32 User, bool Repeat); void InitTrackingSource(); TArray AttachedDevices; // Wrapper link TSharedPtr Leap; ILeapConnector* Connector; // LeapWrapper Callbacks // Global virtual void OnConnect() override; virtual void OnConnectionLost() override; virtual void OnDeviceFound(const LEAP_DEVICE_INFO* props) override; virtual void OnDeviceLost(const char* serial) override; virtual void OnDeviceFailure(const eLeapDeviceStatus failure_code, const LEAP_DEVICE failed_device) override; IHandTrackingDevice* GetDeviceBySerial(const FString& DeviceSerial); IHandTrackingWrapper* GetDeviceWrapperBySerial(const FString& DeviceSerial); void SetTrackingModeBySerial(ELeapMode Flag, const FString& DeviceSerial); void SetLeapPolicyBySerial(ELeapPolicyFlag Flag, bool Enable, const FString& DeviceSerial); IHandTrackingWrapper* GetFallbackDeviceWrapper(); bool IsWaitingForConnect = false; bool IsInOpenXRMode = false; };