BsScriptSceneSelection.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "BsScriptSceneSelection.h"
  2. #include "BsScriptCamera.h"
  3. #include "BsSelectionRenderer.h"
  4. #include "BsScenePicking.h"
  5. #include "BsSelection.h"
  6. namespace BansheeEngine
  7. {
  8. ScriptSceneSelection::ScriptSceneSelection(MonoObject* object, const SPtr<Camera>& camera)
  9. :ScriptObject(object), mSelectionRenderer(nullptr), mCamera(camera)
  10. {
  11. mSelectionRenderer = bs_new<SelectionRenderer>();
  12. }
  13. ScriptSceneSelection::~ScriptSceneSelection()
  14. {
  15. bs_delete(mSelectionRenderer);
  16. }
  17. void ScriptSceneSelection::initRuntimeData()
  18. {
  19. metaData.scriptClass->addInternalCall("Internal_Create", &ScriptSceneSelection::internal_Create);
  20. metaData.scriptClass->addInternalCall("Internal_Draw", &ScriptSceneSelection::internal_Draw);
  21. metaData.scriptClass->addInternalCall("Internal_PickObject", &ScriptSceneSelection::internal_PickObject);
  22. }
  23. void ScriptSceneSelection::internal_Create(MonoObject* managedInstance, ScriptCamera* camera)
  24. {
  25. new (bs_alloc<ScriptSceneSelection>()) ScriptSceneSelection(managedInstance, camera->getInternal());
  26. }
  27. void ScriptSceneSelection::internal_Draw(ScriptSceneSelection* thisPtr)
  28. {
  29. thisPtr->mSelectionRenderer->update(thisPtr->mCamera);
  30. }
  31. void ScriptSceneSelection::internal_PickObject(ScriptSceneSelection* thisPtr, Vector2I* inputPos, bool additive)
  32. {
  33. // TODO - Handle multi-selection (i.e. selection rectangle when dragging)
  34. HSceneObject pickedObject = ScenePicking::instance().pickClosestObject(thisPtr->mCamera, *inputPos, Vector2I(1, 1));
  35. if (pickedObject)
  36. {
  37. if (additive) // Append to existing selection
  38. {
  39. Vector<HSceneObject> selectedSOs = Selection::instance().getSceneObjects();
  40. auto iterFind = std::find_if(selectedSOs.begin(), selectedSOs.end(),
  41. [&](const HSceneObject& obj) { return obj == pickedObject; }
  42. );
  43. if (iterFind == selectedSOs.end())
  44. selectedSOs.push_back(pickedObject);
  45. Selection::instance().setSceneObjects(selectedSOs);
  46. }
  47. else
  48. {
  49. Vector<HSceneObject> selectedSOs = { pickedObject };
  50. Selection::instance().setSceneObjects(selectedSOs);
  51. }
  52. }
  53. else
  54. Selection::instance().clearSceneSelection();
  55. }
  56. }