UIAnimationSlide.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <TestFramework.h>
  5. #include <Renderer/Renderer.h>
  6. #include <Window/ApplicationWindow.h>
  7. #include <UI/UIAnimationSlide.h>
  8. #include <UI/UIElement.h>
  9. #include <UI/UIManager.h>
  10. JPH_IMPLEMENT_RTTI_ABSTRACT(UIAnimationSlide)
  11. {
  12. JPH_ADD_BASE_CLASS(UIAnimationSlide, UIAnimation)
  13. }
  14. UIAnimationSlide::UIAnimationSlide(EMode inMode, int inSlideDistanceH, int inSlideDistanceV, float inTimeBeforeSlide, float inSlideTime) :
  15. mSlideMode(inMode),
  16. mSlideDistanceH(inSlideDistanceH),
  17. mSlideDistanceV(inSlideDistanceV),
  18. mTimeBeforeSlide(inTimeBeforeSlide),
  19. mSlideTime(inSlideTime)
  20. {
  21. }
  22. void UIAnimationSlide::Init(UIElement *inElement)
  23. {
  24. mTargetRelativeX = inElement->GetRelativeX();
  25. mTargetRelativeY = inElement->GetRelativeY();
  26. ApplicationWindow *window = inElement->GetManager()->GetRenderer()->GetWindow();
  27. int dl = inElement->GetX();
  28. int dr = window->GetWindowWidth() - (inElement->GetX() + inElement->GetWidth());
  29. int dt = inElement->GetY();
  30. int db = window->GetWindowHeight() - (inElement->GetY() + inElement->GetHeight());
  31. if (min(dl, dr) < min(dt, db))
  32. {
  33. mInitialRelativeX = mTargetRelativeX + (dl < dr? -mSlideDistanceH : mSlideDistanceH);
  34. mInitialRelativeY = mTargetRelativeY;
  35. }
  36. else
  37. {
  38. mInitialRelativeX = mTargetRelativeX;
  39. mInitialRelativeY = mTargetRelativeY + (dt < db? -mSlideDistanceV : mSlideDistanceV);
  40. }
  41. if (mSlideMode == SLIDE_ON_SCREEN)
  42. inElement->SetAnimatedVisible(true);
  43. mTime = 0.0f;
  44. }
  45. bool UIAnimationSlide::Update(UIElement *inElement, float inDeltaTime)
  46. {
  47. mTime += inDeltaTime;
  48. float factor = (mTime - mTimeBeforeSlide) / mSlideTime;
  49. if (factor >= 1.0f)
  50. return false;
  51. if (factor < 0.0f)
  52. factor = 0.0f;
  53. if (mSlideMode == SLIDE_OFF_SCREEN)
  54. factor = 1.0f - factor;
  55. float x = mInitialRelativeX * (1.0f - factor) + mTargetRelativeX * factor;
  56. float y = mInitialRelativeY * (1.0f - factor) + mTargetRelativeY * factor;
  57. inElement->SetRelativeX((int)x);
  58. inElement->SetRelativeY((int)y);
  59. return true;
  60. }
  61. void UIAnimationSlide::Exit(UIElement *inElement)
  62. {
  63. inElement->SetRelativeX(mTargetRelativeX);
  64. inElement->SetRelativeY(mTargetRelativeY);
  65. inElement->SetAnimatedVisible(mSlideMode == SLIDE_ON_SCREEN);
  66. }