// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Dataflow/DataflowEngine.h" #include "GeometryCollection/ManagedArrayCollection.h" #include "DynamicMesh/DynamicMesh3.h" #include "UDynamicMesh.h" #include "Dataflow/DataflowSelection.h" #include "GeometryCollectionNodes.generated.h" class FGeometryCollection; class UStaticMesh; /** * * Description for this node * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FGetCollectionAssetDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FGetCollectionAssetDataflowNode, "GetCollectionAsset", "GeometryCollection", "") public: typedef FManagedArrayCollection DataType; UPROPERTY(meta = (DataflowOutput, DisplayName = "Collection")) mutable FManagedArrayCollection Output; FGetCollectionAssetDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Output); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FExampleCollectionEditDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FExampleCollectionEditDataflowNode, "ExampleCollectionEdit", "GeometryCollection", "") public: typedef FManagedArrayCollection DataType; /** Description for this parameter */ UPROPERTY(EditAnywhere, Category = "Dataflow", meta = (EditCondition = "false", EditConditionHides)); float Scale = 1.0; UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection")) FManagedArrayCollection Collection; FExampleCollectionEditDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Collection, &Collection); RegisterInputConnection(&Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT(meta = (DataflowGeometryCollection, DataflowTerminal)) struct FSetCollectionAssetDataflowNode : public FDataflowTerminalNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FSetCollectionAssetDataflowNode, "SetCollectionAsset", "Terminal", "") public: typedef FManagedArrayCollection DataType; UPROPERTY(meta = (DataflowInput)) FManagedArrayCollection Collection; FSetCollectionAssetDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowTerminalNode(InParam, InGuid) { RegisterInputConnection(&Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FAppendCollectionAssetsDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FAppendCollectionAssetsDataflowNode, "AppendCollections", "GeometryCollection", "") public: typedef FManagedArrayCollection DataType; UPROPERTY(meta = (DataflowInput, DataflowOutput, DisplayName = "Collection", DataflowPassthrough = "Collection1")) FManagedArrayCollection Collection1; UPROPERTY(meta = (DataflowInput, DisplayName = "Collection")) FManagedArrayCollection Collection2; FAppendCollectionAssetsDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection1); RegisterInputConnection(&Collection2); RegisterOutputConnection(&Collection1, &Collection1); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FResetGeometryCollectionDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FResetGeometryCollectionDataflowNode, "ResetGeometryCollection", "GeometryCollection", "") public: typedef FManagedArrayCollection DataType; UPROPERTY(meta = (DataflowOutput)) FManagedArrayCollection Collection; FResetGeometryCollectionDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FPrintStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FPrintStringDataflowNode, "PrintString", "Development", "") public: UPROPERTY(EditAnywhere, Category = "Print"); bool PrintToScreen = true; UPROPERTY(EditAnywhere, Category = "Print"); bool PrintToLog = true; UPROPERTY(EditAnywhere, Category = "Print"); FColor Color = FColor::White; UPROPERTY(EditAnywhere, Category = "Print"); float Duration = 2.f; UPROPERTY(EditAnywhere, Category = "Print", meta = (DataflowInput)); FString String = FString(""); FPrintStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FLogStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FLogStringDataflowNode, "LogString", "Development", "") public: UPROPERTY(EditAnywhere, Category = "Print"); bool PrintToLog = true; UPROPERTY(EditAnywhere, Category = "Print", meta = (DataflowInput)); FString String = FString(""); FLogStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FMakeLiteralStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakeLiteralStringDataflowNode, "MakeLiteralString", "Utilities|String", "") public: UPROPERTY(EditAnywhere, Category = "String"); FString Value = FString(""); UPROPERTY(meta = (DataflowOutput)) FString String; FMakeLiteralStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FBoundingBoxDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FBoundingBoxDataflowNode, "BoundingBox", "Utilities|Box", "") public: UPROPERTY(meta = (DataflowInput)) FManagedArrayCollection Collection; UPROPERTY(meta = (DataflowOutput)) FBox BoundingBox = FBox(ForceInit); FBoundingBoxDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterOutputConnection(&BoundingBox); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FExpandBoundingBoxDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FExpandBoundingBoxDataflowNode, "ExpandBoundingBox", "Utilities|Box", "") public: UPROPERTY(meta = (DataflowInput)) FBox BoundingBox = FBox(ForceInit);; UPROPERTY(meta = (DataflowOutput)) FVector Min = FVector(0.0); UPROPERTY(meta = (DataflowOutput)) FVector Max = FVector(0.0); UPROPERTY(meta = (DataflowOutput)) FVector Center = FVector(0.0); UPROPERTY(meta = (DataflowOutput)) FVector HalfExtents = FVector(0.0); UPROPERTY(meta = (DataflowOutput)) float Volume = 0.0; FExpandBoundingBoxDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&BoundingBox); RegisterOutputConnection(&Min); RegisterOutputConnection(&Max); RegisterOutputConnection(&Center); RegisterOutputConnection(&HalfExtents); RegisterOutputConnection(&Volume); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FVectorToStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FVectorToStringDataflowNode, "VectorToString", "Utilities|String", "") public: UPROPERTY(EditAnywhere, Category = "Vector", meta = (DataflowInput)) FVector Vector = FVector(0.0); UPROPERTY(meta = (DataflowOutput)) FString String = FString(""); FVectorToStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Vector); RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FFloatToStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FFloatToStringDataflowNode, "FloatToString", "Utilities|String", "") public: UPROPERTY(EditAnywhere, Category = "Float", meta = (DataflowInput)) float Float = 0.f; UPROPERTY(meta = (DataflowOutput)) FString String = FString(""); FFloatToStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Float); RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FMakePointsDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakePointsDataflowNode, "MakePoints", "Generators|Point", "") public: UPROPERTY(EditAnywhere, Category = "Point") TArray Point; UPROPERTY(meta = (DataflowOutput)) TArray Points; FMakePointsDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Points); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; UENUM(BlueprintType) enum class EMakeBoxDataTypeEnum : uint8 { Dataflow_MakeBox_DataType_MinMax UMETA(DisplayName = "Min/Max"), Dataflow_MakeBox_DataType_CenterSize UMETA(DisplayName = "Center/Size"), //~~~ //256th entry Dataflow_Max UMETA(Hidden) }; /** * * Description for this node * */ USTRUCT() struct FMakeBoxDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakeBoxDataflowNode, "MakeBox", "Generators|Box", "") public: UPROPERTY(EditAnywhere, Category = "Box", meta = (DisplayName = "Input Data Type")); EMakeBoxDataTypeEnum DataType = EMakeBoxDataTypeEnum::Dataflow_MakeBox_DataType_MinMax; UPROPERTY(EditAnywhere, Category = "Box", meta = (DataflowInput, EditCondition = "DataType == EMakeBoxDataTypeEnum::Dataflow_MakeBox_DataType_MinMax", EditConditionHides)); FVector Min = FVector(0.0); UPROPERTY(EditAnywhere, Category = "Box", meta = (DataflowInput, EditCondition = "DataType == EMakeBoxDataTypeEnum::Dataflow_MakeBox_DataType_MinMax", EditConditionHides)); FVector Max = FVector(0.0); UPROPERTY(EditAnywhere, Category = "Box", meta = (DataflowInput, EditCondition = "DataType == EMakeBoxDataTypeEnum::Dataflow_MakeBox_DataType_CenterSize", EditConditionHides)); FVector Center = FVector(0.0); UPROPERTY(EditAnywhere, Category = "Box", meta = (DataflowInput, EditCondition = "DataType == EMakeBoxDataTypeEnum::Dataflow_MakeBox_DataType_CenterSize", EditConditionHides)); FVector Size = FVector(0.0); UPROPERTY(meta = (DataflowOutput)); FBox Box = FBox(ForceInit); FMakeBoxDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Min); RegisterInputConnection(&Max); RegisterInputConnection(&Center); RegisterInputConnection(&Size); RegisterOutputConnection(&Box); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FMakeLiteralFloatDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakeLiteralFloatDataflowNode, "MakeLiteralFloat", "Math|Float", "") public: UPROPERTY(EditAnywhere, Category = "Float"); float Value = 0.f; UPROPERTY(meta = (DataflowOutput)) float Float = 0.f; FMakeLiteralFloatDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Float); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FMakeLiteralIntDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakeLiteralIntDataflowNode, "MakeLiteralInt", "Math|Int", "") public: UPROPERTY(EditAnywhere, Category = "Int"); int32 Value = 0; UPROPERTY(meta = (DataflowOutput, DisplayName = "Int")) int32 Int = 0; FMakeLiteralIntDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Int); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Description for this node * */ USTRUCT() struct FMakeLiteralBoolDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakeLiteralBoolDataflowNode, "MakeLiteralBool", "Math|Boolean", "") public: UPROPERTY(EditAnywhere, Category = "Bool"); bool Value = false; UPROPERTY(meta = (DataflowOutput)) bool Bool = false; FMakeLiteralBoolDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Bool); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Converts an integer to a float * */ USTRUCT() struct FMakeLiteralVectorDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMakeLiteralVectorDataflowNode, "MakeLiteralVector", "Math|Vector", "") public: UPROPERTY(EditAnywhere, Category = "Vector"); FVector Value = FVector(0.0); UPROPERTY(meta = (DataflowOutput, DisplayName = "Vector")) FVector Vector = FVector(0.0); FMakeLiteralVectorDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Vector); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Converts an Int to a String * */ USTRUCT() struct FIntToStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FIntToStringDataflowNode, "IntToString", "Utilities|String", "") public: UPROPERTY(EditAnywhere, Category = "Int", meta = (DataflowInput)) int32 Int = 0; UPROPERTY(meta = (DataflowOutput)) FString String = FString(""); FIntToStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Int); RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Converts a Bool to a String in a form of ("true", "false") * */ USTRUCT() struct FBoolToStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FBoolToStringDataflowNode, "BoolToString", "Utilities|String", "") public: UPROPERTY(EditAnywhere, Category = "Bool", meta = (DataflowInput)) bool Bool = false; UPROPERTY(meta = (DataflowOutput)) FString String = FString(""); FBoolToStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Bool); RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Expands a Vector into X, Y, Z components * */ USTRUCT() struct FExpandVectorDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FExpandVectorDataflowNode, "ExpandVector", "Utilities|Vector", "") public: UPROPERTY(meta = (DataflowInput)) FVector Vector = FVector(0.0); UPROPERTY(meta = (DataflowOutput)) float X = 0.f; UPROPERTY(meta = (DataflowOutput)) float Y = 0.f; UPROPERTY(meta = (DataflowOutput)) float Z = 0.f; FExpandVectorDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Vector); RegisterOutputConnection(&X); RegisterOutputConnection(&Y); RegisterOutputConnection(&Z); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Converts an Int to a Float * */ USTRUCT() struct FIntToFloatDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FIntToFloatDataflowNode, "IntToFloat", "Math|Conversions", "") public: UPROPERTY(EditAnywhere, Category = "Int", meta = (DataflowInput)) int32 Int = 0; UPROPERTY(meta = (DataflowOutput)) float Float = 0.f; FIntToFloatDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Int); RegisterOutputConnection(&Float); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Concatenates two strings together to make a new string * */ USTRUCT() struct FStringAppendDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FStringAppendDataflowNode, "StringAppend", "Utilities|String", "") public: UPROPERTY(EditAnywhere, Category = "String", meta = (DataflowInput)) FString String1 = FString(""); UPROPERTY(EditAnywhere, Category = "String", meta = (DataflowInput)) FString String2 = FString(""); UPROPERTY(meta = (DataflowOutput)) FString String = FString(""); FStringAppendDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&String1); RegisterInputConnection(&String2); RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Generates a random float * */ USTRUCT() struct FRandomFloatDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FRandomFloatDataflowNode, "RandomFloat", "Math|Random", "") public: UPROPERTY(EditAnywhere, Category = "Seed") bool Deterministic = false; UPROPERTY(EditAnywhere, Category = "Seed", meta = (DataflowInput, EditCondition = "Deterministic")) float RandomSeed = 0.f; UPROPERTY(meta = (DataflowOutput)) float Float = 0.f; FRandomFloatDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RandomSeed = FMath::FRandRange(-1e5, 1e5); RegisterInputConnection(&RandomSeed); RegisterOutputConnection(&Float); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Generates a random float between Min and Max * */ USTRUCT() struct FRandomFloatInRangeDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FRandomFloatInRangeDataflowNode, "RandomFloatInRange", "Math|Random", "") public: UPROPERTY(EditAnywhere, Category = "Seed") bool Deterministic = false; UPROPERTY(EditAnywhere, Category = "Seed", meta = (DataflowInput, EditCondition = "Deterministic")) float RandomSeed = 0.f; UPROPERTY(EditAnywhere, Category = "Random", meta = (DataflowInput)) float Min = 0.f; UPROPERTY(EditAnywhere, Category = "Random", meta = (DataflowInput)) float Max = 1.f; UPROPERTY(meta = (DataflowOutput)) float Float = 0.f; FRandomFloatInRangeDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RandomSeed = FMath::FRandRange(-1e5, 1e5); RegisterInputConnection(&RandomSeed); RegisterInputConnection(&Min); RegisterInputConnection(&Max); RegisterOutputConnection(&Float); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Returns a random vector with length of 1 * */ USTRUCT() struct FRandomUnitVectorDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FRandomUnitVectorDataflowNode, "RandomUnitVector", "Math|Random", "") public: UPROPERTY(EditAnywhere, Category = "Seed") bool Deterministic = false; UPROPERTY(EditAnywhere, Category = "Seed", meta = (DataflowInput, EditCondition = "Deterministic")) float RandomSeed = 0.f; UPROPERTY(meta = (DataflowOutput)) FVector Vector = FVector(0.0); FRandomUnitVectorDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RandomSeed = FMath::FRandRange(-1e5, 1e5); RegisterInputConnection(&RandomSeed); RegisterOutputConnection(&Vector); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Returns a random vector with length of 1, within the specified cone, with uniform random distribution * */ USTRUCT() struct FRandomUnitVectorInConeDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FRandomUnitVectorInConeDataflowNode, "RandomUnitVectorInCone", "Math|Random", "") public: UPROPERTY(EditAnywhere, Category = "Seed") bool Deterministic = false; UPROPERTY(EditAnywhere, Category = "Seed", meta = (DataflowInput, EditCondition = "Deterministic")) float RandomSeed = 0.f; /** The base "center" direction of the cone */ UPROPERTY(EditAnywhere, Category = "Random", meta = (DataflowInput)) FVector ConeDirection = FVector(0.0, 0.0, 1.0); /** The half-angle of the cone (from ConeDir to edge), in degrees */ UPROPERTY(EditAnywhere, Category = "Random", meta = (DataflowInput)) float ConeHalfAngle = PI / 4.f; UPROPERTY(meta = (DataflowOutput)) FVector Vector = FVector(0.0); FRandomUnitVectorInConeDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RandomSeed = FMath::FRandRange(-1e5, 1e5); RegisterInputConnection(&RandomSeed); RegisterInputConnection(&ConeDirection); RegisterInputConnection(&ConeHalfAngle); RegisterOutputConnection(&Vector); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Converts radians to degrees * */ USTRUCT() struct FRadiansToDegreesDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FRadiansToDegreesDataflowNode, "RadiansToDegrees", "Math|Trigonometry", "") public: UPROPERTY(EditAnywhere, Category = "Radians", meta = (DataflowInput)) float Radians = 0.f; UPROPERTY(meta = (DataflowOutput)) float Degrees = 0.f; FRadiansToDegreesDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Radians); RegisterOutputConnection(&Degrees); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Converts degrees to radians * */ USTRUCT() struct FDegreesToRadiansDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FDegreesToRadiansDataflowNode, "DegreesToRadians", "Math|Trigonometry", "") public: UPROPERTY(EditAnywhere, Category = "Degrees", meta = (DataflowInput)) float Degrees = 0.f; UPROPERTY(meta = (DataflowOutput)) float Radians = 0.f; FDegreesToRadiansDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Degrees); RegisterOutputConnection(&Radians); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * "Explodes" the pieces from the Collection for better visualization * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FExplodedViewDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FExplodedViewDataflowNode, "ExplodedView", "Fracture|Utilities", "") public: UPROPERTY(meta = (DataflowInput, DataflowOutput)) FManagedArrayCollection Collection; UPROPERTY(EditAnywhere, Category = "Scale", meta = (DataflowInput)) float UniformScale = 1.f; UPROPERTY(EditAnywhere, Category = "Scale", meta = (DataflowInput)) FVector Scale = FVector(1.0); FExplodedViewDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterInputConnection(&UniformScale); RegisterInputConnection(&Scale); RegisterOutputConnection(&Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; private: // todo(chaos) this is a copy of a function in FractureEditorModeToolkit, we should move this to a common place static bool GetValidGeoCenter(FGeometryCollection* Collection, const TManagedArray& TransformToGeometryIndex, const TArray& Transforms, const TManagedArray>& Children, const TManagedArray& BoundingBox, int32 TransformIndex, FVector& OutGeoCenter); }; /** * * Generates convex hull representation for the bones for simulation * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FCreateNonOverlappingConvexHullsDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FCreateNonOverlappingConvexHullsDataflowNode, "CreateNonOverlappingConvexHulls", "GeometryCollection|Utilities", "") public: UPROPERTY(meta = (DataflowInput, DataflowOutput)) FManagedArrayCollection Collection; UPROPERTY(EditAnywhere, Category = "Convex", meta = (DataflowInput, UIMin = 0.01f, UIMax = 1.f)) float CanRemoveFraction = 0.5f; UPROPERTY(EditAnywhere, Category = "Convex", meta = (DataflowInput, UIMin = 0.f)) float CanExceedFraction = 0.5f; UPROPERTY(EditAnywhere, Category = "Convex", meta = (DataflowInput, UIMin = 0.f)) float SimplificationDistanceThreshold = 10.f; FCreateNonOverlappingConvexHullsDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterInputConnection(&CanRemoveFraction); RegisterInputConnection(&CanExceedFraction); RegisterInputConnection(&SimplificationDistanceThreshold); RegisterOutputConnection(&Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Generates a hash value from a string * */ USTRUCT() struct FHashStringDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FHashStringDataflowNode, "HashString", "Utilities|String", "") public: /** String to hash */ UPROPERTY(meta = (DataflowInput)) FString String = FString(""); /** Generated hash value */ UPROPERTY(meta = (DataflowOutput)) int32 Hash = 0; FHashStringDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&String); RegisterOutputConnection(&Hash); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Generates a hash value from a vector * */ USTRUCT() struct FHashVectorDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FHashVectorDataflowNode, "HashVector", "Utilities|Vector", "") public: /** Vector to hash */ UPROPERTY(meta = (DataflowInput)) FVector Vector = FVector(0.0); /** Generated hash value */ UPROPERTY(meta = (DataflowOutput)) int32 Hash = 0; FHashVectorDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Vector); RegisterOutputConnection(&Hash); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; UENUM(BlueprintType) enum class EFloatToIntFunctionEnum : uint8 { Dataflow_FloatToInt_Function_Floor UMETA(DisplayName = "Floor()"), Dataflow_FloatToInt_Function_Ceil UMETA(DisplayName = "Ceil()"), Dataflow_FloatToInt_Function_Round UMETA(DisplayName = "Round()"), Dataflow_FloatToInt_Function_Truncate UMETA(DisplayName = "Truncate()"), //~~~ //256th entry Dataflow_Max UMETA(Hidden) }; /** * * Converts a Float to Int using the specified method * */ USTRUCT() struct FFloatToIntDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FFloatToIntDataflowNode, "FloatToInt", "Math|Conversions", "") public: /** Method to convert */ UPROPERTY(EditAnywhere, Category = "Float"); EFloatToIntFunctionEnum Function = EFloatToIntFunctionEnum::Dataflow_FloatToInt_Function_Round; /** Float value to convert */ UPROPERTY(EditAnywhere, Category = "Float", meta = (DataflowInput)) float Float = 0.f; /** Int output */ UPROPERTY(meta = (DataflowOutput)) int32 Int = 0; FFloatToIntDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Float); RegisterOutputConnection(&Int); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; UENUM(BlueprintType) enum class EMathConstantsEnum : uint8 { Dataflow_MathConstants_Pi UMETA(DisplayName = "Pi"), Dataflow_MathConstants_HalfPi UMETA(DisplayName = "HalfPi"), Dataflow_MathConstants_TwoPi UMETA(DisplayName = "TwoPi"), Dataflow_MathConstants_FourPi UMETA(DisplayName = "FourPi"), Dataflow_MathConstants_InvPi UMETA(DisplayName = "InvPi"), Dataflow_MathConstants_InvTwoPi UMETA(DisplayName = "InvTwoPi"), Dataflow_MathConstants_Sqrt2 UMETA(DisplayName = "Sqrt2"), Dataflow_MathConstants_InvSqrt2 UMETA(DisplayName = "InvSqrt2"), Dataflow_MathConstants_Sqrt3 UMETA(DisplayName = "Sqrt3"), Dataflow_MathConstants_InvSqrt3 UMETA(DisplayName = "InvSqrt3"), Dataflow_FloatToInt_Function_E UMETA(DisplayName = "e"), Dataflow_FloatToInt_Function_Gamma UMETA(DisplayName = "Gamma"), Dataflow_FloatToInt_Function_GoldenRatio UMETA(DisplayName = "GoldenRatio"), Dataflow_FloatToInt_Function_ZeroTolerance UMETA(DisplayName = "ZeroTolerance"), //~~~ //256th entry Dataflow_Max UMETA(Hidden) }; /** * * Offers a selection of Math constants * */ USTRUCT() struct FMathConstantsDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FMathConstantsDataflowNode, "MathConstants", "Math|Utilities", "") public: /** Math constant to output */ UPROPERTY(EditAnywhere, Category = "Constants"); EMathConstantsEnum Constant = EMathConstantsEnum::Dataflow_MathConstants_Pi; /** Selected Math constant */ UPROPERTY(meta = (DataflowOutput)) float Float = 0; FMathConstantsDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterOutputConnection(&Float); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Returns the specified element from an array * */ USTRUCT() struct FGetArrayElementDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FGetArrayElementDataflowNode, "GetArrayElement", "Utilities|Array", "") public: /** Element index */ UPROPERTY(EditAnywhere, Category = "Index"); int32 Index = 0; /** Array to get the element from */ UPROPERTY(meta = (DataflowInput)) TArray Points; /** Specified element */ UPROPERTY(meta = (DataflowOutput)) FVector Point = FVector(0.0); FGetArrayElementDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Points); RegisterInputConnection(&Index); RegisterOutputConnection(&Point); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Returns the number of elements in an array * */ USTRUCT() struct FGetNumArrayElementsDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FGetNumArrayElementsDataflowNode, "GetNumArrayElements", "Utilities|Array", "") public: /** Array input */ UPROPERTY(meta = (DataflowInput)) TArray Points; /** Number of elements in the array */ UPROPERTY(meta = (DataflowOutput)) int32 NumElements = 0; FGetNumArrayElementsDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Points); RegisterOutputConnection(&NumElements); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Gets BoundingBoxes of pieces from a Collection * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FGetBoundingBoxesDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FGetBoundingBoxesDataflowNode, "GetBoundingBoxes", "GeometryCollection", "") public: /** Input Collection */ UPROPERTY(meta = (DataflowInput)) FManagedArrayCollection Collection; /** The BoundingBoxes will be output for the bones selected in the TransformSelection */ UPROPERTY(meta = (DataflowInput, DisplayName = "TransformSelection")) FDataflowTransformSelection TransformSelection; /** Output BoundingBoxes */ UPROPERTY(meta = (DataflowOutput)) TArray BoundingBoxes; FGetBoundingBoxesDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterInputConnection(&TransformSelection); RegisterOutputConnection(&BoundingBoxes); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Gets centroids of pieces from a Collection * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FGetCentroidsDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FGetCentroidsDataflowNode, "GetCentroids", "GeometryCollection", "") public: /** Input Collection */ UPROPERTY(meta = (DataflowInput)) FManagedArrayCollection Collection; /** The centroids will be output for the bones selected in the TransformSelection */ UPROPERTY(meta = (DataflowInput, DisplayName = "TransformSelection")) FDataflowTransformSelection TransformSelection; /** Output centroids */ UPROPERTY(meta = (DataflowOutput)) TArray Centroids = TArray(); FGetCentroidsDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterInputConnection(&TransformSelection); RegisterOutputConnection(&Centroids); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Transforms a mesh * */ USTRUCT() struct FTransformDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FTransformDataflowNode, "Transform", "Math", "") public: /** Translation */ UPROPERTY(EditAnywhere, Category = "Transform"); FVector Translate = FVector(0.0); /** Rotation */ UPROPERTY(EditAnywhere, Category = "Transform"); FVector Rotate = FVector(0.0); /** Scale */ UPROPERTY(EditAnywhere, Category = "Transform"); FVector Scale = FVector(1.0); /** Shear */ UPROPERTY(EditAnywhere, Category = "Transform"); FVector Shear = FVector(0.0); /** Uniform scale */ UPROPERTY(EditAnywhere, Category = "Transform"); float UniformScale = 1.f; /** Pivot for the rotation */ UPROPERTY(EditAnywhere, Category = "Pivot"); FVector RotatePivot = FVector(0.0); /** Pivot for the scale */ UPROPERTY(EditAnywhere, Category = "Pivot"); FVector ScalePivot = FVector(0.0); /** Invert the transformation */ UPROPERTY(EditAnywhere, Category = "General"); bool InvertTransformation = false; /** Output mesh */ UPROPERTY(meta = (DataflowInput, DataflowOutput)) TObjectPtr Mesh; FTransformDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Mesh); RegisterOutputConnection(&Mesh); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; UENUM(BlueprintType) enum class ECompareOperationEnum : uint8 { Dataflow_Compare_Equal UMETA(DisplayName = "=="), Dataflow_Compare_Smaller UMETA(DisplayName = "<"), Dataflow_Compare_SmallerOrEqual UMETA(DisplayName = "<="), Dataflow_Compare_Greater UMETA(DisplayName = ">"), Dataflow_Compare_GreaterOrEqual UMETA(DisplayName = ">="), //~~~ //256th entry Dataflow_Max UMETA(Hidden) }; /** * * Comparison between integers * */ USTRUCT() struct FCompareIntDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FCompareIntDataflowNode, "CompareInt", "Math|Int", "") public: /** Comparison operation */ UPROPERTY(EditAnywhere, Category = "Compare"); ECompareOperationEnum Operation = ECompareOperationEnum::Dataflow_Compare_Equal; /** Int input */ UPROPERTY(EditAnywhere, Category = "Compare"); int32 IntA = 0; /** Int input */ UPROPERTY(EditAnywhere, Category = "Compare"); int32 IntB = 0; /** Boolean result of the comparison */ UPROPERTY(meta = (DataflowOutput)); bool Result = false; FCompareIntDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&IntA); RegisterInputConnection(&IntB); RegisterOutputConnection(&Result); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Branch between two inputs based on boolean condition * */ USTRUCT() struct FBranchDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FBranchDataflowNode, "Branch", "Utilites|FlowControl", "") public: /** Mesh input */ UPROPERTY(meta = (DataflowInput)) TObjectPtr MeshA; /** Mesh input */ UPROPERTY(meta = (DataflowInput)) TObjectPtr MeshB; /** If true, Output = MeshA, otherwise Output = MeshB */ UPROPERTY(EditAnywhere, Category = "Branch"); bool Condition = false; /** Output mesh */ UPROPERTY(meta = (DataflowOutput)) TObjectPtr Mesh; FBranchDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&MeshA); RegisterInputConnection(&MeshB); RegisterInputConnection(&Condition); RegisterOutputConnection(&Mesh); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; /** * * Collects grooup and attribute information from the Collection and outputs it into a formatted string * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FGetSchemaDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FGetSchemaDataflowNode, "GetSchema", "GeometryCollection|Utilities", "") public: /** GeometryCollection for the information */ UPROPERTY(meta = (DataflowInput)) FManagedArrayCollection Collection; /** Formatted string containing the groups and attributes */ UPROPERTY(meta = (DataflowOutput)) FString String; FGetSchemaDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterOutputConnection(&String); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; USTRUCT(meta = (DataflowGeometryCollection)) struct FRemoveOnBreakDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FRemoveOnBreakDataflowNode, "RemoveOnBreak", "GeometryCollection", "") public: // @todo(harsha) Support Selections UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic)) FManagedArrayCollection Collection; UPROPERTY(EditAnywhere, Category = "Removal", meta = (DataflowInput)) FVector2f PostBreakTimer{0.0, 0.0}; UPROPERTY(EditAnywhere, Category = "Removal", meta = (DataflowInput)) FVector2f RemovalTimer{0.0, 1.0}; UPROPERTY(EditAnywhere, Category = "Removal", meta = (DataflowInput)) bool ClusterCrumbling = false; FRemoveOnBreakDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterInputConnection(&PostBreakTimer); RegisterInputConnection(&RemovalTimer); RegisterInputConnection(&ClusterCrumbling); RegisterOutputConnection(&Collection, &Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; UENUM(BlueprintType) enum class EAnchorStateEnum : uint8 { Dataflow_AnchorState_Anchored UMETA(DisplayName = "Anchored"), Dataflow_AnchorState_NotAnchored UMETA(DisplayName = "Not Anchored"), //~~~ //256th entry Dataflow_Max UMETA(Hidden) }; /** * * Sets the anchored state on the selected bones in a Collection * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FSetAnchorStateDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FSetAnchorStateDataflowNode, "SetAnchorState", "GeometryCollection", "") public: /** What anchor state to set on selected bones */ UPROPERTY(EditAnywhere, Category = "Anchoring"); EAnchorStateEnum AnchorState = EAnchorStateEnum::Dataflow_AnchorState_Anchored; /** If true, sets the non selected bones to opposite anchor state */ UPROPERTY(EditAnywhere, Category = "Anchoring") bool SetNotSelectedBonesToOppositeState = false; /** GeometryCollection to set anchor state on */ UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic)) FManagedArrayCollection Collection; /** Bone selection for setting the state on */ UPROPERTY(meta = (DataflowInput, DisplayName = "TransformSelection", DataflowIntrinsic)) FDataflowTransformSelection TransformSelection; FSetAnchorStateDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterInputConnection(&TransformSelection); RegisterOutputConnection(&Collection, &Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; UENUM(BlueprintType) enum class EProximityMethodEnum : uint8 { /** Precise proximity mode looks for geometry with touching vertices or touching, coplanar, opposite - facing triangles.This works well with geometry fractured using our fracture tools. */ Dataflow_ProximityMethod_Precise UMETA(DisplayName = "Precise"), /** Convex Hull proximity mode looks for geometry with overlapping convex hulls(with an optional offset) */ Dataflow_ProximityMethod_ConvexHull UMETA(DisplayName = "ConvexHull"), //~~~ //256th entry Dataflow_Max UMETA(Hidden) }; /** * * Update the proximity (contact) graph for the bones in a Collection * */ USTRUCT(meta = (DataflowGeometryCollection)) struct FProximityDataflowNode : public FDataflowNode { GENERATED_USTRUCT_BODY() DATAFLOW_NODE_DEFINE_INTERNAL(FProximityDataflowNode, "Proximity", "GeometryCollection", "") public: /** Which method to use to decide whether a given piece of geometry is in proximity with another */ UPROPERTY(EditAnywhere, Category = "Proximity"); EProximityMethodEnum ProximityMethod = EProximityMethodEnum::Dataflow_ProximityMethod_Precise; /** If hull-based proximity detection is enabled, amount to expand hulls when searching for overlapping neighbors */ UPROPERTY(EditAnywhere, Category = "Proximity", meta = (ClampMin = "0", EditCondition = "ProximityMethod == EProximityMethodEnum::Dataflow_ProximityMethod_ConvexHull")) float DistanceThreshold = 1; /** Whether to automatically transform the proximity graph into a connection graph to be used for simulation */ UPROPERTY(EditAnywhere, Category = "Proximity") bool bUseAsConnectionGraph = false; /** GeometryCollection to update the proximity graph on */ UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic)) FManagedArrayCollection Collection; FProximityDataflowNode(const Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid()) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&Collection); RegisterOutputConnection(&Collection, &Collection); } virtual void Evaluate(Dataflow::FContext& Context, const FDataflowOutput* Out) const override; }; namespace Dataflow { void GeometryCollectionEngineNodes(); }