BsScriptSerializedObject.cpp 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptSerializedObject.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoClass.h"
  6. #include "BsScriptComponent.h"
  7. #include "BsScriptManagedResource.h"
  8. #include "BsManagedComponent.h"
  9. #include "BsManagedResource.h"
  10. #include "BsManagedSerializableObject.h"
  11. #include "BsScriptAssemblyManager.h"
  12. namespace BansheeEngine
  13. {
  14. ScriptSerializedObject::ScriptSerializedObject(MonoObject* instance, const SPtr<ManagedSerializableObject>& obj)
  15. : ScriptObject(instance), mSerializedObject(obj)
  16. {
  17. }
  18. void ScriptSerializedObject::initRuntimeData()
  19. {
  20. metaData.scriptClass->addInternalCall("Internal_CreateComponent", &ScriptSerializedObject::internal_CreateComponent);
  21. metaData.scriptClass->addInternalCall("Internal_CreateResource", &ScriptSerializedObject::internal_CreateResource);
  22. metaData.scriptClass->addInternalCall("Internal_CreateGeneric", &ScriptSerializedObject::internal_CreateGeneric);
  23. metaData.scriptClass->addInternalCall("Internal_Deserialize", &ScriptSerializedObject::internal_Deserialize);
  24. }
  25. MonoObject* ScriptSerializedObject::internal_CreateComponent(ScriptComponent* componentPtr)
  26. {
  27. HManagedComponent component = componentPtr->getHandle();
  28. if (component.isDestroyed())
  29. return nullptr;
  30. MonoObject* managedInstance = component->getManagedInstance();
  31. SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(managedInstance);
  32. if (serializedObject == nullptr)
  33. return nullptr;
  34. serializedObject->serialize();
  35. MonoObject* instance = metaData.scriptClass->createInstance();
  36. new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
  37. return instance;
  38. }
  39. MonoObject* ScriptSerializedObject::internal_CreateResource(ScriptManagedResource* resourcePtr)
  40. {
  41. HManagedResource resource = resourcePtr->getHandle();
  42. if (!resource.isLoaded())
  43. return nullptr;
  44. MonoObject* managedInstance = resource->getManagedInstance();
  45. SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(managedInstance);
  46. if (serializedObject == nullptr)
  47. return nullptr;
  48. serializedObject->serialize();
  49. MonoObject* instance = metaData.scriptClass->createInstance();
  50. new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
  51. return instance;
  52. }
  53. MonoObject* ScriptSerializedObject::internal_CreateGeneric(MonoObject* obj)
  54. {
  55. if (obj == nullptr)
  56. return nullptr;
  57. SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(obj);
  58. if (serializedObject == nullptr)
  59. return nullptr;
  60. serializedObject->serialize();
  61. MonoObject* instance = metaData.scriptClass->createInstance();
  62. new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
  63. return instance;
  64. }
  65. MonoObject* ScriptSerializedObject::internal_Deserialize(ScriptSerializedObject* thisPtr)
  66. {
  67. SPtr<ManagedSerializableObject> serializedObject = thisPtr->mSerializedObject;
  68. if (serializedObject == nullptr)
  69. return nullptr;
  70. serializedObject->deserialize();
  71. MonoObject* managedInstance = serializedObject->getManagedInstance();
  72. // Note: Technically I could just clear managed data without a full serialization since I know nothing has changed
  73. serializedObject->serialize();
  74. return managedInstance;
  75. }
  76. }