Files
UnrealEngine/Engine/Plugins/FX/Niagara/Source/NiagaraEditor/Public/NiagaraClipboard.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

368 lines
14 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Curves/RichCurve.h"
#include "NiagaraMessages.h"
#include "NiagaraScriptVariable.h"
#include "NiagaraTypes.h"
#include "Engine/UserDefinedEnum.h"
#include "UObject/GCObject.h"
#include "UObject/SoftObjectPtr.h"
#include "NiagaraClipboard.generated.h"
class UHierarchyCategory;
class IPropertyHandle;
class UNiagaraDataInterface;
class UNiagaraScript;
class UNiagaraRendererProperties;
class UNiagaraNodeFunctionCall;
class UNiagaraScriptVariable;
UENUM()
enum class ENiagaraClipboardFunctionInputValueMode
{
Local,
Linked,
Data,
ObjectAsset,
Expression,
Dynamic,
ResetToDefault // special paste mode where it resets to the default value
};
class UNiagaraClipboardFunction;
UCLASS(MinimalAPI)
class UNiagaraClipboardFunctionInput : public UObject
{
GENERATED_BODY()
public:
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateLocalValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType, TOptional<bool> bInEditConditionValue, TArray<uint8>& InLocalValueData);
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateLinkedValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType, TOptional<bool> bInEditConditionValue, const FNiagaraVariableBase& InLinkedValue);
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateDataValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType, TOptional<bool> bInEditConditionValue, UNiagaraDataInterface* InDataValue);
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateObjectAssetValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType, TOptional<bool> bInEditConditionValue, UObject* InObject);
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateExpressionValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType, TOptional<bool> bInEditConditionValue, const FString& InExpressionValue);
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateDynamicValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType, TOptional<bool> bInEditConditionValue, FString InDynamicValueName, UNiagaraScript* InDynamicValue, const FGuid& InScriptVersion);
static NIAGARAEDITOR_API const UNiagaraClipboardFunctionInput* CreateDefaultInputValue(UObject* InOuter, FName InInputName, FNiagaraTypeDefinition InInputType);
UPROPERTY()
FName InputName;
UPROPERTY()
FNiagaraTypeDefinition InputType;
UPROPERTY()
bool bHasEditCondition;
UPROPERTY()
bool bEditConditionValue;
UPROPERTY()
ENiagaraClipboardFunctionInputValueMode ValueMode;
UPROPERTY()
TArray<uint8> Local;
UPROPERTY()
FNiagaraVariableBase Linked;
UPROPERTY()
TObjectPtr<UNiagaraDataInterface> Data;
UPROPERTY()
TObjectPtr<UObject> ObjectAsset;
UPROPERTY()
FString Expression;
UPROPERTY()
TObjectPtr<UNiagaraClipboardFunction> Dynamic;
UPROPERTY()
TArray<TObjectPtr<const UNiagaraClipboardFunctionInput>> ChildrenInputs;
NIAGARAEDITOR_API bool CopyValuesFrom(const UNiagaraClipboardFunctionInput* InOther);
const FNiagaraTypeDefinition& GetTypeDef() const { return InputType; };
};
UCLASS()
class UNiagaraClipboardRenderer : public UObject
{
GENERATED_BODY()
public:
static NIAGARAEDITOR_API const UNiagaraClipboardRenderer* CreateRenderer(UObject* InOuter, UNiagaraRendererProperties* Renderer, TOptional<FNiagaraStackNoteData> StackNoteData = TOptional<FNiagaraStackNoteData>());
UPROPERTY()
TObjectPtr<UNiagaraRendererProperties> RendererProperties;
UPROPERTY()
FNiagaraStackNoteData StackNoteData;
};
UENUM()
enum class ENiagaraClipboardFunctionScriptMode
{
ScriptAsset,
Assignment
};
UCLASS(MinimalAPI)
class UNiagaraClipboardFunction : public UObject
{
GENERATED_BODY()
public:
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnPastedFunctionCallNode, UNiagaraNodeFunctionCall*, PastedFunctionCall);
static NIAGARAEDITOR_API UNiagaraClipboardFunction* CreateScriptFunction(UObject* InOuter, FString InFunctionName, UNiagaraScript* InScript, const FGuid& InScriptVersion = FGuid(), const TOptional<FNiagaraStackNoteData>& InStackNote = TOptional<FNiagaraStackNoteData>());
static NIAGARAEDITOR_API UNiagaraClipboardFunction* CreateAssignmentFunction(UObject* InOuter, FString InFunctionName, const TArray<FNiagaraVariable>& InAssignmentTargets, const TArray<FString>& InAssignmentDefaults, TOptional<FNiagaraStackNoteData> InStackNoteData = TOptional<FNiagaraStackNoteData>());
UPROPERTY()
FString FunctionName;
UPROPERTY()
FText DisplayName;
UPROPERTY()
ENiagaraClipboardFunctionScriptMode ScriptMode;
UPROPERTY()
TSoftObjectPtr<UNiagaraScript> Script;
UPROPERTY()
TArray<FNiagaraVariable> AssignmentTargets;
UPROPERTY()
TArray<FString> AssignmentDefaults;
UPROPERTY()
TArray<TObjectPtr<const UNiagaraClipboardFunctionInput>> Inputs;
UPROPERTY()
FOnPastedFunctionCallNode OnPastedFunctionCallNodeDelegate;
UPROPERTY()
FGuid ScriptVersion;
UPROPERTY()
FNiagaraStackNoteData StackNoteData;
};
USTRUCT()
struct FNiagaraClipboardScriptVariable
{
GENERATED_BODY()
FNiagaraClipboardScriptVariable() : ScriptVariable(nullptr)
{}
FNiagaraClipboardScriptVariable(const UNiagaraScriptVariable& InScriptVariable) : ScriptVariable(&InScriptVariable), OriginalChangeId(InScriptVariable.GetChangeId())
{}
UPROPERTY();
TObjectPtr<const UNiagaraScriptVariable> ScriptVariable;
/** We cache the original change Id here since deserialization of the clipboard will cause the change id to update.
* Using the original change id, we can identify during pasting whether we have already pasted this script variable before.
*/
UPROPERTY()
FGuid OriginalChangeId;
// since the contained variables are typically copies, we compare their change IDs instead
bool operator==(const FNiagaraClipboardScriptVariable& OtherVariable) const
{
return OriginalChangeId == OtherVariable.OriginalChangeId;
}
};
USTRUCT()
struct FNiagaraClipboardCurveCollection
{
GENERATED_BODY()
UPROPERTY()
TArray<FRichCurve> Curves;
};
USTRUCT()
struct FNiagaraClipboardPortableValue
{
GENERATED_BODY()
class FErrorPipe : public FOutputDevice
{
public:
int32 NumErrors;
FErrorPipe()
: FOutputDevice()
, NumErrors(0)
{
}
virtual void Serialize(const TCHAR* V, ELogVerbosity::Type Verbosity, const class FName& Category) override
{
NumErrors++;
}
};
FNiagaraClipboardPortableValue()
: ValueString(FString())
{
}
bool IsValid() const { return ValueString.IsEmpty() == false; } // ValueType != ENiagaraClipboardPortableValueType::None; }
void Reset()
{
*this = FNiagaraClipboardPortableValue();
}
static FNiagaraClipboardPortableValue NIAGARAEDITOR_API CreateFromStructValue(const UScriptStruct& TargetStruct, uint8* StructMemory);
static FNiagaraClipboardPortableValue NIAGARAEDITOR_API CreateFromTypedValue(const FNiagaraTypeDefinition& InType, const FNiagaraVariant& InValue);
static FNiagaraClipboardPortableValue NIAGARAEDITOR_API CreateFromPropertyHandle(const IPropertyHandle& InPropertyHandle);
NIAGARAEDITOR_API bool TryUpdateStructValue(const UScriptStruct& TargetStruct, uint8* StructMemory) const;
NIAGARAEDITOR_API bool CanUpdateTypedValue(const FNiagaraTypeDefinition& InTargetInputType) const;
NIAGARAEDITOR_API bool TryUpdateTypedValue(const FNiagaraTypeDefinition& InTargetInputType, FNiagaraVariant& InValue) const;
NIAGARAEDITOR_API bool TryUpdatePropertyHandle(IPropertyHandle& InTargetPropertyHandle) const;
UPROPERTY()
FString ValueString;
};
UCLASS(MinimalAPI)
class UNiagaraClipboardContent : public UObject
{
GENERATED_BODY()
public:
static NIAGARAEDITOR_API UNiagaraClipboardContent* Create();
UPROPERTY()
TArray<TObjectPtr<const UNiagaraClipboardFunction>> Functions;
UPROPERTY()
TArray<TObjectPtr<const UNiagaraClipboardFunctionInput>> FunctionInputs;
UPROPERTY()
TArray<TObjectPtr<const UNiagaraClipboardRenderer>> Renderers;
UPROPERTY()
TArray<TObjectPtr<const UNiagaraScript>> Scripts;
UPROPERTY()
TArray<FNiagaraClipboardScriptVariable> ScriptVariables;
UPROPERTY()
TArray<TObjectPtr<const UObject>> StatelessModules;
/** We expect nodes to be exported into this string using FEdGraphUtilities::ExportNodesToText */
UPROPERTY()
FString ExportedNodes;
/** Markup MetaData to specify that if scripts are pasted from the clipboard to automatically fixup their order in the stack to satisfy dependencies. */
UPROPERTY()
mutable bool bFixupPasteIndexForScriptDependenciesInStack = false;
UPROPERTY()
FNiagaraStackNoteData StackNote;
UPROPERTY()
TArray<FNiagaraClipboardPortableValue> PortableValues;
};
class FNiagaraClipboard
{
public:
NIAGARAEDITOR_API FNiagaraClipboard();
NIAGARAEDITOR_API void SetClipboardContent(UNiagaraClipboardContent* ClipboardContent);
NIAGARAEDITOR_API const UNiagaraClipboardContent* GetClipboardContent() const;
};
UCLASS(MinimalAPI)
class UNiagaraClipboardEditorScriptingUtilities : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API void TryGetInputByName(const TArray<UNiagaraClipboardFunctionInput*>& InInputs, FName InInputName, bool& bOutSucceeded, UNiagaraClipboardFunctionInput*& OutInput);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API void TryGetLocalValueAsFloat(const UNiagaraClipboardFunctionInput* InInput, bool& bOutSucceeded, float& OutValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API void TryGetLocalValueAsInt(const UNiagaraClipboardFunctionInput* InInput, bool& bOutSucceeded, int32& OutValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API void TrySetLocalValueAsInt(UNiagaraClipboardFunctionInput* InInput, bool& bOutSucceeded, int32 InValue, bool bLooseTyping = true);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API FName GetTypeName(const UNiagaraClipboardFunctionInput* InInput);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateColorLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, FLinearColor InColorValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateFloatLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, float InLocalValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateMatrixLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, FMatrix44f InMatrixValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateQuatLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, FQuat4f InQuatValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateVec2LocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, FVector2D InVec2Value);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateVec3LocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, FVector InVec3Value);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateVec4LocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, FVector4f InVec4Value);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateIntLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, int32 InLocalValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateBoolLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, bool InBoolValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateStructLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, UUserDefinedStruct* InStructValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateEnumLocalValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditCoditionValue, UUserDefinedEnum* InEnumType, int32 InEnumValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateEnumLinkedValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditCoditionValue, UUserDefinedEnum* InEnumType, FName InLinkedValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateLinkedValueInput(UObject* InOuter, FName InInputName, FName InInputTypeName, bool bInHasEditCondition, bool bInEditConditionValue, FName InLinkedValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateDataValueInput(UObject* InOuter, FName InInputName, bool bInHasEditCondition, bool bInEditConditionValue, UNiagaraDataInterface* InDataValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateExpressionValueInput(UObject* InOuter, FName InInputName, FName InInputTypeName, bool bInHasEditCondition, bool bInEditConditionValue, const FString& InExpressionValue);
UFUNCTION(BlueprintPure, Category = "Input")
static NIAGARAEDITOR_API UNiagaraClipboardFunctionInput* CreateDynamicValueInput(UObject* InOuter, FName InInputName, FName InInputTypeName, bool bInHasEditCondition, bool bInEditConditionValue, FString InDynamicValueName, UNiagaraScript* InDynamicValue);
static NIAGARAEDITOR_API FNiagaraTypeDefinition GetRegisteredTypeDefinitionByName(FName InTypeName);
};