BsScriptSceneObject.cpp 3.5 KB

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