// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "NiagaraTypes.h" #include "NiagaraScriptSourceBase.h" #include "EdGraphSchema_Niagara.h" #include "NiagaraGraph.h" #include "ViewModels/Stack/NiagaraParameterHandle.h" #include "ViewModels/Stack/NiagaraStackGraphUtilities.h" class UNiagaraScript; struct FNiagaraEmitterHandle; class UNiagaraNodeFunctionCall; class UEdGraphPin; class FNiagaraStackFunctionInputBinder { public: NIAGARAEDITOR_API FNiagaraStackFunctionInputBinder(); bool TryBind( UNiagaraScript* InScript, TArray InDependentScripts, FCompileConstantResolver InConstantResolver, FString InOwningEmitterUniqueName, UNiagaraNodeFunctionCall* InFunctionCallNode, FName InMetaDataKey, FString InMetaDataValue, TOptional InInputType, bool bInIsRequired, FText& OutErrorMessage); NIAGARAEDITOR_API bool TryBind( UNiagaraScript* InScript, TArray InDependentScripts, FCompileConstantResolver InConstantResolver, FString InOwningEmitterUniqueName, UNiagaraNodeFunctionCall* InFunctionCallNode, FName InInputName, TOptional InInputType, bool bInIsRequired, FText& OutErrorMessage); bool IsValid() const; void Reset(); FName GetInputName() const; FNiagaraTypeDefinition GetInputType() const; UNiagaraNodeFunctionCall* GetFunctionCallNode() const; template ValueType GetValue() const { checkf(sizeof(ValueType) == InputType.GetSize(), TEXT("ValueType size doesn't match bound value size")); ValueType Value; FMemory::Memcpy(&Value, GetData().GetData(), InputType.GetSize()); return Value; } template void SetValue(const ValueType& InValue) { SetData((uint8*)&InValue, sizeof(ValueType)); } TArray GetData() const; NIAGARAEDITOR_API void SetData(const uint8* InValue, int32 InSize); private: DECLARE_DELEGATE_RetVal_OneParam(bool, FInputMatchesPredicate, FNiagaraVariable); private: bool TryBindInternal( UNiagaraScript* InScript, TArray InDependentScripts, FCompileConstantResolver InConstantResolver, FString InOwningEmitterUniqueName, UNiagaraNodeFunctionCall* InFunctionCallNode, FInputMatchesPredicate InputMatchesCallback, FText InputMatchDescription, TOptional InInputType, bool bInIsRequired, FText& OutErrorMessage); FGuid GetChangeIdFromFunctionScript() const; void RefreshGraphPins() const; private: TWeakObjectPtr Script; TArray> DependentScripts; TWeakObjectPtr FunctionCallNode; FNiagaraTypeDefinition InputType; FName InputName; FGuid InputVariableGuid; FNiagaraParameterHandle AliasedParameterHandle; mutable FGuid ValidScriptGraphChangeIdForOverridePin; mutable FGuid ValidScriptGraphChangeIdForDefaultPin; FNiagaraVariable RapidIterationParameter; mutable UEdGraphPin* DefaultPin; mutable UEdGraphPin* OverridePin; }; template<> inline bool FNiagaraStackFunctionInputBinder::GetValue() const { check(InputType.IsSameBaseDefinition(FNiagaraTypeDefinition::GetBoolDef())); TArray ValueData = GetData(); FNiagaraBool* BoolStruct = (FNiagaraBool*)ValueData.GetData(); return BoolStruct->GetValue(); } template<> inline void FNiagaraStackFunctionInputBinder::SetValue(const bool& bInValue) { check(InputType.IsSameBaseDefinition(FNiagaraTypeDefinition::GetBoolDef())); FNiagaraBool BoolStruct(bInValue); SetData((uint8*)(&BoolStruct), sizeof(FNiagaraBool)); }