BsScriptSceneSelection.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptSceneSelection.h"
  4. #include "Scene/BsSelectionRenderer.h"
  5. #include "Wrappers/BsScriptSceneObject.h"
  6. #include "BsScriptGameObjectManager.h"
  7. #include "Scene/BsScenePicking.h"
  8. #include "Scene/BsSelection.h"
  9. #include "BsMonoPrerequisites.h"
  10. #include "BsMonoArray.h"
  11. #include "Components/BsCCamera.h"
  12. #include "BsScriptCCamera.generated.h"
  13. namespace bs
  14. {
  15. ScriptSceneSelection::ScriptSceneSelection(MonoObject* object, const SPtr<Camera>& camera,
  16. const GizmoDrawSettings& gizmoDrawSettings)
  17. :ScriptObject(object), mCamera(camera), mGizmoDrawSettings(gizmoDrawSettings)
  18. {
  19. mSelectionRenderer = bs_new<SelectionRenderer>();
  20. }
  21. ScriptSceneSelection::~ScriptSceneSelection()
  22. {
  23. bs_delete(mSelectionRenderer);
  24. }
  25. void ScriptSceneSelection::initRuntimeData()
  26. {
  27. metaData.scriptClass->addInternalCall("Internal_Create", (void*)&ScriptSceneSelection::internal_Create);
  28. metaData.scriptClass->addInternalCall("Internal_Draw", (void*)&ScriptSceneSelection::internal_Draw);
  29. metaData.scriptClass->addInternalCall("Internal_PickObject", (void*)&ScriptSceneSelection::internal_PickObject);
  30. metaData.scriptClass->addInternalCall("Internal_PickObjects", (void*)&ScriptSceneSelection::internal_PickObjects);
  31. metaData.scriptClass->addInternalCall("Internal_Snap", (void*)&ScriptSceneSelection::internal_Snap);
  32. metaData.scriptClass->addInternalCall("Internal_SetGizmoDrawSettings", (void*)&ScriptSceneSelection::internal_SetGizmoDrawSettings);
  33. metaData.scriptClass->addInternalCall("Internal_GetGizmoDrawSettings", (void*)&ScriptSceneSelection::internal_GetGizmoDrawSettings);
  34. }
  35. void ScriptSceneSelection::internal_Create(MonoObject* managedInstance, ScriptCCamera* camera, GizmoDrawSettings* gizmoDrawSettings)
  36. {
  37. new (bs_alloc<ScriptSceneSelection>()) ScriptSceneSelection(managedInstance, camera->getHandle()->_getCamera(),
  38. *gizmoDrawSettings);
  39. }
  40. void ScriptSceneSelection::internal_Draw(ScriptSceneSelection* thisPtr)
  41. {
  42. thisPtr->mSelectionRenderer->update(thisPtr->mCamera);
  43. }
  44. void ScriptSceneSelection::internal_PickObject(ScriptSceneSelection* thisPtr, Vector2I* inputPos, bool additive, MonoArray* ignoreRenderables)
  45. {
  46. Vector<HSceneObject> ignoredSceneObjects;
  47. if (ignoreRenderables != nullptr)
  48. {
  49. ScriptArray scriptArray(ignoreRenderables);
  50. UINT32 arrayLen = scriptArray.size();
  51. for (UINT32 i = 0; i < arrayLen; i++)
  52. {
  53. MonoObject* monoSO = scriptArray.get<MonoObject*>(i);
  54. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(monoSO);
  55. if (scriptSO == nullptr)
  56. continue;
  57. HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
  58. ignoredSceneObjects.push_back(so);
  59. }
  60. }
  61. HSceneObject pickedObject = ScenePicking::instance().pickClosestObject(thisPtr->mCamera,
  62. thisPtr->mGizmoDrawSettings, *inputPos, Vector2I(1, 1), ignoredSceneObjects);
  63. if (pickedObject)
  64. {
  65. if (additive) // Append to existing selection
  66. {
  67. Vector<HSceneObject> selectedSOs = Selection::instance().getSceneObjects();
  68. auto iterFind = std::find_if(selectedSOs.begin(), selectedSOs.end(),
  69. [&](const HSceneObject& obj) { return obj == pickedObject; }
  70. );
  71. if (iterFind == selectedSOs.end())
  72. selectedSOs.push_back(pickedObject);
  73. Selection::instance().setSceneObjects(selectedSOs);
  74. }
  75. else
  76. {
  77. Vector<HSceneObject> selectedSOs = { pickedObject };
  78. Selection::instance().setSceneObjects(selectedSOs);
  79. }
  80. }
  81. else if (!additive)
  82. {
  83. Selection::instance().clearSceneSelection();
  84. }
  85. }
  86. void ScriptSceneSelection::internal_PickObjects(ScriptSceneSelection* thisPtr, Vector2I* inputPos, Vector2I* area,
  87. bool additive, MonoArray* ignoreRenderables)
  88. {
  89. Vector<HSceneObject> ignoredSceneObjects;
  90. if (ignoreRenderables != nullptr)
  91. {
  92. ScriptArray scriptArray(ignoreRenderables);
  93. UINT32 arrayLen = scriptArray.size();
  94. for (UINT32 i = 0; i < arrayLen; i++)
  95. {
  96. MonoObject* monoSO = scriptArray.get<MonoObject*>(i);
  97. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(monoSO);
  98. if (scriptSO == nullptr)
  99. continue;
  100. HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
  101. ignoredSceneObjects.push_back(so);
  102. }
  103. }
  104. Vector<HSceneObject> pickedObjects = ScenePicking::instance().pickObjects(thisPtr->mCamera,
  105. thisPtr->mGizmoDrawSettings, *inputPos, *area, ignoredSceneObjects);
  106. if (!pickedObjects.empty())
  107. {
  108. if (additive) // Append to existing selection
  109. {
  110. Vector<HSceneObject> selectedSOs = Selection::instance().getSceneObjects();
  111. for (int i = 0; i < (int)pickedObjects.size(); i++)
  112. {
  113. bool found = false;
  114. for (int j = 0; j < (int)selectedSOs.size(); j++)
  115. {
  116. if (selectedSOs[j] == pickedObjects[i])
  117. {
  118. found = true;
  119. break;
  120. }
  121. }
  122. if (!found)
  123. selectedSOs.push_back(pickedObjects[i]);
  124. }
  125. Selection::instance().setSceneObjects(selectedSOs);
  126. }
  127. else
  128. Selection::instance().setSceneObjects(pickedObjects);
  129. }
  130. else if (!additive)
  131. {
  132. Selection::instance().clearSceneSelection();
  133. }
  134. }
  135. MonoObject* ScriptSceneSelection::internal_Snap(ScriptSceneSelection* thisPtr, Vector2I* inputPos, SnapData* data,
  136. MonoArray* ignoreRenderables)
  137. {
  138. Vector<HSceneObject> ignoredSceneObjects;
  139. if (ignoreRenderables != nullptr)
  140. {
  141. ScriptArray scriptArray(ignoreRenderables);
  142. UINT32 arrayLen = scriptArray.size();
  143. for (UINT32 i = 0; i < arrayLen; i++)
  144. {
  145. MonoObject* monoSO = scriptArray.get<MonoObject*>(i);
  146. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(monoSO);
  147. if (scriptSO == nullptr)
  148. continue;
  149. HSceneObject so = static_object_cast<SceneObject>(scriptSO->getNativeHandle());
  150. ignoredSceneObjects.push_back(so);
  151. }
  152. }
  153. HSceneObject instance = ScenePicking::instance().pickClosestObject(thisPtr->mCamera, thisPtr->mGizmoDrawSettings,
  154. *inputPos, Vector2I(1, 1), ignoredSceneObjects, data);
  155. if (instance == nullptr)
  156. return nullptr;
  157. ScriptSceneObject* scriptSO = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(instance);
  158. return scriptSO->getManagedInstance();
  159. }
  160. void ScriptSceneSelection::internal_GetGizmoDrawSettings(ScriptSceneSelection* thisPtr, GizmoDrawSettings* settings)
  161. {
  162. *settings = thisPtr->mGizmoDrawSettings;
  163. }
  164. void ScriptSceneSelection::internal_SetGizmoDrawSettings(ScriptSceneSelection* thisPtr, GizmoDrawSettings* settings)
  165. {
  166. thisPtr->mGizmoDrawSettings = *settings;;
  167. }
  168. }