Move Asset_Search to use IAssetRegistry
This commit is contained in:
@@ -3,8 +3,9 @@
|
|||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "MCPServer.h"
|
#include "MCPServer.h"
|
||||||
#include "MCPHandler.h"
|
#include "MCPHandler.h"
|
||||||
#include "MCPAssets.h"
|
|
||||||
#include "MCPUtils.h"
|
#include "MCPUtils.h"
|
||||||
|
#include "AssetRegistry/AssetRegistryModule.h"
|
||||||
|
#include "AssetRegistry/IAssetRegistry.h"
|
||||||
#include "Asset_Search.generated.h"
|
#include "Asset_Search.generated.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -40,9 +41,12 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MCPAssets<UObject> Assets;
|
// Build the asset registry filter
|
||||||
|
FARFilter Filter;
|
||||||
|
Filter.bRecursiveClasses = true;
|
||||||
|
Filter.bRecursivePaths = true;
|
||||||
|
Filter.PackagePaths.Add(FName(TEXT("/Game")));
|
||||||
|
|
||||||
// If a type is specified, find the UClass and filter by it
|
|
||||||
if (!Type.IsEmpty())
|
if (!Type.IsEmpty())
|
||||||
{
|
{
|
||||||
UClass* TypeClass = MCPUtils::FindClassByName(Type);
|
UClass* TypeClass = MCPUtils::FindClassByName(Type);
|
||||||
@@ -51,29 +55,40 @@ public:
|
|||||||
UMCPServer::Printf(TEXT("ERROR: Unknown asset type '%s'\n"), *Type);
|
UMCPServer::Printf(TEXT("ERROR: Unknown asset type '%s'\n"), *Type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Assets.NoScans().Scan(TypeClass);
|
Filter.ClassPaths.Add(TypeClass->GetClassPathName());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Query.IsEmpty())
|
// Query the asset registry
|
||||||
|
IAssetRegistry& AR = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry").Get();
|
||||||
|
TArray<FAssetData> Candidates;
|
||||||
|
AR.GetAssets(Filter, Candidates);
|
||||||
|
|
||||||
|
// Filter by query substring and collect results
|
||||||
|
TArray<FAssetData> Results;
|
||||||
|
for (const FAssetData& Data : Candidates)
|
||||||
{
|
{
|
||||||
Assets.Substring(Query);
|
if (Results.Num() >= Limit) break;
|
||||||
|
if (!Query.IsEmpty())
|
||||||
|
{
|
||||||
|
if (!Data.AssetName.ToString().Contains(Query, ESearchCase::IgnoreCase) &&
|
||||||
|
!Data.PackageName.ToString().Contains(Query, ESearchCase::IgnoreCase))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Results.Add(Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Assets.AllContent().Limit(Limit).Info();
|
for (const FAssetData& Data : Results)
|
||||||
|
|
||||||
const TArray<FAssetData>& AllData = Assets.AllData();
|
|
||||||
for (const FAssetData& Data : AllData)
|
|
||||||
{
|
{
|
||||||
UMCPServer::Printf(TEXT("%s %s\n"),
|
UMCPServer::Printf(TEXT("%s %s\n"),
|
||||||
*MCPUtils::FormatName(Data.GetClass()),
|
*MCPUtils::FormatName(Data.GetClass()),
|
||||||
*Data.PackageName.ToString());
|
*Data.PackageName.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AllData.Num() == 0)
|
if (Results.Num() == 0)
|
||||||
{
|
{
|
||||||
UMCPServer::Print(TEXT("No assets found.\n"));
|
UMCPServer::Print(TEXT("No assets found.\n"));
|
||||||
}
|
}
|
||||||
else if (AllData.Num() >= Limit)
|
else if (Results.Num() >= Limit)
|
||||||
{
|
{
|
||||||
UMCPServer::Printf(TEXT("WARNING: You reached the limit of %d, to raise it, specify the Limit parameter.\n"), Limit);
|
UMCPServer::Printf(TEXT("WARNING: You reached the limit of %d, to raise it, specify the Limit parameter.\n"), Limit);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user