From 1d08ec2bd34ed6baa1938076067aca26e1e16bb3 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 25 Nov 2015 17:52:35 +0300 Subject: [PATCH] Refactor switch from perspective when zoom level is too low. Conflicts: drape_frontend/frontend_renderer.hpp --- drape_frontend/frontend_renderer.cpp | 60 ++++++++++++++++------------ drape_frontend/frontend_renderer.hpp | 8 +++- drape_frontend/user_event_stream.cpp | 2 +- 3 files changed, 42 insertions(+), 28 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index a4eb71b78f..fdb2310343 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -386,11 +386,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { m_myPositionController->DeactivateRouting(); if (m_enable3dInNavigation) - { - m_discardedFOV = -1.0; - m_discardedAngle = -1.0; - AddUserEvent(DisablePerspectiveEvent()); - } + DiscardPerspective(); } break; } @@ -410,11 +406,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { m_myPositionController->DeactivateRouting(); if (m_enable3dInNavigation) - { - m_discardedFOV = -1.0; - m_discardedAngle = -1.0; - AddUserEvent(DisablePerspectiveEvent()); - } + DiscardPerspective(); break; } @@ -909,26 +901,44 @@ int FrontendRenderer::GetCurrentZoomLevelForData() const return (m_currentZoomLevel <= upperScale ? m_currentZoomLevel : upperScale); } +void FrontendRenderer::DiscardPerspective(ScreenBase const & screen) +{ + if (!screen.isPerspective()) + return; + + m_discardedFOV = screen.GetAngleFOV(); + m_discardedAngle = screen.GetRotationAngle(); + AddUserEvent(DisablePerspectiveEvent()); +} + +void FrontendRenderer::DiscardPerspective() +{ + m_discardedFOV = 0.0; + m_discardedAngle = 0.0; + AddUserEvent(DisablePerspectiveEvent()); +} + +void FrontendRenderer::RecoverPerspective() +{ + if (m_discardedFOV <= 0.0) + return; + + AddUserEvent(EnablePerspectiveEvent(m_discardedAngle, m_discardedFOV, + true /* animated */, true /* immediately start */)); + m_discardedFOV = 0.0; + m_discardedAngle = 0.0; +} + void FrontendRenderer::ResolveZoomLevel(ScreenBase const & screen) { m_currentZoomLevel = GetDrawTileScale(screen); - if (m_userEventStream.IsInPerspectiveAnimation()) - return; - LOG(LWARNING, ("m_currentZoomLevel =", m_currentZoomLevel)); - if (screen.isPerspective() && m_currentZoomLevel < m_min3dZoomLevel) + if (m_enable3dInNavigation && !m_userEventStream.IsInPerspectiveAnimation()) { - m_discardedFOV = screen.GetAngleFOV(); - m_discardedAngle = screen.GetRotationAngle(); - AddUserEvent(DisablePerspectiveEvent()); - } - else if (m_discardedFOV > 0.0 && - m_currentZoomLevel >= m_min3dZoomLevel) - { - AddUserEvent(EnablePerspectiveEvent(m_discardedAngle, m_discardedFOV, - true /* animated */, true /* immediately start */)); - m_discardedFOV = -1.0; - m_discardedAngle = -1.0; + if (m_currentZoomLevel < m_min3dZoomLevel) + DiscardPerspective(screen); + else + RecoverPerspective(); } } diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 849a232ab2..de39a234c7 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -153,6 +153,10 @@ private: int GetCurrentZoomLevelForData() const; void ResolveZoomLevel(ScreenBase const & screen); + void DiscardPerspective(ScreenBase const & screen); + void DiscardPerspective(); + void RecoverPerspective(); + void OnTap(m2::PointD const & pt, bool isLong) override; void OnForceTap(m2::PointD const & pt) override; void OnDoubleTap(m2::PointD const & pt) override; @@ -240,8 +244,8 @@ private: unique_ptr m_tileTree; int m_currentZoomLevel = -1; int m_min3dZoomLevel = 17; - double m_discardedFOV = -1.0; - double m_discardedAngle = -1.0; + double m_discardedFOV = 0.0; + double m_discardedAngle = 0.0; ref_ptr m_requestedTiles; uint64_t m_maxGeneration; diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index 9ad72edcd6..fa31e1df73 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -161,7 +161,7 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChange, bool & case UserEvent::EVENT_SET_RECT: if (m_perspectiveAnimation != nullptr) { - //m_pendingEvent.reset(new UserEvent(e.m_rectEvent)); + m_pendingEvent.reset(new UserEvent(e.m_rectEvent)); break; } breakAnim = SetRect(e.m_rectEvent.m_rect, e.m_rectEvent.m_zoom, e.m_rectEvent.m_applyRotation, e.m_rectEvent.m_isAnim);