BsManagedResource.cpp 4.2 KB

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