2
0

BsScriptSelection.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "BsScriptSelection.h"
  2. #include "BsScriptMeta.h"
  3. #include "BsMonoClass.h"
  4. #include "BsSelection.h"
  5. #include "BsScriptSceneObject.h"
  6. #include "BsMonoUtil.h"
  7. #include "BsPath.h"
  8. #include "BsScriptGameObjectManager.h"
  9. namespace BansheeEngine
  10. {
  11. void ScriptSelection::initRuntimeData()
  12. {
  13. metaData.scriptClass->addInternalCall("Internal_GetSceneObjectSelection", &ScriptSelection::internal_GetSceneObjectSelection);
  14. metaData.scriptClass->addInternalCall("Internal_SetSceneObjectSelection", &ScriptSelection::internal_SetSceneObjectSelection);
  15. metaData.scriptClass->addInternalCall("Internal_GetResourceUUIDSelection", &ScriptSelection::internal_GetResourceUUIDSelection);
  16. metaData.scriptClass->addInternalCall("Internal_SetResourceUUIDSelection", &ScriptSelection::internal_SetResourceUUIDSelection);
  17. metaData.scriptClass->addInternalCall("Internal_GetResourcePathSelection", &ScriptSelection::internal_GetResourcePathSelection);
  18. metaData.scriptClass->addInternalCall("Internal_SetResourcePathSelection", &ScriptSelection::internal_SetResourcePathSelection);
  19. }
  20. void ScriptSelection::internal_GetSceneObjectSelection(MonoArray** selection)
  21. {
  22. Vector<HSceneObject> sceneObjects = Selection::instance().getSceneObjects();
  23. ::MonoClass* sceneObjectMonoClass = ScriptSceneObject::getMetaData()->scriptClass->_getInternalClass();
  24. MonoArray* sceneObjectArray = mono_array_new(MonoManager::instance().getDomain(),
  25. sceneObjectMonoClass, (UINT32)sceneObjects.size());
  26. for (UINT32 i = 0; i < (UINT32)sceneObjects.size(); i++)
  27. {
  28. // TODO - This bit is commonly used, I should add a method in ScriptGameObjectManager
  29. ScriptSceneObject* scriptSceneObject = ScriptGameObjectManager::instance().getScriptSceneObject(sceneObjects[i]);
  30. if (scriptSceneObject == nullptr)
  31. scriptSceneObject = ScriptGameObjectManager::instance().createScriptSceneObject(sceneObjects[i]);
  32. MonoObject* sceneMonoObject = scriptSceneObject->getManagedInstance();
  33. void* elemAddr = mono_array_addr_with_size(sceneObjectArray, sizeof(MonoObject*), i);
  34. memcpy(elemAddr, &sceneMonoObject, sizeof(MonoObject*));
  35. }
  36. *selection = sceneObjectArray;
  37. }
  38. void ScriptSelection::internal_SetSceneObjectSelection(MonoArray* selection)
  39. {
  40. Vector<HSceneObject> sceneObjects;
  41. UINT32 arrayLen = (UINT32)mono_array_length(selection);
  42. for (UINT32 i = 0; i < arrayLen; i++)
  43. {
  44. MonoObject* monoSO = mono_array_get(selection, MonoObject*, i);
  45. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(monoSO);
  46. HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
  47. sceneObjects.push_back(so);
  48. }
  49. Selection::instance().setSceneObjects(sceneObjects);
  50. }
  51. void ScriptSelection::internal_GetResourceUUIDSelection(MonoArray** selection)
  52. {
  53. Vector<String> uuids = Selection::instance().getResourceUUIDs();
  54. MonoArray* uuidArray = mono_array_new(MonoManager::instance().getDomain(),
  55. mono_get_string_class(), (UINT32)uuids.size());
  56. for (UINT32 i = 0; i < (UINT32)uuids.size(); i++)
  57. {
  58. MonoString* monoString = MonoUtil::stringToMono(MonoManager::instance().getDomain(), uuids[i]);
  59. void* elemAddr = mono_array_addr_with_size(uuidArray, sizeof(MonoString*), i);
  60. memcpy(elemAddr, &monoString, sizeof(MonoString*));
  61. }
  62. *selection = uuidArray;
  63. }
  64. void ScriptSelection::internal_SetResourceUUIDSelection(MonoArray* selection)
  65. {
  66. Vector<String> uuids;
  67. UINT32 arrayLen = (UINT32)mono_array_length(selection);
  68. for (UINT32 i = 0; i < arrayLen; i++)
  69. {
  70. MonoString* monoString = mono_array_get(selection, MonoString*, i);
  71. String uuid = MonoUtil::monoToString(monoString);
  72. uuids.push_back(uuid);
  73. }
  74. Selection::instance().setResourceUUIDs(uuids);
  75. }
  76. void ScriptSelection::internal_GetResourcePathSelection(MonoArray** selection)
  77. {
  78. Vector<Path> paths = Selection::instance().getResourcePaths();
  79. MonoArray* pathArray = mono_array_new(MonoManager::instance().getDomain(),
  80. mono_get_string_class(), (UINT32)paths.size());
  81. for (UINT32 i = 0; i < (UINT32)paths.size(); i++)
  82. {
  83. MonoString* monoString = MonoUtil::stringToMono(MonoManager::instance().getDomain(), paths[i].toString());
  84. void* elemAddr = mono_array_addr_with_size(pathArray, sizeof(MonoString*), i);
  85. memcpy(elemAddr, &monoString, sizeof(MonoString*));
  86. }
  87. *selection = pathArray;
  88. }
  89. void ScriptSelection::internal_SetResourcePathSelection(MonoArray* selection)
  90. {
  91. Vector<Path> paths;
  92. UINT32 arrayLen = (UINT32)mono_array_length(selection);
  93. for (UINT32 i = 0; i < arrayLen; i++)
  94. {
  95. MonoString* monoString = mono_array_get(selection, MonoString*, i);
  96. Path path = MonoUtil::monoToString(monoString);
  97. paths.push_back(path);
  98. }
  99. Selection::instance().setResourcePaths(paths);
  100. }
  101. }