// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "IMessageContext.h" #include "LiveLinkMessages.h" #include "LiveLinkProvider.h" #include "MessageEndpoint.h" PRAGMA_DISABLE_DEPRECATION_WARNINGS // Subject that the application has told us about struct FTrackedSubject { // Ref skeleton to go with transform data FLiveLinkRefSkeleton RefSkeleton; // Bone transform data TArray Transforms; // Curve data TArray Curves; // MetaData for subject FLiveLinkMetaData MetaData; // Incrementing time (application time) for interpolation purposes double Time; }; PRAGMA_ENABLE_DEPRECATION_WARNINGS struct FLiveLinkProvider : public ILiveLinkProvider { private: const FString ProviderName; const FString MachineName; TSharedPtr MessageEndpoint; /** Lock to stop multiple threads accessing the CurrentPreset at the same time */ mutable FCriticalSection CriticalSection; // Array of our current connections TArray ConnectedAddresses; // Cache of our current subject state TArray StaticDatas; TArray FrameDatas; TMap Subjects; // Delegate to notify interested parties when the client sources have changed FLiveLinkProviderConnectionStatusChanged OnConnectionStatusChanged; void CreateMessageEndpoint(struct FMessageEndpointBuilder& EndpointBuilder); //Message bus message handlers void HandlePingMessage(const FLiveLinkPingMessage& Message, const TSharedRef& Context); void HandleConnectMessage(const FLiveLinkConnectMessage& Message, const TSharedRef& Context); void HandleHeartbeat(const FLiveLinkHeartbeatMessage& Message, const TSharedRef& Context); // End message bus message handlers // Validate our current connections void ValidateConnections(); FTrackedSubject& GetTrackedSubject(const FName& SubjectName); void SendSubject(FName SubjectName, const struct FTrackedSubject& Subject); void SendSubjectFrame(FName SubjectName, const struct FTrackedSubject& Subject); // Get the cached data for the named subject FTrackedStaticData* GetLastSubjectStaticData(const FName& SubjectName); FTrackedFrameData* GetLastSubjectFrameData(const FName& SubjectName); void SetLastSubjectStaticData(FName SubjectName, TSubclassOf Role, FLiveLinkStaticDataStruct&& StaticData); void SetLastSubjectFrameData(FName SubjectName, FLiveLinkFrameDataStruct&& FrameData); // Clear a existing track subject void ClearTrackedSubject(const FName& SubjectName); void SendClearSubjectToConnections(FName SubjectName); void GetConnectedAddresses(TArray& Addresses); protected: template void SendMessage(MessageType* Message) { if (!Message) { return; } TArray Addresses; GetConnectedAddresses(Addresses); if (Addresses.Num() != 0) { MessageEndpoint->Send(Message, Addresses); } } template void SendMessage(MessageType* Message, const FMessageAddress& Address) { if (!Message || !Address.IsValid()) { return; } MessageEndpoint->Send(Message, Address); } template void Subscribe() { if (MessageEndpoint.IsValid()) { MessageEndpoint->Subscribe(); } } const FString& GetProviderName() const { return ProviderName; } const FString& GetMachineName() const { return MachineName; } public: FLiveLinkProvider(const FString& InProviderName); FLiveLinkProvider(const FString& InProviderName, struct FMessageEndpointBuilder&& EndpointBuilder); virtual ~FLiveLinkProvider(); virtual void UpdateSubject(const FName& SubjectName, const TArray& BoneNames, const TArray& BoneParents) override; virtual bool UpdateSubjectStaticData(const FName SubjectName, TSubclassOf Role, FLiveLinkStaticDataStruct&& StaticData) override; virtual void ClearSubject(const FName& SubjectName); virtual void RemoveSubject(const FName SubjectName) override; PRAGMA_DISABLE_DEPRECATION_WARNINGS virtual void UpdateSubjectFrame(const FName& SubjectName, const TArray& BoneTransforms, const TArray& CurveData, double Time) override; virtual void UpdateSubjectFrame(const FName& SubjectName, const TArray& BoneTransforms, const TArray& CurveData, const FLiveLinkMetaData& MetaData, double Time) override; PRAGMA_ENABLE_DEPRECATION_WARNINGS virtual bool UpdateSubjectFrameData(const FName SubjectName, FLiveLinkFrameDataStruct&& FrameData); virtual bool HasConnection() const override; virtual FDelegateHandle RegisterConnStatusChangedHandle(const FLiveLinkProviderConnectionStatusChanged::FDelegate& ConnStatusChanged) override; virtual void UnregisterConnStatusChangedHandle(FDelegateHandle Handle); };