BsManagedDiff.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. SPtr<SerializedObject> output = bs_shared_ptr_new<SerializedObject>();
  23. output->subObjects.push_back(SerializedSubObject());
  24. SerializedSubObject& subObject = output->subObjects.back();
  25. subObject.typeId = ManagedSerializableObject::getRTTIStatic()->getRTTIId();
  26. SerializedEntry entry;
  27. entry.fieldId = 0;
  28. entry.serialized = bs._encodeIntermediate(diff.get());
  29. subObject.entries[0] = entry;
  30. return output;
  31. }
  32. void ManagedDiff::applyDiff(const SPtr<IReflectable>& object, const SPtr<SerializedObject>& serzDiff,
  33. DiffObjectMap& objectMap, Vector<DiffCommand>& diffCommands)
  34. {
  35. SPtr<SerializedObject> diffObj = std::static_pointer_cast<SerializedObject>(serzDiff->subObjects[0].entries[0].serialized);
  36. BinarySerializer bs;
  37. ManagedSerializableDiffPtr diff = std::static_pointer_cast<ManagedSerializableDiff>(bs._decodeIntermediate(diffObj));
  38. if (diff != nullptr)
  39. {
  40. SPtr<ManagedSerializableObject> managedObj = std::static_pointer_cast<ManagedSerializableObject>(object);
  41. diff->apply(managedObj);
  42. }
  43. }
  44. }