BsManagedResource.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsManagedResource.h"
  4. #include "RTTI/BsManagedResourceRTTI.h"
  5. #include "BsManagedResourceMetaData.h"
  6. #include "BsMonoManager.h"
  7. #include "BsMonoClass.h"
  8. #include "Resources/BsResources.h"
  9. #include "BsManagedResourceManager.h"
  10. #include "Serialization/BsManagedSerializableObject.h"
  11. #include "Wrappers/BsScriptManagedResource.h"
  12. #include "Serialization/BsMemorySerializer.h"
  13. #include "BsScriptResourceManager.h"
  14. #include "BsMonoUtil.h"
  15. #include "Serialization/BsScriptAssemblyManager.h"
  16. #include "Debug/BsDebug.h"
  17. namespace bs
  18. {
  19. ManagedResource::ManagedResource()
  20. :Resource(false), mManagedInstance(nullptr)
  21. { }
  22. ManagedResource::ManagedResource(MonoObject* managedInstance)
  23. :Resource(false), mManagedInstance(nullptr)
  24. {
  25. SPtr<ManagedResourceMetaData> metaData = bs_shared_ptr_new<ManagedResourceMetaData>();
  26. mMetaData = metaData;
  27. MonoUtil::getClassName(managedInstance, metaData->typeNamespace, metaData->typeName);
  28. MonoClass* managedClass = MonoManager::instance().findClass(metaData->typeNamespace, metaData->typeName);
  29. if (managedClass == nullptr)
  30. {
  31. LOGWRN("Cannot create managed component: " + metaData->typeNamespace + "." + metaData->typeName + " because that type doesn't exist.");
  32. return;
  33. }
  34. }
  35. ResourceBackupData ManagedResource::backup(bool clearExisting)
  36. {
  37. SPtr<ManagedSerializableObject> serializableObject = ManagedSerializableObject::createFromExisting(mManagedInstance);
  38. ResourceBackupData backupData;
  39. if (serializableObject != nullptr)
  40. {
  41. MemorySerializer ms;
  42. backupData.size = 0;
  43. backupData.data = ms.encode(serializableObject.get(), backupData.size);
  44. }
  45. else
  46. {
  47. backupData.size = 0;
  48. backupData.data = nullptr;
  49. }
  50. if (clearExisting)
  51. {
  52. if (mManagedInstance != nullptr)
  53. {
  54. mManagedInstance = nullptr;
  55. MonoUtil::freeGCHandle(mManagedHandle);
  56. mManagedHandle = 0;
  57. }
  58. }
  59. return backupData;
  60. }
  61. void ManagedResource::restore(MonoObject* instance, const ResourceBackupData& data)
  62. {
  63. mManagedInstance = instance;
  64. if (mManagedInstance != nullptr)
  65. {
  66. mManagedHandle = MonoUtil::newGCHandle(mManagedInstance);
  67. mManagedInstance = MonoUtil::getObjectFromGCHandle(mManagedHandle);
  68. if (data.data != nullptr)
  69. {
  70. MemorySerializer ms;
  71. SPtr<ManagedSerializableObject> serializableObject = std::static_pointer_cast<ManagedSerializableObject>(ms.decode(data.data, data.size));
  72. SPtr<ManagedResourceMetaData> managedResMetaData = std::static_pointer_cast<ManagedResourceMetaData>(mMetaData);
  73. SPtr<ManagedSerializableObjectInfo> currentObjInfo = nullptr;
  74. if (ScriptAssemblyManager::instance().getSerializableObjectInfo(managedResMetaData->typeNamespace, managedResMetaData->typeName, currentObjInfo))
  75. serializableObject->deserialize(mManagedInstance, currentObjInfo);
  76. }
  77. }
  78. else
  79. {
  80. // Could not restore resource
  81. ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
  82. }
  83. }
  84. HManagedResource ManagedResource::create(MonoObject* managedResource)
  85. {
  86. SPtr<ManagedResource> newRes = bs_core_ptr<ManagedResource>(new (bs_alloc<ManagedResource>()) ManagedResource(managedResource));
  87. newRes->_setThisPtr(newRes);
  88. newRes->initialize();
  89. HManagedResource handle = static_resource_cast<ManagedResource>(gResources()._createResourceHandle(newRes));
  90. newRes->setHandle(managedResource, handle);
  91. return handle;
  92. }
  93. SPtr<ManagedResource> ManagedResource::createEmpty()
  94. {
  95. SPtr<ManagedResource> newRes = bs_core_ptr<ManagedResource>(new (bs_alloc<ManagedResource>()) ManagedResource());
  96. newRes->_setThisPtr(newRes);
  97. newRes->initialize();
  98. return newRes;
  99. }
  100. void ManagedResource::setHandle(MonoObject* object, const HManagedResource& myHandle)
  101. {
  102. mManagedHandle = MonoUtil::newGCHandle(object);
  103. mManagedInstance = MonoUtil::getObjectFromGCHandle(mManagedHandle);
  104. mMyHandle = myHandle.getWeak();
  105. ScriptResourceManager::instance().createManagedScriptResource(myHandle, object);
  106. ManagedResourceManager::instance().registerManagedResource(mMyHandle);
  107. }
  108. void ManagedResource::destroy()
  109. {
  110. Resource::destroy();
  111. if (mManagedInstance != nullptr)
  112. {
  113. mManagedInstance = nullptr;
  114. MonoUtil::freeGCHandle(mManagedHandle);
  115. }
  116. ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
  117. }
  118. RTTITypeBase* ManagedResource::getRTTIStatic()
  119. {
  120. return ManagedResourceRTTI::instance();
  121. }
  122. RTTITypeBase* ManagedResource::getRTTI() const
  123. {
  124. return ManagedResource::getRTTIStatic();
  125. }
  126. }