BsManagedDiff.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Serialization/BsManagedDiff.h"
  4. #include "Serialization/BsManagedSerializableDiff.h"
  5. #include "Serialization/BsBinarySerializer.h"
  6. #include "Serialization/BsMemorySerializer.h"
  7. #include "Serialization/BsManagedSerializableObject.h"
  8. #include "Scene/BsGameObjectManager.h"
  9. #include "Reflection/BsRTTIType.h"
  10. namespace bs
  11. {
  12. SPtr<SerializedObject> ManagedDiff::generateDiff(const SPtr<SerializedObject>& orgSerzObj,
  13. const SPtr<SerializedObject>& newSerzObj, ObjectMap& objectMap)
  14. {
  15. BinarySerializer bs;
  16. // Need to call GameObjectManager because GameObject handles call it during deserialization, but we don't really need it
  17. GameObjectManager::instance().startDeserialization();
  18. SPtr<ManagedSerializableObject> orgObj = std::static_pointer_cast<ManagedSerializableObject>(bs._decodeFromIntermediate(orgSerzObj));
  19. SPtr<ManagedSerializableObject> newObj = std::static_pointer_cast<ManagedSerializableObject>(bs._decodeFromIntermediate(newSerzObj));
  20. GameObjectManager::instance().endDeserialization();
  21. SPtr<ManagedSerializableDiff> diff = ManagedSerializableDiff::create(orgObj, newObj);
  22. if (diff == nullptr)
  23. return nullptr;
  24. SPtr<SerializedObject> output = bs_shared_ptr_new<SerializedObject>();
  25. output->subObjects.push_back(SerializedSubObject());
  26. SerializedSubObject& subObject = output->subObjects.back();
  27. subObject.typeId = ManagedSerializableObject::getRTTIStatic()->getRTTIId();
  28. SerializedEntry entry;
  29. entry.fieldId = 0;
  30. entry.serialized = bs._encodeToIntermediate(diff.get());
  31. subObject.entries[0] = entry;
  32. return output;
  33. }
  34. void ManagedDiff::applyDiff(const SPtr<IReflectable>& object, const SPtr<SerializedObject>& serzDiff,
  35. DiffObjectMap& objectMap, Vector<DiffCommand>& diffCommands)
  36. {
  37. SPtr<SerializedObject> diffObj = std::static_pointer_cast<SerializedObject>(serzDiff->subObjects[0].entries[0].serialized);
  38. BinarySerializer bs;
  39. SPtr<ManagedSerializableDiff> diff = std::static_pointer_cast<ManagedSerializableDiff>(bs._decodeFromIntermediate(diffObj));
  40. if (diff != nullptr)
  41. {
  42. SPtr<ManagedSerializableObject> managedObj = std::static_pointer_cast<ManagedSerializableObject>(object);
  43. diff->apply(managedObj);
  44. }
  45. }
  46. }