94{
95 if (!FModuleManager::Get().IsModuleLoaded("AssetRegistry")) return;
96 if (DependencyStack.Num() >= (int32)UCDD_EditorConfig::Get()->maxDependencyDepth) return;
97 DependencyStack.Add(CurrentAsset);
98 static FAssetRegistryModule& assetRegistryModule = FModuleManager::GetModuleChecked<FAssetRegistryModule>("AssetRegistry");
99 TArray<FName> outDependencies;
100
101 static const FRegexPattern externalPattern(TEXT("/__External[^/]*__/"));
102
103 if (isStopping.value
104 || !assetPackageArray.FindByPredicate(
105 [&CurrentAsset](FString assetPackage) { return CurrentAsset.ToString().StartsWith(assetPackage); })
106 || FRegexMatcher(externalPattern, CurrentAsset.ToString()).FindNext())
107 {
108 DependencyStack.RemoveAt(DependencyStack.Num() - 1);
109 return;
110 }
111
112 if (
const FNameArray* pDependencyList = DependencyListMap.Find(CurrentAsset)) outDependencies = pDependencyList->content;
113 else
114 {
116 assetRegistryModule.GetRegistry().GetDependencies(CurrentAsset,
117 outDependencies,
118 UE::AssetRegistry::EDependencyCategory::Package,
119 UE::AssetRegistry::FDependencyQuery(UE::AssetRegistry::EDependencyQuery::Hard));
120 DependencyListMap.Add(CurrentAsset,
FNameArray(outDependencies));
121 }
122 for (const auto& childAsset : outDependencies)
123 {
124 if (!assetPackageArray.FindByPredicate(
125 [&childAsset](FString assetPackage) { return childAsset.ToString().StartsWith(assetPackage); })
126 || FRegexMatcher(externalPattern, childAsset.ToString()).FindNext())
127 continue;
129 if (childAsset.ToString() == CurrentAsset.ToString() || BrokenDependecySet.Contains(currentDependency)) continue;
130 int childAssetIndex = DependencyStack.Find(childAsset);
131 if (childAssetIndex == INDEX_NONE)
133 childAsset,
134 DependencyListMap,
135 DependencyStack,
136 BrokenDependecySet,
137 circularInvolvedItemArray,
138 isStopping);
139 else
140 {
142 BrokenDependecySet.Add(currentDependency);
143 BrokenDependecySet.Add(oppositeDependency);
144 TArray<FName> involvedDependencyStack;
145 for (int i = childAssetIndex; i < DependencyStack.Num(); i++) involvedDependencyStack.Add(DependencyStack[i]);
147 circularInvolvedItem->
AssetName = involvedDependencyStack[0];
149 circularInvolvedItemArray.Add(circularInvolvedItem);
150 }
151 }
152 DependencyStack.RemoveAt(DependencyStack.Num() - 1);
153}
static const TArray< FString > & getExcludedAssetList()
Definition CircularDependenciesLib.cpp:181
static void AddToDependencyStack(const TArray< FString > &assetPackageArray, const FName &CurrentAsset, UPARAM(ref) TMap< FName, FNameArray > &DependencyListMap, UPARAM(ref) TArray< FName > &DependencyStack, UPARAM(ref) TSet< FNamePair > &BrokenDependecySet, UPARAM(ref) TArray< UCircularInvolvedAssetItem * > &circularInvolvedItemArray, UPARAM(ref) FBoolHolder &isStopping)
Definition CircularDependenciesLib.cpp:87
Definition CircularInvolvedAssetItem.h:13
FName AssetName
Definition CircularInvolvedAssetItem.h:19
TArray< FName > DependencyStack
Definition CircularInvolvedAssetItem.h:22
Definition NameArray.h:13