// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. #include "NiagaraEditorUtilities.h" #include "NiagaraEditorModule.h" #include "INiagaraEditorTypeUtilities.h" #include "NiagaraNodeInput.h" #include "NiagaraDataInterface.h" #include "NiagaraComponent.h" #include "ModuleManager.h" #include "StructOnScope.h" #include "NiagaraGraph.h" #include "NiagaraEffect.h" #include "NiagaraScriptSource.h" FName FNiagaraEditorUtilities::GetUniqueName(FName CandidateName, const TSet& ExistingNames) { if (ExistingNames.Contains(CandidateName) == false) { return CandidateName; } FString CandidateNameString = CandidateName.ToString(); FString BaseNameString = CandidateNameString; if (CandidateNameString.Len() >= 3 && CandidateNameString.Right(3).IsNumeric()) { BaseNameString = CandidateNameString.Left(CandidateNameString.Len() - 3); } FName UniqueName = FName(*BaseNameString); int32 NameIndex = 1; while (ExistingNames.Contains(UniqueName)) { UniqueName = FName(*FString::Printf(TEXT("%s%03i"), *BaseNameString, NameIndex)); NameIndex++; } return UniqueName; } TSet FNiagaraEditorUtilities::GetSystemConstantNames() { TSet SystemConstantNames; for (const FNiagaraVariable& SystemConstant : UNiagaraComponent::GetSystemConstants()) { SystemConstantNames.Add(SystemConstant.GetName()); } return SystemConstantNames; } void FNiagaraEditorUtilities::ResetVariableToDefaultValue(FNiagaraVariable& Variable) { if (const UScriptStruct* ScriptStruct = Variable.GetType().GetScriptStruct()) { FNiagaraEditorModule& NiagaraEditorModule = FModuleManager::GetModuleChecked("NiagaraEditor"); TSharedPtr TypeEditorUtilities = NiagaraEditorModule.GetTypeUtilities(Variable.GetType()); if (TypeEditorUtilities.IsValid() && TypeEditorUtilities->CanProvideDefaultValue()) { TSharedRef Struct = MakeShareable(new FStructOnScope(ScriptStruct)); TypeEditorUtilities->UpdateStructWithDefaultValue(Struct); Variable.SetData(Struct->GetStructMemory()); } else { Variable.AllocateData(); ScriptStruct->InitializeDefaultValue(Variable.GetData()); } } } void FNiagaraEditorUtilities::InitializeParameterInputNode(UNiagaraNodeInput& InputNode, const FNiagaraTypeDefinition& Type, const class UNiagaraGraph* InGraph, FName InputName) { InputNode.Usage = ENiagaraInputNodeUsage::Parameter; InputNode.bCanRenameNode = true; InputNode.Input.SetId(FGuid::NewGuid()); InputName = UNiagaraNodeInput::GenerateUniqueName(InGraph, InputName, ENiagaraInputNodeUsage::Parameter); InputNode.Input.SetName(InputName); InputNode.Input.SetType(Type); if (InGraph) // Only compute sort priority if a graph was passed in, similar to the way that GenrateUniqueName works above. { InputNode.CallSortPriority = UNiagaraNodeInput::GenerateNewSortPriority(InGraph, InputName, ENiagaraInputNodeUsage::Parameter); } if (Type.GetScriptStruct() != nullptr) { ResetVariableToDefaultValue(InputNode.Input); InputNode.DataInterface = nullptr; } else { InputNode.Input.AllocateData(); // Frees previously used memory if we're switching from a struct to a class type. InputNode.DataInterface = NewObject(&InputNode, const_cast(Type.GetClass())); } } void FNiagaraEditorUtilities::GetParameterVariablesFromEffect(UNiagaraEffect& Effect, TArray& ParameterVariables, FNiagaraEditorUtilities::FGetParameterVariablesFromEffectOptions Options) { UNiagaraScript* EffectScript = Effect.GetEffectScript(); if (EffectScript != nullptr) { UNiagaraScriptSource* ScriptSource = Cast(EffectScript->Source); if (ScriptSource != nullptr) { UNiagaraGraph* EffectGraph = ScriptSource->NodeGraph; if (EffectGraph != nullptr) { UNiagaraGraph::FFindInputNodeOptions FindOptions; FindOptions.bIncludeAttributes = false; FindOptions.bIncludeSystemConstants = false; FindOptions.bFilterDuplicates = true; TArray InputNodes; EffectGraph->FindInputNodes(InputNodes, FindOptions); for (UNiagaraNodeInput* InputNode : InputNodes) { bool bIsStructParameter = InputNode->Input.GetType().GetScriptStruct() != nullptr; bool bIsDataInterfaceParameter = InputNode->Input.GetType().GetClass() != nullptr; if ((bIsStructParameter && Options.bIncludeStructParameters) || (bIsDataInterfaceParameter && Options.bIncludeDataInterfaceParameters)) { ParameterVariables.Add(InputNode->Input); } } } } } }