BsManagedComponent.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "BsManagedComponent.h"
  2. #include "BsManagedComponentRTTI.h"
  3. #include "BsMonoManager.h"
  4. #include "BsMonoClass.h"
  5. #include "CmDebug.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. construct(managedClass->createInstance(), runtimeType);
  22. }
  23. void ManagedComponent::construct(MonoObject* object, MonoReflectionType* runtimeType)
  24. {
  25. mFullTypeName = mNamespace + "." + mTypeName;
  26. mManagedInstance = object;
  27. mRuntimeType = runtimeType;
  28. mManagedHandle = mono_gchandle_new(mManagedInstance, false);
  29. }
  30. void ManagedComponent::onDestroyed()
  31. {
  32. if(mManagedInstance != nullptr)
  33. {
  34. mManagedInstance = nullptr;
  35. mono_gchandle_free(mManagedHandle);
  36. }
  37. }
  38. RTTITypeBase* ManagedComponent::getRTTIStatic()
  39. {
  40. return ManagedComponentRTTI::instance();
  41. }
  42. RTTITypeBase* ManagedComponent::getRTTI() const
  43. {
  44. return ManagedComponent::getRTTIStatic();
  45. }
  46. }