Skip to content
Snippets Groups Projects
Select Git revision
  • 6ae02dd43017a8f0d4db399957dfda985cefc53c
  • 5.4 default protected
  • dev/5.4
  • dev/5.3_downgrade
  • dev/5.5
  • 5.3 protected
  • feature/present_barrier
7 results

DisplayClusterEventWrapper.h

Blame
  • DisplayClusterEventWrapper.h 5.00 KiB
    #pragma once
    
    #include "IDisplayCluster.h"
    #include "Cluster/IDisplayClusterClusterManager.h"
    #include "Cluster/DisplayClusterClusterEvent.h"
    #include "DisplayClusterEventParameterHelper.h"
    #include "Templates/IsInvocable.h"
    
    static constexpr int32 CLUSTER_EVENT_WRAPPER_EVENT_ID = 1337420;
    
    template <typename MemberFunctionType, MemberFunctionType MemberFunction>
    class ClusterEventWrapperEvent;
    
    template <typename ObjectType, typename ReturnType, typename... ArgTypes,
    		  ReturnType (ObjectType::*MemberFunction)(ArgTypes...)>
    class ClusterEventWrapperEvent<ReturnType (ObjectType::*)(ArgTypes...), MemberFunction>
    {
    	static_assert(TIsDerivedFrom<ObjectType, UObject>::IsDerived, "Object needs to derive from UObject");
    
    public:
    	using MemberFunctionType = decltype(MemberFunction);
    
    	ClusterEventWrapperEvent(const TCHAR* MethodName) : MethodName{MethodName} {}
    
    	void Attach(ObjectType* NewObject)
    	{
    
    		checkf(Object == nullptr, TEXT("The event is already attached."));
    		Object = NewObject;
    		ObjectName = Object->GetFullName();
    
    		EDisplayClusterOperationMode OperationMode = IDisplayCluster::Get().GetOperationMode();
    		if (OperationMode == EDisplayClusterOperationMode::Cluster)
    		{
    			IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
    			check(ClusterManager != nullptr);
    
    			check(!ClusterEventListenerDelegate.IsBound());
    			ClusterEventListenerDelegate = FOnClusterEventBinaryListener::CreateLambda(
    				[this](const FDisplayClusterClusterEventBinary& Event)
    				{
    					if (Event.EventId != CLUSTER_EVENT_WRAPPER_EVENT_ID)
    					{
    						return;
    					}
    
    					FMemoryReader MemoryReader(Event.EventData);
    
    					FString EventObjectName;
    					// This reads the value!
    					MemoryReader << EventObjectName;
    					if (EventObjectName != ObjectName)
    					{
    						// Event does not belong to this object.
    						return;
    					}
    
    					FString EventMethodName;
    					// This reads the value!
    					MemoryReader << EventMethodName;
    					if (EventMethodName != MethodName)
    					{
    						// This event does not belong to this method.
    						return;
    					}
    
    					// Create a tuple that holds all arguments. This assumes that all
    					// argument types are default constructible. However, all
    					// types that overload the FArchive "<<" operator probably are.
    					TTuple<typename std::remove_cv_t<typename TRemoveReference<ArgTypes>::Type>...> ArgumentTuple;