BsScriptGameObjectManager.cpp 3.4 KB

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