BsManagedComponent.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "BsManagedComponent.h"
  2. #include "BsManagedComponentRTTI.h"
  3. #include "BsMonoManager.h"
  4. #include "BsMonoClass.h"
  5. #include "BsDebug.h"
  6. namespace BansheeEngine
  7. {
  8. ManagedComponent::ManagedComponent(const HSceneObject& parent, MonoReflectionType* runtimeType)
  9. :mManagedInstance(nullptr), mRuntimeType(runtimeType)
  10. {
  11. MonoType* monoType = mono_reflection_type_get_type(mRuntimeType);
  12. ::MonoClass* monoClass = mono_type_get_class(monoType);
  13. mNamespace = mono_class_get_namespace(monoClass);
  14. mTypeName = mono_class_get_name(monoClass);
  15. MonoClass* managedClass = MonoManager::instance().findClass(mNamespace, mTypeName);
  16. if(managedClass == nullptr)
  17. {
  18. LOGWRN("Cannot create managed component: " + mNamespace + "." + mTypeName + " because that type doesn't exist.");
  19. return;
  20. }
  21. setName(mTypeName);
  22. construct(managedClass->createInstance(), runtimeType);
  23. }
  24. void ManagedComponent::construct(MonoObject* object, MonoReflectionType* runtimeType)
  25. {
  26. mFullTypeName = mNamespace + "." + mTypeName;
  27. mManagedInstance = object;
  28. mRuntimeType = runtimeType;
  29. mManagedHandle = mono_gchandle_new(mManagedInstance, false);
  30. }
  31. void ManagedComponent::onDestroyed()
  32. {
  33. if(mManagedInstance != nullptr)
  34. {
  35. mManagedInstance = nullptr;
  36. mono_gchandle_free(mManagedHandle);
  37. }
  38. }
  39. RTTITypeBase* ManagedComponent::getRTTIStatic()
  40. {
  41. return ManagedComponentRTTI::instance();
  42. }
  43. RTTITypeBase* ManagedComponent::getRTTI() const
  44. {
  45. return ManagedComponent::getRTTIStatic();
  46. }
  47. }