From de0252cbbadb3c80e033e388fbeaa05587d9f1dc Mon Sep 17 00:00:00 2001 From: Christopher Lee Date: Tue, 27 Feb 2024 11:45:34 +0000 Subject: [PATCH] Added Emergence patch --- .../Private/LoaderBPFunctionLibrary.cpp | 15 +++++++++++++++ Source/VRM4ULoader/Private/VrmAsyncLoadAction.cpp | 5 ++++- .../VRM4ULoader/Public/LoaderBPFunctionLibrary.h | 5 ++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Source/VRM4ULoader/Private/LoaderBPFunctionLibrary.cpp b/Source/VRM4ULoader/Private/LoaderBPFunctionLibrary.cpp index a9343659..01186df2 100644 --- a/Source/VRM4ULoader/Private/LoaderBPFunctionLibrary.cpp +++ b/Source/VRM4ULoader/Private/LoaderBPFunctionLibrary.cpp @@ -558,6 +558,21 @@ bool ULoaderBPFunctionLibrary::LoadVRMFile(const UVrmAssetListObject *InVrmAsset return LoadVRMFileLocal(InVrmAsset, OutVrmAsset, filepath); } +void ULoaderBPFunctionLibrary::LoadVRMFromMemoryAsync(const UObject* WorldContextObject, const class UVrmAssetListObject* InVrmAsset, class UVrmAssetListObject*& OutVrmAsset, const TArray& Data, const FImportOptionData& OptionForRuntimeLoad, struct FLatentActionInfo LatentInfo) { + VRMConverter::Options::Get().SetVrmOption(&OptionForRuntimeLoad); + + if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) + { + FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); + if (LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID) == NULL) + { + FVrmAsyncLoadActionParam p = { InVrmAsset, OutVrmAsset, OptionForRuntimeLoad, FString("a.vrm"), Data.GetData(), (size_t)Data.Num()}; + LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FVrmAsyncLoadAction(LatentInfo, p)); + } + } + return; +} + void ULoaderBPFunctionLibrary::LoadVRMFileAsync(const UObject* WorldContextObject, const class UVrmAssetListObject* InVrmAsset, class UVrmAssetListObject*& OutVrmAsset, const FString filepath, const FImportOptionData& OptionForRuntimeLoad, struct FLatentActionInfo LatentInfo) { VRMConverter::Options::Get().SetVrmOption(&OptionForRuntimeLoad); diff --git a/Source/VRM4ULoader/Private/VrmAsyncLoadAction.cpp b/Source/VRM4ULoader/Private/VrmAsyncLoadAction.cpp index c0ad706b..bf6d39c4 100644 --- a/Source/VRM4ULoader/Private/VrmAsyncLoadAction.cpp +++ b/Source/VRM4ULoader/Private/VrmAsyncLoadAction.cpp @@ -199,6 +199,9 @@ void FVrmAsyncLoadAction::UpdateOperation(FLatentResponse& Response) TFunction< void() > f = [&] { + if (param.dataSize > 0) { + return; + } if (FFileHelper::LoadFileToArray(localAsset.vrmLocalRes, *param.filepath)) { param.pData = localAsset.vrmLocalRes.GetData(); param.dataSize = localAsset.vrmLocalRes.Num(); @@ -228,7 +231,7 @@ void FVrmAsyncLoadAction::UpdateOperation(FLatentResponse& Response) ++SequenceCount; localAsset.Importer = new Assimp::Importer(); - localAsset.ScenePtr = localAsset.Importer->ReadFileFromMemory(localAsset.vrmLocalRes.GetData(), localAsset.vrmLocalRes.Num(), + localAsset.ScenePtr = localAsset.Importer->ReadFileFromMemory(param.pData, param.dataSize, aiProcess_Triangulate | aiProcess_MakeLeftHanded | aiProcess_CalcTangentSpace | aiProcess_GenSmoothNormals | aiProcess_OptimizeMeshes, "vrm"); return; diff --git a/Source/VRM4ULoader/Public/LoaderBPFunctionLibrary.h b/Source/VRM4ULoader/Public/LoaderBPFunctionLibrary.h index af243855..8f04277c 100644 --- a/Source/VRM4ULoader/Public/LoaderBPFunctionLibrary.h +++ b/Source/VRM4ULoader/Public/LoaderBPFunctionLibrary.h @@ -88,7 +88,10 @@ class VRM4ULOADER_API ULoaderBPFunctionLibrary : public UBlueprintFunctionLibrar UFUNCTION(BlueprintCallable,Category="VRM4U", meta = (DynamicOutputParam = "OutVrmAsset")) static bool LoadVRMFile(const class UVrmAssetListObject *InVrmAsset, class UVrmAssetListObject *&OutVrmAsset, const FString filepath, const FImportOptionData &OptionForRuntimeLoad); - + + UFUNCTION(BlueprintCallable, Category = "VRM4U", meta = (Latent, DynamicOutputParam = "OutVrmAsset", WorldContext = "WorldContextObject", LatentInfo = "LatentInfo")) + static void LoadVRMFromMemoryAsync(const UObject* WorldContextObject, const UVrmAssetListObject* InVrmAsset, UVrmAssetListObject*& OutVrmAsset, const TArray& Data, const FImportOptionData& OptionForRuntimeLoad, FLatentActionInfo LatentInfo); + UFUNCTION(BlueprintCallable, Category = "VRM4U", meta = (Latent, DynamicOutputParam = "OutVrmAsset", WorldContext = "WorldContextObject", LatentInfo = "LatentInfo")) static void LoadVRMFileAsync(const UObject* WorldContextObject, const class UVrmAssetListObject* InVrmAsset, class UVrmAssetListObject*& OutVrmAsset, const FString filepath, const FImportOptionData& OptionForRuntimeLoad, struct FLatentActionInfo LatentInfo);