You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#jira UE-142345 #rb helge.mathee #preflight https://horde.devtools.epicgames.com/job/620a94c24d320dbf4c1e5154 #ROBOMERGE-AUTHOR: sara.schvartzman #ROBOMERGE-SOURCE: CL 18993594 in //UE5/Release-5.0/... via CL 18993651 via CL 18993699 #ROBOMERGE-BOT: UE5 (Release-Engine-Test -> Main) (v917-18934589) [CL 18997921 by sara schvartzman in ue5-main branch]
273 lines
7.4 KiB
C++
273 lines
7.4 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "RigVMModel/RigVMBuildData.h"
|
|
|
|
FRigVMReferenceNodeData::FRigVMReferenceNodeData(URigVMFunctionReferenceNode* InReferenceNode)
|
|
{
|
|
check(InReferenceNode);
|
|
ReferenceNodePtr = TSoftObjectPtr<URigVMFunctionReferenceNode>(InReferenceNode);
|
|
ReferenceNodePath = ReferenceNodePtr.ToString();
|
|
LibraryNodePtr = TSoftObjectPtr<URigVMLibraryNode>(InReferenceNode->GetReferencedNode());
|
|
ReferencedFunctionPath = LibraryNodePtr.ToString();
|
|
}
|
|
|
|
TSoftObjectPtr<URigVMFunctionReferenceNode> FRigVMReferenceNodeData::GetReferenceNodeObjectPath()
|
|
{
|
|
if(ReferenceNodePtr.IsNull())
|
|
{
|
|
ReferenceNodePtr = TSoftObjectPtr<URigVMFunctionReferenceNode>(ReferenceNodePath);
|
|
}
|
|
return ReferenceNodePtr;
|
|
}
|
|
|
|
TSoftObjectPtr<URigVMLibraryNode> FRigVMReferenceNodeData::GetReferencedFunctionObjectPath()
|
|
{
|
|
if(LibraryNodePtr.IsNull())
|
|
{
|
|
LibraryNodePtr = TSoftObjectPtr<URigVMFunctionReferenceNode>(ReferencedFunctionPath);
|
|
}
|
|
return LibraryNodePtr;
|
|
}
|
|
|
|
URigVMFunctionReferenceNode* FRigVMReferenceNodeData::GetReferenceNode()
|
|
{
|
|
if(ReferenceNodePtr.IsNull())
|
|
{
|
|
ReferenceNodePtr = TSoftObjectPtr<URigVMFunctionReferenceNode>(ReferenceNodePath);
|
|
}
|
|
if(!ReferenceNodePtr.IsValid())
|
|
{
|
|
ReferenceNodePtr.LoadSynchronous();
|
|
}
|
|
if(ReferenceNodePtr.IsValid())
|
|
{
|
|
return ReferenceNodePtr.Get();
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
URigVMLibraryNode* FRigVMReferenceNodeData::GetReferencedFunction()
|
|
{
|
|
if(LibraryNodePtr.IsNull())
|
|
{
|
|
LibraryNodePtr = TSoftObjectPtr<URigVMLibraryNode>(ReferencedFunctionPath);
|
|
}
|
|
if(!LibraryNodePtr.IsValid())
|
|
{
|
|
LibraryNodePtr.LoadSynchronous();
|
|
}
|
|
if(LibraryNodePtr.IsValid())
|
|
{
|
|
return LibraryNodePtr.Get();
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
URigVMBuildData::URigVMBuildData()
|
|
: UObject()
|
|
, bIsRunningUnitTest(false)
|
|
{
|
|
}
|
|
|
|
const FRigVMFunctionReferenceArray* URigVMBuildData::FindFunctionReferences(const URigVMLibraryNode* InFunction) const
|
|
{
|
|
check(InFunction);
|
|
|
|
const TSoftObjectPtr<URigVMLibraryNode> Key(InFunction);
|
|
return FunctionReferences.Find(Key);
|
|
}
|
|
|
|
void URigVMBuildData::ForEachFunctionReference(const URigVMLibraryNode* InFunction,
|
|
TFunction<void(URigVMFunctionReferenceNode*)> PerReferenceFunction) const
|
|
{
|
|
check(InFunction);
|
|
|
|
if (const FRigVMFunctionReferenceArray* ReferencesEntry = FindFunctionReferences(InFunction))
|
|
{
|
|
for (int32 ReferenceIndex = 0; ReferenceIndex < ReferencesEntry->Num(); ReferenceIndex++)
|
|
{
|
|
const TSoftObjectPtr<URigVMFunctionReferenceNode>& Reference = ReferencesEntry->operator [](ReferenceIndex);
|
|
if (!Reference.IsValid())
|
|
{
|
|
Reference.LoadSynchronous();
|
|
}
|
|
if (Reference.IsValid())
|
|
{
|
|
PerReferenceFunction(Reference.Get());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void URigVMBuildData::ForEachFunctionReferenceSoftPtr(const URigVMLibraryNode* InFunction,
|
|
TFunction<void(TSoftObjectPtr<URigVMFunctionReferenceNode>)> PerReferenceFunction) const
|
|
{
|
|
check(InFunction);
|
|
|
|
if (const FRigVMFunctionReferenceArray* ReferencesEntry = FindFunctionReferences(InFunction))
|
|
{
|
|
for (int32 ReferenceIndex = 0; ReferenceIndex < ReferencesEntry->Num(); ReferenceIndex++)
|
|
{
|
|
const TSoftObjectPtr<URigVMFunctionReferenceNode>& Reference = ReferencesEntry->operator [](ReferenceIndex);
|
|
PerReferenceFunction(Reference);
|
|
}
|
|
}
|
|
}
|
|
|
|
void URigVMBuildData::UpdateReferencesForFunctionReferenceNode(URigVMFunctionReferenceNode* InReferenceNode)
|
|
{
|
|
check(InReferenceNode);
|
|
|
|
if(InReferenceNode->GetOutermost() == GetTransientPackage())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(const URigVMLibraryNode* Function = InReferenceNode->GetReferencedNode())
|
|
{
|
|
const TSoftObjectPtr<URigVMLibraryNode> Key(Function);
|
|
FRigVMFunctionReferenceArray* ReferencesEntry = FunctionReferences.Find(Key);
|
|
if (ReferencesEntry == nullptr)
|
|
{
|
|
Modify();
|
|
FunctionReferences.Add(Key);
|
|
ReferencesEntry = FunctionReferences.Find(Key);
|
|
}
|
|
|
|
const FString ReferenceNodePathName = InReferenceNode->GetPathName();
|
|
for (int32 ReferenceIndex = 0; ReferenceIndex < ReferencesEntry->Num(); ReferenceIndex++)
|
|
{
|
|
const TSoftObjectPtr<URigVMFunctionReferenceNode>& Reference = ReferencesEntry->operator [](ReferenceIndex);
|
|
if(Reference.ToString() == ReferenceNodePathName)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
Modify();
|
|
ReferencesEntry->FunctionReferences.Add(InReferenceNode);
|
|
MarkPackageDirty();
|
|
}
|
|
}
|
|
|
|
void URigVMBuildData::RegisterFunctionReference(URigVMLibraryNode* InFunction,
|
|
URigVMFunctionReferenceNode* InReference)
|
|
{
|
|
if(InFunction == nullptr || InReference == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const TSoftObjectPtr<URigVMLibraryNode> FunctionKey(InFunction);
|
|
const TSoftObjectPtr<URigVMFunctionReferenceNode> ReferenceKey(InReference);
|
|
|
|
RegisterFunctionReference(FunctionKey, ReferenceKey);
|
|
}
|
|
|
|
void URigVMBuildData::RegisterFunctionReference(TSoftObjectPtr<URigVMLibraryNode> InFunction,
|
|
TSoftObjectPtr<URigVMFunctionReferenceNode> InReference)
|
|
{
|
|
if(InFunction.IsNull() || InReference.IsNull())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(FRigVMFunctionReferenceArray* ReferenceEntry = FunctionReferences.Find(InFunction))
|
|
{
|
|
if(ReferenceEntry->FunctionReferences.Contains(InReference))
|
|
{
|
|
return;
|
|
}
|
|
|
|
Modify();
|
|
ReferenceEntry->FunctionReferences.Add(InReference);
|
|
}
|
|
else
|
|
{
|
|
Modify();
|
|
FRigVMFunctionReferenceArray NewReferenceEntry;
|
|
NewReferenceEntry.FunctionReferences.Add(InReference);
|
|
FunctionReferences.Add(InFunction, NewReferenceEntry);
|
|
}
|
|
|
|
MarkPackageDirty();
|
|
}
|
|
|
|
void URigVMBuildData::RegisterFunctionReference(FRigVMReferenceNodeData InReferenceNodeData)
|
|
{
|
|
RegisterFunctionReference(InReferenceNodeData.GetReferencedFunctionObjectPath(), InReferenceNodeData.GetReferenceNodeObjectPath());
|
|
}
|
|
|
|
void URigVMBuildData::UnregisterFunctionReference(URigVMLibraryNode* InFunction,
|
|
URigVMFunctionReferenceNode* InReference)
|
|
{
|
|
if(InFunction == nullptr || InReference == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const TSoftObjectPtr<URigVMLibraryNode> FunctionKey(InFunction);
|
|
const TSoftObjectPtr<URigVMFunctionReferenceNode> ReferenceKey(InReference);
|
|
|
|
return UnregisterFunctionReference(FunctionKey, ReferenceKey);
|
|
}
|
|
|
|
void URigVMBuildData::UnregisterFunctionReference(TSoftObjectPtr<URigVMLibraryNode> InFunction,
|
|
TSoftObjectPtr<URigVMFunctionReferenceNode> InReference)
|
|
{
|
|
if(InFunction.IsNull() || InReference.IsNull())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(FRigVMFunctionReferenceArray* ReferenceEntry = FunctionReferences.Find(InFunction))
|
|
{
|
|
if(!ReferenceEntry->FunctionReferences.Contains(InReference))
|
|
{
|
|
return;
|
|
}
|
|
|
|
Modify();
|
|
ReferenceEntry->FunctionReferences.Remove(InReference);
|
|
MarkPackageDirty();
|
|
}
|
|
}
|
|
|
|
void URigVMBuildData::ClearInvalidReferences()
|
|
{
|
|
if (bIsRunningUnitTest)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Modify();
|
|
|
|
// check each function's each reference
|
|
int32 NumRemoved = 0;
|
|
for (TTuple<TSoftObjectPtr<URigVMLibraryNode>, FRigVMFunctionReferenceArray>& FunctionReferenceInfo : FunctionReferences)
|
|
{
|
|
FRigVMFunctionReferenceArray* ReferencesEntry = &FunctionReferenceInfo.Value;
|
|
|
|
static FString sTransientPackagePrefix;
|
|
if(sTransientPackagePrefix.IsEmpty())
|
|
{
|
|
sTransientPackagePrefix = GetTransientPackage()->GetPathName();
|
|
}
|
|
static const FString sTempPrefix = TEXT("/Temp/");
|
|
|
|
NumRemoved += ReferencesEntry->FunctionReferences.RemoveAll([](TSoftObjectPtr<URigVMFunctionReferenceNode> Referencer)
|
|
{
|
|
// ignore keys / references within the transient package
|
|
const FString ReferencerString = Referencer.ToString();
|
|
return ReferencerString.StartsWith(sTransientPackagePrefix) || ReferencerString.StartsWith(sTempPrefix);
|
|
});
|
|
}
|
|
|
|
if (NumRemoved > 0)
|
|
{
|
|
MarkPackageDirty();
|
|
}
|
|
}
|
|
|
|
|