BsHandleSliderManager.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "BsHandleSliderManager.h"
  2. #include "BsDrawHelper.h"
  3. #include "BsMaterial.h"
  4. #include "BsBuiltinEditorResources.h"
  5. #include "BsCoreThread.h"
  6. #include "BsRendererManager.h"
  7. #include "BsRenderer.h"
  8. #include "BsTransientMesh.h"
  9. #include "BsCamera.h"
  10. #include "BsHandleSlider.h"
  11. using namespace std::placeholders;
  12. namespace BansheeEngine
  13. {
  14. HandleSliderManager::HandleSliderManager()
  15. :mActiveSlider(nullptr), mHoverSlider(nullptr)
  16. {
  17. }
  18. HandleSliderManager::~HandleSliderManager()
  19. {
  20. }
  21. void HandleSliderManager::update(const HCamera& camera, const Vector2I& inputPos, const Ray& inputRay, bool pressed)
  22. {
  23. if (!pressed)
  24. {
  25. if (mActiveSlider != nullptr)
  26. {
  27. mActiveSlider->setInactive();
  28. mActiveSlider = nullptr;
  29. }
  30. float nearestT = std::numeric_limits<float>::max();
  31. HandleSlider* overSlider = nullptr;
  32. for (auto& slider : mSliders)
  33. {
  34. float t;
  35. if (slider->intersects(inputRay, t))
  36. {
  37. if (t < nearestT)
  38. {
  39. overSlider = slider;
  40. nearestT = t;
  41. }
  42. }
  43. }
  44. if (mHoverSlider != overSlider)
  45. {
  46. if (mHoverSlider != nullptr)
  47. mHoverSlider->setInactive();
  48. mHoverSlider = overSlider;
  49. if (mHoverSlider != nullptr)
  50. overSlider->setHover();
  51. }
  52. }
  53. else
  54. {
  55. if (mActiveSlider == nullptr)
  56. {
  57. float nearestT = std::numeric_limits<float>::max();
  58. HandleSlider* overSlider = nullptr;
  59. for (auto& slider : mSliders)
  60. {
  61. float t;
  62. if (slider->intersects(inputRay, t))
  63. {
  64. if (t < nearestT)
  65. {
  66. overSlider = slider;
  67. nearestT = t;
  68. }
  69. }
  70. }
  71. if (overSlider != nullptr)
  72. {
  73. mActiveSlider = overSlider;
  74. mActiveSlider->setActive(inputPos);
  75. }
  76. }
  77. if (mActiveSlider != nullptr)
  78. {
  79. mActiveSlider->update(camera, inputPos, inputRay);
  80. }
  81. }
  82. }
  83. bool HandleSliderManager::isSliderActive() const
  84. {
  85. return mActiveSlider != nullptr;
  86. }
  87. void HandleSliderManager::_registerSlider(HandleSlider* slider)
  88. {
  89. mSliders.insert(slider);
  90. }
  91. void HandleSliderManager::_unregisterSlider(HandleSlider* slider)
  92. {
  93. mSliders.erase(slider);
  94. if (mActiveSlider == slider)
  95. mActiveSlider = nullptr;
  96. }
  97. }