BsScriptGameObjectManager.cpp 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "BsScriptGameObjectManager.h"
  2. #include "BsScriptGameObject.h"
  3. #include "BsScriptComponent.h"
  4. #include "BsScriptSceneObject.h"
  5. #include "CmGameObject.h"
  6. #include "CmComponent.h"
  7. #include "BsManagedComponent.h"
  8. #include "CmSceneObject.h"
  9. #include "BsMonoManager.h"
  10. #include "BsMonoAssembly.h"
  11. #include "BsMonoClass.h"
  12. namespace BansheeEngine
  13. {
  14. ScriptGameObjectManager::ScriptGameObjectManager()
  15. :mSceneObjectClass(nullptr)
  16. {
  17. MonoAssembly* assembly = MonoManager::instance().getAssembly(BansheeEngineAssemblyName);
  18. if(assembly == nullptr)
  19. CM_EXCEPT(InternalErrorException, "Cannot find \"" + String(BansheeEngineAssemblyName) + "\" assembly.");
  20. mSceneObjectClass = assembly->getClass("BansheeEngine", "SceneObject");
  21. if(mSceneObjectClass == nullptr)
  22. CM_EXCEPT(InternalErrorException, "Cannot find managed SceneObject class.");
  23. }
  24. ScriptComponent* ScriptGameObjectManager::createScriptComponent(const GameObjectHandle<ManagedComponent>& component)
  25. {
  26. auto findIter = mScriptGameObjects.find(component->getInstanceId());
  27. if(findIter != mScriptGameObjects.end())
  28. CM_EXCEPT(InvalidStateException, "Script component for this Component already exists.");
  29. ScriptComponent* nativeInstance = new (cm_alloc<ScriptComponent>()) ScriptComponent(component);
  30. nativeInstance->createInstance(component->getManagedInstance());
  31. nativeInstance->metaData.thisPtrField->setValue(component->getManagedInstance(), &nativeInstance);
  32. mScriptGameObjects[component->getInstanceId()] = nativeInstance;
  33. return nativeInstance;
  34. }
  35. ScriptSceneObject* ScriptGameObjectManager::createScriptSceneObject(const HSceneObject& sceneObject)
  36. {
  37. MonoObject* instance = mSceneObjectClass->createInstance();
  38. return createScriptSceneObject(instance, sceneObject);
  39. }
  40. ScriptSceneObject* ScriptGameObjectManager::createScriptSceneObject(MonoObject* existingInstance, const HSceneObject& sceneObject)
  41. {
  42. auto findIter = mScriptGameObjects.find(sceneObject->getInstanceId());
  43. if(findIter != mScriptGameObjects.end())
  44. CM_EXCEPT(InvalidStateException, "Script SceneObject for this SceneObject already exists.");
  45. ScriptSceneObject* nativeInstance = new (cm_alloc<ScriptSceneObject>()) ScriptSceneObject(sceneObject);
  46. nativeInstance->createInstance(existingInstance);
  47. nativeInstance->metaData.thisPtrField->setValue(existingInstance, &nativeInstance);
  48. mScriptGameObjects[sceneObject->getInstanceId()] = nativeInstance;
  49. return nativeInstance;
  50. }
  51. ScriptComponent* ScriptGameObjectManager::getScriptComponent(const GameObjectHandle<ManagedComponent>& component)
  52. {
  53. auto findIter = mScriptGameObjects.find(component->getInstanceId());
  54. if(findIter != mScriptGameObjects.end())
  55. return static_cast<ScriptComponent*>(findIter->second);
  56. return nullptr;
  57. }
  58. ScriptSceneObject* ScriptGameObjectManager::getScriptSceneObject(const HSceneObject& sceneObject)
  59. {
  60. auto findIter = mScriptGameObjects.find(sceneObject->getInstanceId());
  61. if(findIter != mScriptGameObjects.end())
  62. return static_cast<ScriptSceneObject*>(findIter->second);
  63. return nullptr;
  64. }
  65. void ScriptGameObjectManager::destroyScriptGameObject(ScriptGameObject* gameObject)
  66. {
  67. UINT64 idx = gameObject->getNativeHandle()->getInstanceId();
  68. mScriptGameObjects.erase(idx);
  69. cm_delete(gameObject);
  70. }
  71. }