BsManagedResource.cpp 4.2 KB

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