//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #include "Serialization/BsManagedDiff.h" #include "Serialization/BsManagedSerializableDiff.h" #include "Serialization/BsBinarySerializer.h" #include "Serialization/BsManagedSerializableObject.h" #include "Reflection/BsRTTIType.h" #include "Utility/BsUtility.h" #include "Scene/BsSceneObject.h" namespace bs { SPtr ManagedDiff::generateDiff(const SPtr& orgSerzObj, const SPtr& newSerzObj, ObjectMap& objectMap) { CoreSerializationContext context; context.goState = bs_shared_ptr_new(GODM_UseOriginalIds | GODM_RestoreExternal); const auto orgObj = std::static_pointer_cast(orgSerzObj->decode(&context)); const auto newObj = std::static_pointer_cast(newSerzObj->decode(&context)); context.goState->resolve(); SPtr diff = ManagedSerializableDiff::create(orgObj, newObj); if (diff == nullptr) return nullptr; SPtr output = bs_shared_ptr_new(); output->subObjects.push_back(SerializedSubObject()); SerializedSubObject& subObject = output->subObjects.back(); subObject.typeId = ManagedSerializableObject::getRTTIStatic()->getRTTIId(); SerializedEntry entry; entry.fieldId = 0; entry.serialized = SerializedObject::create(*diff); subObject.entries[0] = entry; return output; } void ManagedDiff::applyDiff(const SPtr& object, const SPtr& serzDiff, FrameAlloc& alloc, DiffObjectMap& objectMap, FrameVector& diffCommands, SerializationContext* context) { SPtr diffObj = std::static_pointer_cast(serzDiff->subObjects[0].entries[0].serialized); SPtr diff = std::static_pointer_cast(diffObj->decode(context)); if (diff != nullptr) { SPtr managedObj = std::static_pointer_cast(object); diff->apply(managedObj); } } }