BsScriptSceneSelection.cpp 5.7 KB

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