BsHandleSliderManager.cpp 3.3 KB

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