2
0

BsManagedResource.cpp 4.7 KB

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