UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DataflowInputOutput.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"
10#include "Async/Async.h"
11#include "HAL/CriticalSection.h"
12
13#include "DataflowInputOutput.generated.h"
14
15
16struct FDataflowOutput;
17
18//
19// Input
20//
21namespace UE::Dataflow
22{
29
38}
39
40USTRUCT()
42{
44
46
48
49 FDataflowOutput* Connection = nullptr ;
50
53 virtual void FixAndPropagateType(FName InType) override;
54
56 // if the Input has DATAFLOW_INTRINSIC metatag specified
57 bool bIsRequired = false;
58
59public:
60 UE_DEPRECATED(5.5, "Deprecated constructor : Guid is now passed through FInputParameters")
61 DATAFLOWCORE_API FDataflowInput(const UE::Dataflow::FInputParameters& Param, FGuid InGuid);
62
63 DATAFLOWCORE_API FDataflowInput(const UE::Dataflow::FInputParameters& Param = {});
64
65 virtual bool IsConnected() const override;
66 virtual bool AddConnection(FDataflowConnection* InOutput) override;
67 virtual bool RemoveConnection(FDataflowConnection* InOutput) override;
68
69 virtual void GetConnections(TArray<FDataflowConnection*>& OutConnections) const override;
70
71 FDataflowOutput* GetConnection() { return Connection; }
72 const FDataflowOutput* GetConnection() const { return Connection; }
73 bool HasAnyConnections() const { return Connection != nullptr; }
74
75 virtual TArray< FDataflowOutput* > GetConnectedOutputs();
76 virtual const TArray< const FDataflowOutput* > GetConnectedOutputs() const;
77
82 template<class T>
83 const T& GetValue(UE::Dataflow::FContext& Context, const T& Default) const;
84
85 template<typename TAnyType UE_REQUIRES(!std::is_same_v<typename TAnyType::FStorageType, void>)>
86 typename TAnyType::FStorageType GetValueFromAnyType(UE::Dataflow::FContext& Context, const typename TAnyType::FStorageType& Default) const;
87
88 template<typename TAnyType UE_REQUIRES(std::is_same_v<typename TAnyType::FStorageType, void>)>
89 typename UE::Dataflow::FContextValue GetValueFromAnyType(UE::Dataflow::FContext& Context) const;
90
95 DATAFLOWCORE_API void PullValue(UE::Dataflow::FContext& Context) const;
96
97 template<class T>
98 TFuture<const T&> GetValueParallel(UE::Dataflow::FContext& Context, const T& Default) const;
99
101
102 bool IsRequired() const { return bIsRequired; }
103 void SetIsRequired(const bool bInIsRequired) { bIsRequired = bInIsRequired; }
104};
105
106USTRUCT()
108{
110
111private:
112 int32 Index;
113 uint32 ElementOffset; // Offset to Property inside an array element
114 const FArrayProperty* ArrayProperty = nullptr;
115 // uint32 Offset; // On base class. This is the Offset to ArrayProperty from OwningNode.
116
117public:
119
120 DATAFLOWCORE_API virtual void* RealAddress() const override;
121 virtual int32 GetContainerIndex() const override { return Index; }
122 virtual uint32 GetContainerElementOffset() const override { return ElementOffset; }
123};
124
125//
126// Output
127//
128namespace UE::Dataflow
129{
136
145}
146
147USTRUCT()
149{
151
153
154 TArray< FDataflowInput* > Connections;
155
156 UE_DEPRECATED(5.5, "Use PassthroughKey instead")
157 uint32 PassthroughOffset = INDEX_NONE;
158
159 UE::Dataflow::FConnectionKey PassthroughKey;
160
163 virtual void FixAndPropagateType(FName InType) override;
164
165public:
167
169
170 UE_DEPRECATED(5.5, "Deprecated constructor : Guid is now passed through FOutputParameters")
171 DATAFLOWCORE_API FDataflowOutput(const UE::Dataflow::FOutputParameters& Param, FGuid InGuid);
172
173 DATAFLOWCORE_API FDataflowOutput(const UE::Dataflow::FOutputParameters& Param = {});
174
176 ~FDataflowOutput() = default;
182
184 DATAFLOWCORE_API const TArray<FDataflowInput*>& GetConnections() const;
185 bool HasAnyConnections() const { return !Connections.IsEmpty(); }
186 virtual bool IsConnected() const override { return HasAnyConnections(); }
187
188 DATAFLOWCORE_API virtual TArray<FDataflowInput*> GetConnectedInputs();
189 DATAFLOWCORE_API virtual const TArray<const FDataflowInput*> GetConnectedInputs() const;
190
191 DATAFLOWCORE_API virtual bool AddConnection(FDataflowConnection* InOutput) override;
192
193 DATAFLOWCORE_API virtual bool RemoveConnection(FDataflowConnection* InInput) override;
194
195 virtual void GetConnections(TArray<FDataflowConnection*>& OutConnections) const override;
196
197 UE_DEPRECATED(5.5, "Use SetPassthroughInput instead")
198 virtual void SetPassthroughOffset(const uint32 InPassthroughOffset)
199 {
201 }
202
203 DATAFLOWCORE_API FDataflowOutput& SetPassthroughInput(const UE::Dataflow::FConnectionReference& Reference);
204 DATAFLOWCORE_API FDataflowOutput& SetPassthroughInput(const UE::Dataflow::FConnectionKey& Key);
205
206 DATAFLOWCORE_API const FDataflowInput* GetPassthroughInput() const;
207
208 virtual void* GetPassthroughRealAddress() const
209 {
210 if(const FDataflowInput* const PassthroughInput = GetPassthroughInput())
211 {
212 return PassthroughInput->RealAddress();
213 }
214 return nullptr;
215 }
216
217 template<class T>
219 {
220 if (Property)
221 {
222 Context.SetData(CacheKey(), Property, Forward<T>(InVal), GetOwningNodeGuid(), GetOwningNodeValueHash(), GetOwningNodeTimestamp());
223 }
224 }
225
227 {
228 if (Property)
229 {
230 Context.SetDataFromStructView(CacheKey(), Property, StructView, GetOwningNodeGuid(), GetOwningNodeValueHash(), GetOwningNodeTimestamp());
231 }
232 }
233
235 {
236 if (Property)
237 {
238 Context.SetDataFromStructArrayView(CacheKey(), Property, StructArrayView, GetOwningNodeGuid(), GetOwningNodeValueHash(), GetOwningNodeTimestamp());
239 }
240 }
241
242 template<typename TAnyType>
243 void SetValueFromAnyType(const typename TAnyType::FStorageType& InVal, UE::Dataflow::FContext& Context) const
244 {
245 TAnyType::FPolicyType::VisitPolicyByType(GetType(),
246 [this, &Context, &InVal](auto SingleTypePolicy)
247 {
248 using FSingleType = typename decltype(SingleTypePolicy)::FType;
249 FSingleType ValueToSet{};
251
252 Context.SetData(CacheKey(), GetProperty(), Forward<FSingleType>(ValueToSet), GetOwningNodeGuid(), GetOwningNodeValueHash(), GetOwningNodeTimestamp());
253 });
254 }
255
257 DATAFLOWCORE_API void SetNullValue(UE::Dataflow::FContext& Context) const;
258
259 /*
260 * Read value returns the cache value on the output without causing an evaluation of the corresponding node
261 * as a result it does not cause a cascading evaluation of the graph
262 * if there's no cached value this will return the default value passed as a parameter
263 * @see GetValue
264 */
265 template<class T, typename = std::enable_if_t<!std::is_base_of_v<FDataflowAnyType, T>>>
267 {
268 if (HasFrozenValue())
269 {
270 return GetFrozenValue(Default);
271 }
272 if (Context.HasData(CacheKey()))
273 {
274 return Context.GetData(CacheKey(), Property, Default);
275 }
276 return Default;
277 }
278
279 template<typename TAnyType, typename = std::enable_if_t<std::is_base_of_v<FDataflowAnyType, TAnyType>>>
280 typename TAnyType::FStorageType ReadValue(UE::Dataflow::FContext& Context, const typename TAnyType::FStorageType& Default) const
281 {
282 if (HasFrozenValue())
283 {
284 return GetFrozenValue(Default);
285 }
286 if (const TUniquePtr<UE::Dataflow::FContextCacheElementBase>* CacheEntry = Context.GetDataImpl(CacheKey()))
287 {
288 if (*CacheEntry)
289 {
290 typename TAnyType::FStorageType ReturnValue = Default;
291 TAnyType::FPolicyType::VisitPolicyByType(GetType(),
292 [this, &Context, &CacheEntry, &ReturnValue](auto SingleTypePolicy)
293 {
294 using FSingleType = typename decltype(SingleTypePolicy)::FType;
295 FSingleType Default{};
296 const FSingleType& CachedValue = (*CacheEntry)->GetTypedData<FSingleType>(Context, nullptr, Default);
298 });
299 return ReturnValue;
300 }
301 }
302 return Default;
303 }
304
305 /*
306 * Get most updated value of the output
307 * if the value is cache or frozen return it otherwise evaluates the node with potentially cascading evaluation of the graph
308 * @see GetValue
309 */
310 template<class T>
312 {
313 if (HasFrozenValue())
314 {
315 return GetFrozenValue(Default);
316 }
317 if (!this->Evaluate(Context))
318 {
319 Context.SetData(CacheKey(), Property, Default, GetOwningNodeGuid(), GetOwningNodeValueHash(), GetOwningNodeTimestamp());
320 }
321
322 if (Context.HasData(CacheKey()))
323 {
324 return Context.GetData(CacheKey(), Property, Default);
325 }
326
327 return Default;
328 }
329
331 template<class T>
332 const T& GetFrozenValue(const T& Default) const
333 {
334 return *(const T*)GetFrozenPropertyValue((const uint8*)&Default);
335 }
339 DATAFLOWCORE_API bool HasFrozenValue() const;
340
342 {
343 return Context.HasData(CacheKey(), GetOwningNodeTimestamp());
344 }
345
346 // there's no need for a templatized version as the parameter will not be used
347 // the method do check if the type of the input is the same as the output type though
349 DATAFLOWCORE_API void ForwardInput(const FDataflowInput* Input, UE::Dataflow::FContext& Context) const;
350
351 DATAFLOWCORE_API bool HasValidData(UE::Dataflow::FContext& Context) const;
352
353 DATAFLOWCORE_API bool EvaluateImpl(UE::Dataflow::FContext& Context) const;
354
355 DATAFLOWCORE_API bool Evaluate(UE::Dataflow::FContext& Context) const;
356
358
360
361 // Check if OwningNode has an error or it has failed, and if it does set the timestamp on the output(s) to FTimestamp::Invalid
362 DATAFLOWCORE_API bool HasNodeFailedOrErrored(UE::Dataflow::FContext& Context) const;
363
364private:
365 DATAFLOWCORE_API const uint8* GetFrozenPropertyValue(const uint8* Default) const;
366};
367
368template<>
370{
371 enum
372 {
373 WithCopy = false,
374 };
375};
376
377USTRUCT()
379{
381
382private:
383 int32 Index;
384 uint32 ElementOffset; // Offset to Property inside an array element
385 const FArrayProperty* ArrayProperty = nullptr;
386
387public:
389
390 DATAFLOWCORE_API virtual void* RealAddress() const override;
391 virtual int32 GetContainerIndex() const override { return Index; }
392 virtual uint32 GetContainerElementOffset() const override { return ElementOffset; }
393};
394
395template<>
397{
398 enum
399 {
400 WithCopy = false,
401 };
402};
403
404template<typename T>
406{
408 {
409 if (ConnectionOut->HasFrozenValue())
410 {
411 return ConnectionOut->GetFrozenValue(Default);
412 }
413 if (!ConnectionOut->Evaluate(Context))
414 {
416 }
417 if (Context.HasData(ConnectionOut->CacheKey()))
418 {
419 const T& Data = Context.GetData(ConnectionOut->CacheKey(), Property, Default);
420 return Data;
421 }
422 }
423 return Default;
424}
425
426template<typename TAnyType UE_REQUIRES(!std::is_same_v<typename TAnyType::FStorageType, void>)>
427typename TAnyType::FStorageType FDataflowInput::GetValueFromAnyType(UE::Dataflow::FContext& Context, const typename TAnyType::FStorageType& Default) const
428{
429 typename TAnyType::FStorageType ReturnValue = Default;
431 {
432 if (ConnectionOut->HasFrozenValue())
433 {
434 return ConnectionOut->GetFrozenValue(Default);
435 }
436 if (ConnectionOut->Evaluate(Context))
437 {
438 if (const TUniquePtr<UE::Dataflow::FContextCacheElementBase>* CacheEntry = Context.GetDataImpl(ConnectionOut->CacheKey()))
439 {
440 if (*CacheEntry)
441 {
442 TAnyType::FPolicyType::VisitPolicyByType(GetType(),
443 [this, &Context, &CacheEntry, &ReturnValue](auto SingleTypePolicy)
444 {
445 using FSingleType = typename decltype(SingleTypePolicy)::FType;
446 FSingleType Default{};
447 const FSingleType& CachedValue = (*CacheEntry)->GetTypedData<FSingleType>(Context, nullptr, Default);
449 });
450 }
451 }
452 }
453 }
454 return ReturnValue;
455}
456
457template<typename TAnyType UE_REQUIRES(std::is_same_v<typename TAnyType::FStorageType, void>)>
459{
462 {
463 if (ConnectionOut->HasFrozenValue())
464 {
465 //return ConnectionOut->GetFrozenValue(Default);
466 ensure(false); // unsupported because the frozen values are actually not in the cache, they should probably be
467 }
468 else if (ConnectionOut->Evaluate(Context))
469 {
470 CacheKey = ConnectionOut->CacheKey();
471 }
472 }
474}
475
476template<class T>
478{
479 return Async(EAsyncExecution::TaskGraph, [&]() -> const T& { return this->GetValue<T>(Context, Default); });
480}
481
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition UnrealType.h:3702
Definition NameTypes.h:617
Definition UnrealType.h:3087
Definition UnrealType.h:174
Definition Array.h:670
Definition Future.h:393
Definition SharedPointer.h:692
Definition UniquePtr.h:107
Definition DataflowConnection.h:91
Definition DataflowNodeParameters.h:134
Definition Array.h:3955
Definition DataflowAnyType.cpp:10
uint32 FContextCacheKey
Definition DataflowContextCache.h:23
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition StructArrayView.h:398
Definition StructView.h:217
Definition DataflowInputOutput.h:108
virtual uint32 GetContainerElementOffset() const override
Definition DataflowInputOutput.h:122
virtual int32 GetContainerIndex() const override
Definition DataflowInputOutput.h:121
Definition DataflowInputOutput.h:379
virtual int32 GetContainerIndex() const override
Definition DataflowInputOutput.h:391
virtual uint32 GetContainerElementOffset() const override
Definition DataflowInputOutput.h:392
Definition DataflowConnection.h:131
FName GetType() const
Definition DataflowConnection.h:238
DATAFLOWCORE_API FGuid GetOwningNodeGuid() const
Definition DataflowConnection.cpp:84
const FProperty * Property
Definition DataflowConnection.h:136
UE::Dataflow::FContextCacheKey CacheKey() const
Definition DataflowConnection.h:254
DATAFLOWCORE_API uint32 GetOwningNodeValueHash() const
Definition DataflowConnection.cpp:94
DATAFLOWCORE_API UE::Dataflow::FTimestamp GetOwningNodeTimestamp() const
Definition DataflowConnection.cpp:89
static void To(const T &From, TToType &To)
Definition DataflowTypePolicy.h:411
static void From(const TFromType &From, T &To)
Definition DataflowTypePolicy.h:408
Definition DataflowInputOutput.h:42
void SetIsRequired(const bool bInIsRequired)
Definition DataflowInputOutput.h:103
bool HasAnyConnections() const
Definition DataflowInputOutput.h:73
TFuture< const T & > GetValueParallel(UE::Dataflow::FContext &Context, const T &Default) const
Definition DataflowInputOutput.h:477
TAnyType::FStorageType GetValueFromAnyType(UE::Dataflow::FContext &Context, const typename TAnyType::FStorageType &Default) const
Definition DataflowInputOutput.h:427
bool IsRequired() const
Definition DataflowInputOutput.h:102
FDataflowOutput * GetConnection()
Definition DataflowInputOutput.h:71
const FDataflowOutput * GetConnection() const
Definition DataflowInputOutput.h:72
const T & GetValue(UE::Dataflow::FContext &Context, const T &Default) const
Definition DataflowInputOutput.h:405
Definition DataflowNode.h:52
Definition DataflowInputOutput.h:149
bool HasAnyConnections() const
Definition DataflowInputOutput.h:185
TAnyType::FStorageType ReadValue(UE::Dataflow::FContext &Context, const typename TAnyType::FStorageType &Default) const
Definition DataflowInputOutput.h:280
FDataflowOutput & operator=(FDataflowOutput &&)=delete
const T & GetFrozenValue(const T &Default) const
Definition DataflowInputOutput.h:332
FDataflowOutput(FDataflowOutput &&)=delete
PRAGMA_DISABLE_DEPRECATION_WARNINGS ~FDataflowOutput()=default
void SetValueFromStructView(const FConstStructView &StructView, UE::Dataflow::FContext &Context) const
Definition DataflowInputOutput.h:226
const T & GetValue(UE::Dataflow::FContext &Context, const T &Default) const
Definition DataflowInputOutput.h:311
const T & ReadValue(UE::Dataflow::FContext &Context, const T &Default) const
Definition DataflowInputOutput.h:266
FDataflowOutput & operator=(const FDataflowOutput &)=delete
virtual void * GetPassthroughRealAddress() const
Definition DataflowInputOutput.h:208
FDataflowOutput(const FDataflowOutput &)=delete
void SetValueFromAnyType(const typename TAnyType::FStorageType &InVal, UE::Dataflow::FContext &Context) const
Definition DataflowInputOutput.h:243
void SetValue(T &&InVal, UE::Dataflow::FContext &Context) const
Definition DataflowInputOutput.h:218
virtual bool IsConnected() const override
Definition DataflowInputOutput.h:186
void SetValueFromStructArrayView(const FConstStructArrayView &StructArrayView, UE::Dataflow::FContext &Context) const
Definition DataflowInputOutput.h:234
bool HasCachedValue(const UE::Dataflow::FContext &Context) const
Definition DataflowInputOutput.h:341
Definition Guid.h:109
static CORE_API FGuid NewGuid()
Definition Guid.cpp:236
Definition PropertyBag.h:418
Definition StructOpsTypeTraits.h:11
@ WithCopy
Definition StructOpsTypeTraits.h:17
Definition StructOpsTypeTraits.h:46
Definition DataflowInputOutput.h:31
uint32 InnerOffset
Definition DataflowInputOutput.h:36
FArrayInputParameters()
Definition DataflowInputOutput.h:32
const FArrayProperty * ArrayProperty
Definition DataflowInputOutput.h:35
Definition DataflowInputOutput.h:138
FArrayOutputParameters()
Definition DataflowInputOutput.h:139
uint32 InnerOffset
Definition DataflowInputOutput.h:143
const FArrayProperty * ArrayProperty
Definition DataflowInputOutput.h:142
Definition DataflowConnection.h:48
Definition DataflowConnection.h:70
Definition DataflowContextCache.h:640
Definition DataflowInputOutput.h:24
FInputParameters(FName InType=NAME_None, FName InName=NAME_None, FDataflowNode *InOwner=nullptr, const FProperty *InProperty=nullptr, uint32 InOffset=INDEX_NONE, FGuid InGuid=FGuid::NewGuid())
Definition DataflowInputOutput.h:25
Definition DataflowInputOutput.h:131
FOutputParameters(FName InType=NAME_None, FName InName=NAME_None, FDataflowNode *InOwner=nullptr, const FProperty *InProperty=nullptr, uint32 InOffset=INDEX_NONE, FGuid InGuid=FGuid::NewGuid())
Definition DataflowInputOutput.h:132
Definition DataflowContextCache.h:40
static DATAFLOWCORE_API Type Current()
Definition DataflowNodeParameters.cpp:105