From 29fe27c2b122abc5b11e37299278e0519986e1d0 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 11 Jul 2018 16:03:22 +0300 Subject: [PATCH] Don't render transit schemes if there is a route. Clear transit cache if the following mode is enabled. --- drape_frontend/backend_renderer.cpp | 9 ++++++++ drape_frontend/drape_engine.cpp | 7 ++++++ drape_frontend/drape_engine.hpp | 1 + drape_frontend/frontend_renderer.cpp | 15 ++++++++++-- drape_frontend/frontend_renderer.hpp | 3 ++- drape_frontend/message.hpp | 1 + drape_frontend/message_subclasses.hpp | 6 +++++ drape_frontend/route_renderer.cpp | 5 ++++ drape_frontend/route_renderer.hpp | 1 + map/routing_manager.cpp | 7 +++++- map/transit/transit_reader.cpp | 33 +++++++++++++++++++++++++-- map/transit/transit_reader.hpp | 2 ++ 12 files changed, 84 insertions(+), 6 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 9561214ab2..9d4fa7b89b 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -456,6 +456,15 @@ void BackendRenderer::AcceptMessage(ref_ptr message) break; } + case Message::ClearAllTransitSchemeData: + { + m_transitBuilder->Clear(); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(), + MessagePriority::Normal); + break; + } + case Message::EnableTransitScheme: { ref_ptr msg = message; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index f907ae9f6e..b35d23d466 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -749,6 +749,13 @@ void DrapeEngine::ClearTransitSchemeCache(MwmSet::MwmId const & mwmId) MessagePriority::Normal); } +void DrapeEngine::ClearAllTransitSchemeCache() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::Normal); +} + void DrapeEngine::UpdateTransitScheme(TransitDisplayInfos && transitDisplayInfos) { m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 70f815073a..0397b6fd25 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -205,6 +205,7 @@ public: void EnableTransitScheme(bool enable); void UpdateTransitScheme(TransitDisplayInfos && transitDisplayInfos); void ClearTransitSchemeCache(MwmSet::MwmId const & mwmId); + void ClearAllTransitSchemeCache(); void SetFontScaleFactor(double scaleFactor); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index a00c406a9f..8f15c6d809 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -771,6 +771,12 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) break; } + case Message::ClearAllTransitSchemeData: + { + m_transitSchemeRenderer->ClearGLDependentResources(make_ref(m_overlayTree)); + break; + } + case Message::EnableTraffic: { ref_ptr msg = message; @@ -1278,7 +1284,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram RenderSearchMarksLayer(modelView); } - if (!HasTransitRouteData()) + if (!HasRouteData()) RenderTransitSchemeLayer(modelView); m_drapeApiRenderer->Render(modelView, make_ref(m_gpuProgramManager), m_frameValues); @@ -1369,11 +1375,16 @@ void FrontendRenderer::RenderNavigationOverlayLayer(ScreenBase const & modelView } } -bool FrontendRenderer::HasTransitRouteData() +bool FrontendRenderer::HasTransitRouteData() const { return m_routeRenderer->HasTransitData(); } +bool FrontendRenderer::HasRouteData() const +{ + return m_routeRenderer->HasData(); +} + void FrontendRenderer::RenderTransitSchemeLayer(ScreenBase const & modelView) { GLFunctions::glClear(gl_const::GLDepthBit); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 1ce744b79e..4976bf8765 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -171,7 +171,8 @@ private: void RenderSearchMarksLayer(ScreenBase const & modelView); void RenderTransitBackground(); - bool HasTransitRouteData(); + bool HasTransitRouteData() const; + bool HasRouteData() const; ScreenBase const & ProcessEvents(bool & modelViewChanged, bool & viewportChanged); void PrepareScene(ScreenBase const & modelView); diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index bb2075a307..a6a85e3f6c 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -88,6 +88,7 @@ public: EnableTransitScheme, UpdateTransitScheme, ClearTransitSchemeData, + ClearAllTransitSchemeData, RegenerateTransitScheme, FlushTransitScheme, ShowDebugInfo, diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index a2569584aa..9217759712 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -1050,6 +1050,12 @@ private: MwmSet::MwmId m_mwmId; }; +class ClearAllTransitSchemeDataMessage : public Message +{ +public: + Type GetType() const override { return Message::ClearAllTransitSchemeData; } +}; + class UpdateTransitSchemeMessage : public Message { public: diff --git a/drape_frontend/route_renderer.cpp b/drape_frontend/route_renderer.cpp index 1b71d242d9..accceee5cb 100644 --- a/drape_frontend/route_renderer.cpp +++ b/drape_frontend/route_renderer.cpp @@ -737,4 +737,9 @@ bool RouteRenderer::HasTransitData() const } return false; } + +bool RouteRenderer::HasData() const +{ + return !m_subroutes.empty(); +} } // namespace df diff --git a/drape_frontend/route_renderer.hpp b/drape_frontend/route_renderer.hpp index b9f402da21..6d29d6db6f 100644 --- a/drape_frontend/route_renderer.hpp +++ b/drape_frontend/route_renderer.hpp @@ -90,6 +90,7 @@ public: void SetSubrouteVisibility(dp::DrapeID id, bool isVisible); bool HasTransitData() const; + bool HasData() const; private: void RenderSubroute(SubrouteInfo const & subrouteInfo, size_t subrouteDataIndex, diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp index e8e1bd5e9a..bc39935003 100644 --- a/map/routing_manager.cpp +++ b/map/routing_manager.cpp @@ -431,6 +431,7 @@ void RoutingManager::RemoveRoute(bool deactivateFollowing) if (deactivateFollowing) { + m_transitReadManager->BlockTransitSchemeMode(false /* isBlocked */); // Remove all subroutes. m_drapeEngine.SafeCall(&df::DrapeEngine::RemoveSubroute, dp::DrapeID(), true /* deactivateFollowing */); @@ -581,6 +582,8 @@ void RoutingManager::FollowRoute() if (!m_routingSession.EnableFollowMode()) return; + m_transitReadManager->BlockTransitSchemeMode(true /* isBlocked */); + // Switching on the extrapolatior only for following mode in car and bicycle navigation. m_extrapolator.Enable(m_currentRouterType == RouterType::Vehicle || m_currentRouterType == RouterType::Bicycle); @@ -907,8 +910,10 @@ bool RoutingManager::DisableFollowMode() { bool const disabled = m_routingSession.DisableFollowMode(); if (disabled) + { + m_transitReadManager->BlockTransitSchemeMode(false /* isBlocked */); m_drapeEngine.SafeCall(&df::DrapeEngine::DeactivateRouteFollowing); - + } return disabled; } diff --git a/map/transit/transit_reader.cpp b/map/transit/transit_reader.cpp index 4bd5eb99be..98ee6d40ec 100644 --- a/map/transit/transit_reader.cpp +++ b/map/transit/transit_reader.cpp @@ -179,6 +179,12 @@ void TransitReadManager::EnableTransitSchemeMode(bool enable) if (m_isSchemeMode == enable) return; m_isSchemeMode = enable; + + m_drapeEngine.SafeCall(&df::DrapeEngine::EnableTransitScheme, enable); + + if (m_isSchemeModeBlocked) + return; + if (!m_isSchemeMode) { m_lastActiveMwms.clear(); @@ -189,14 +195,37 @@ void TransitReadManager::EnableTransitSchemeMode(bool enable) { Invalidate(); } - m_drapeEngine.SafeCall(&df::DrapeEngine::EnableTransitScheme, enable); +} + +void TransitReadManager::BlockTransitSchemeMode(bool isBlocked) +{ + if (m_isSchemeModeBlocked == isBlocked) + return; + + m_isSchemeModeBlocked = isBlocked; + + if (!m_isSchemeMode) + return; + + if (m_isSchemeModeBlocked) + { + m_drapeEngine.SafeCall(&df::DrapeEngine::ClearAllTransitSchemeCache); + + m_lastActiveMwms.clear(); + m_mwmCache.clear(); + m_cacheSize = 0; + } + else + { + Invalidate(); + } } void TransitReadManager::UpdateViewport(ScreenBase const & screen) { m_currentModelView = {screen, true /* initialized */}; - if (!m_isSchemeMode) + if (!m_isSchemeMode || m_isSchemeModeBlocked) return; if (df::GetDrawTileScale(screen) < kMinSchemeZoomLevel) diff --git a/map/transit/transit_reader.hpp b/map/transit/transit_reader.hpp index c3ef315bf0..5242657d72 100644 --- a/map/transit/transit_reader.hpp +++ b/map/transit/transit_reader.hpp @@ -102,6 +102,7 @@ public: bool GetTransitDisplayInfo(TransitDisplayInfos & transitDisplayInfos); void EnableTransitSchemeMode(bool enable); + void BlockTransitSchemeMode(bool isBlocked); void UpdateViewport(ScreenBase const & screen); void OnMwmDeregistered(MwmSet::MwmId const & mwmId); void Invalidate(); @@ -145,5 +146,6 @@ private: std::map m_mwmCache; size_t m_cacheSize = 0; bool m_isSchemeMode = false; + bool m_isSchemeModeBlocked = false; pair m_currentModelView = {ScreenBase(), false /* initialized */}; };