// Copyright Epic Games, Inc. All Rights Reserved. #include "PersonaAssetFamilyManager.h" #include "AssetRegistry/AssetData.h" #include "IAssetFamily.h" #include "PersonaAssetFamily.h" FPersonaAssetFamilyManager& FPersonaAssetFamilyManager::Get() { static FPersonaAssetFamilyManager TheManager; return TheManager; } TSharedRef FPersonaAssetFamilyManager::CreatePersonaAssetFamily(const UObject* InAsset) { // compact any invalid entries AssetFamilies.RemoveAll([](const TWeakPtr& InAssetFamily) { return !InAssetFamily.IsValid(); }); // look for an existing matching asset family TWeakPtr* ExistingAssetFamily = nullptr; FAssetData AssetData(InAsset); for (TWeakPtr& AssetFamily : AssetFamilies) { if (AssetFamily.Pin()->IsAssetCompatible(AssetData)) { ExistingAssetFamily = &AssetFamily; break; } } // Create new asset family TSharedRef NewAssetFamily = ExistingAssetFamily != nullptr ? MakeShared(InAsset, ExistingAssetFamily->Pin().ToSharedRef()) : MakeShared(InAsset); NewAssetFamily->Initialize(); AssetFamilies.Add(NewAssetFamily); return NewAssetFamily; } void FPersonaAssetFamilyManager::BroadcastAssetFamilyChange() { // Create copy as delegate can modify the AssetFamilies array TArray> AssetFamiliesCopy = AssetFamilies; for (TWeakPtr& AssetFamily : AssetFamiliesCopy) { if (TSharedPtr PinnedAssetFamily = AssetFamily.Pin()) { PinnedAssetFamily->GetOnAssetFamilyChanged().Broadcast(); } } } void FPersonaAssetFamilyManager::RecordAssetOpened(const FAssetData& InAssetData) const { for (const TWeakPtr& AssetFamily : AssetFamilies) { if (TSharedPtr PinnedAssetFamily = AssetFamily.Pin()) { if(PinnedAssetFamily->IsAssetCompatible(InAssetData)) { PRAGMA_DISABLE_DEPRECATION_WARNINGS PinnedAssetFamily->RecordAssetOpened(InAssetData); PRAGMA_ENABLE_DEPRECATION_WARNINGS } } } }