From eb960bd69abf04363a81b90b169b73f49658ffb2 Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 12 Aug 2024 10:11:46 +0300 Subject: [PATCH 1/7] chore: ignore intermediate --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c6d0a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +Intermediate/ From ee33e22694aea39b76494108bd83ba13e8990c27 Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 12 Aug 2024 10:19:01 +0300 Subject: [PATCH 2/7] chore: update git ignore --- .gitignore | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7c6d0a3..6582eaf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,74 @@ +# Visual Studio 2015 user specific files +.vs/ -Intermediate/ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +*.ipa + +# These project files can be generated by the engine +*.xcodeproj +*.xcworkspace +*.sln +*.suo +*.opensdf +*.sdf +*.VC.db +*.VC.opendb + +# Precompiled Assets +SourceArt/**/*.png +SourceArt/**/*.tga + +# Binary Files +Binaries/* +Plugins/*/Binaries/* + +# Builds +Build/* + +# Whitelist PakBlacklist-.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + +# Don't ignore icon files in Build +!Build/**/*.ico + +# Built data for maps +*_BuiltData.uasset + +# Configuration files generated by the Editor +Saved/* + +# Compiled source files for the engine to use +Intermediate/* +Plugins/*/Intermediate/* + +# Cache files for the editor to use +DerivedDataCache/* From 2a3bb957c675b80fab1bb8ee9d4e9a2eca6028d7 Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 12 Aug 2024 10:19:14 +0300 Subject: [PATCH 3/7] chore: fix for FImageView errors --- .../Private/TransientObjectSaverLibrary.cpp | 73 ++++++++++++------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp index 09d562e..b148120 100644 --- a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp +++ b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp @@ -135,33 +135,54 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat UTexture* Value = nullptr; if (MaterialInstanceDynamic->GetTextureParameterValue(MaterialsParameterInfos[ParameterIndex].Name, Value, true)) { - if (TransientObjectSaver::IsTransient(Value)) - { - if (!Value->Source.IsValid()) - { - UTexture2D* Texture2D = Cast(Value); - if (Texture2D) - { - FTexturePlatformData* PlatformData = Texture2D->GetPlatformData(); - if (PlatformData->Mips.IsValidIndex(0)) - { - const void* Data = PlatformData->Mips[0].BulkData.LockReadOnly(); - - FImageView ImageView(const_cast(Data), PlatformData->Mips[0].SizeX, PlatformData->Mips[0].SizeY, ERawImageFormat::BGRA8); - PlatformData->Mips[0].BulkData.Unlock(); - Value->Source.Init(ImageView); - } - } - } - const FString TextureName = TextureNameGenerator.Execute(Value, Material, MaterialPath, MaterialsParameterInfos[ParameterIndex].Name.ToString()); - if (!TextureName.IsEmpty()) - { - TransientObjectSaver::SaveUObject(Value, TextureName); - } - } - UE_LOG(LogTemp, Warning, TEXT("Param: %s [%s] = %s"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), *Value->GetFullName()); - MaterialInstance->SetTextureParameterValueEditorOnly(MaterialsParameterInfos[ParameterIndex], Value); + if (TransientObjectSaver::IsTransient(Value)) + { + if (!Value->Source.IsValid()) + { + UTexture2D* Texture2D = Cast(Value); + if (Texture2D) + { + FTexturePlatformData* PlatformData = Texture2D->GetPlatformData(); + if (PlatformData && PlatformData->Mips.IsValidIndex(0)) + { + // Lock the texture data for reading + const void* Data = PlatformData->Mips[0].BulkData.LockReadOnly(); + + // Access the raw texture data and handle it as needed + int32 Width = PlatformData->Mips[0].SizeX; + int32 Height = PlatformData->Mips[0].SizeY; + int32 ImageBytes = Width * Height * 4; // Assuming 4 bytes per pixel for BGRA8 + + // Create a buffer to store the image data + TArray ImageData; + ImageData.AddUninitialized(ImageBytes); + + // Copy the data from the locked region + FMemory::Memcpy(ImageData.GetData(), Data, ImageBytes); + + // Unlock the bulk data + PlatformData->Mips[0].BulkData.Unlock(); + + // If you need to initialize the texture source with this data + Value->Source.Init(Width, Height, 1, 1, TSF_BGRA8, ImageData.GetData()); + + // Additional processing or saving the texture can be done here + } + } + } + + // Generate texture name and save the UObject if needed + const FString TextureName = TextureNameGenerator.Execute(Value, Material, MaterialPath, MaterialsParameterInfos[ParameterIndex].Name.ToString()); + if (!TextureName.IsEmpty()) + { + TransientObjectSaver::SaveUObject(Value, TextureName); + } + } + + UE_LOG(LogTemp, Warning, TEXT("Param: %s [%s] = %s"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), *Value->GetFullName()); + MaterialInstance->SetTextureParameterValueEditorOnly(MaterialsParameterInfos[ParameterIndex], Value); } + } OutMaterial = MaterialInstance; return TransientObjectSaver::SaveUObject(MaterialInstance, MaterialPath); From 81c6ada9db3b9eaaa2a3262be17eaa54129ab1ee Mon Sep 17 00:00:00 2001 From: Harrison Hough Date: Thu, 29 Aug 2024 19:13:04 +0300 Subject: [PATCH 4/7] chore: add extra include for UE 5.1 + --- .../Private/TransientObjectSaverLibrary.cpp | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp index b148120..d3892c7 100644 --- a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp +++ b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp @@ -8,7 +8,9 @@ #include "Rendering/SkeletalMeshRenderData.h" #include "Materials/MaterialInstanceConstant.h" #include "LODUtilities.h" - +#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 1 +#include "Engine/SkinnedAssetCommon.h" +#endif namespace TransientObjectSaver { @@ -145,33 +147,23 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat FTexturePlatformData* PlatformData = Texture2D->GetPlatformData(); if (PlatformData && PlatformData->Mips.IsValidIndex(0)) { - // Lock the texture data for reading const void* Data = PlatformData->Mips[0].BulkData.LockReadOnly(); - - // Access the raw texture data and handle it as needed - int32 Width = PlatformData->Mips[0].SizeX; - int32 Height = PlatformData->Mips[0].SizeY; + const int32 Width = PlatformData->Mips[0].SizeX; + const int32 Height = PlatformData->Mips[0].SizeY; int32 ImageBytes = Width * Height * 4; // Assuming 4 bytes per pixel for BGRA8 - - // Create a buffer to store the image data + TArray ImageData; ImageData.AddUninitialized(ImageBytes); - - // Copy the data from the locked region + FMemory::Memcpy(ImageData.GetData(), Data, ImageBytes); - - // Unlock the bulk data + PlatformData->Mips[0].BulkData.Unlock(); - // If you need to initialize the texture source with this data Value->Source.Init(Width, Height, 1, 1, TSF_BGRA8, ImageData.GetData()); - - // Additional processing or saving the texture can be done here } } } - - // Generate texture name and save the UObject if needed + const FString TextureName = TextureNameGenerator.Execute(Value, Material, MaterialPath, MaterialsParameterInfos[ParameterIndex].Name.ToString()); if (!TextureName.IsEmpty()) { From b915c0d2d14f00b53bd4c466d0844a436fb65b1d Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 16 Sep 2024 12:26:49 +0300 Subject: [PATCH 5/7] chore: added log category --- .../Private/TransientObjectSaverLibrary.cpp | 33 ++++++++++--------- .../Public/TransientObjectSaverLibrary.h | 2 ++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp index d3892c7..6d2874e 100644 --- a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp +++ b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp @@ -12,6 +12,9 @@ #include "Engine/SkinnedAssetCommon.h" #endif + +DEFINE_LOG_CATEGORY(LogTransientObjectSaver); + namespace TransientObjectSaver { bool IsTransient(UObject* Object) @@ -33,20 +36,20 @@ namespace TransientObjectSaver { if (!FPackageName::IsValidObjectPath(Path)) { - UE_LOG(LogTemp, Error, TEXT("Invalid UPackage path %s"), *Path); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Invalid UPackage path %s"), *Path); return false; } if (FindPackage(nullptr, *Path) || LoadPackage(nullptr, *Path, EObjectFlags::RF_Public | EObjectFlags::RF_Standalone)) { - UE_LOG(LogTemp, Error, TEXT("UPackage %s already exists"), *Path); + UE_LOG(LogTransientObjectSaver, Error, TEXT("UPackage %s already exists"), *Path); return false; } UPackage* NewPackage = CreatePackage(*Path); if (!NewPackage) { - UE_LOG(LogTemp, Error, TEXT("Unable to create UPackage %s"), *Path); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Unable to create UPackage %s"), *Path); return false; } @@ -54,7 +57,7 @@ namespace TransientObjectSaver if (!Object->Rename(nullptr, NewPackage, REN_DontCreateRedirectors)) { - UE_LOG(LogTemp, Error, TEXT("Unable to move UObject %s into UPackage %s"), *Object->GetFullName(), *Path); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Unable to move UObject %s into UPackage %s"), *Object->GetFullName(), *Path); return false; } @@ -69,13 +72,13 @@ namespace TransientObjectSaver if (!Object->Rename(*NewName, nullptr, REN_DontCreateRedirectors)) { - UE_LOG(LogTemp, Error, TEXT("Unable to rename UObject %s to %s"), *Object->GetFullName(), *NewName); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Unable to rename UObject %s to %s"), *Object->GetFullName(), *NewName); return false; } if (!UPackage::SavePackage(NewPackage, Object, EObjectFlags::RF_Standalone | EObjectFlags::RF_Public, *FPackageName::LongPackageNameToFilename(Path, FPackageName::GetAssetPackageExtension()))) { - UE_LOG(LogTemp, Error, TEXT("Unable to save UPackage %s"), *NewPackage->GetPathName()); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Unable to save UPackage %s"), *NewPackage->GetPathName()); return false; } @@ -100,7 +103,7 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat return false; } - UE_LOG(LogTemp, Error, TEXT("Material %s %s %d"), *(Material->GetFullName()), *(Material->GetOutermost()->GetFullName()), Material->GetOutermost()->HasAnyFlags(EObjectFlags::RF_Transient)); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Material %s %s %d"), *(Material->GetFullName()), *(Material->GetOutermost()->GetFullName()), Material->GetOutermost()->HasAnyFlags(EObjectFlags::RF_Transient)); UMaterialInstanceDynamic* MaterialInstanceDynamic = Cast(Material); if (MaterialInstanceDynamic) { @@ -115,7 +118,7 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat float Value = 0; if (MaterialInstanceDynamic->GetScalarParameterValue(MaterialsParameterInfos[ParameterIndex].Name, Value, true)) { - UE_LOG(LogTemp, Warning, TEXT("Param: %s [%s] = %f"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), Value); + UE_LOG(LogTransientObjectSaver, Warning, TEXT("Param: %s [%s] = %f"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), Value); MaterialInstance->SetScalarParameterValueEditorOnly(MaterialsParameterInfos[ParameterIndex], Value); } } @@ -126,7 +129,7 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat FLinearColor Value = FLinearColor::Black; if (MaterialInstanceDynamic->GetVectorParameterValue(MaterialsParameterInfos[ParameterIndex].Name, Value, true)) { - UE_LOG(LogTemp, Warning, TEXT("Param: %s [%s] = %s"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), *Value.ToString()); + UE_LOG(LogTransientObjectSaver, Warning, TEXT("Param: %s [%s] = %s"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), *Value.ToString()); MaterialInstance->SetVectorParameterValueEditorOnly(MaterialsParameterInfos[ParameterIndex], Value); } } @@ -171,7 +174,7 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat } } - UE_LOG(LogTemp, Warning, TEXT("Param: %s [%s] = %s"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), *Value->GetFullName()); + UE_LOG(LogTransientObjectSaver, Warning, TEXT("Param: %s [%s] = %s"), *MaterialsParameterInfos[ParameterIndex].Name.ToString(), *ParameterGuids[ParameterIndex].ToString(), *Value->GetFullName()); MaterialInstance->SetTextureParameterValueEditorOnly(MaterialsParameterInfos[ParameterIndex], Value); } @@ -202,7 +205,7 @@ bool UTransientObjectSaverLibrary::SaveTransientStaticMesh(UStaticMesh* StaticMe if (!StaticMesh->GetMeshDescription(0)) { - UE_LOG(LogTemp, Error, TEXT("The StaticMesh has no MeshDescription")); + UE_LOG(LogTransientObjectSaver, Error, TEXT("The StaticMesh has no MeshDescription")); return false; } @@ -247,16 +250,16 @@ bool UTransientObjectSaverLibrary::SaveTransientSkeletalMesh(USkeletalMesh* Skel FSkeletalMeshModel* ImportedResource = SkeletalMesh->GetImportedModel(); if (!ImportedResource) { - UE_LOG(LogTemp, Error, TEXT("Unable to GetImportedModel()")); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Unable to GetImportedModel()")); return false; } - UE_LOG(LogTemp, Error, TEXT("ImportedResource: %d"), ImportedResource->LODModels.Num()); + UE_LOG(LogTransientObjectSaver, Log, TEXT("ImportedResource: %d"), ImportedResource->LODModels.Num()); FSkeletalMeshRenderData* RenderData = SkeletalMesh->GetResourceForRendering(); if (!RenderData) { - UE_LOG(LogTemp, Error, TEXT("Unable to access RenderData")); + UE_LOG(LogTransientObjectSaver, Error, TEXT("Unable to access RenderData")); return false; } @@ -286,7 +289,7 @@ bool UTransientObjectSaverLibrary::SaveTransientSkeletalMesh(USkeletalMesh* Skel //ImportData.PointToRawMap.Add(VertexIndex); //} - UE_LOG(LogTemp, Error, TEXT("LOD %d has %d vertices and %d sections"), LODIndex, ImportedResource->LODModels[LODIndex].NumVertices, ImportedResource->LODModels[LODIndex].Sections.Num()); + UE_LOG(LogTransientObjectSaver, Log, TEXT("LOD %d has %d vertices and %d sections"), LODIndex, ImportedResource->LODModels[LODIndex].NumVertices, ImportedResource->LODModels[LODIndex].Sections.Num()); const int32 NumSections = RenderData->LODRenderData[LODIndex].RenderSections.Num(); for (int32 SectionIndex = 0; SectionIndex < NumSections; SectionIndex++) { diff --git a/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h b/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h index db45985..1965dfb 100644 --- a/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h +++ b/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h @@ -6,6 +6,8 @@ #include "Kismet/BlueprintFunctionLibrary.h" #include "TransientObjectSaverLibrary.generated.h" +GLTFRUNTIME_API DECLARE_LOG_CATEGORY_EXTERN(LogTransientObjectSaver, Log, All); + DECLARE_DYNAMIC_DELEGATE_RetVal_ThreeParams(FString, FTransientObjectSaverMaterialNameGenerator, UMaterialInterface*, Material, const int32, MaterialIndex, const FString&, SlotName); DECLARE_DYNAMIC_DELEGATE_RetVal_FourParams(FString, FTransientObjectSaverTextureNameGenerator, UTexture*, Texture, UMaterialInterface*, Material, const FString&, MaterialPath, const FString&, ParamName); From d9477f4d976f52aa7e0fd4dc26227e653981bf6c Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 16 Sep 2024 12:30:45 +0300 Subject: [PATCH 6/7] fix: update log cat declaration --- .../TransientObjectSaver/Public/TransientObjectSaverLibrary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h b/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h index 1965dfb..66a5c9e 100644 --- a/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h +++ b/Source/TransientObjectSaver/Public/TransientObjectSaverLibrary.h @@ -6,7 +6,7 @@ #include "Kismet/BlueprintFunctionLibrary.h" #include "TransientObjectSaverLibrary.generated.h" -GLTFRUNTIME_API DECLARE_LOG_CATEGORY_EXTERN(LogTransientObjectSaver, Log, All); +TRANSIENTOBJECTSAVER_API DECLARE_LOG_CATEGORY_EXTERN(LogTransientObjectSaver, Log, All); DECLARE_DYNAMIC_DELEGATE_RetVal_ThreeParams(FString, FTransientObjectSaverMaterialNameGenerator, UMaterialInterface*, Material, const int32, MaterialIndex, const FString&, SlotName); DECLARE_DYNAMIC_DELEGATE_RetVal_FourParams(FString, FTransientObjectSaverTextureNameGenerator, UTexture*, Texture, UMaterialInterface*, Material, const FString&, MaterialPath, const FString&, ParamName); From 45b7fc5bc576c72092324ce0e5e1e9e3d4af9b9d Mon Sep 17 00:00:00 2001 From: Harrison Hough Date: Thu, 10 Oct 2024 09:22:33 +0300 Subject: [PATCH 7/7] chore: small log cleanup --- .../Private/TransientObjectSaverLibrary.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp index 6d2874e..66d700a 100644 --- a/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp +++ b/Source/TransientObjectSaver/Private/TransientObjectSaverLibrary.cpp @@ -103,7 +103,7 @@ bool UTransientObjectSaverLibrary::SaveTransientMaterial(UMaterialInterface* Mat return false; } - UE_LOG(LogTransientObjectSaver, Error, TEXT("Material %s %s %d"), *(Material->GetFullName()), *(Material->GetOutermost()->GetFullName()), Material->GetOutermost()->HasAnyFlags(EObjectFlags::RF_Transient)); + UE_LOG(LogTransientObjectSaver, Log, TEXT("Material %s %s %d"), *(Material->GetFullName()), *(Material->GetOutermost()->GetFullName()), Material->GetOutermost()->HasAnyFlags(EObjectFlags::RF_Transient)); UMaterialInstanceDynamic* MaterialInstanceDynamic = Cast(Material); if (MaterialInstanceDynamic) { @@ -234,8 +234,9 @@ bool UTransientObjectSaverLibrary::SaveTransientStaticMesh(UStaticMesh* StaticMe bool UTransientObjectSaverLibrary::SaveTransientSkeletalMesh(USkeletalMesh* SkeletalMesh, const FString& SkeletalMeshPath, const FString& SkeletonPath, const FString& PhysicsAssetPath, const FTransientObjectSaverMaterialNameGenerator& MaterialNameGenerator, const FTransientObjectSaverTextureNameGenerator& TextureNameGenerator) { - if (!SkeletalMesh) + if (!IsValid(SkeletalMesh)) { + UE_LOG(LogTransientObjectSaver, Error, TEXT("Invalid or destroyed SkeletalMesh.")); return false; }