2
0

UIAnimationSlide.cpp 2.2 KB

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