BsScriptGameObjectManager.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "BsScriptGameObjectManager.h"
  2. #include "BsScriptGameObject.h"
  3. #include "BsScriptComponent.h"
  4. #include "BsScriptSceneObject.h"
  5. #include "BsGameObject.h"
  6. #include "BsComponent.h"
  7. #include "BsManagedComponent.h"
  8. #include "BsSceneObject.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. BS_EXCEPT(InternalErrorException, "Cannot find \"" + String(BansheeEngineAssemblyName) + "\" assembly.");
  20. mSceneObjectClass = assembly->getClass("BansheeEngine", "SceneObject");
  21. if(mSceneObjectClass == nullptr)
  22. BS_EXCEPT(InternalErrorException, "Cannot find managed SceneObject class.");
  23. }
  24. void ScriptGameObjectManager::registerScriptComponent(ScriptComponent* nativeInstance, const GameObjectHandle<ManagedComponent>& component)
  25. {
  26. auto findIter = mScriptGameObjects.find(component->getInstanceId());
  27. if(findIter != mScriptGameObjects.end())
  28. BS_EXCEPT(InvalidStateException, "Script component for this Component already exists.");
  29. nativeInstance->setManagedComponent(component);
  30. mScriptGameObjects[component->getInstanceId()] = nativeInstance;
  31. }
  32. ScriptSceneObject* ScriptGameObjectManager::createScriptSceneObject(const HSceneObject& sceneObject)
  33. {
  34. MonoObject* instance = mSceneObjectClass->createInstance();
  35. return createScriptSceneObject(instance, sceneObject);
  36. }
  37. ScriptSceneObject* ScriptGameObjectManager::createScriptSceneObject(MonoObject* existingInstance, const HSceneObject& sceneObject)
  38. {
  39. auto findIter = mScriptGameObjects.find(sceneObject.getInstanceId());
  40. if(findIter != mScriptGameObjects.end())
  41. BS_EXCEPT(InvalidStateException, "Script SceneObject for this SceneObject already exists.");
  42. ScriptSceneObject* nativeInstance = new (bs_alloc<ScriptSceneObject>()) ScriptSceneObject(existingInstance, sceneObject);
  43. mScriptGameObjects[sceneObject.getInstanceId()] = nativeInstance;
  44. return nativeInstance;
  45. }
  46. ScriptComponent* ScriptGameObjectManager::getScriptComponent(const GameObjectHandle<ManagedComponent>& component) const
  47. {
  48. auto findIter = mScriptGameObjects.find(component.getInstanceId());
  49. if(findIter != mScriptGameObjects.end())
  50. return static_cast<ScriptComponent*>(findIter->second);
  51. return nullptr;
  52. }
  53. ScriptSceneObject* ScriptGameObjectManager::getScriptSceneObject(const HSceneObject& sceneObject) const
  54. {
  55. auto findIter = mScriptGameObjects.find(sceneObject.getInstanceId());
  56. if(findIter != mScriptGameObjects.end())
  57. return static_cast<ScriptSceneObject*>(findIter->second);
  58. return nullptr;
  59. }
  60. ScriptGameObjectBase* ScriptGameObjectManager::getScriptGameObject(UINT64 instanceId) const
  61. {
  62. auto findIter = mScriptGameObjects.find(instanceId);
  63. if (findIter != mScriptGameObjects.end())
  64. return static_cast<ScriptSceneObject*>(findIter->second);
  65. return nullptr;
  66. }
  67. void ScriptGameObjectManager::destroyScriptGameObject(ScriptGameObjectBase* gameObject)
  68. {
  69. UINT64 idx = gameObject->getNativeHandle().getInstanceId();
  70. mScriptGameObjects.erase(idx);
  71. bs_delete(gameObject);
  72. }
  73. }