BsScriptSerializedDiff.cpp 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptSerializedDiff.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoClass.h"
  6. #include "Serialization/BsManagedSerializableObject.h"
  7. #include "Wrappers/BsScriptSerializedObject.h"
  8. #include "Serialization/BsManagedSerializableDiff.h"
  9. #include "Serialization/BsBinaryDiff.h"
  10. #include "Reflection/BsRTTIType.h"
  11. #include "Serialization/BsSerializedObject.h"
  12. #include "Serialization/BsScriptAssemblyManager.h"
  13. #include "Utility/BsUtility.h"
  14. #include "Serialization/BsBinaryDiff.h"
  15. namespace bs
  16. {
  17. ScriptSerializedDiff::ScriptSerializedDiff(MonoObject* instance, const SPtr<IReflectable>& obj)
  18. : ScriptObject(instance), mSerializedDiff(obj)
  19. {
  20. }
  21. void ScriptSerializedDiff::initRuntimeData()
  22. {
  23. metaData.scriptClass->addInternalCall("Internal_CreateDiff", (void*)&ScriptSerializedDiff::internal_CreateDiff);
  24. metaData.scriptClass->addInternalCall("Internal_ApplyDiff", (void*)&ScriptSerializedDiff::internal_ApplyDiff);
  25. metaData.scriptClass->addInternalCall("Internal_IsEmpty", (void*)&ScriptSerializedDiff::internal_IsEmpty);
  26. }
  27. MonoObject* ScriptSerializedDiff::internal_CreateDiff(ScriptSerializedObject* oldObj, ScriptSerializedObject* newObj)
  28. {
  29. SPtr<IReflectable> oldSerializedObject = oldObj->getInternal();
  30. SPtr<IReflectable> newSerializedObject = newObj->getInternal();
  31. if (oldSerializedObject == nullptr || newSerializedObject == nullptr)
  32. return nullptr;
  33. auto oldManagedSerializedObject = rtti_cast<ManagedSerializableObject>(oldSerializedObject);
  34. auto newManagedSerializedObject = rtti_cast<ManagedSerializableObject>(newSerializedObject);
  35. auto oldNativeSerializedObj = rtti_cast<SerializedObject>(oldSerializedObject);
  36. auto newNativeSerializedObj = rtti_cast<SerializedObject>(newSerializedObject);
  37. SPtr<IReflectable> diff;
  38. if(oldManagedSerializedObject != nullptr && newManagedSerializedObject != nullptr)
  39. diff = ManagedSerializableDiff::create(oldManagedSerializedObject, newManagedSerializedObject);
  40. else if(oldNativeSerializedObj != nullptr && newNativeSerializedObj != nullptr)
  41. {
  42. BinaryDiff diffHandler;
  43. diff = diffHandler.generateDiff(oldNativeSerializedObj, newNativeSerializedObj);
  44. }
  45. if(diff)
  46. {
  47. MonoObject* instance = metaData.scriptClass->createInstance();
  48. new (bs_alloc<ScriptSerializedDiff>()) ScriptSerializedDiff(instance, diff);
  49. return instance;
  50. }
  51. return nullptr;
  52. }
  53. void ScriptSerializedDiff::internal_ApplyDiff(ScriptSerializedDiff* thisPtr, MonoObject* obj)
  54. {
  55. if(thisPtr->mSerializedDiff == nullptr)
  56. return;
  57. SPtr<ManagedSerializableDiff> managedDiff = rtti_cast<ManagedSerializableDiff>(thisPtr->mSerializedDiff);
  58. if(managedDiff != nullptr)
  59. {
  60. SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(obj);
  61. if (!serializedObject)
  62. return;
  63. managedDiff->apply(serializedObject);
  64. }
  65. else
  66. {
  67. SPtr<IReflectable> nativeValue = ScriptAssemblyManager::instance().getReflectableFromManagedObject(obj);
  68. if (!nativeValue)
  69. return;
  70. IDiff& diffHandler = nativeValue->getRTTI()->getDiffHandler();
  71. CoreSerializationContext serzContext;
  72. diffHandler.applyDiff(nativeValue, rtti_cast<SerializedObject>(thisPtr->mSerializedDiff), &serzContext);
  73. }
  74. }
  75. bool ScriptSerializedDiff::internal_IsEmpty(ScriptSerializedDiff* thisPtr)
  76. {
  77. return thisPtr->mSerializedDiff == nullptr;
  78. }
  79. }