Files
UnrealEngineUWP/Engine/Source/Runtime/AssetRegistry/Private/PackageDependencyData.cpp
Matt Peters 46290e86ee AssetDataGatherer: Change serialization format of dependencies in the editor's AssetDataGatherer cache to improve load performance.
#rb Zousar.Shaker
#rnx
#preflight 6245a64e637925b5d3c6c729

[CL 19571741 by Matt Peters in ue5-main branch]
2022-03-31 09:16:55 -04:00

103 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "PackageDependencyData.h"
FName FPackageDependencyData::GetImportPackageName(const TArray<FObjectImport>& ImportMap, int32 ImportIndex)
{
for (int32 NumCycles = 0; NumCycles < ImportMap.Num(); ++NumCycles)
{
if (!ImportMap.IsValidIndex(ImportIndex))
{
return NAME_None;
}
const FObjectImport& Resource = ImportMap[ImportIndex];
// If the import has a package name set, then that's the import package name,
if (Resource.HasPackageName())
{
return Resource.GetPackageName();
}
// If our outer is null, then we have a package
else if (Resource.OuterIndex.IsNull())
{
return Resource.ObjectName;
}
if (!Resource.OuterIndex.IsImport())
{
return NAME_None;
}
ImportIndex = Resource.OuterIndex.ToImport();
}
return NAME_None;
}
void FPackageDependencyData::LoadDependenciesFromPackageHeader(FName SourcePackageName, TArray<FObjectImport>& ImportMap,
TArray<FName>& SoftPackageReferenceList, TMap<FPackageIndex, TArray<FName>>& SearchableNames,
TBitArray<>& ImportUsedInGame, TBitArray<>& SoftPackageUsedInGame)
{
using namespace UE::AssetRegistry;
PackageDependencies.Reset(ImportMap.Num() + SoftPackageReferenceList.Num());
check(ImportMap.Num() == ImportUsedInGame.Num());
for (int32 ImportIdx = 0; ImportIdx < ImportMap.Num(); ++ImportIdx)
{
FName DependencyPackageName = GetImportPackageName(ImportMap, ImportIdx);
EDependencyProperty DependencyProperty = EDependencyProperty::Build | EDependencyProperty::Hard;
DependencyProperty |= ImportUsedInGame[ImportIdx] ? EDependencyProperty::Game : EDependencyProperty::None;
PackageDependencies.Add({ DependencyPackageName, DependencyProperty });
}
check(SoftPackageReferenceList.Num() == SoftPackageUsedInGame.Num());
for (int32 SoftPackageIdx = 0; SoftPackageIdx < SoftPackageReferenceList.Num(); ++SoftPackageIdx)
{
FName DependencyPackageName = SoftPackageReferenceList[SoftPackageIdx];
FAssetIdentifier AssetId(DependencyPackageName);
EDependencyProperty DependencyProperty = UE::AssetRegistry::EDependencyProperty::Build; // !EDependencyProperty::Hard
DependencyProperty |= (SoftPackageUsedInGame[SoftPackageIdx] ? EDependencyProperty::Game : EDependencyProperty::None);
PackageDependencies.Add({ DependencyPackageName, DependencyProperty });
}
SearchableNameDependencies.Reset(SearchableNames.Num());
for (const TPair<FPackageIndex, TArray<FName>>& SearchableNameList : SearchableNames)
{
FName ObjectName;
FName DependencyPackageName;
// Find object and package name from linker
FPackageIndex LinkerIndex = SearchableNameList.Key;
if (LinkerIndex.IsExport())
{
// Package name has to be this package, take a guess at object name
DependencyPackageName = SourcePackageName;
ObjectName = FName(*FPackageName::GetLongPackageAssetName(DependencyPackageName.ToString()));
}
else if (LinkerIndex.IsImport())
{
int32 ImportIndex = LinkerIndex.ToImport();
if (!ImportMap.IsValidIndex(ImportIndex))
{
continue;
}
FObjectImport& Resource = ImportMap[ImportIndex];
FPackageIndex OuterLinkerIndex = Resource.OuterIndex;
if (!OuterLinkerIndex.IsNull())
{
ObjectName = Resource.ObjectName;
}
DependencyPackageName = GetImportPackageName(ImportMap, ImportIndex);
if (DependencyPackageName.IsNone())
{
continue;
}
}
else
{
continue;
}
FSearchableNamesDependency& Dependency = SearchableNameDependencies.Emplace_GetRef();
Dependency.PackageName = DependencyPackageName;
Dependency.ObjectName = ObjectName;
Dependency.ValueNames = SearchableNameList.Value;
}
}