87 lines
2.7 KiB
C++
87 lines
2.7 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "AssetRegistry/AssetData.h"
|
|
#include "MCPUtils.h"
|
|
#include "Engine/Blueprint.h"
|
|
#include "Engine/LevelScriptBlueprint.h"
|
|
#include "Engine/World.h"
|
|
|
|
struct FARFilter;
|
|
|
|
// ============================================================
|
|
// MCPAssetsBase — non-template base for MCPAssets<T>
|
|
// ============================================================
|
|
|
|
class MCPAssetsBase
|
|
{
|
|
public:
|
|
MCPAssetsBase(UClass* InTargetClass);
|
|
MCPAssetsBase& Scan(UClass* Class) { Classes.Add(Class); return *this; }
|
|
template<class T> MCPAssetsBase& Scan() { return Scan(T::StaticClass()); }
|
|
MCPAssetsBase& Exact(const FString& InName);
|
|
MCPAssetsBase& Substring(const FString& InFilter);
|
|
MCPAssetsBase& Limit(int32 Count) { MaxResults = Count; return *this; }
|
|
MCPAssetsBase& NoDerived();
|
|
MCPAssetsBase& AllContent();
|
|
MCPAssetsBase& Errors(MCPErrorCallback InCB);
|
|
MCPAssetsBase& EAny() { bErrorIfAny = true; return *this; }
|
|
MCPAssetsBase& ENone() { bErrorIfNone = true; return *this; }
|
|
MCPAssetsBase& ETwo() { bErrorIfTwo = true; return *this; }
|
|
|
|
bool Load();
|
|
bool Info();
|
|
|
|
const TArray<FAssetData>& AllData() const { return AssetResults; }
|
|
const FAssetData& OneData() const { return AssetResults[0]; }
|
|
|
|
private:
|
|
bool Execute(bool bLoad);
|
|
void ConfigureFilterClassPaths(FARFilter &Filter);
|
|
bool AssetMatches(const FAssetData &Data);
|
|
UObject *TryLoadAsset(const FAssetData &Asset);
|
|
void SetError(const FString &Msg);
|
|
|
|
protected:
|
|
UClass* TargetClass;
|
|
TArray<UClass*, TInlineAllocator<4>> Classes;
|
|
TArray<FAssetData> AssetResults;
|
|
TArray<UObject*> UObjectResults;
|
|
FString MatchName;
|
|
bool bExactMatch = false;
|
|
bool bPatternHasSlash = false;
|
|
bool bNoDerived = false;
|
|
bool bAllContent = false;
|
|
bool bErrorIfAny = false;
|
|
bool bErrorIfNone = false;
|
|
bool bErrorIfTwo = false;
|
|
int32 MaxResults = 50;
|
|
MCPErrorCallback ErrorCB = MCPErrorCallback(nullptr);
|
|
};
|
|
|
|
// ============================================================
|
|
// MCPAssets<T> — builder-pattern asset finder
|
|
//
|
|
// Usage:
|
|
// MCPAssets<UBlueprint> Assets;
|
|
// if (!Assets.Exact(Name).Errors(Result).ENone().ETwo().Load()) return;
|
|
// UBlueprint* BP = Assets.Object();
|
|
//
|
|
// MCPAssets<UMaterial> Materials;
|
|
// if (!Materials.Substring(Filter).Limit(100).Load()) return;
|
|
// for (UMaterial* Mat : Materials.Objects()) { ... }
|
|
// ============================================================
|
|
|
|
template<class T>
|
|
class MCPAssets : public MCPAssetsBase
|
|
{
|
|
public:
|
|
MCPAssets() : MCPAssetsBase(T::StaticClass()) {}
|
|
|
|
TArrayView<T* const> Objects() const
|
|
{
|
|
return TArrayView<T* const>(reinterpret_cast<T* const*>(UObjectResults.GetData()), UObjectResults.Num());
|
|
}
|
|
T* Object() const { return static_cast<T*>(UObjectResults[0]); }
|
|
};
|