BsScriptSceneSelection.cpp 5.8 KB

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