BsScriptSceneObject.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "BsScriptSceneObject.h"
  2. #include "BsScriptGameObjectManager.h"
  3. #include "BsScriptMeta.h"
  4. #include "BsMonoField.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoManager.h"
  7. #include "CmSceneObject.h"
  8. #include "BsMonoUtil.h"
  9. namespace BansheeEngine
  10. {
  11. ScriptSceneObject::ScriptSceneObject(const HSceneObject& sceneObject)
  12. :mSceneObject(sceneObject)
  13. {
  14. }
  15. void ScriptSceneObject::initMetaData()
  16. {
  17. metaData = ScriptMeta(BansheeEngineAssemblyName, "BansheeEngine", "SceneObject", &ScriptSceneObject::initRuntimeData);
  18. MonoManager::registerScriptType(&metaData);
  19. }
  20. void ScriptSceneObject::initRuntimeData()
  21. {
  22. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptSceneObject::internal_createInstance);
  23. metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptSceneObject::internal_destroyInstance);
  24. metaData.scriptClass->addInternalCall("Internal_GetParent", &ScriptSceneObject::internal_getParent);
  25. metaData.scriptClass->addInternalCall("Internal_SetParent", &ScriptSceneObject::internal_setParent);
  26. metaData.scriptClass->addInternalCall("Internal_GetNumChildren", &ScriptSceneObject::internal_getNumChildren);
  27. metaData.scriptClass->addInternalCall("Internal_GetChild", &ScriptSceneObject::internal_getChild);
  28. }
  29. void ScriptSceneObject::internal_createInstance(MonoObject* instance, MonoString* name)
  30. {
  31. HSceneObject sceneObject = SceneObject::create(toString(MonoUtil::monoToWString(name)));
  32. ScriptGameObjectManager::instance().createScriptSceneObject(instance, sceneObject);
  33. }
  34. void ScriptSceneObject::internal_destroyInstance(ScriptSceneObject* nativeInstance)
  35. {
  36. ScriptGameObjectManager::instance().destroyScriptGameObject(nativeInstance);
  37. }
  38. void ScriptSceneObject::internal_setParent(ScriptSceneObject* nativeInstance, MonoObject* parent)
  39. {
  40. ScriptSceneObject* parentScriptSO = ScriptSceneObject::toNative(parent);
  41. nativeInstance->mSceneObject->setParent(parentScriptSO->mSceneObject);
  42. }
  43. MonoObject* ScriptSceneObject::internal_getParent(ScriptSceneObject* nativeInstance)
  44. {
  45. HSceneObject parent = nativeInstance->mSceneObject->getParent();
  46. ScriptSceneObject* parentScriptSO = ScriptGameObjectManager::instance().getScriptSceneObject(parent);
  47. if(parentScriptSO == nullptr)
  48. parentScriptSO = ScriptGameObjectManager::instance().createScriptSceneObject(parent);
  49. return parentScriptSO->getManagedInstance();
  50. }
  51. UINT32 ScriptSceneObject::internal_getNumChildren(ScriptSceneObject* nativeInstance)
  52. {
  53. return nativeInstance->mSceneObject->getNumChildren();
  54. }
  55. MonoObject* ScriptSceneObject::internal_getChild(ScriptSceneObject* nativeInstance, UINT32 idx)
  56. {
  57. UINT32 numChildren = nativeInstance->mSceneObject->getNumChildren();
  58. if(idx >= numChildren)
  59. {
  60. LOGWRN("Attempting to access an out of range SceneObject child. Provided index: \"" + toString(idx)
  61. + "\". Valid range: [0 .. " + toString(numChildren) + ")");
  62. return nullptr;
  63. }
  64. HSceneObject childSO = nativeInstance->mSceneObject->getChild(idx);
  65. ScriptSceneObject* childScriptSO = ScriptGameObjectManager::instance().getScriptSceneObject(childSO);
  66. if(childScriptSO == nullptr)
  67. childScriptSO = ScriptGameObjectManager::instance().createScriptSceneObject(childSO);
  68. return childScriptSO->getManagedInstance();
  69. }
  70. void ScriptSceneObject::setNativeHandle(const HGameObject& gameObject)
  71. {
  72. mSceneObject = static_object_cast<SceneObject>(gameObject);
  73. }
  74. }