BsManagedResource.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "BsManagedResource.h"
  2. #include "BsManagedResourceRTTI.h"
  3. #include "BsManagedResourceMetaData.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsDebug.h"
  7. namespace BansheeEngine
  8. {
  9. ManagedResource::ManagedResource(MonoReflectionType* runtimeType)
  10. :mManagedInstance(nullptr), mRuntimeType(runtimeType)
  11. {
  12. ManagedResourceMetaDataPtr metaData = bs_shared_ptr<ManagedResourceMetaData>();
  13. mMetaData = metaData;
  14. MonoType* monoType = mono_reflection_type_get_type(mRuntimeType);
  15. ::MonoClass* monoClass = mono_type_get_class(monoType);
  16. metaData->typeNamespace = mono_class_get_namespace(monoClass);
  17. metaData->typeName = mono_class_get_name(monoClass);
  18. MonoClass* managedClass = MonoManager::instance().findClass(metaData->typeNamespace, metaData->typeName);
  19. if (managedClass == nullptr)
  20. {
  21. LOGWRN("Cannot create managed component: " + metaData->typeNamespace + "." + metaData->typeName + " because that type doesn't exist.");
  22. return;
  23. }
  24. construct(managedClass->createInstance(), runtimeType);
  25. }
  26. ManagedResourcePtr ManagedResource::createEmpty()
  27. {
  28. ManagedResourcePtr newRes = bs_core_ptr<ManagedResource, GenAlloc>(new (bs_alloc<ManagedResource>()) ManagedResource());
  29. newRes->_setThisPtr(newRes);
  30. newRes->initialize();
  31. return newRes;
  32. }
  33. void ManagedResource::construct(MonoObject* object, MonoReflectionType* runtimeType)
  34. {
  35. mManagedInstance = object;
  36. mRuntimeType = runtimeType;
  37. mManagedHandle = mono_gchandle_new(mManagedInstance, false);
  38. }
  39. void ManagedResource::destroy_internal()
  40. {
  41. Resource::destroy_internal();
  42. if (mManagedInstance != nullptr)
  43. {
  44. mManagedInstance = nullptr;
  45. mono_gchandle_free(mManagedHandle);
  46. }
  47. }
  48. RTTITypeBase* ManagedResource::getRTTIStatic()
  49. {
  50. return ManagedResourceRTTI::instance();
  51. }
  52. RTTITypeBase* ManagedResource::getRTTI() const
  53. {
  54. return ManagedResource::getRTTIStatic();
  55. }
  56. }