2
0

BsManagedDiff.cpp 2.3 KB

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