BsManagedDiff.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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/BsManagedSerializableObject.h"
  7. #include "Reflection/BsRTTIType.h"
  8. #include "Utility/BsUtility.h"
  9. #include "Scene/BsSceneObject.h"
  10. namespace bs
  11. {
  12. SPtr<SerializedObject> ManagedDiff::generateDiff(const SPtr<SerializedObject>& orgSerzObj,
  13. const SPtr<SerializedObject>& newSerzObj, ObjectMap& objectMap)
  14. {
  15. CoreSerializationContext context;
  16. context.goState = bs_shared_ptr_new<GameObjectDeserializationState>(GODM_UseOriginalIds | GODM_RestoreExternal);
  17. const auto orgObj = std::static_pointer_cast<ManagedSerializableObject>(orgSerzObj->decode(&context));
  18. const auto newObj = std::static_pointer_cast<ManagedSerializableObject>(newSerzObj->decode(&context));
  19. context.goState->resolve();
  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, SerializationContext* context)
  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(context));
  38. if (diff != nullptr)
  39. {
  40. SPtr<ManagedSerializableObject> managedObj = std::static_pointer_cast<ManagedSerializableObject>(object);
  41. diff->apply(managedObj);
  42. }
  43. }
  44. }