From 93d9b9877cc5fa1b2f52c4d91fb8c0b9cb7a50d4 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 19 Sep 2024 11:18:42 +0200 Subject: [PATCH] Add preserving local changes to model prefab objects when reimporting #2275 --- .../Engine/ContentImporters/ImportModel.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Source/Engine/ContentImporters/ImportModel.cpp b/Source/Engine/ContentImporters/ImportModel.cpp index 611b58089..e73646eeb 100644 --- a/Source/Engine/ContentImporters/ImportModel.cpp +++ b/Source/Engine/ContentImporters/ImportModel.cpp @@ -5,6 +5,7 @@ #if COMPILE_WITH_ASSETS_IMPORTER #include "Engine/Core/Log.h" +#include "Engine/Core/Cache.h" #include "Engine/Core/Collections/Sorting.h" #include "Engine/Core/Collections/ArrayExtensions.h" #include "Engine/Serialization/MemoryWriteStream.h" @@ -765,6 +766,7 @@ CreateAssetResult ImportModel::CreatePrefab(CreateAssetContext& context, ModelDa // Link with object from prefab (if reimporting) if (prefab) { + rapidjson_flax::StringBuffer buffer; for (Actor* a : nodeActors) { for (const auto& i : prefab->ObjectsCache) @@ -775,6 +777,32 @@ CreateAssetResult ImportModel::CreatePrefab(CreateAssetContext& context, ModelDa if (o->GetName() != a->GetName()) // Name match continue; + // Preserve local changes made in the prefab + { + // Serialize + buffer.Clear(); + CompactJsonWriter writer(buffer); + writer.StartObject(); + const void* defaultInstance = o->GetType().GetDefaultInstance(); + o->Serialize(writer, defaultInstance); + writer.EndObject(); + + // Parse json + rapidjson_flax::Document document; + document.Parse(buffer.GetString(), buffer.GetSize()); + + // Strip unwanted data + document.RemoveMember("ID"); + document.RemoveMember("ParentID"); + document.RemoveMember("PrefabID"); + document.RemoveMember("PrefabObjectID"); + document.RemoveMember("Name"); + + // Deserialize object + auto modifier = Cache::ISerializeModifier.Get(); + a->Deserialize(document, &*modifier); + } + // Mark as this object already exists in prefab so will be preserved when updating it a->LinkPrefab(o->GetPrefabID(), o->GetPrefabObjectID()); break;