From 19dc496a3571ca424cfc5c7057a92018914be6d3 Mon Sep 17 00:00:00 2001 From: Andrew Shkrob Date: Wed, 1 Feb 2023 00:32:51 +0100 Subject: [PATCH] [drape] SetCenterEvent animation fix Signed-off-by: Andrew Shkrob --- drape_frontend/drape_engine.cpp | 8 --- drape_frontend/drape_engine.hpp | 3 - drape_frontend/screen_animations.cpp | 4 +- drape_frontend/user_event_stream.cpp | 96 ++++++++++++++++------------ drape_frontend/user_event_stream.hpp | 15 ----- 5 files changed, 56 insertions(+), 70 deletions(-) diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 440aefbbe4..d142894e0c 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -204,14 +204,6 @@ void DrapeEngine::Rotate(double azimuth, bool isAnim) AddUserEvent(make_unique_dp(azimuth, isAnim, nullptr /* parallelAnimCreator */)); } -void DrapeEngine::ScaleAndSetCenter(m2::PointD const & centerPt, double scaleFactor, bool isAnim, - bool trackVisibleViewport) -{ - PostUserEvent(make_unique_dp(scaleFactor, centerPt, isAnim, - trackVisibleViewport, - nullptr /* parallelAnimCreator */)); -} - void DrapeEngine::SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim, bool trackVisibleViewport) { diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 6cc60655b0..8b368a4f3f 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -131,9 +131,6 @@ public: void Move(double factorX, double factorY, bool isAnim); void Rotate(double azimuth, bool isAnim); - void ScaleAndSetCenter(m2::PointD const & centerPt, double scaleFactor, bool isAnim, - bool trackVisibleViewport); - // If zoom == -1 then current zoom will not be changed. void SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim, bool trackVisibleViewport); diff --git a/drape_frontend/screen_animations.cpp b/drape_frontend/screen_animations.cpp index 50e3b36e57..5046dadd96 100644 --- a/drape_frontend/screen_animations.cpp +++ b/drape_frontend/screen_animations.cpp @@ -92,7 +92,7 @@ drape_ptr GetPrettyFollowAnimation(ScreenBase const & startSc auto moveAnim = make_unique_dp(); moveAnim->SetMove(startScreen.GetOrg(), tmp.GetOrg(), viewportRect, tmp.GetScale()); - moveAnim->SetMaxDuration(kMaxAnimationTimeSec); + moveAnim->SetMaxDuration(kMaxAnimationTimeSec * 0.5); sequenceAnim->AddAnimation(move(moveAnim)); } @@ -138,7 +138,7 @@ drape_ptr GetFollowAnimation(ScreenBase const & startScreen, bool isAutoZoom) { auto anim = make_unique_dp(startScreen, userPos, endPixelPos, targetScale, targetAngle, isAutoZoom); - anim->SetMaxDuration(kMaxAnimationTimeSec); + anim->SetMaxDuration(kMaxAnimationTimeSec * 0.5); return anim; } diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index f0529cd072..6834fc388f 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -44,6 +44,47 @@ size_t GetValidTouchesCount(std::array const & touches) return result; } + +drape_ptr createMapFollowAnimation( + ScreenBase const ¤tScreen, ScreenBase const & endScreen, m2::PointD const & userPos, + m2::PointD const & pixelPos, int preferredZoomLevel, double targetAngle, + bool isAutoScale, Animation::TAction const & onFinishAction = nullptr, TAnimationCreator const & parallelAnimCreator = nullptr) +{ + drape_ptr anim; + double const moveDuration = PositionInterpolator::GetMoveDuration(currentScreen.GetOrg(), endScreen.GetOrg(), + currentScreen.PixelRectIn3d(), + (currentScreen.GetScale() + endScreen.GetScale()) / 2.0); + if (moveDuration > kMaxAnimationTimeSec) + { + // Run pretty move animation if we are far from userPos. + anim = GetPrettyFollowAnimation(currentScreen, userPos, endScreen.GetScale(), targetAngle, pixelPos); + } + else + { + // Run follow-and-rotate animation. + anim = GetFollowAnimation(currentScreen, userPos, endScreen.GetScale(), targetAngle, pixelPos, isAutoScale); + } + + if (preferredZoomLevel != kDoNotChangeZoom) + { + anim->SetCouldBeInterrupted(false); + anim->SetCouldBeBlended(false); + } + + anim->SetOnFinishAction(onFinishAction); + + if (parallelAnimCreator != nullptr) + { + drape_ptr parallelAnim = make_unique_dp(); + parallelAnim->SetCustomType(kParallelFollowAnim); + parallelAnim->AddAnimation(parallelAnimCreator(anim->GetType() == Animation::Type::MapFollow ? make_ref(anim) + : nullptr)); + parallelAnim->AddAnimation(std::move(anim)); + return parallelAnim; + } + + return anim; +} } // namespace #ifdef DEBUG @@ -395,7 +436,6 @@ bool UserEventStream::OnSetCenter(ref_ptr centerEvent) { m2::PointD const & center = centerEvent->GetCenter(); auto const zoom = centerEvent->GetZoom(); - auto const scaleFactor = centerEvent->GetScaleFactor(); if (centerEvent->TrackVisibleViewport()) { @@ -409,11 +449,15 @@ bool UserEventStream::OnSetCenter(ref_ptr centerEvent) { screen.SetFromParams(center, screen.GetAngle(), GetScreenScale(zoom)); screen.MatchGandP3d(center, m_visibleViewport.Center()); - } - else if (scaleFactor > 0.0) - { - screen.SetOrg(center); - ApplyScale(m_visibleViewport.Center(), scaleFactor, screen); + if (centerEvent->IsAnim()) + { + ShrinkAndScaleInto(screen, df::GetWorldRect()); + drape_ptr anim = createMapFollowAnimation( + GetCurrentScreen(), screen, center, m_visibleViewport.Center(), + zoom, screen.GetAngle(), false); + m_animationSystem.CombineAnimation(std::move(anim)); + return false; + } } else { @@ -600,42 +644,10 @@ bool UserEventStream::SetFollowAndRotate(m2::PointD const & userPos, m2::PointD if (isAnim) { - drape_ptr anim; - double const moveDuration = PositionInterpolator::GetMoveDuration(currentScreen.GetOrg(), screen.GetOrg(), - currentScreen.PixelRectIn3d(), - (currentScreen.GetScale() + screen.GetScale()) / 2.0); - if (moveDuration > kMaxAnimationTimeSec) - { - // Run pretty move animation if we are far from userPos. - anim = GetPrettyFollowAnimation(currentScreen, userPos, screen.GetScale(), -azimuth, pixelPos); - } - else - { - // Run follow-and-rotate animation. - anim = GetFollowAnimation(currentScreen, userPos, screen.GetScale(), -azimuth, pixelPos, isAutoScale); - } - - if (preferredZoomLevel != kDoNotChangeZoom) - { - anim->SetCouldBeInterrupted(false); - anim->SetCouldBeBlended(false); - } - - anim->SetOnFinishAction(onFinishAction); - - if (parallelAnimCreator != nullptr) - { - drape_ptr parallelAnim = make_unique_dp(); - parallelAnim->SetCustomType(kParallelFollowAnim); - parallelAnim->AddAnimation(parallelAnimCreator(anim->GetType() == Animation::Type::MapFollow ? make_ref(anim) - : nullptr)); - parallelAnim->AddAnimation(move(anim)); - m_animationSystem.CombineAnimation(move(parallelAnim)); - } - else - { - m_animationSystem.CombineAnimation(move(anim)); - } + drape_ptr anim = createMapFollowAnimation( + currentScreen, screen, userPos, pixelPos, preferredZoomLevel, + -azimuth, isAutoScale, onFinishAction, parallelAnimCreator); + m_animationSystem.CombineAnimation(std::move(anim)); return false; } diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index 86def97619..0f8bb705ae 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -164,28 +164,15 @@ public: TAnimationCreator const & parallelAnimCreator) : m_center(center) , m_zoom(zoom) - , m_scaleFactor(0.0) , m_isAnim(isAnim) , m_trackVisibleViewport(trackVisibleViewport) , m_parallelAnimCreator(parallelAnimCreator) {} - SetCenterEvent(double scaleFactor, m2::PointD const & center, - bool isAnim, bool trackVisibleViewport, - TAnimationCreator const & parallelAnimCreator) - : m_center(center) - , m_zoom(-1) - , m_scaleFactor(scaleFactor) - , m_isAnim(isAnim) - , m_trackVisibleViewport(trackVisibleViewport) - , m_parallelAnimCreator(parallelAnimCreator) - {} - EventType GetType() const override { return UserEvent::EventType::SetCenter; } m2::PointD const & GetCenter() const { return m_center; } int GetZoom() const { return m_zoom; } - double GetScaleFactor() const { return m_scaleFactor; } bool IsAnim() const { return m_isAnim; } bool TrackVisibleViewport() const { return m_trackVisibleViewport; } TAnimationCreator const & GetParallelAnimCreator() const { return m_parallelAnimCreator; } @@ -193,8 +180,6 @@ public: private: m2::PointD m_center; // center point in mercator int m_zoom; // if zoom == -1, then zoom level will not change - double m_scaleFactor; // this parameter is used when zoom == -1, - // if scaleFactor <= 0.0, then scale will not change bool m_isAnim; bool m_trackVisibleViewport; TAnimationCreator m_parallelAnimCreator;