BsScriptSelection.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "BsScriptSelection.h"
  2. #include "BsScriptMeta.h"
  3. #include "BsMonoClass.h"
  4. #include "BsMonoMethod.h"
  5. #include "BsSelection.h"
  6. #include "BsScriptSceneObject.h"
  7. #include "BsMonoUtil.h"
  8. #include "BsScriptGameObjectManager.h"
  9. namespace BansheeEngine
  10. {
  11. ScriptSelection::OnSelectionChangedThunkDef ScriptSelection::OnSelectionChangedThunk;
  12. HEvent ScriptSelection::OnSelectionChangedConn;
  13. ScriptSelection::ScriptSelection(MonoObject* instance)
  14. :ScriptObject(instance)
  15. {
  16. }
  17. void ScriptSelection::initRuntimeData()
  18. {
  19. metaData.scriptClass->addInternalCall("Internal_GetSceneObjectSelection", &ScriptSelection::internal_GetSceneObjectSelection);
  20. metaData.scriptClass->addInternalCall("Internal_SetSceneObjectSelection", &ScriptSelection::internal_SetSceneObjectSelection);
  21. metaData.scriptClass->addInternalCall("Internal_GetResourceUUIDSelection", &ScriptSelection::internal_GetResourceUUIDSelection);
  22. metaData.scriptClass->addInternalCall("Internal_SetResourceUUIDSelection", &ScriptSelection::internal_SetResourceUUIDSelection);
  23. metaData.scriptClass->addInternalCall("Internal_GetResourcePathSelection", &ScriptSelection::internal_GetResourcePathSelection);
  24. metaData.scriptClass->addInternalCall("Internal_SetResourcePathSelection", &ScriptSelection::internal_SetResourcePathSelection);
  25. OnSelectionChangedThunk = (OnSelectionChangedThunkDef)metaData.scriptClass->getMethod("Internal_TriggerSelectionChanged", 2)->getThunk();
  26. }
  27. void ScriptSelection::internal_GetSceneObjectSelection(MonoArray** selection)
  28. {
  29. Vector<HSceneObject> sceneObjects = Selection::instance().getSceneObjects();
  30. ::MonoClass* sceneObjectMonoClass = ScriptSceneObject::getMetaData()->scriptClass->_getInternalClass();
  31. MonoArray* sceneObjectArray = mono_array_new(MonoManager::instance().getDomain(),
  32. sceneObjectMonoClass, (UINT32)sceneObjects.size());
  33. for (UINT32 i = 0; i < (UINT32)sceneObjects.size(); i++)
  34. {
  35. // TODO - This bit is commonly used, I should add a method in ScriptGameObjectManager
  36. ScriptSceneObject* scriptSceneObject = ScriptGameObjectManager::instance().getScriptSceneObject(sceneObjects[i]);
  37. if (scriptSceneObject == nullptr)
  38. scriptSceneObject = ScriptGameObjectManager::instance().createScriptSceneObject(sceneObjects[i]);
  39. MonoObject* sceneMonoObject = scriptSceneObject->getManagedInstance();
  40. void* elemAddr = mono_array_addr_with_size(sceneObjectArray, sizeof(MonoObject*), i);
  41. memcpy(elemAddr, &sceneMonoObject, sizeof(MonoObject*));
  42. }
  43. *selection = sceneObjectArray;
  44. }
  45. void ScriptSelection::internal_SetSceneObjectSelection(MonoArray* selection)
  46. {
  47. Vector<HSceneObject> sceneObjects;
  48. UINT32 arrayLen = (UINT32)mono_array_length(selection);
  49. for (UINT32 i = 0; i < arrayLen; i++)
  50. {
  51. MonoObject* monoSO = mono_array_get(selection, MonoObject*, i);
  52. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(monoSO);
  53. HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
  54. sceneObjects.push_back(so);
  55. }
  56. Selection::instance().setSceneObjects(sceneObjects);
  57. }
  58. void ScriptSelection::internal_GetResourceUUIDSelection(MonoArray** selection)
  59. {
  60. Vector<String> uuids = Selection::instance().getResourceUUIDs();
  61. MonoArray* uuidArray = mono_array_new(MonoManager::instance().getDomain(),
  62. mono_get_string_class(), (UINT32)uuids.size());
  63. for (UINT32 i = 0; i < (UINT32)uuids.size(); i++)
  64. {
  65. MonoString* monoString = MonoUtil::stringToMono(MonoManager::instance().getDomain(), uuids[i]);
  66. void* elemAddr = mono_array_addr_with_size(uuidArray, sizeof(MonoString*), i);
  67. memcpy(elemAddr, &monoString, sizeof(MonoString*));
  68. }
  69. *selection = uuidArray;
  70. }
  71. void ScriptSelection::internal_SetResourceUUIDSelection(MonoArray* selection)
  72. {
  73. Vector<String> uuids;
  74. UINT32 arrayLen = (UINT32)mono_array_length(selection);
  75. for (UINT32 i = 0; i < arrayLen; i++)
  76. {
  77. MonoString* monoString = mono_array_get(selection, MonoString*, i);
  78. String uuid = MonoUtil::monoToString(monoString);
  79. uuids.push_back(uuid);
  80. }
  81. Selection::instance().setResourceUUIDs(uuids);
  82. }
  83. void ScriptSelection::internal_GetResourcePathSelection(MonoArray** selection)
  84. {
  85. Vector<Path> paths = Selection::instance().getResourcePaths();
  86. MonoArray* pathArray = mono_array_new(MonoManager::instance().getDomain(),
  87. mono_get_string_class(), (UINT32)paths.size());
  88. for (UINT32 i = 0; i < (UINT32)paths.size(); i++)
  89. {
  90. MonoString* monoString = MonoUtil::stringToMono(MonoManager::instance().getDomain(), paths[i].toString());
  91. void* elemAddr = mono_array_addr_with_size(pathArray, sizeof(MonoString*), i);
  92. memcpy(elemAddr, &monoString, sizeof(MonoString*));
  93. }
  94. *selection = pathArray;
  95. }
  96. void ScriptSelection::internal_SetResourcePathSelection(MonoArray* selection)
  97. {
  98. Vector<Path> paths;
  99. UINT32 arrayLen = (UINT32)mono_array_length(selection);
  100. for (UINT32 i = 0; i < arrayLen; i++)
  101. {
  102. MonoString* monoString = mono_array_get(selection, MonoString*, i);
  103. Path path = MonoUtil::monoToString(monoString);
  104. paths.push_back(path);
  105. }
  106. Selection::instance().setResourcePaths(paths);
  107. }
  108. void ScriptSelection::startUp()
  109. {
  110. OnSelectionChangedConn = Selection::instance().onSelectionChanged.connect(&ScriptSelection::onSelectionChanged);
  111. }
  112. void ScriptSelection::shutDown()
  113. {
  114. OnSelectionChangedConn.disconnect();
  115. }
  116. void ScriptSelection::onSelectionChanged(const Vector<HSceneObject>& sceneObjects, const Vector<Path>& resPaths)
  117. {
  118. UINT32 numObjects = (UINT32)sceneObjects.size();
  119. ScriptArray scriptObjects = ScriptArray::create<ScriptSceneObject>(numObjects);
  120. for (UINT32 i = 0; i < numObjects; i++)
  121. {
  122. // TODO - This bit is commonly used, I should add a method in ScriptGameObjectManager
  123. ScriptSceneObject* scriptSceneObject = ScriptGameObjectManager::instance().getScriptSceneObject(sceneObjects[i]);
  124. if (scriptSceneObject == nullptr)
  125. scriptSceneObject = ScriptGameObjectManager::instance().createScriptSceneObject(sceneObjects[i]);
  126. scriptObjects.set(i, scriptSceneObject->getManagedInstance());
  127. }
  128. UINT32 numPaths = (UINT32)resPaths.size();
  129. ScriptArray scriptPaths = ScriptArray::create<String>(numPaths);
  130. for (UINT32 i = 0; i < numPaths; i++)
  131. scriptObjects.set(i, resPaths[i].toString());
  132. MonoArray* monoObjects = scriptObjects.getInternal();
  133. MonoArray* monoPaths = scriptPaths.getInternal();
  134. MonoUtil::invokeThunk(OnSelectionChangedThunk, monoObjects, monoPaths);
  135. }
  136. }