BsManagedResource.cpp 2.1 KB

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