2
0

BsManagedComponent.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "BsManagedComponent.h"
  2. #include "BsManagedComponentRTTI.h"
  3. #include "BsMonoManager.h"
  4. #include "BsMonoClass.h"
  5. #include "CmDebug.h"
  6. using namespace CamelotFramework;
  7. namespace BansheeEngine
  8. {
  9. ManagedComponent::ManagedComponent(const CM::HSceneObject& parent, MonoReflectionType* runtimeType)
  10. :mManagedInstance(nullptr), mRuntimeType(runtimeType)
  11. {
  12. MonoType* monoType = mono_reflection_type_get_type(mRuntimeType);
  13. ::MonoClass* monoClass = mono_type_get_class(monoType);
  14. mNamespace = mono_class_get_namespace(monoClass);
  15. mTypeName = mono_class_get_name(monoClass);
  16. MonoClass* managedClass = MonoManager::instance().findClass(mNamespace, mTypeName);
  17. if(managedClass == nullptr)
  18. {
  19. LOGWRN("Cannot create managed component: " + mNamespace + "." + mTypeName + " because that type doesn't exist.");
  20. return;
  21. }
  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. CM::RTTITypeBase* ManagedComponent::getRTTIStatic()
  40. {
  41. return ManagedComponentRTTI::instance();
  42. }
  43. CM::RTTITypeBase* ManagedComponent::getRTTI() const
  44. {
  45. return ManagedComponent::getRTTIStatic();
  46. }
  47. }