UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DataflowNode.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "ChaosLog.h"
6#include "CoreMinimal.h"
15
16#include "DataflowNode.generated.h"
17
18class UScriptStruct;
20
21namespace UE::Dataflow {
26 class FGraph;
27}
30
32USTRUCT()
37
47USTRUCT()
49#if CPP
51#endif
52{
55
56 friend class UE::Dataflow::FGraph;
58
59 UE_DEPRECATED(5.6, "Outputs type has changed and has been made private (see ExpandedOutputs)")
60 TMap< int, FDataflowOutput* > Outputs;
61
62 UE_DEPRECATED(5.7, "Will be made private in 5.9, use IsColorOverriden() instead.")
63 UPROPERTY(EditAnywhere, Category = "Dataflow", meta = (InlineEditConditionToggle, DisplayAfter = "bActive"))
64 bool bOverrideColor = false;
65
66 UE_DEPRECATED(5.7, "Will be made private in 5.9, use GetOverrideColor() instead.")
67 UPROPERTY(EditAnywhere, Category = "Dataflow", meta = (EditCondition="bOverrideColor"))
69
71 DATAFLOWCORE_API FDataflowNode(const UE::Dataflow::FNodeParameters& Param, FGuid InGuid = FGuid::NewGuid());
72
74 virtual ~FDataflowNode() { ClearInputs(); ClearOutputs(); }
76
77 // Warning: FDataflowNodes aren't actually safe to copy/move yet. These are here to disable deprecation warnings from the implicit operators that were getting created anyways.
78 // (Deleting the operators would require tagging all derived classes since this is a USTRUCT, so also not doing that here).
80 {
82 return *this;
83 }
84
85 FGuid GetGuid() const { return Guid; }
86 FName GetName() const { return Name; }
87 void SetName(FName InName) { Name = InName; }
88 UE::Dataflow::FTimestamp GetTimestamp() const { return LastModifiedTimestamp; }
89 DATAFLOWCORE_API uint32 GetValueHash();
90
91 static FName StaticType() { return FName("FDataflowNode"); }
92 virtual FName GetType() const { return StaticType(); }
93 virtual FName GetDisplayName() const { return ""; }
94 virtual FName GetCategory() const { return ""; }
95 virtual FString GetTags() const { return ""; }
96 DATAFLOWCORE_API virtual FString GetToolTip() const;
100 virtual TArray<UE::Dataflow::FRenderingParameter> GetRenderParameters() const { return GetRenderParametersImpl(); }
101 // Copy node property values from another node
102 UE_DEPRECATED(5.4, "FDataflowNode::CopyNodeProperties is deprecated.")
103 DATAFLOWCORE_API void CopyNodeProperties(const TSharedPtr<FDataflowNode> CopyFromDataflowNode);
104
105 UE_DEPRECATED(5.4, "FDataflowNode::IsDeprecated is deprecated.")
106 virtual bool IsDeprecated() { return false; }
107 UE_DEPRECATED(5.4, "FDataflowNode::IsExperimental is deprecated.")
108 virtual bool IsExperimental() { return false; }
109
111 virtual bool HasRenderCollectionPrimitives() const
112 {
113 return false;
114 }
115
116#if WITH_EDITOR
118 {
120 bool bNodeIsSelected = false;
121
123 bool bNodeIsPinned = false;
124
127 };
128
130 virtual bool CanDebugDraw() const
131 {
132 return false;
133 }
135 virtual bool CanDebugDrawViewMode(const FName& ViewModeName) const
136 {
137 return false;
138 }
140 virtual void DebugDraw(UE::Dataflow::FContext& Context,
143
144 virtual void OnDoubleClicked() const {};
145#endif
146
147 //
148 // Connections
149 //
150
152
159 virtual bool CanAddPin() const { return false; }
169 virtual void OnPinRemoved(const UE::Dataflow::FPin& Pin) {}
171 virtual bool CanRemovePin() const { return false; }
172
173
174 DATAFLOWCORE_API bool InputSupportsType(FName Name, FName Type) const;
175 DATAFLOWCORE_API bool OutputSupportsType(FName Name, FName Type) const;
176
177 DATAFLOWCORE_API virtual void AddInput(FDataflowInput* InPtr);
178 DATAFLOWCORE_API int32 GetNumInputs() const;
180 DATAFLOWCORE_API void ClearInputs();
181 DATAFLOWCORE_API bool HasHideableInputs() const;
182 DATAFLOWCORE_API bool HasHiddenInputs() const;
183
184 DATAFLOWCORE_API const FDataflowConnection* FindConnection(const UE::Dataflow::FConnectionKey& Key) const;
187
192 DATAFLOWCORE_API const FDataflowInput* FindInput(FName Name) const;
193 DATAFLOWCORE_API const FDataflowInput* FindInput(const UE::Dataflow::FConnectionKey& Key) const;
195 DATAFLOWCORE_API const FDataflowInput* FindInput(const UE::Dataflow::FConnectionReference& Reference) const;
196 DATAFLOWCORE_API const FDataflowInput* FindInput(const FGuid& InGuid) const;
197
198 DATAFLOWCORE_API virtual void AddOutput(FDataflowOutput* InPtr);
199 DATAFLOWCORE_API int NumOutputs() const;
201 DATAFLOWCORE_API void ClearOutputs();
202 DATAFLOWCORE_API bool HasHideableOutputs() const;
203 DATAFLOWCORE_API bool HasHiddenOutputs() const;
204
209 DATAFLOWCORE_API const FDataflowOutput* FindOutput(FName Name) const;
210 DATAFLOWCORE_API const FDataflowOutput* FindOutput(uint32 GuidHash) const;
211 DATAFLOWCORE_API const FDataflowOutput* FindOutput(const UE::Dataflow::FConnectionKey& Key) const;
212 DATAFLOWCORE_API const FDataflowOutput* FindOutput(const UE::Dataflow::FConnectionReference& Reference) const;
213 DATAFLOWCORE_API const FDataflowOutput* FindOutput(const FGuid& InGuid) const;
214
215 DATAFLOWCORE_API bool TryRenameInput(const UE::Dataflow::FConnectionReference& Reference, FName NewName);
216 DATAFLOWCORE_API bool TryRenameInput(FDataflowInput& InputToRename, FName NewName);
217 DATAFLOWCORE_API bool TryRenameOutput(const UE::Dataflow::FConnectionReference& Reference, FName NewName);
218 DATAFLOWCORE_API bool TryRenameOutput(FDataflowOutput& OutputToRename, FName NewName);
219
221 uint32 GetPropertyOffset(const FName& PropertyFullName) const;
222
228
231
233 virtual void Serialize(FArchive& Ar) {}
236 virtual void PostSerialize(const FArchive& Ar) {}
237
242
243 //
244 // Struct Support
245 //
246
247 virtual void SerializeInternal(FArchive& Ar) { check(false); }
248 virtual FStructOnScope* NewStructOnScope() { return nullptr; }
249 virtual const UScriptStruct* TypedScriptStruct() const { return nullptr; }
250
251 TUniquePtr<const FStructOnScope> NewStructOnScopeConst() const;
252
254 template<typename T>
256 {
257 FDataflowInput& Input = RegisterInputConnectionInternal(Reference, PropertyName);
258 if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
259 {
260 Input.SetTypePolicy(T::FPolicyType::GetInterface());
261 }
262 return Input;
263 }
264
265 template <typename T>
267 {
268 return RegisterInputConnection(UE::Dataflow::TConnectionReference<T>(Reference), PropertyName);
269 }
270
271 template <typename T>
273 {
274 FDataflowOutput& Output = RegisterOutputConnectionInternal(Reference, PropertyName);
275 if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
276 {
277 Output.SetTypePolicy(T::FPolicyType::GetInterface());
278 }
279
280 if (Passthrough.Reference != nullptr)
281 {
282 Output.SetPassthroughInput(Passthrough);
283 }
284 return Output;
285 }
286
287 template <typename T>
288 FDataflowOutput& RegisterOutputConnection(const T* Reference, const T* Passthrough = nullptr, const FName& PropertyName = NAME_None)
289 {
291 }
292
293 template <typename T>
294 UE_DEPRECATED(5.5, "PassthroughName is no longer needed to register output connections")
295 FDataflowOutput& RegisterOutputConnection(const T* Reference, const T* Passthrough, const FName& PropertyName, const FName& PassthroughName)
296 {
298 }
299
300 template<typename T>
303 {
304 FDataflowInput& Input = RegisterInputArrayConnectionInternal(Reference, ElementPropertyName, ArrayPropertyName);
305 if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
306 {
307 Input.SetTypePolicy(T::FPolicyType::GetInterface());
308 }
309 return Input;
310 }
311
312 template<typename T>
315 {
316 if (FDataflowInput* const FoundInput = FindInput(Reference))
317 {
318 return *FoundInput;
319 }
320
321 FDataflowInput& Input = RegisterInputArrayConnectionInternal(Reference, ElementPropertyName, ArrayPropertyName);
322 if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
323 {
324 Input.SetTypePolicy(T::FPolicyType::GetInterface());
325 }
326 return Input;
327 }
328
329 template<typename T>
332 {
333 FDataflowOutput& Output = RegisterOutputArrayConnectionInternal(Reference, ElementPropertyName, ArrayPropertyName);
334 if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
335 {
336 Output.SetTypePolicy(T::FPolicyType::GetInterface());
337 }
338 return Output;
339 }
340
341 template<typename T>
344 {
345 if (FDataflowOutput* const FoundOutput = FindOutput(Reference))
346 {
347 return *FoundOutput;
348 }
349
350 FDataflowOutput& Output = RegisterOutputArrayConnectionInternal(Reference, ElementPropertyName, ArrayPropertyName);
351 if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
352 {
353 Output.SetTypePolicy(T::FPolicyType::GetInterface());
354 }
355 return Output;
356 }
357
360 {
361 UnregisterInputConnection(GetKeyFromReference(Reference));
362 }
363 DATAFLOWCORE_API void UnregisterInputConnection(const UE::Dataflow::FConnectionKey& Key);
365 DATAFLOWCORE_API void UnregisterPinConnection(const UE::Dataflow::FPin& Pin);
366
368 {
369 UnregisterOutputConnection(GetKeyFromReference(Reference));
370 }
371 DATAFLOWCORE_API void UnregisterOutputConnection(const UE::Dataflow::FConnectionKey& Key);
372
373 //
374 // Evaluation
375 //
376 virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput*) const { ensure(false); }
377
378 virtual bool EvaluateOnGameThreadOnly() const { return false; }
379
385 bool IsFrozen() const
386 {
387 return bIsFrozen;
388 }
391 {
392 return FrozenProperties;
393 }
394
395 bool IsColorOverriden() const
396 {
397PRAGMA_DISABLE_DEPRECATION_WARNINGS // UE_DEPRECATED(5.7, "Will be made private in 5.9, use IsColorOverriden() instead.")
398 return bOverrideColor;
400 }
401
403 {
404PRAGMA_DISABLE_DEPRECATION_WARNINGS // UE_DEPRECATED(5.7, "Will be made private in 5.9, use GetOverrideColor() instead.")
405 return OverrideColor;
407 }
408
413 {
414 return GET_MEMBER_NAME_CHECKED(FDataflowNode, bActive);
415 }
416
421 DATAFLOWCORE_API bool IsActive(bool bCheckFlagOnly = false) const;
422
433 template<class T UE_REQUIRES(!std::is_base_of_v<FDataflowAnyType, T>)>
435 {
436 checkSlow(FindInput(Reference));
437 return FindInput(Reference)->template GetValue<T>(Context, *static_cast<const T*>(Reference.Reference));
438 }
439
440 template<typename TAnyType UE_REQUIRES(std::is_base_of_v<FDataflowAnyType, TAnyType> && !std::is_same_v<typename TAnyType::FStorageType, void>)>
441 typename TAnyType::FStorageType GetValue(UE::Dataflow::FContext& Context, const UE::Dataflow::TConnectionReference<TAnyType>& Reference) const
442 {
443 checkSlow(Reference.Reference && FindInput(Reference));
444 return FindInput(Reference)->template GetValueFromAnyType<TAnyType>(Context, static_cast<const TAnyType*>(Reference.Reference)->Value);
445 }
446
447 template<typename TAnyType UE_REQUIRES(std::is_base_of_v<FDataflowAnyType, TAnyType> && std::is_same_v<typename TAnyType::FStorageType, void>)>
449 {
450 checkSlow(Reference.Reference && FindInput(Reference));
451 return FindInput(Reference)->template GetValueFromAnyType<TAnyType>(Context);
452 }
453
454 template<class T UE_REQUIRES(!std::is_base_of_v<FDataflowAnyType, T>)>
455 const T& GetValue(UE::Dataflow::FContext& Context, const T* Reference) const
456 {
457 return GetValue(Context, UE::Dataflow::TConnectionReference<T>(Reference));
458 }
459
460 template<typename TAnyType UE_REQUIRES(std::is_base_of_v<FDataflowAnyType, TAnyType> && !std::is_same_v<typename TAnyType::FStorageType, void>)>
461 typename TAnyType::FStorageType GetValue(UE::Dataflow::FContext& Context, const TAnyType* Reference) const
462 {
463 return GetValue(Context, UE::Dataflow::TConnectionReference<TAnyType>(Reference));
464 }
465
466 template<typename TAnyType UE_REQUIRES(std::is_base_of_v<FDataflowAnyType, TAnyType> && std::is_same_v<typename TAnyType::FStorageType, void>)>
468 {
469 return GetValue(Context, UE::Dataflow::TConnectionReference<TAnyType>(Reference));
470 }
471
472 template<class T>
474 {
475 checkSlow(FindInput(Reference));
476 return FindInput(Reference)->template GetValueParallel<T>(Context, *static_cast<const T*>(Reference.Reference));
477 }
478
479 template<class T>
481 {
482 return GetValueParallel(Context, UE::Dataflow::TConnectionReference<T>(Reference));
483 }
484
495 template<class T> const T& GetValue(UE::Dataflow::FContext& Context, const UE::Dataflow::TConnectionReference<T>& Reference, const T& Default) const
496 {
497 checkSlow(FindInput(Reference));
498 return FindInput(Reference)->template GetValue<T>(Context, Default);
499 }
500
501 template<class T> const T& GetValue(UE::Dataflow::FContext& Context, const T* Reference, const T& Default) const
502 {
503 return GetValue(Context, UE::Dataflow::TConnectionReference<T>(Reference), Default);
504 }
505
506 template<class T> const T& GetOutputValue(UE::Dataflow::FContext& Context, const T* Reference, const T& Default) const
507 {
508 if (const FDataflowOutput* Output = FindOutput(Reference))
509 {
510 return Output->GetValue(Context, Default);
511 }
512 return Default;
513 }
514
530 template<class T, class U UE_REQUIRES(!std::is_base_of_v<FDataflowAnyType, U>)>
531 void SetValue(UE::Dataflow::FContext& Context, T&& Value, const U* Reference) const
532 {
533 using FInValueType = typename TDecay<decltype(Value)>::Type;
534 using FInReferenceType = typename TDecay<decltype(*Reference)>::Type;
535 static_assert(std::is_same_v<FInValueType, FInReferenceType>);
536 if (const FDataflowOutput* Output = FindOutput(Reference))
537 {
539 }
540 else
541 {
542 ensureMsgf(false, TEXT("This output could not be found within this node, check this has been properly registered in the node constructor"));
543 }
544 }
545
546 template<typename TAnyType UE_REQUIRES(std::is_base_of_v<FDataflowAnyType, TAnyType> && !std::is_same_v<typename TAnyType::FStorageType, void>)>
547 void SetValue(UE::Dataflow::FContext& Context, const typename TAnyType::FStorageType& Value, const TAnyType* Reference) const
548 {
549 if (const FDataflowOutput* Output = FindOutput(Reference))
550 {
552 }
553 else
554 {
555 ensureMsgf(false, TEXT("This output could not be found within this node, check this has been properly registered in the node constructor"));
556 }
557 }
558
559 template<typename TAnyType UE_REQUIRES(std::is_base_of_v<FDataflowAnyType, TAnyType> && std::is_same_v<typename TAnyType::FStorageType, void>)>
561 {
562 if (const FDataflowOutput* Output = FindOutput(Reference))
563 {
565 }
566 else
567 {
568 ensureMsgf(false, TEXT("This output could not be found within this node, check this has been properly registered in the node constructor"));
569 }
570 }
571
572 void SetError(UE::Dataflow::FContext& Context, const void* Reference, const FString& InError) const
573 {
574 Context.Error(InError, this, FindOutput(Reference));
575 }
576
591
603 template<class T>
605 {
606 if (IsConnected(InputReference))
607 {
609 }
610 else if constexpr (std::is_base_of_v<FDataflowAnyType, T>)
611 {
612 SetValue(Context, static_cast<const T*>(InputReference.Reference)->Value, Reference);
613 }
614 else
615 {
616 SetValue(Context, *static_cast<const T*>(InputReference.Reference), Reference);
617 }
618 }
619
625 UE_DEPRECATED(5.7, "Use UE::Dataflow::FContextValue from calling GetValue on the node to access the same functionality")
626 DATAFLOWCORE_API void SetArraySizeFromInput(UE::Dataflow::FContext& Context, const UE::Dataflow::FConnectionReference& InputReference, const int32* OutputReference) const;
627
633 UE_DEPRECATED(5.7, "Use UE::Dataflow::FContextValue from calling GetValue on the node to access the same functionality")
634 DATAFLOWCORE_API void SetArrayElementFromInput(UE::Dataflow::FContext& Context, const UE::Dataflow::FConnectionReference& InputReference, int32 Index, const void* OutputReference) const;
635
636 /*
637 * Go through all connections and execute a function
638 * Signature of the function is bool Function(FDataflowConnection* Connection)
639 */
641 void ForEachConnection(TFunction Function) const
642 {
644 {
645 if (Function(Elem.Value) == false)
646 {
647 return;
648 }
649 }
651 {
652 if (Function(Elem.Value) == false)
653 {
654 return;
655 }
656 }
657 }
658
667 {
668 checkSlow(FindInput(Reference));
669 return (FindInput(Reference)->GetConnection() != nullptr);
670 }
671
672 template<typename T>
673 bool IsConnected(const T* Reference) const
674 {
675 return IsConnected(UE::Dataflow::FConnectionReference(Reference));
676 }
677
679 {
680 if (!bPauseInvalidations)
681 {
682 bPauseInvalidations = true;
683 PausedModifiedTimestamp = UE::Dataflow::FTimestamp::Invalid;
684 }
685 }
686
688 {
689 if (bPauseInvalidations)
690 {
691 bPauseInvalidations = false;
692 Invalidate(PausedModifiedTimestamp);
693 }
694 }
695
697
698 virtual void OnInvalidate() {}
699
700 DATAFLOWCORE_API virtual bool ValidateConnections();
701
702 DATAFLOWCORE_API virtual void ValidateProperties();
703
704 // return true if the node supports a specific type of asset to be assign to it
705 virtual bool SupportsAssetProperty(UObject* Asset) const { return false; }
706
707 // Set an asset property on this node ( called when SupportsAssetProperty returns true )
708 virtual void SetAssetProperty(UObject* Asset) {};
709
710 // Called when UPROPERTY members of the dataflow node have been changed in the editor
712
713 // check if the node support dropped connections
714 virtual bool SupportsDropConnectionOnNode(FName TypeName, UE::Dataflow::FPin::EDirection Direction) const { return false; }
715
716 // called when a dragged pin is dropped on the node
717 // if the node creates a connection, returns its pointer
719
720 // Override when a property change musn't invalidate the node. Must return the base implementation when the property name isn't recognised.
721 DATAFLOWCORE_API virtual bool ShouldInvalidateOnPropertyChanged(const FPropertyChangedEvent& InPropertyChangedEvent) const;
722
723 // returns true to disable node properties in its detail view when the corresponding input is connected ( default is true )
724 virtual bool MakeConnectedPropertiesReadOnly() const { return true; }
725
726 // this method is called when the construction viewport render a specific output in the viewport
727 // this allow the node to be able to set extra properties on the component or set it up differently
729
730 bool HasValidConnections() const { return bHasValidConnections; }
731
732 virtual bool IsA(FName InType) const
733 {
734 return InType.ToString().Equals(StaticType().ToString());
735 }
736
737 template<class T>
738 const T* AsType() const
739 {
740 FName TargetType = T::StaticType();
741 if (IsA(TargetType))
742 {
743 return (T*)this;
744 }
745 return nullptr;
746 }
747
748 template<class T>
750 {
751 FName TargetType = T::StaticType();
752 if (IsA(TargetType))
753 {
754 return (T*)this;
755 }
756 return nullptr;
757 }
758
760 FOnNodeInvalidated& GetOnNodeInvalidatedDelegate() { return OnNodeInvalidatedDelegate; }
761
762 // returns true if the type was changed successfully
763 // only unset datatype connection will be set a new type
764 DATAFLOWCORE_API bool TrySetConnectionType(FDataflowConnection* Connection, FName NewType);
765
766 // Only used when forcing types on connection in order to make sure the node properly refreshes the rest of its connection accordingly if there's any dependencies between their types
767 DATAFLOWCORE_API void NotifyConnectionTypeChanged(FDataflowConnection* Connection);
768
769 // returns true if the input type was changed successfully
770 DATAFLOWCORE_API bool SetInputConcreteType(const UE::Dataflow::FConnectionReference& InputReference, FName NewType);
771
772 // returns true if the output type was changed successfully
773 DATAFLOWCORE_API bool SetOutputConcreteType(const UE::Dataflow::FConnectionReference& OutputReference, FName NewType);
774
776 DATAFLOWCORE_API bool IsAnytypeDependencyConnected(FName DependencyGroup, const FDataflowConnection* IgnoreConnection = nullptr) const;
777
778 bool IsAsyncEvaluating() const { return bIsAsyncEvaluating; }
779 void SetAsyncEvaluating(bool bValue) const { bIsAsyncEvaluating = bValue; }
780
781protected:
782 bool OnConnectionTypeChanged(const FDataflowConnection& Connection);
783
788 DATAFLOWCORE_API virtual FName GetDependentConnectionType(const FDataflowConnection& SourceConnection, const FDataflowConnection& DependentConnection) const;
789
790 UE_DEPRECATED(5.6, "Use inputs and outputs SetTypeDependencyGroup() to declare dependent types")
791 virtual bool OnInputTypeChanged(const FDataflowInput* Input) { return false; }
792
793 UE_DEPRECATED(5.6, "Use inputs and outputs SetTypeDependencyGroup() to declare dependent types")
794 virtual bool OnOutputTypeChanged(const FDataflowOutput* Output) { return false; }
795
796 template <typename T>
801
802 template <typename T>
807
813 DATAFLOWCORE_API bool SetConnectionConcreteType(const UE::Dataflow::FConnectionKey& ConnectionKey, FName NewType);
814
821 DATAFLOWCORE_API bool SetConnectionConcreteType(FDataflowConnection* Connection, FName NewType, FName InTypeDependencyGroup = NAME_None);
822
823 // returns true if any of the types was changed successfully
824 DATAFLOWCORE_API bool SetAllConnectionConcreteType(FName NewType);
825
826 DATAFLOWCORE_API FDataflowInput& RegisterInputConnectionInternal(const UE::Dataflow::FConnectionReference& Reference, const FName& PropertyName = NAME_None);
827 DATAFLOWCORE_API FDataflowOutput& RegisterOutputConnectionInternal(const UE::Dataflow::FConnectionReference& Reference, const FName& PropertyName = NAME_None);
828 DATAFLOWCORE_API FDataflowInput& RegisterInputArrayConnectionInternal(const UE::Dataflow::FConnectionReference& Reference, const FName& ElementPropertyName = NAME_None, const FName& ArrayPropertyName = NAME_None);
829 DATAFLOWCORE_API FDataflowOutput& RegisterOutputArrayConnectionInternal(const UE::Dataflow::FConnectionReference& Reference, const FName& ElementPropertyName = NAME_None, const FName& ArrayPropertyName = NAME_None);
830
831 DATAFLOWCORE_API TSharedPtr<UE::Dataflow::FGraph> GetDataflowGraph() const;
832
833private:
834
835 void InitConnectionParametersFromPropertyReference(const FStructOnScope& StructOnScope, const void* PropertyRef, const FName& PropertyName, UE::Dataflow::FConnectionParameters& OutParams);
836 // This will add [ContainerIndex] to any array it finds unless ContainerIndex == INDEX_NONE.
837 static FString GetPropertyFullNameString(const TConstArrayView<const FProperty*>& PropertyChain, int32 ContainerIndex = INDEX_NONE);
838 static FName GetPropertyFullName(const TArray<const FProperty*>& PropertyChain, int32 ContainerIndex = INDEX_NONE);
839 static FText GetPropertyDisplayNameText(const TArray<const FProperty*>& PropertyChain, int32 ContainerIndex = INDEX_NONE);
840 static FString StripContainerIndexFromPropertyFullName(const FString& PropertyFullName);
841 static uint32 GetPropertyOffset(const TArray<const FProperty*>& PropertyChain);
842 uint32 GetConnectionOffsetFromReference(const void* Reference) const;
843 DATAFLOWCORE_API UE::Dataflow::FConnectionKey GetKeyFromReference(const UE::Dataflow::FConnectionReference& Reference) const;
844
850 const FProperty* FindProperty(const UStruct* Struct, const void* Property, const FName& PropertyName, TArray<const FProperty*>* OutPropertyChain = nullptr) const;
851 const FProperty& FindPropertyChecked(const UStruct* Struct, const void* Property, const FName& PropertyName, TArray<const FProperty*>* OutPropertyChain = nullptr) const;
852
854 const FProperty* FindProperty(const UStruct* Struct, const FName& PropertyFullName, TArray<const FProperty*>* OutPropertyChain = nullptr) const;
855
856 virtual TArray<UE::Dataflow::FRenderingParameter> GetRenderParametersImpl() const { return TArray<UE::Dataflow::FRenderingParameter>(); }
857
858 FGuid Guid;
859 FName Name;
860 UE::Dataflow::FTimestamp LastModifiedTimestamp;
861
862 bool bHasValidConnections = true;
864 TMap<uint32, const FArrayProperty*> InputArrayProperties; // Used to calculate ContainerElementOffsets
865
867 TMap<uint32, const FArrayProperty*> OutputArrayProperties; // Used to calculate ContainerElementOffsets
868
869#if 0 // Disabled for 5.6
870#if WITH_EDITORONLY_DATA
871 // Freeze node customization
872 UPROPERTY(EditAnywhere, Category = "Dataflow")
874#endif
875#endif
876
877 UPROPERTY(EditAnywhere, Category = "Dataflow")
878 bool bActive = true;
879
880
881 UPROPERTY()
882 FInstancedPropertyBag FrozenProperties; // Property bag for frozen outputs
883
884 UPROPERTY()
885 bool bIsFrozen = false;
886
887 TWeakPtr<UE::Dataflow::FGraph> WeakDataflowGraph;
888
889 mutable TAtomic<bool> bIsAsyncEvaluating = false;
890
892 bool bPauseInvalidations = false;
893 UE::Dataflow::FTimestamp PausedModifiedTimestamp = UE::Dataflow::FTimestamp::Invalid; // When unpausing invalidations, Invalidate will be called with this timestamp.
894 FOnNodeInvalidated OnNodeInvalidatedDelegate;
895
896};
897
898namespace UE::Dataflow
899{
900
902{
903public:
905 :Node(InNode)
906 {
907 if (Node)
908 {
909 Node->PauseInvalidations();
910 }
911 }
912
914 {
915 if (Node)
916 {
917 Node->ResumeInvalidations();
918 }
919 }
920
924private:
925 FDataflowNode* Node;
926};
927
928 //
929 // Use these macros to register dataflow nodes.
930 //
931
932#define DATAFLOW_NODE_REGISTER_CREATION_FACTORY(A) \
933 ::UE::Dataflow::FNodeFactory::RegisterNodeFromType<A>();
934
935#define DATAFLOW_NODE_RENDER_TYPE(A, B, ...) \
936 virtual TArray<::UE::Dataflow::FRenderingParameter> GetRenderParametersImpl() const { \
937 TArray<::UE::Dataflow::FRenderingParameter> Array; \
938 Array.Add({ A, B, {__VA_ARGS__,} }); \
939 return Array;}
940
941#define DATAFLOW_NODE_RENDER_TYPE_START() \
942 virtual TArray<::UE::Dataflow::FRenderingParameter> GetRenderParametersImpl() const { \
943 TArray<::UE::Dataflow::FRenderingParameter> Array;
944
945#define DATAFLOW_NODE_RENDER_TYPE_ADD(A, B, ...) \
946 Array.Add({ A, B, {__VA_ARGS__,} });
947
948#define DATAFLOW_NODE_RENDER_TYPE_END() \
949 return Array;}
950
951#define DATAFLOW_NODE_DEFINE_INTERNAL(TYPE, DISPLAY_NAME, CATEGORY, TAGS) \
952public: \
953 static FName StaticType() {return #TYPE;} \
954 static const char* StaticDisplay() {return DISPLAY_NAME;} \
955 static const char* StaticCategory() {return CATEGORY;} \
956 static FString StaticTags() {return TAGS;} \
957 static FString StaticToolTip() {return FString("Create a dataflow node.");} \
958 virtual FName GetType() const { return #TYPE; } \
959 virtual bool IsA(FName InType) const override \
960 { return InType.ToString().Equals(StaticType().ToString()) || Super::IsA(InType); } \
961 virtual FStructOnScope* NewStructOnScope() override { \
962 return new FStructOnScope(TYPE::StaticStruct(), (uint8*)this);} \
963 virtual void SerializeInternal(FArchive& Ar) override { \
964 UScriptStruct* const Struct = TYPE::StaticStruct(); \
965 Struct->SerializeTaggedProperties(Ar, (uint8*)this, Struct, nullptr); \
966 Serialize(Ar); \
967 PostSerialize(Ar);} \
968 virtual FName GetDisplayName() const override { return TYPE::StaticDisplay(); } \
969 virtual FName GetCategory() const override { return TYPE::StaticCategory(); } \
970 virtual FString GetTags() const override { return TYPE::StaticTags(); } \
971 virtual const UScriptStruct* TypedScriptStruct() const override \
972 {return TYPE::StaticStruct();} \
973 TYPE() {} \
974private:
975
976#define DATAFLOW_NODE_REGISTER_CREATION_FACTORY_NODE_COLORS_BY_CATEGORY(A, C1, C2) \
977{ \
978 ::UE::Dataflow::FNodeColorsRegistry::Get().RegisterNodeColors(A, {C1, C2}); \
979} \
980
981#define DATAFLOW_NODE_REGISTER_CREATION_FACTORY_PIN_SETTINGS_BY_TYPE(A, C, T) \
982{ \
983 ::UE::Dataflow::FPinSettingsRegistry::Get().RegisterPinSettings(A, {C, T}); \
984} \
985
986#define DATAFLOW_NODE_REGISTER_GETTER_FOR_ASSET(ASSETTYPE, NODETYPE) \
987 ::UE::Dataflow::FNodeFactory::GetInstance()->RegisterGetterNodeForAssetType(ASSETTYPE::StaticClass()->GetFName(), #NODETYPE);
988
989}
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define checkNoEntry()
Definition AssertionMacros.h:316
#define GET_MEMBER_NAME_CHECKED(ClassName, MemberName)
Definition AssertionMacros.h:493
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
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
return true
Definition ExternalRpcRegistry.cpp:601
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
const bool
Definition NetworkReplayStreaming.h:178
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition NameTypes.h:617
Definition UnrealType.h:3087
Definition UnrealType.h:174
Definition StructOnScope.h:13
Definition Text.h:385
Definition DataflowDebugDrawInterface.h:23
Definition Array.h:670
Definition Atomic.h:538
Definition AndroidPlatformMisc.h:14
Definition Future.h:393
Definition UnrealString.h.inl:34
Definition SharedPointer.h:1640
Definition SharedPointer.h:692
Definition UniquePtr.h:107
Definition SharedPointer.h:1295
Definition DataflowConnection.h:91
Definition DataflowNodeParameters.h:134
FDataflowNodePauseInvalidationScope(const FDataflowNodePauseInvalidationScope &)=delete
FDataflowNodePauseInvalidationScope(FDataflowNode *InNode)
Definition DataflowNode.h:904
~FDataflowNodePauseInvalidationScope()
Definition DataflowNode.h:913
FDataflowNodePauseInvalidationScope(FDataflowNodePauseInvalidationScope &&)=delete
Definition DataflowGraph.h:71
Definition Object.h:95
Definition Class.h:1720
Definition Class.h:480
Definition Array.h:3955
Definition DataflowAnyType.cpp:10
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition DataflowElement.h:12
Definition DataflowConnection.h:131
Definition DataflowNode.h:34
Definition DataflowInputOutput.h:42
Definition DataflowNode.h:52
static DATAFLOWCORE_API const FName DataflowSkipConnection
Definition DataflowNode.h:227
virtual void PostSerialize(const FArchive &Ar)
Definition DataflowNode.h:236
virtual bool CanRemovePin() const
Definition DataflowNode.h:171
virtual bool EvaluateOnGameThreadOnly() const
Definition DataflowNode.h:378
DECLARE_MULTICAST_DELEGATE_OneParam(FOnNodeInvalidated, FDataflowNode *)
virtual const UScriptStruct * TypedScriptStruct() const
Definition DataflowNode.h:249
bool SetOutputConcreteType(const UE::Dataflow::FConnectionReference &OutputReference)
Definition DataflowNode.h:803
virtual FStructOnScope * NewStructOnScope()
Definition DataflowNode.h:248
bool IsConnected(const UE::Dataflow::FConnectionReference &Reference) const
Definition DataflowNode.h:666
virtual void OnPinRemoved(const UE::Dataflow::FPin &Pin)
Definition DataflowNode.h:169
virtual void OnPropertyChanged(UE::Dataflow::FContext &Context, const FPropertyChangedEvent &InPropertyChangedEvent)
Definition DataflowNode.h:711
FDataflowOutput & FindOrRegisterOutputArrayConnection(const UE::Dataflow::TConnectionReference< T > &Reference, const FName &ElementPropertyName=NAME_None, const FName &ArrayPropertyName=NAME_None)
Definition DataflowNode.h:342
FDataflowOutput & RegisterOutputConnection(const UE::Dataflow::TConnectionReference< T > &Reference, const UE::Dataflow::TConnectionReference< T > &Passthrough=UE::Dataflow::TConnectionReference< T >(nullptr), const FName &PropertyName=NAME_None)
Definition DataflowNode.h:272
const T & GetValue(UE::Dataflow::FContext &Context, const UE::Dataflow::TConnectionReference< T > &Reference, const T &Default) const
Definition DataflowNode.h:495
TFuture< const T & > GetValueParallel(UE::Dataflow::FContext &Context, const UE::Dataflow::TConnectionReference< T > &Reference) const
Definition DataflowNode.h:473
static DATAFLOWCORE_API const FName DataflowPassthrough
Definition DataflowNode.h:225
static DATAFLOWCORE_API const FLinearColor DefaultNodeBodyTintColor
Definition DataflowNode.h:230
void ResumeInvalidations()
Definition DataflowNode.h:687
UE::Dataflow::FTimestamp GetTimestamp() const
Definition DataflowNode.h:88
void PauseInvalidations()
Definition DataflowNode.h:678
virtual void SetAssetProperty(UObject *Asset)
Definition DataflowNode.h:708
virtual TArray< UE::Dataflow::FPin > GetPinsToRemove() const
Definition DataflowNode.h:161
const T & GetOutputValue(UE::Dataflow::FContext &Context, const T *Reference, const T &Default) const
Definition DataflowNode.h:506
virtual TArray< UE::Dataflow::FPin > AddPins()
Definition DataflowNode.h:154
FDataflowInput & RegisterInputConnection(const UE::Dataflow::TConnectionReference< T > &Reference, const FName &PropertyName=NAME_None)
Definition DataflowNode.h:255
virtual FName GetDisplayName() const
Definition DataflowNode.h:93
virtual void OnRenderOutput(UE::Dataflow::FContext &Context, const FName OutputName, const FName RenderGroup, const TArray< UPrimitiveComponent * > &RenderComponents) const
Definition DataflowNode.h:728
const T * AsType() const
Definition DataflowNode.h:738
PRAGMA_ENABLE_DEPRECATION_WARNINGS FDataflowNode & operator=(const FDataflowNode &Other)
Definition DataflowNode.h:79
void SetValue(UE::Dataflow::FContext &Context, T &&Value, const U *Reference) const
Definition DataflowNode.h:531
static DATAFLOWCORE_API const FLinearColor DefaultNodeTitleColor
Definition DataflowNode.h:229
TAnyType::FStorageType GetValue(UE::Dataflow::FContext &Context, const UE::Dataflow::TConnectionReference< TAnyType > &Reference) const
Definition DataflowNode.h:441
void SetError(UE::Dataflow::FContext &Context, const void *Reference, const FString &InError) const
Definition DataflowNode.h:572
virtual bool IsA(FName InType) const
Definition DataflowNode.h:732
void SetAsyncEvaluating(bool bValue) const
Definition DataflowNode.h:779
void SetName(FName InName)
Definition DataflowNode.h:87
static const FName GetActivePropertyName()
Definition DataflowNode.h:412
virtual bool CanAddPin() const
Definition DataflowNode.h:159
FDataflowOutput & RegisterOutputArrayConnection(const UE::Dataflow::TConnectionReference< T > &Reference, const FName &ElementPropertyName=NAME_None, const FName &ArrayPropertyName=NAME_None)
Definition DataflowNode.h:330
virtual bool SupportsDropConnectionOnNode(FName TypeName, UE::Dataflow::FPin::EDirection Direction) const
Definition DataflowNode.h:714
FGuid GetGuid() const
Definition DataflowNode.h:85
virtual FName GetType() const
Definition DataflowNode.h:92
const FLinearColor & GetOverrideColor() const
Definition DataflowNode.h:402
bool HasValidConnections() const
Definition DataflowNode.h:730
void SetValue(UE::Dataflow::FContext &Context, UE::Dataflow::FContextValue &&Value, const TAnyType *Reference) const
Definition DataflowNode.h:560
bool IsAsyncEvaluating() const
Definition DataflowNode.h:778
const T & GetValue(UE::Dataflow::FContext &Context, const T *Reference) const
Definition DataflowNode.h:455
virtual const FDataflowConnection * OnDropConnectionOnNode(const FDataflowConnection &DroppedConnection)
Definition DataflowNode.h:718
virtual bool MakeConnectedPropertiesReadOnly() const
Definition DataflowNode.h:724
virtual void Serialize(FArchive &Ar)
Definition DataflowNode.h:233
virtual FDataflowOutput * RedirectSerializedOutput(const FName &MissingOutputName)
Definition DataflowNode.h:241
bool SetInputConcreteType(const UE::Dataflow::FConnectionReference &InputReference)
Definition DataflowNode.h:797
bool IsConnected(const T *Reference) const
Definition DataflowNode.h:673
static DATAFLOWCORE_API const FName DataflowIntrinsic
Definition DataflowNode.h:226
virtual FDataflowInput * RedirectSerializedInput(const FName &MissingInputName)
Definition DataflowNode.h:239
FDataflowOutput & RegisterOutputConnection(const T *Reference, const T *Passthrough=nullptr, const FName &PropertyName=NAME_None)
Definition DataflowNode.h:288
const T & GetValue(UE::Dataflow::FContext &Context, const T *Reference, const T &Default) const
Definition DataflowNode.h:501
static FName StaticType()
Definition DataflowNode.h:91
TFuture< const T & > GetValueParallel(UE::Dataflow::FContext &Context, const T *Reference) const
Definition DataflowNode.h:480
FDataflowInput & RegisterInputConnection(const T *Reference, const FName &PropertyName=NAME_None)
Definition DataflowNode.h:266
UE::Dataflow::FContextValue GetValue(UE::Dataflow::FContext &Context, const TAnyType *Reference) const
Definition DataflowNode.h:467
virtual void Evaluate(UE::Dataflow::FContext &Context, const FDataflowOutput *) const
Definition DataflowNode.h:376
virtual bool HasRenderCollectionPrimitives() const
Definition DataflowNode.h:111
TAnyType::FStorageType GetValue(UE::Dataflow::FContext &Context, const TAnyType *Reference) const
Definition DataflowNode.h:461
void UnregisterOutputConnection(const UE::Dataflow::FConnectionReference &Reference)
Definition DataflowNode.h:367
virtual FName GetCategory() const
Definition DataflowNode.h:94
virtual TArray< UE::Dataflow::FRenderingParameter > GetRenderParameters() const
Definition DataflowNode.h:100
virtual void OnInvalidate()
Definition DataflowNode.h:698
virtual void SerializeInternal(FArchive &Ar)
Definition DataflowNode.h:247
static DATAFLOWCORE_API const FName DataflowInput
Definition DataflowNode.h:223
virtual FString GetTags() const
Definition DataflowNode.h:95
FName GetName() const
Definition DataflowNode.h:86
bool IsFrozen() const
Definition DataflowNode.h:385
void SafeForwardInput(UE::Dataflow::FContext &Context, const UE::Dataflow::FConnectionReference &InputReference, const T *Reference) const
Definition DataflowNode.h:604
UE::Dataflow::FContextValue GetValue(UE::Dataflow::FContext &Context, const UE::Dataflow::TConnectionReference< TAnyType > &Reference) const
Definition DataflowNode.h:448
void SetValue(UE::Dataflow::FContext &Context, const typename TAnyType::FStorageType &Value, const TAnyType *Reference) const
Definition DataflowNode.h:547
const T & GetValue(UE::Dataflow::FContext &Context, const UE::Dataflow::TConnectionReference< T > &Reference) const
Definition DataflowNode.h:434
virtual bool SupportsAssetProperty(UObject *Asset) const
Definition DataflowNode.h:705
static DATAFLOWCORE_API const FName DataflowOutput
Definition DataflowNode.h:224
void UnregisterInputConnection(const UE::Dataflow::FConnectionReference &Reference)
Definition DataflowNode.h:359
bool IsColorOverriden() const
Definition DataflowNode.h:395
const FInstancedPropertyBag & GetFrozenFroperties() const
Definition DataflowNode.h:390
FDataflowInput & FindOrRegisterInputArrayConnection(const UE::Dataflow::TConnectionReference< T > &Reference, const FName &ElementPropertyName=NAME_None, const FName &ArrayPropertyName=NAME_None)
Definition DataflowNode.h:313
FOnNodeInvalidated & GetOnNodeInvalidatedDelegate()
Definition DataflowNode.h:760
FDataflowInput & RegisterInputArrayConnection(const UE::Dataflow::TConnectionReference< T > &Reference, const FName &ElementPropertyName=NAME_None, const FName &ArrayPropertyName=NAME_None)
Definition DataflowNode.h:301
T * AsType()
Definition DataflowNode.h:749
Definition DataflowInputOutput.h:149
Definition Guid.h:109
Definition PropertyBag.h:418
Definition Color.h:48
Definition UnrealType.h:6865
Definition DataflowTypePolicy.h:16
Definition Decay.h:44
Definition Tuple.h:652
Definition DataflowConnection.h:48
Definition DataflowConnection.h:70
Definition DataflowContextCache.h:640
Definition DataflowNode.h:22
UObject * OwningObject
Definition DataflowNode.h:24
FName Name
Definition DataflowNode.h:23
Definition DataflowConnection.h:28
EDirection
Definition DataflowConnection.h:29
Definition DataflowContextCache.h:40
static DATAFLOWCORE_API Type Current()
Definition DataflowNodeParameters.cpp:105
static DATAFLOWCORE_API Type Invalid
Definition DataflowContextCache.h:52
Definition DataflowConnection.h:84