BsHandleManager.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Handles/BsHandleManager.h"
  4. #include "Handles/BsHandleDrawManager.h"
  5. #include "Handles/BsHandleSliderManager.h"
  6. #include "Components/BsCCamera.h"
  7. #include "Scene/BsSceneObject.h"
  8. #include "Settings/BsEditorSettings.h"
  9. #include "Utility/BsTime.h"
  10. namespace bs
  11. {
  12. HandleManager::HandleManager()
  13. : mSliderManager(nullptr), mDrawManager(nullptr), mInputStarted(false), mSettingsHash(0xFFFFFFFF)
  14. , mLastDrawFrameIdx((UINT64)-1)
  15. {
  16. mSliderManager = bs_new<HandleSliderManager>();
  17. mDrawManager = bs_new<HandleDrawManager>();
  18. }
  19. HandleManager::~HandleManager()
  20. {
  21. bs_delete(mSliderManager);
  22. bs_delete(mDrawManager);
  23. }
  24. bool HandleManager::isHandleActive(const SPtr<Camera>& camera) const
  25. {
  26. return mSliderManager->isSliderActive(camera);
  27. }
  28. void HandleManager::beginInput()
  29. {
  30. triggerPreInput();
  31. mInputStarted = true;
  32. }
  33. void HandleManager::updateInput(const SPtr<Camera>& camera, const Vector2I& inputPos, const Vector2I& inputDelta)
  34. {
  35. if(!mInputStarted)
  36. {
  37. BS_LOG(Warning, Editor, "Updating handle input without calling beginInput() first. Input won't be processed.");
  38. return;
  39. }
  40. if (mSettings != nullptr && mSettingsHash != mSettings->getHash())
  41. updateFromEditorSettings();
  42. mSliderManager->update(camera, inputPos, inputDelta);
  43. }
  44. void HandleManager::endInput()
  45. {
  46. triggerPostInput();
  47. mInputStarted = false;
  48. }
  49. void HandleManager::draw(const SPtr<Camera>& camera)
  50. {
  51. UINT64 frameIdx = gTime().getFrameIdx();
  52. if (frameIdx != mLastDrawFrameIdx)
  53. {
  54. mDrawManager->clear();
  55. queueDrawCommands();
  56. mLastDrawFrameIdx = frameIdx;
  57. }
  58. mDrawManager->draw(camera);
  59. }
  60. void HandleManager::setSettings(const SPtr<EditorSettings>& settings)
  61. {
  62. mSettings = settings;
  63. updateFromEditorSettings();
  64. }
  65. void HandleManager::updateFromEditorSettings()
  66. {
  67. setDefaultHandleSize(mSettings->getHandleSize());
  68. mSettingsHash = mSettings->getHash();
  69. }
  70. void HandleManager::trySelect(const SPtr<Camera>& camera, const Vector2I& inputPos)
  71. {
  72. return mSliderManager->trySelect(camera, inputPos);
  73. }
  74. void HandleManager::clearSelection(const SPtr<Camera>& camera)
  75. {
  76. return mSliderManager->clearSelection(camera);
  77. }
  78. float HandleManager::getHandleSize(const SPtr<Camera>& camera, const Vector3& handlePos) const
  79. {
  80. if (camera->getProjectionType() == PT_PERSPECTIVE)
  81. {
  82. const Transform& tfrm = camera->getTransform();
  83. Vector3 cameraPos = tfrm.getPosition();
  84. Vector3 diff = handlePos - cameraPos;
  85. float distAlongViewDir = Math::abs(diff.dot(tfrm.getRotation().zAxis()));
  86. return distAlongViewDir * mDefaultHandleSize;
  87. }
  88. else
  89. {
  90. return camera->getOrthoWindowHeight() * mDefaultHandleSize;
  91. }
  92. }
  93. }