2
0

BsManagedResource.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 "BsDebug.h"
  9. namespace BansheeEngine
  10. {
  11. ManagedResource::ManagedResource()
  12. :Resource(false), mManagedInstance(nullptr)
  13. { }
  14. ManagedResource::ManagedResource(MonoObject* managedInstance)
  15. :Resource(false), mManagedInstance(nullptr)
  16. {
  17. ManagedResourceMetaDataPtr metaData = bs_shared_ptr<ManagedResourceMetaData>();
  18. mMetaData = metaData;
  19. ::MonoClass* monoClass = mono_object_get_class(managedInstance);
  20. metaData->typeNamespace = mono_class_get_namespace(monoClass);
  21. metaData->typeName = mono_class_get_name(monoClass);
  22. MonoClass* managedClass = MonoManager::instance().findClass(metaData->typeNamespace, metaData->typeName);
  23. if (managedClass == nullptr)
  24. {
  25. LOGWRN("Cannot create managed component: " + metaData->typeNamespace + "." + metaData->typeName + " because that type doesn't exist.");
  26. return;
  27. }
  28. }
  29. HManagedResource ManagedResource::create(MonoObject* managedResource)
  30. {
  31. ManagedResourcePtr newRes = bs_core_ptr<ManagedResource, GenAlloc>(new (bs_alloc<ManagedResource>()) ManagedResource(managedResource));
  32. newRes->_setThisPtr(newRes);
  33. newRes->initialize();
  34. HManagedResource handle = static_resource_cast<ManagedResource>(gResources()._createResourceHandle(newRes));
  35. newRes->construct(managedResource, handle);
  36. return handle;
  37. }
  38. ManagedResourcePtr ManagedResource::createEmpty()
  39. {
  40. ManagedResourcePtr newRes = bs_core_ptr<ManagedResource, GenAlloc>(new (bs_alloc<ManagedResource>()) ManagedResource());
  41. newRes->_setThisPtr(newRes);
  42. newRes->initialize();
  43. return newRes;
  44. }
  45. void ManagedResource::construct(MonoObject* object, const HManagedResource& myHandle)
  46. {
  47. mManagedInstance = object;
  48. mManagedHandle = mono_gchandle_new(mManagedInstance, false);
  49. mMyHandle = myHandle;
  50. ManagedResourceManager::instance().registerManagedResource(mMyHandle);
  51. }
  52. void ManagedResource::destroy_internal()
  53. {
  54. Resource::destroy_internal();
  55. if (mManagedInstance != nullptr)
  56. {
  57. mManagedInstance = nullptr;
  58. mono_gchandle_free(mManagedHandle);
  59. }
  60. ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
  61. }
  62. RTTITypeBase* ManagedResource::getRTTIStatic()
  63. {
  64. return ManagedResourceRTTI::instance();
  65. }
  66. RTTITypeBase* ManagedResource::getRTTI() const
  67. {
  68. return ManagedResource::getRTTIStatic();
  69. }
  70. }