#include "BsManagedDiff.h" #include "BsManagedSerializableDiff.h" #include "BsBinarySerializer.h" #include "BsMemorySerializer.h" #include "BsManagedSerializableObject.h" #include "BsRTTIType.h" namespace BansheeEngine { SPtr ManagedDiff::generateDiff(const SPtr& orgSerzObj, const SPtr& newSerzObj, ObjectMap& objectMap) { BinarySerializer bs; SPtr orgObj = std::static_pointer_cast(bs._decodeIntermediate(orgSerzObj)); SPtr newObj = std::static_pointer_cast(bs._decodeIntermediate(newSerzObj)); ManagedSerializableDiffPtr diff = ManagedSerializableDiff::create(orgObj, newObj); if (diff == nullptr) return nullptr; MemorySerializer ms; UINT32 dataLength = 0; UINT8* diffData = ms.encode(diff.get(), dataLength, &bs_alloc); SPtr output = bs_shared_ptr_new(); output->subObjects.push_back(SerializedSubObject()); SerializedSubObject& subObject = output->subObjects.back(); subObject.typeId = ManagedSerializableObject::getRTTIStatic()->getRTTIId(); SPtr field = bs_shared_ptr_new(); field->value = diffData; field->size = dataLength; field->ownsMemory = true; SerializedEntry entry; entry.fieldId = 0; entry.serialized = field; subObject.entries[0] = entry; return output; } void ManagedDiff::applyDiff(const SPtr& object, const SPtr& serzDiff, DiffObjectMap& objectMap, Vector& diffCommands) { SPtr field = std::static_pointer_cast(serzDiff->subObjects[0].entries[0].serialized); MemorySerializer ms; ManagedSerializableDiffPtr diff = std::static_pointer_cast(ms.decode(field->value, field->size)); SPtr managedObj = std::static_pointer_cast(object); diff->apply(managedObj); } }