From 8e6bd07322ec1d283c21b2e8969bbc0e10a26c33 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 20 Feb 2024 13:12:23 +0100 Subject: [PATCH] Fix `Transform` diff serialization to properly handle prefab changes to a single component of transform #2085 --- Source/Engine/Serialization/JsonWriter.cpp | 26 ++++++++++++++----- Source/Engine/Serialization/Serialization.cpp | 18 ++++++++++--- Source/Engine/Serialization/Serialization.h | 2 +- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Source/Engine/Serialization/JsonWriter.cpp b/Source/Engine/Serialization/JsonWriter.cpp index 27ecb672b..af7bb63a0 100644 --- a/Source/Engine/Serialization/JsonWriter.cpp +++ b/Source/Engine/Serialization/JsonWriter.cpp @@ -343,18 +343,30 @@ void JsonWriter::Transform(const ::Transform& value) void JsonWriter::Transform(const ::Transform& value, const ::Transform* other) { StartObject(); - if (!other || !Vector3::NearEqual(value.Translation, other->Translation)) + if (other) + { + if (!Vector3::NearEqual(value.Translation, other->Translation)) + { + JKEY("Translation"); + Vector3(value.Translation); + } + if (!Quaternion::NearEqual(value.Orientation, other->Orientation)) + { + JKEY("Orientation"); + Quaternion(value.Orientation); + } + if (!Float3::NearEqual(value.Scale, other->Scale)) + { + JKEY("Scale"); + Float3(value.Scale); + } + } + else { JKEY("Translation"); Vector3(value.Translation); - } - if (!other || !Quaternion::NearEqual(value.Orientation, other->Orientation)) - { JKEY("Orientation"); Quaternion(value.Orientation); - } - if (!other || !Float3::NearEqual(value.Scale, other->Scale)) - { JKEY("Scale"); Float3(value.Scale); } diff --git a/Source/Engine/Serialization/Serialization.cpp b/Source/Engine/Serialization/Serialization.cpp index ac8eb41a9..1f8020288 100644 --- a/Source/Engine/Serialization/Serialization.cpp +++ b/Source/Engine/Serialization/Serialization.cpp @@ -747,9 +747,21 @@ bool Serialization::ShouldSerialize(const Transform& v, const void* otherObj) void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Transform& v, ISerializeModifier* modifier) { - DESERIALIZE_HELPER(stream, "Translation", v.Translation, Vector3::Zero); - DESERIALIZE_HELPER(stream, "Scale", v.Scale, Vector3::One); - DESERIALIZE_HELPER(stream, "Orientation", v.Orientation, Quaternion::Identity); + { + const auto m = SERIALIZE_FIND_MEMBER(stream, "Translation"); + if (m != stream.MemberEnd()) + Deserialize(m->value, v.Translation, modifier); + } + { + const auto m = SERIALIZE_FIND_MEMBER(stream, "Scale"); + if (m != stream.MemberEnd()) + Deserialize(m->value, v.Scale, modifier); + } + { + const auto m = SERIALIZE_FIND_MEMBER(stream, "Orientation"); + if (m != stream.MemberEnd()) + Deserialize(m->value, v.Orientation, modifier); + } } bool Serialization::ShouldSerialize(const Matrix& v, const void* otherObj) diff --git a/Source/Engine/Serialization/Serialization.h b/Source/Engine/Serialization/Serialization.h index ed1008922..f7e8a0fcb 100644 --- a/Source/Engine/Serialization/Serialization.h +++ b/Source/Engine/Serialization/Serialization.h @@ -393,7 +393,7 @@ namespace Serialization FLAXENGINE_API bool ShouldSerialize(const Transform& v, const void* otherObj); inline void Serialize(ISerializable::SerializeStream& stream, const Transform& v, const void* otherObj) { - stream.Transform(v); + stream.Transform(v, (const Transform*)otherObj); } FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Transform& v, ISerializeModifier* modifier);