void FAssetSourceFilenameCache::HandleOnAssetRenamed(const FAssetData& AssetData, const FString& OldPath) { TOptional<FAssetImportInfo> ImportData = ExtractAssetImportInfo(AssetData.TagsAndValues); if (ImportData.IsSet()) { FName OldPathName = *OldPath; for (auto& SourceFile : ImportData->GetSourceFileData()) { FString CleanFilename = FPaths::GetCleanFilename(SourceFile.RelativeFilename); if (auto* Objects = SourceFileToObjectPathCache.Find(CleanFilename)) { Objects->Remove(OldPathName); if (Objects->Num() == 0) { SourceFileToObjectPathCache.Remove(CleanFilename); } } SourceFileToObjectPathCache.FindOrAdd(CleanFilename).Add(AssetData.ObjectPath); } } AssetRenamedEvent.Broadcast(AssetData, OldPath); }
void FAssetSourceFilenameCache::HandleOnAssetAdded(const FAssetData& AssetData) { TOptional<FAssetImportInfo> ImportData = ExtractAssetImportInfo(AssetData.TagsAndValues); if (ImportData.IsSet()) { for (const auto& SourceFile : ImportData->GetSourceFileData()) { SourceFileToObjectPathCache.FindOrAdd(FPaths::GetCleanFilename(SourceFile.RelativeFilename)).Add(AssetData.ObjectPath); } } }
void FAssetSourceFilenameCache::HandleOnAssetRemoved(const FAssetData& AssetData) { TOptional<FAssetImportInfo> ImportData = ExtractAssetImportInfo(AssetData.TagsAndValues); if (ImportData.IsSet()) { for (auto& SourceFile : ImportData->GetSourceFileData()) { FString CleanFilename = FPaths::GetCleanFilename(SourceFile.RelativeFilename); if (auto* Objects = SourceFileToObjectPathCache.Find(CleanFilename)) { Objects->Remove(AssetData.ObjectPath); if (Objects->Num() == 0) { SourceFileToObjectPathCache.Remove(CleanFilename); } } } } }
TArray<FAssetData> FAssetSourceFilenameCache::GetAssetsPertainingToFile(const IAssetRegistry& Registry, const FString& AbsoluteFilename) const { TArray<FAssetData> Assets; if (const auto* ObjectPaths = SourceFileToObjectPathCache.Find(FPaths::GetCleanFilename(AbsoluteFilename))) { for (const FName& Path : *ObjectPaths) { FAssetData Asset = Registry.GetAssetByObjectPath(Path); TOptional<FAssetImportInfo> ImportInfo = ExtractAssetImportInfo(Asset.TagsAndValues); if (ImportInfo.IsSet()) { auto AssetPackagePath = FPackageName::LongPackageNameToFilename(Asset.PackagePath.ToString() / TEXT("")); // Attempt to find the matching source filename in the list of imported sorce files (generally there are only one of these) const bool bWasImportedFromFile = ImportInfo->GetSourceFileData().ContainsByPredicate([&](const FAssetImportInfo::FSourceFile& File){ if (AbsoluteFilename == FPaths::ConvertRelativePathToFull(AssetPackagePath / File.RelativeFilename) || AbsoluteFilename == FPaths::ConvertRelativePathToFull(File.RelativeFilename)) { return true; } return false; }); if (bWasImportedFromFile) { Assets.Emplace(); Swap(Asset, Assets[Assets.Num() - 1]); } } } } return Assets; }