BsScriptSerializedObject.cpp 3.4 KB

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