BsManagedDiff.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "BsManagedDiff.h"
  2. #include "BsManagedSerializableDiff.h"
  3. #include "BsBinarySerializer.h"
  4. #include "BsMemorySerializer.h"
  5. #include "BsManagedSerializableObject.h"
  6. #include "BsRTTIType.h"
  7. namespace BansheeEngine
  8. {
  9. SPtr<SerializedObject> ManagedDiff::generateDiff(const SPtr<SerializedObject>& orgSerzObj,
  10. const SPtr<SerializedObject>& newSerzObj, ObjectMap& objectMap)
  11. {
  12. BinarySerializer bs;
  13. SPtr<ManagedSerializableObject> orgObj = std::static_pointer_cast<ManagedSerializableObject>(bs._decodeIntermediate(orgSerzObj));
  14. SPtr<ManagedSerializableObject> newObj = std::static_pointer_cast<ManagedSerializableObject>(bs._decodeIntermediate(newSerzObj));
  15. ManagedSerializableDiffPtr diff = ManagedSerializableDiff::create(orgObj, newObj);
  16. if (diff == nullptr)
  17. return nullptr;
  18. MemorySerializer ms;
  19. UINT32 dataLength = 0;
  20. UINT8* diffData = ms.encode(diff.get(), dataLength, &bs_alloc);
  21. SPtr<SerializedObject> output = bs_shared_ptr<SerializedObject>();
  22. output->subObjects.push_back(SerializedSubObject());
  23. SerializedSubObject& subObject = output->subObjects.back();
  24. subObject.typeId = ManagedSerializableObject::getRTTIStatic()->getRTTIId();
  25. SPtr<SerializedField> field = bs_shared_ptr<SerializedField>();
  26. field->value = diffData;
  27. field->size = dataLength;
  28. field->ownsMemory = true;
  29. SerializedEntry entry;
  30. entry.fieldId = 0;
  31. entry.serialized = field;
  32. subObject.entries[0] = entry;
  33. return output;
  34. }
  35. void ManagedDiff::applyDiff(const SPtr<IReflectable>& object, const SPtr<SerializedObject>& serzDiff,
  36. DiffObjectMap& objectMap, Vector<DiffCommand>& diffCommands)
  37. {
  38. SPtr<SerializedField> field = std::static_pointer_cast<SerializedField>(serzDiff->subObjects[0].entries[0].serialized);
  39. MemorySerializer ms;
  40. ManagedSerializableDiffPtr diff = std::static_pointer_cast<ManagedSerializableDiff>(ms.decode(field->value, field->size));
  41. SPtr<ManagedSerializableObject> managedObj = std::static_pointer_cast<ManagedSerializableObject>(object);
  42. diff->apply(managedObj);
  43. }
  44. }