BsManagedResource.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 "BsMonoUtil.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<ManagedResourceMetaData>();
  24. mMetaData = metaData;
  25. String elementNs;
  26. String elementTypeName;
  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. ManagedSerializableObjectPtr serializableObject = ManagedSerializableObject::createFromExisting(mManagedInstance);
  38. ResourceBackupData backupData;
  39. if (serializableObject != nullptr)
  40. {
  41. ManagedSerializableObjectInfoPtr objectInfo = serializableObject->getObjectInfo();
  42. ManagedSerializableObjectDataPtr objectData = serializableObject->getObjectData();
  43. MemorySerializer ms;
  44. backupData.mTypeInfo.size = 0;
  45. backupData.mTypeInfo.data = ms.encode(objectInfo.get(), backupData.mTypeInfo.size);
  46. backupData.mObjectData.size = 0;
  47. backupData.mObjectData.data = ms.encode(objectData.get(), backupData.mObjectData.size);
  48. }
  49. else
  50. {
  51. backupData.mTypeInfo.size = 0;
  52. backupData.mTypeInfo.data = nullptr;
  53. backupData.mObjectData.size = 0;
  54. backupData.mObjectData.data = nullptr;
  55. }
  56. if (clearExisting)
  57. {
  58. if (mManagedInstance != nullptr)
  59. {
  60. mManagedInstance = nullptr;
  61. mono_gchandle_free(mManagedHandle);
  62. mManagedHandle = 0;
  63. }
  64. }
  65. return backupData;
  66. }
  67. void ManagedResource::restore(MonoObject* instance, const ResourceBackupData& data)
  68. {
  69. mManagedInstance = instance;
  70. if (mManagedInstance != nullptr)
  71. {
  72. mManagedHandle = mono_gchandle_new(mManagedInstance, false);
  73. if (data.mTypeInfo.data != nullptr && data.mObjectData.data != nullptr)
  74. {
  75. MemorySerializer ms;
  76. ManagedSerializableObjectInfoPtr objectInfo = std::static_pointer_cast<ManagedSerializableObjectInfo>(ms.decode(data.mTypeInfo.data, data.mTypeInfo.size));
  77. ManagedSerializableObjectDataPtr objectData = std::static_pointer_cast<ManagedSerializableObjectData>(ms.decode(data.mObjectData.data, data.mObjectData.size));
  78. ManagedSerializableObjectPtr serializableObject = ManagedSerializableObject::createFromExisting(instance);
  79. serializableObject->setObjectData(objectData, objectInfo);
  80. }
  81. }
  82. else
  83. {
  84. // Could not restore resource
  85. ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
  86. }
  87. }
  88. HManagedResource ManagedResource::create(MonoObject* managedResource)
  89. {
  90. ManagedResourcePtr newRes = bs_core_ptr<ManagedResource, GenAlloc>(new (bs_alloc<ManagedResource>()) ManagedResource(managedResource));
  91. newRes->_setThisPtr(newRes);
  92. newRes->initialize();
  93. HManagedResource handle = static_resource_cast<ManagedResource>(gResources()._createResourceHandle(newRes));
  94. newRes->construct(managedResource, handle);
  95. return handle;
  96. }
  97. ManagedResourcePtr ManagedResource::createEmpty()
  98. {
  99. ManagedResourcePtr newRes = bs_core_ptr<ManagedResource, GenAlloc>(new (bs_alloc<ManagedResource>()) ManagedResource());
  100. newRes->_setThisPtr(newRes);
  101. newRes->initialize();
  102. return newRes;
  103. }
  104. void ManagedResource::construct(MonoObject* object, const HManagedResource& myHandle)
  105. {
  106. mManagedInstance = object;
  107. mManagedHandle = mono_gchandle_new(mManagedInstance, false);
  108. mMyHandle = myHandle;
  109. ManagedResourceManager::instance().registerManagedResource(mMyHandle);
  110. }
  111. void ManagedResource::destroy()
  112. {
  113. Resource::destroy();
  114. if (mManagedInstance != nullptr)
  115. {
  116. mManagedInstance = nullptr;
  117. mono_gchandle_free(mManagedHandle);
  118. }
  119. ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
  120. }
  121. RTTITypeBase* ManagedResource::getRTTIStatic()
  122. {
  123. return ManagedResourceRTTI::instance();
  124. }
  125. RTTITypeBase* ManagedResource::getRTTI() const
  126. {
  127. return ManagedResource::getRTTIStatic();
  128. }
  129. }