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