BsHandleSliderManager.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Handles/BsHandleSliderManager.h"
  4. #include "Utility/BsBuiltinEditorResources.h"
  5. #include "Components/BsCCamera.h"
  6. #include "Handles/BsHandleSlider.h"
  7. using namespace std::placeholders;
  8. namespace bs
  9. {
  10. bool HandleSliderManager::update(const SPtr<Camera>& camera, const Vector2I& inputPos, const Vector2I& inputDelta)
  11. {
  12. for (auto& slider : mSliders)
  13. {
  14. bool layerMatches = (camera->getLayers() & slider->getLayer()) != 0;
  15. if(layerMatches)
  16. slider->update(camera);
  17. }
  18. StatePerCamera& state = mStates[camera->getInternalID()];
  19. if (state.activeSlider != nullptr)
  20. {
  21. bool layerMatches = (camera->getLayers() & state.activeSlider->getLayer()) != 0;
  22. if (layerMatches)
  23. state.activeSlider->handleInput(camera, inputDelta);
  24. }
  25. else
  26. {
  27. HandleSlider* newHoverSlider = findUnderCursor(camera, inputPos);
  28. if (newHoverSlider != state.hoverSlider)
  29. {
  30. if (state.hoverSlider != nullptr)
  31. {
  32. state.hoverSlider->setInactive();
  33. state.hoverSlider = nullptr;
  34. }
  35. if (newHoverSlider != nullptr)
  36. {
  37. state.hoverSlider = newHoverSlider;
  38. state.hoverSlider->setHover();
  39. }
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. bool HandleSliderManager::trySelect(const SPtr<Camera>& camera, const Vector2I& inputPos)
  46. {
  47. HandleSlider* newActiveSlider = findUnderCursor(camera, inputPos);
  48. bool stateChanged = false;
  49. StatePerCamera& state = mStates[camera->getInternalID()];
  50. if (state.hoverSlider != nullptr)
  51. {
  52. state.hoverSlider->setInactive();
  53. state.hoverSlider = nullptr;
  54. stateChanged = true;
  55. }
  56. if (newActiveSlider != state.activeSlider)
  57. {
  58. if (state.activeSlider != nullptr)
  59. {
  60. state.activeSlider->setInactive();
  61. state.activeSlider = nullptr;
  62. }
  63. if (newActiveSlider != nullptr)
  64. {
  65. state.activeSlider = newActiveSlider;
  66. state.activeSlider->setActive(camera, inputPos);
  67. }
  68. return true;
  69. }
  70. return stateChanged;
  71. }
  72. bool HandleSliderManager::isSliderActive(const SPtr<Camera>& camera) const
  73. {
  74. auto iterFind = mStates.find(camera->getInternalID());
  75. if (iterFind == mStates.end())
  76. return false;
  77. return iterFind->second.activeSlider != nullptr;
  78. }
  79. void HandleSliderManager::clearSelection(const SPtr<Camera>& camera)
  80. {
  81. StatePerCamera& state = mStates[camera->getInternalID()];
  82. if (state.activeSlider != nullptr)
  83. {
  84. state.activeSlider->setInactive();
  85. state.activeSlider = nullptr;
  86. }
  87. }
  88. HandleSlider* HandleSliderManager::findUnderCursor(const SPtr<Camera>& camera, const Vector2I& inputPos) const
  89. {
  90. Ray inputRay = camera->screenPointToRay(inputPos);
  91. float nearestT = std::numeric_limits<float>::max();
  92. HandleSlider* overSlider = nullptr;
  93. for (auto& slider : mSliders)
  94. {
  95. if (!slider->getEnabled())
  96. continue;
  97. bool layerMatches = (camera->getLayers() & slider->getLayer()) != 0;
  98. float t;
  99. if (layerMatches && slider->intersects(inputPos, inputRay, t))
  100. {
  101. if (t < nearestT)
  102. {
  103. overSlider = slider;
  104. nearestT = t;
  105. }
  106. }
  107. }
  108. return overSlider;
  109. }
  110. void HandleSliderManager::_registerSlider(HandleSlider* slider)
  111. {
  112. mSliders.insert(slider);
  113. }
  114. void HandleSliderManager::_unregisterSlider(HandleSlider* slider)
  115. {
  116. mSliders.erase(slider);
  117. for(auto& entry : mStates)
  118. {
  119. if (entry.second.activeSlider == slider)
  120. entry.second.activeSlider = nullptr;
  121. if (entry.second.hoverSlider == slider)
  122. entry.second.hoverSlider = nullptr;
  123. }
  124. }
  125. }