BsManagedDiff.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. // Need to call GameObjectManager because GameObject handles call it during deserialization, but we don't really need it
  16. GameObjectManager::instance().startDeserialization();
  17. SPtr<ManagedSerializableObject> orgObj = std::static_pointer_cast<ManagedSerializableObject>(orgSerzObj->decode());
  18. SPtr<ManagedSerializableObject> newObj = std::static_pointer_cast<ManagedSerializableObject>(newSerzObj->decode());
  19. GameObjectManager::instance().endDeserialization();
  20. SPtr<ManagedSerializableDiff> diff = ManagedSerializableDiff::create(orgObj, newObj);
  21. if (diff == nullptr)
  22. return nullptr;
  23. SPtr<SerializedObject> output = bs_shared_ptr_new<SerializedObject>();
  24. output->subObjects.push_back(SerializedSubObject());
  25. SerializedSubObject& subObject = output->subObjects.back();
  26. subObject.typeId = ManagedSerializableObject::getRTTIStatic()->getRTTIId();
  27. SerializedEntry entry;
  28. entry.fieldId = 0;
  29. entry.serialized = SerializedObject::create(*diff);
  30. subObject.entries[0] = entry;
  31. return output;
  32. }
  33. void ManagedDiff::applyDiff(const SPtr<IReflectable>& object, const SPtr<SerializedObject>& serzDiff,
  34. FrameAlloc& alloc, DiffObjectMap& objectMap, FrameVector<DiffCommand>& diffCommands)
  35. {
  36. SPtr<SerializedObject> diffObj = std::static_pointer_cast<SerializedObject>(serzDiff->subObjects[0].entries[0].serialized);
  37. SPtr<ManagedSerializableDiff> diff = std::static_pointer_cast<ManagedSerializableDiff>(diffObj->decode());
  38. if (diff != nullptr)
  39. {
  40. SPtr<ManagedSerializableObject> managedObj = std::static_pointer_cast<ManagedSerializableObject>(object);
  41. diff->apply(managedObj);
  42. }
  43. }
  44. }