UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DataflowNodeParameters.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Misc/ScopeExit.h"
14
15class UDataflow;
16struct FDataflowNode;
17struct FDataflowOutput;
19
20#define DATAFLOW_EDITOR_EVALUATION WITH_EDITOR
21
22namespace UE::Dataflow
23{
39
41
42 /*
43 * Performance data per connection
44 */
46 {
47 void Reset();
48 void Accumulate(const FDataflowConnection* Connection, uint64 TotalTime, uint64 ExternalTime);
50
51 struct FData
52 {
53 float InclusiveTimeMs = 0;
54 float ExclusiveTimeMs = 0;
56 FTimestamp LastTimestamp = FTimestamp(0); // timestamp of the owner node when data was last collected
57 };
59 bool bEnabled = false;
60 };
61
63
64 /*
65 * Connection context callstack
66 * Used to detected loops and use for error handling
67 */
69 {
70 void Push(const FDataflowConnection* Connection);
72 const FDataflowConnection* Top() const;
73
74 int32 Num() const;
76 bool Contains(const FDataflowConnection* Connection) const;
77
90 };
91
94 {
95 public:
97 : CriticalSection(InCriticalSection)
98 {
99 if (CriticalSection)
100 {
101 CriticalSection->Lock();
102 }
103 }
104
106 {
107 Unlock();
108 }
109
110 void Unlock()
111 {
112 if (CriticalSection)
113 {
114 CriticalSection->Unlock();
115 CriticalSection = nullptr;
116 }
117 }
118
119 private:
120 FScopedOptionalLock() = delete;
122 FScopedOptionalLock& operator=(const FScopedOptionalLock& InScopeLock) = delete;
123
124 private:
125 FCriticalSection* CriticalSection;
126 };
127
129
130 /*
131 * Dataflow context base class
132 */
134 {
135 protected:
136 FContext(FContext&&) = delete;
138
139 FContext(const FContext&) = delete;
140 FContext& operator=(const FContext&) = delete;
141
144
146
147 public:
149 virtual ~FContext() = default;
150
151 static FName StaticType() { return FName("FContext"); }
152
153 virtual bool IsA(FName InType) const { return InType==StaticType(); }
154
155 virtual FName GetType() const { return FContext::StaticType(); }
156
157 template<class T>
158 const T* AsType() const
159 {
160 if (IsA(T::StaticType()))
161 {
162 return static_cast<const T*>(this);
163 }
164 return nullptr;
165 }
166
167 template<class T>
169 {
170 if (IsA(T::StaticType()))
171 {
172 return static_cast<T*>(this);
173 }
174 return nullptr;
175 }
176
177 bool IsThreaded() const { return DataLock.IsValid(); }
178 DATAFLOWCORE_API void SetThreaded(bool bValue);
179
183
187 DATAFLOWCORE_API virtual bool IsEmptyImpl() const;
189
190 DATAFLOWCORE_API void Evaluate(const FDataflowNode* Node, const FDataflowOutput* Output, FOnPostEvaluationFunction PostEvaluationFunction);
191
192 DATAFLOWCORE_API virtual void Evaluate(const FDataflowNode* Node, const FDataflowOutput* Output );
193 DATAFLOWCORE_API virtual bool Evaluate(const FDataflowOutput& Connection );
194
196
197 template<typename T>
199 {
201
202 if constexpr (std::is_same_v<T, FContextValue>)
203 {
204 if (const FContextCacheElementBase* CacheEntryToClone = InValue.GetCacheEntry())
205 {
206 DataStoreEntry = CacheEntryToClone->Clone(*this);
207 if (DataStoreEntry)
208 {
209 DataStoreEntry->UpdatePropertyAndNodeData(InProperty, InNodeGuid, InNodeHash, InTimestamp);
210 }
211 }
212 }
213 else
214 {
215 bool bMadeEntry = false;
217 {
218 typedef typename TDecay<T>::Type ArrayType;
220 {
221 bMadeEntry = true;
223 }
224 else if constexpr (TIsReflectedStruct<ArrayType>::Value)
225 {
227 }
228 }
229 if (!bMadeEntry)
230 {
231 if constexpr (TIsUObjectPtrElement<T>::Value)
232 {
234 }
235 else if constexpr (TIsReflectedStruct<T>::Value)
236 {
238 }
239 else
240 {
242 }
243 }
244 }
245
246 if (DataStoreEntry)
247 {
249 }
250 else
251 {
253 }
254 }
255
257
259
261
262 // this is useful when there's a need to have to have cache entry but the type is not known and there no connected output
263 // ( like reroute nodes with unconnected input for example )
264 // in that case posting an invalid reference, will allow the evaluatino to go through and the node reading it will get a default value instead
266
267 UE_DEPRECATED(5.7, "Use UE::Dataflow::FContextValue from calling GetValue on the node to access the same functionality")
269
270 UE_DEPRECATED(5.7, "Use UE::Dataflow::FContextValue from calling GetValue on the node to access the same functionality")
272
274
275 template<class T>
276 const T& GetData(FContextCacheKey Key, const FProperty* InProperty, const T& Default = T()) const
277 {
279 {
280 return (*Cache)->GetTypedData<T>(*this, InProperty, Default);
281 }
282 return Default;
283 }
284
287 DATAFLOWCORE_API bool IsEmpty() const;
288 DATAFLOWCORE_API virtual void Serialize(FArchive& Ar);
289
290 // Begin - IContextCacheStore
293 // End - IContextCacheStore
294
295 // Begin - IContextAssetStoreInterface
296 DATAFLOWCORE_API virtual UObject* AddAsset(const FString& AssetPath, const UClass* AssetClass) override;
297 DATAFLOWCORE_API virtual UObject* CommitAsset(const FString& AssetPath) override;
298 DATAFLOWCORE_API virtual void ClearAssets() override;
299 // End - IContextAssetStoreInterface
300
302
305 DATAFLOWCORE_API bool IsInCallstack(const FDataflowConnection* Connection) const;
306
311 DATAFLOWCORE_API void EnablePerfData(bool bEnable);
313
315
316 DATAFLOWCORE_API void Info(const FString& InInfo, const FDataflowNode* InNode = nullptr, const FDataflowOutput* InOutput = nullptr);
318 DATAFLOWCORE_API void Warning(const FString& InWarning, const FDataflowNode* InNode = nullptr, const FDataflowOutput* InOutput = nullptr);
320 DATAFLOWCORE_API void Error(const FString& InError, const FDataflowNode* InNode = nullptr, const FDataflowOutput* InOutput = nullptr);
322
323 bool NodeHasWarning(const FDataflowNode* InNode) { return NodesWithWarning.Contains(InNode); };
324 bool NodeHasError(const FDataflowNode* InNode) { return NodesWithError.Contains(InNode); };
325 bool NodeFailed(const FDataflowNode* InNode) { return NodesFailed.Contains(InNode); };
326
329
332
335
338
341
344
345 protected:
347
349
350 private:
351
352 void CheckIntrinsicInputs(const FDataflowOutput& Connection);
353
354#if DATAFLOW_EDITOR_EVALUATION
355 FContextCallstack Callstack;
357#endif
358 TSet<const FDataflowNode*> NodesWithInfo;
359 TSet<const FDataflowNode*> NodesWithWarning;
360 TSet<const FDataflowNode*> NodesWithError;
361 TSet<const FDataflowNode*> NodesFailed;
362
364 FContextAssetStore AssetStore;
365 };
366
368 {
369 public:
372
373 bool IsLoopDetected() const { return bLoopDetected; }
374
375 private:
376 bool bLoopDetected;
377 FContext& Context;
378 const FDataflowConnection* Connection;
379 };
380
381#define DATAFLOW_CONTEXT_INTERNAL(PARENTTYPE, TYPENAME) \
382 typedef PARENTTYPE Super; \
383 static FName StaticType() { return FName(#TYPENAME); } \
384 virtual bool IsA(FName InType) const override { return InType==StaticType() || Super::IsA(InType); } \
385 virtual FName GetType() const override { return StaticType(); }
386
392
394 {
395 public:
397
399 : FContext()
400 {
401 SetThreaded(true);
402 }
403 };
404}
405
406
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_NODISCARD_CTOR
Definition Platform.h:761
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition NameTypes.h:617
Definition UnrealType.h:174
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition UniquePtr.h:107
bool IsValid() const
Definition UniquePtr.h:280
Definition Class.h:3793
Definition DataflowObject.h:106
Definition DataflowNodeParameters.h:388
DATAFLOW_CONTEXT_INTERNAL(FContext, FContextSingle)
Definition DataflowNodeParameters.h:394
FContextThreaded()
Definition DataflowNodeParameters.h:398
DATAFLOW_CONTEXT_INTERNAL(FContext, FContextThreaded)
Definition DataflowNodeParameters.h:134
DATAFLOWCORE_API void ClearAllPerfData()
Definition DataflowNodeParameters.cpp:315
DATAFLOWCORE_API void PopFromCallstack(const FDataflowConnection *Connection)
Definition DataflowNodeParameters.cpp:346
DATAFLOWCORE_API bool HasData(FContextCacheKey Key, FTimestamp InTimestamp=FTimestamp::Invalid) const
Definition DataflowNodeParameters.cpp:155
DATAFLOWCORE_API void SetNullData(FContextCacheKey InKey, const FProperty *InProperty, const FGuid &InNodeGuid, uint32 InNodeHash, const FTimestamp &InTimestamp)
Definition DataflowNodeParameters.cpp:140
DATAFLOWCORE_API bool IsEmpty() const
Definition DataflowNodeParameters.cpp:161
DATAFLOWCORE_API int32 GetNumErrors() const
Definition DataflowNodeParameters.cpp:453
virtual DATAFLOWCORE_API const TUniquePtr< FContextCacheElementBase > * GetDataImpl(FContextCacheKey Key) const
Definition DataflowNodeParameters.cpp:225
DATAFLOWCORE_API void ClearAllData()
Definition DataflowNodeParameters.cpp:243
DATAFLOWCORE_API bool CopyDataToAnotherContext(const FContextCacheKey InSourceKey, FContext &TargetContext, const FContextCacheKey InTargetKey, const FProperty *InProperty, const FGuid &InNodeGuid, uint32 InNodeHash, const FTimestamp &InTimestamp) const
Definition DataflowNodeParameters.cpp:540
DATAFLOWCORE_API void SetDataReference(FContextCacheKey Key, const FProperty *Property, FContextCacheKey ReferenceKey, const FTimestamp &InTimestamp)
Definition DataflowNodeParameters.cpp:121
virtual DATAFLOWCORE_API UObject * CommitAsset(const FString &AssetPath) override
Definition DataflowNodeParameters.cpp:681
DATAFLOWCORE_API void SetDataFromStructView(FContextCacheKey InKey, const FProperty *InProperty, const FConstStructView &StructView, const FGuid &InNodeGuid, uint32 InNodeHash, const FTimestamp &InTimestamp)
Definition DataflowNodeParameters.cpp:109
DATAFLOWCORE_API void SetThreaded(bool bValue)
Definition DataflowNodeParameters.cpp:183
TUniquePtr< FCriticalSection > DataLock
Definition DataflowNodeParameters.h:143
static FName StaticType()
Definition DataflowNodeParameters.h:151
FContextEvaluator AsyncEvaluator
Definition DataflowNodeParameters.h:145
FOnNodeFinishEvaluateMulticast OnNodeFinishEvaluateMulticast
Definition DataflowNodeParameters.h:334
DATAFLOWCORE_API const void * GetUntypedData(FContextCacheKey Key, const FProperty *InProperty) const
Definition DataflowNodeParameters.cpp:146
DATAFLOWCORE_API void PushToCallstack(const FDataflowConnection *Connection)
Definition DataflowNodeParameters.cpp:339
FOnContextHasWarningMulticast OnContextHasWarning
Definition DataflowNodeParameters.h:340
FOnContextHasErrorMulticast OnContextHasError
Definition DataflowNodeParameters.h:343
DATAFLOWCORE_API void SetDataFromStructArrayView(FContextCacheKey InKey, const FProperty *InProperty, const FConstStructArrayView &StructArrayView, const FGuid &InNodeGuid, uint32 InNodeHash, const FTimestamp &InTimestamp)
Definition DataflowNodeParameters.cpp:115
FContext()
Definition DataflowNodeParameters.h:148
virtual DATAFLOWCORE_API bool HasCacheElement(FContextCacheKey InKey, FTimestamp InTimestamp=FTimestamp::Invalid) const override
Definition DataflowNodeParameters.cpp:178
DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnContextHasInfoMulticast, const FDataflowNode *Node, const FDataflowOutput *Output, const FString &Info)
DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnContextHasWarningMulticast, const FDataflowNode *Node, const FDataflowOutput *Output, const FString &Info)
DATAFLOWCORE_API void GetAsyncEvaluationStats(int32 &OutNumPendingTasks, int32 &OutNumRunningTasks, int32 &OutNumCompletedTasks) const
Definition DataflowNodeParameters.cpp:208
const T & GetData(FContextCacheKey Key, const FProperty *InProperty, const T &Default=T()) const
Definition DataflowNodeParameters.h:276
FOnContextHasInfoMulticast OnContextHasInfo
Definition DataflowNodeParameters.h:337
DATAFLOWCORE_API bool IsCacheEntryAfterTimestamp(FContextCacheKey InKey, const FTimestamp InTimestamp) const
Definition DataflowNodeParameters.cpp:366
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnNodeFinishEvaluateMulticast, const FDataflowNode *Node, const FDataflowOutput *Output)
DATAFLOWCORE_API void EnablePerfData(bool bEnable)
Definition DataflowNodeParameters.cpp:322
virtual DATAFLOWCORE_API int32 GetKeys(TSet< FContextCacheKey > &InKeys) const
Definition DataflowNodeParameters.cpp:213
DATAFLOWCORE_API int32 GetNumWarnings() const
Definition DataflowNodeParameters.cpp:414
DATAFLOWCORE_API int32 GetNumInfo() const
Definition DataflowNodeParameters.cpp:397
FContextCache DataStore
Definition DataflowNodeParameters.h:142
void SetData(FContextCacheKey InKey, const FProperty *InProperty, T &&InValue, const FGuid &InNodeGuid, uint32 InNodeHash, const FTimestamp &InTimestamp)
Definition DataflowNodeParameters.h:198
virtual bool IsA(FName InType) const
Definition DataflowNodeParameters.h:153
virtual FName GetType() const
Definition DataflowNodeParameters.h:155
DATAFLOWCORE_API void BeginContextEvaluation(const FDataflowNode *Node, const FDataflowOutput *Output)
Definition DataflowNodeParameters.cpp:556
DATAFLOWCORE_API bool IsInCallstack(const FDataflowConnection *Connection) const
Definition DataflowNodeParameters.cpp:357
bool NodeFailed(const FDataflowNode *InNode)
Definition DataflowNodeParameters.h:325
FContext & operator=(const FContext &)=delete
FContext(const FContext &)=delete
DATAFLOWCORE_API void AddExternalPerfData(const FContextPerfData &InPerfData)
Definition DataflowNodeParameters.cpp:308
DATAFLOWCORE_API void CancelAsyncEvaluation()
Definition DataflowNodeParameters.cpp:203
DATAFLOWCORE_API const FContextPerfData & GetPerfData() const
Definition DataflowNodeParameters.cpp:258
virtual DATAFLOWCORE_API void SetDataImpl(FContextCacheKey Key, TUniquePtr< FContextCacheElementBase > &&DataStoreEntry)
Definition DataflowNodeParameters.cpp:219
DATAFLOWCORE_API void Evaluate(const FDataflowNode *Node, const FDataflowOutput *Output, FOnPostEvaluationFunction PostEvaluationFunction)
Definition DataflowNodeParameters.cpp:600
virtual DATAFLOWCORE_API void ClearAssets() override
Definition DataflowNodeParameters.cpp:686
FContext & operator=(FContext &&)=delete
virtual DATAFLOWCORE_API bool IsEmptyImpl() const
Definition DataflowNodeParameters.cpp:237
FContext(FContext &&)=delete
bool NodeHasWarning(const FDataflowNode *InNode)
Definition DataflowNodeParameters.h:323
DATAFLOWCORE_API void ClearNodeData(const FDataflowNode *InNode)
Definition DataflowNodeParameters.cpp:466
DATAFLOWCORE_API bool IsPerfDataEnabled() const
Definition DataflowNodeParameters.cpp:329
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnNodeBeginEvaluateMulticast, const FDataflowNode *Node, const FDataflowOutput *Output)
DATAFLOWCORE_API void SetArrayElementFromData(const FContextCacheKey InArrayKey, int32 Index, const FContextCacheKey InElementKey, const FProperty *InProperty, const FGuid &InNodeGuid, uint32 InNodeHash, const FTimestamp &InTimestamp)
Definition DataflowNodeParameters.cpp:523
DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnContextHasErrorMulticast, const FDataflowNode *Node, const FDataflowOutput *Output, const FString &Info)
DATAFLOWCORE_API bool IsAsyncEvaluating() const
Definition DataflowNodeParameters.cpp:198
virtual DATAFLOWCORE_API UObject * AddAsset(const FString &AssetPath, const UClass *AssetClass) override
Definition DataflowNodeParameters.cpp:676
const T * AsType() const
Definition DataflowNodeParameters.h:158
bool IsThreaded() const
Definition DataflowNodeParameters.h:177
DATAFLOWCORE_API void ClearNodesData()
Definition DataflowNodeParameters.cpp:458
virtual DATAFLOWCORE_API const TUniquePtr< FContextCacheElementBase > * FindCacheElement(FContextCacheKey InKey) const override
Definition DataflowNodeParameters.cpp:173
T * AsType()
Definition DataflowNodeParameters.h:168
virtual ~FContext()=default
DATAFLOWCORE_API int32 GetArraySizeFromData(const FContextCacheKey InKey) const
Definition DataflowNodeParameters.cpp:511
DATAFLOWCORE_API FContextPerfData::FData GetPerfDataForNode(const FDataflowNode &Node) const
Definition DataflowNodeParameters.cpp:268
FOnNodeBeginEvaluateMulticast OnNodeBeginEvaluateMulticast
Definition DataflowNodeParameters.h:331
DATAFLOWCORE_API void ResetPerfDataForNode(const FDataflowNode &Node)
Definition DataflowNodeParameters.cpp:289
virtual DATAFLOWCORE_API bool HasDataImpl(FContextCacheKey Key, FTimestamp InTimestamp=FTimestamp::Invalid) const
Definition DataflowNodeParameters.cpp:231
bool NodeHasError(const FDataflowNode *InNode)
Definition DataflowNodeParameters.h:324
DATAFLOWCORE_API FTimestamp GetTimestamp(FContextCacheKey Key) const
Definition DataflowNodeParameters.cpp:249
Definition DataflowNodeParameters.h:94
void Unlock()
Definition DataflowNodeParameters.h:110
UE_NODISCARD_CTOR FScopedOptionalLock(FCriticalSection *InCriticalSection)
Definition DataflowNodeParameters.h:96
~FScopedOptionalLock()
Definition DataflowNodeParameters.h:105
Definition Object.h:95
Definition DataflowAnyType.cpp:10
uint32 FContextCacheKey
Definition DataflowContextCache.h:23
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition StructArrayView.h:398
Definition StructView.h:217
Definition DataflowConnection.h:131
Definition DataflowNode.h:52
Definition DataflowInputOutput.h:149
Definition Guid.h:109
UE::Core::Private::Decay::TDecayNonReference< typenameTRemoveReference< T >::Type >::Type Type
Definition Decay.h:45
Definition Array.h:4015
Definition DataflowContextAssetStore.h:50
Definition DataflowContextCache.h:65
Definition DataflowContextCache.h:591
Definition DataflowNodeParameters.h:79
uint64 ExternalTime
Definition DataflowNodeParameters.h:82
uint64 StartTime
Definition DataflowNodeParameters.h:81
bool operator==(const FDataflowConnection *OtherConnection) const
Definition DataflowNodeParameters.h:84
const FDataflowConnection * Connection
Definition DataflowNodeParameters.h:80
Definition DataflowNodeParameters.h:69
int32 Num() const
Definition DataflowNodeParameters.cpp:89
const FDataflowConnection * Top() const
Definition DataflowNodeParameters.cpp:80
void Pop(const FDataflowConnection *Connection, uint64 &OutTotalTime, uint64 &OutExternalTime)
Definition DataflowNodeParameters.cpp:61
TArray< FEntry > Callstack
Definition DataflowNodeParameters.h:89
bool Contains(const FDataflowConnection *Connection) const
Definition DataflowNodeParameters.cpp:99
const FDataflowConnection * operator[](int32 Index)
Definition DataflowNodeParameters.cpp:94
void Push(const FDataflowConnection *Connection)
Definition DataflowNodeParameters.cpp:50
Definition DataflowContextEvaluator.h:27
Definition DataflowNodeParameters.h:52
int32 NumCalls
Definition DataflowNodeParameters.h:55
float InclusiveTimeMs
Definition DataflowNodeParameters.h:53
float ExclusiveTimeMs
Definition DataflowNodeParameters.h:54
FTimestamp LastTimestamp
Definition DataflowNodeParameters.h:56
Definition DataflowNodeParameters.h:46
TMap< FGuid, FData > DataPerOutput
Definition DataflowNodeParameters.h:58
void Reset()
Definition DataflowNodeParameters.cpp:18
bool bEnabled
Definition DataflowNodeParameters.h:59
Definition DataflowNodeParameters.h:368
bool IsLoopDetected() const
Definition DataflowNodeParameters.h:373
DATAFLOWCORE_API ~FContextScopedCallstack()
Definition DataflowNodeParameters.cpp:484
Definition DataflowContextCache.h:640
Definition DataflowNodeParameters.h:25
FName ViewMode
Definition DataflowNodeParameters.h:37
FRenderingParameter(FString InRenderName, FName InTypeName, const TArray< FName > &InOutputs, const FName &InViewMode=FName("3DView"))
Definition DataflowNodeParameters.h:27
FName Type
Definition DataflowNodeParameters.h:35
FString Name
Definition DataflowNodeParameters.h:34
FRenderingParameter(FString InRenderName, FName InTypeName, TArray< FName > &&InOutputs, const FName &InViewMode=FName("3DView"))
Definition DataflowNodeParameters.h:29
FRenderingParameter()
Definition DataflowNodeParameters.h:26
TArray< FName > Outputs
Definition DataflowNodeParameters.h:36
bool operator==(const FRenderingParameter &Other) const =default
Definition DataflowContextCache.h:40
static DATAFLOWCORE_API Type Invalid
Definition DataflowContextCache.h:52
Definition DataflowContextAssetStore.h:15
Definition DataflowContextCache.h:56
Definition DataflowContextCache.h:35
Definition DataflowContextCache.h:28