Finally finished asset lookup refactor (yeesh).

This commit is contained in:
2025-11-14 04:42:04 -05:00
parent 3215efeef3
commit 29612d226d
2 changed files with 48 additions and 92 deletions

View File

@@ -10,18 +10,6 @@
#include "Animation/AnimSequence.h"
#include "Engine/StaticMesh.h"
void UlxAssetLookup::LogMaybeError(bool Error, const TCHAR *Message, const TCHAR *Path)
{
if (Error)
{
UE_LOG(LogLuprexIntegration, Error, TEXT("%s: %s"), Message, Path);
}
else
{
UE_LOG(LogLuprexIntegration, Display, TEXT("%s: %s"), Message, Path);
}
}
const ElxValidOrNotValid NotValid = ElxValidOrNotValid::NotValid;
const ElxValidOrNotValid Valid = ElxValidOrNotValid::Valid;
@@ -36,7 +24,7 @@ void UlxAssetLookup::RebuildIndex()
AddAssets(TEXT("/Game/Widgets"), UWidgetBlueprint::StaticClass(), TEXT("WB_"));
}
void UlxAssetLookup::AddAssets(const TCHAR *Path, const UClass *Class, const TCHAR *NamePrefix)
void UlxAssetLookup::AddAssets(const TCHAR *Path, UClass *Class, const TCHAR *NamePrefix)
{
TArray<FAssetData> FoundData;
TMap<FName, FString> Result;
@@ -62,74 +50,71 @@ void UlxAssetLookup::AddAssets(const TCHAR *Path, const UClass *Class, const TCH
FoundData.Num(), *Class->GetName(), Path);
}
FString UlxAssetLookup::GetAssetPath(const UObject *Context, const UClass *Class, const FString &Name)
UObject *UlxAssetLookup::LoadAsset(const UObject *Context, UClass *Class, UClass *ChildOf, const FString &Name, bool ErrorIfNotFound)
{
const UlxAssetLookup *Lookup = ALuprexGameModeBase::FromContext(Context)->GetAssetLookup();
const FString *Path = Lookup->AssetPaths.Find(MakeTuple(Class->GetName(), FName(Name)));
if (Path == nullptr)
{
return FString();
if (ErrorIfNotFound)
{
UE_LOG(LogLuprexIntegration, Error, TEXT("Loading %s %s: asset not found"), *Class->GetName(), *Name);
}
return nullptr;
}
return *Path;
UObject *Result;
if (ChildOf == nullptr)
{
Result = StaticLoadObject(Class, nullptr, **Path);
}
else
{
Result = StaticLoadObject(UClass::StaticClass(), nullptr, *((*Path) + FString(TEXT("_C"))));
}
if (Result == nullptr)
{
UE_LOG(LogLuprexIntegration, Error, TEXT("Loading %s %s: unknown load failure"), *Class->GetName(), *Name);
return nullptr;
}
if (ChildOf != nullptr)
{
UClass *ResClass = (UClass *)Result;
if (!ResClass->IsChildOf(ChildOf))
{
UE_LOG(LogLuprexIntegration, Error, TEXT("Loading %s %s: blueprint not a child of %s"), *Class->GetName(), *Name, *ChildOf->GetName());
return nullptr;
}
}
return Result;
}
ElxValidOrNotValid UlxAssetLookup::LoadStaticMeshAsset(
UStaticMesh *&Result, const UObject *Context, const FString &Name, bool ErrorIfNotFound)
{
Result = nullptr;
FString Path = GetAssetPath(Context, UStaticMesh::StaticClass(), Name);
if (Path.IsEmpty())
{
LogMaybeError(ErrorIfNotFound, TEXT("Static Mesh not found"), *Name);
Result = nullptr; return NotValid;
}
Result = LoadObject<UStaticMesh>(nullptr, *Path);
if (Result == nullptr)
{
LogMaybeError(ErrorIfNotFound, TEXT("Cannot load Static Mesh"), *Path);
Result = nullptr; return NotValid;
}
return Valid;
Result = (UStaticMesh *)LoadAsset(Context, UStaticMesh::StaticClass(), nullptr, Name, ErrorIfNotFound);
return Result ? Valid : NotValid;
}
ElxValidOrNotValid UlxAssetLookup::LoadAnimSequenceAsset(
UAnimSequence *&Result, const UObject *Context, const FString &Name, bool ErrorIfNotFound)
{
Result = nullptr;
FString Path = GetAssetPath(Context, UAnimSequence::StaticClass(), Name);
if (Path.IsEmpty())
{
LogMaybeError(ErrorIfNotFound, TEXT("Anim Sequence not found"), *Name);
Result = nullptr; return NotValid;
}
Result = LoadObject<UAnimSequence>(nullptr, *Path);
if (Result == nullptr)
{
LogMaybeError(ErrorIfNotFound, TEXT("Cannot load Anim Sequence"), *Path);
Result = nullptr; return NotValid;
}
return Valid;
Result = (UAnimSequence *)LoadAsset(Context, UAnimSequence::StaticClass(), nullptr, Name, ErrorIfNotFound);
return Result ? Valid : NotValid;
}
ElxValidOrNotValid UlxAssetLookup::LoadTangibleBlueprintAsset(
TSubclassOf<AActor> &Result, const UObject *Context, const FString &Name, bool ErrorIfNotFound)
{
FString Path = GetAssetPath(Context, UBlueprint::StaticClass(), Name);
if (Path.IsEmpty())
{
LogMaybeError(ErrorIfNotFound, TEXT("Tangible not found"), *Name);
Result = nullptr; return NotValid;
}
Result = LoadClass<AActor>(nullptr, *UnderscoreC(Path));
if (Result == nullptr)
{
LogMaybeError(ErrorIfNotFound, TEXT("Tangible load failed, not an actor blueprint"), *Path);
Result = nullptr; return NotValid;
}
Result = (UClass*)LoadAsset(Context, UBlueprint::StaticClass(), AActor::StaticClass(), Name, ErrorIfNotFound);
if (Result == nullptr) return NotValid;
UFunction *aqchanged = Result->FindFunctionByName(FName(TEXT("Animation Queue Changed")));
if ((aqchanged == nullptr)||(aqchanged->ParmsSize != 0))
{
LogMaybeError(ErrorIfNotFound, TEXT("Tangible does not have 'Animation Queue Changed' function"), *Path);
UE_LOG(LogLuprexIntegration, Error, TEXT("Loading Blueprint %s: Tangible does not have 'Animation Queue Changed' function"), *Name);
Result = nullptr; return NotValid;
}
return Valid;
@@ -138,38 +123,13 @@ ElxValidOrNotValid UlxAssetLookup::LoadTangibleBlueprintAsset(
ElxValidOrNotValid UlxAssetLookup::LoadUserWidgetAsset(
TSubclassOf<UUserWidget> &Result, const UObject *Context, const FString &Name, bool ErrorIfNotFound)
{
Result = nullptr;
FString Path = GetAssetPath(Context, UWidgetBlueprint::StaticClass(), Name);
if (Path.IsEmpty())
{
LogMaybeError(ErrorIfNotFound, TEXT("Widget not Found"), *Name);
Result = nullptr; return NotValid;
}
Result = LoadClass<UUserWidget>(nullptr, *UnderscoreC(Path));
if (Result == nullptr)
{
LogMaybeError(ErrorIfNotFound, TEXT("Cannot load widget, not a UUserWidget"), *Path);
Result = nullptr; return NotValid;
}
return Valid;
Result = (UClass *)LoadAsset(Context, UWidgetBlueprint::StaticClass(), UUserWidget::StaticClass(), Name, ErrorIfNotFound);
return Result ? Valid : NotValid;
}
ElxValidOrNotValid UlxAssetLookup::LoadLuaWidgetAsset(
TSubclassOf<UlxLuaWidget> &Result, const UObject *Context, const FString &Name, bool ErrorIfNotFound)
{
Result = nullptr;
FString Path = GetAssetPath(Context, UWidgetBlueprint::StaticClass(), Name);
if (Path.IsEmpty())
{
LogMaybeError(ErrorIfNotFound, TEXT("Widget not on search path"), *Name);
Result = nullptr; return NotValid;
}
Result = LoadClass<UlxLuaWidget>(nullptr, *UnderscoreC(Path));
if (Result == nullptr)
{
LogMaybeError(ErrorIfNotFound, TEXT("Cannot load widget, not a UlxLuaWidget"), *Path);
Result = nullptr; return NotValid;
}
return Valid;
Result = (UClass *)LoadAsset(Context, UWidgetBlueprint::StaticClass(), UlxLuaWidget::StaticClass(), Name, ErrorIfNotFound);
return Result ? Valid : NotValid;
}