From baba7b7953f6b0d2eb81b238fa9322caeb5239e9 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Tue, 20 Sep 2016 18:32:58 +0300 Subject: [PATCH] Route recaching fixed. --- drape_frontend/backend_renderer.cpp | 6 +++--- drape_frontend/frontend_renderer.cpp | 22 +++++++++++++++++++--- drape_frontend/frontend_renderer.hpp | 2 ++ drape_frontend/message_subclasses.hpp | 22 ++++++++++++++++++++++ drape_frontend/route_builder.cpp | 9 ++++++--- drape_frontend/route_builder.hpp | 6 +++--- drape_frontend/route_shape.hpp | 3 +++ 7 files changed, 58 insertions(+), 12 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 94a9f16654..c768037666 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -242,19 +242,19 @@ void BackendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; m_routeBuilder->Build(msg->GetRoutePolyline(), msg->GetTurns(), - msg->GetColor(), msg->GetPattern(), m_texMng); + msg->GetColor(), msg->GetPattern(), m_texMng, msg->GetRechacheId()); break; } case Message::CacheRouteSign: { ref_ptr msg = message; - m_routeBuilder->BuildSign(msg->GetPosition(), msg->IsStart(), msg->IsValid(), m_texMng); + m_routeBuilder->BuildSign(msg->GetPosition(), msg->IsStart(), msg->IsValid(), m_texMng, msg->GetRechacheId()); break; } case Message::CacheRouteArrows: { ref_ptr msg = message; - m_routeBuilder->BuildArrows(msg->GetRouteIndex(), msg->GetBorders(), m_texMng); + m_routeBuilder->BuildArrows(msg->GetRouteIndex(), msg->GetBorders(), m_texMng, msg->GetRechacheId()); break; } case Message::RemoveRoute: diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 94d0e14362..61182eee24 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -476,6 +476,10 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; drape_ptr routeData = msg->AcceptRouteData(); + + if (routeData->m_recacheId > 0 && routeData->m_recacheId < m_lastRecacheRouteId) + break; + m2::PointD const finishPoint = routeData->m_sourcePolyline.Back(); m_routeRenderer->SetRouteData(move(routeData), make_ref(m_gpuProgramManager)); if (!m_routeRenderer->GetFinishPoint()) @@ -499,6 +503,10 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; drape_ptr routeSignData = msg->AcceptRouteSignData(); + + if (routeSignData->m_recacheId > 0 && routeSignData->m_recacheId < m_lastRecacheRouteId) + break; + m_routeRenderer->SetRouteSign(move(routeSignData), make_ref(m_gpuProgramManager)); break; } @@ -507,6 +515,10 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; drape_ptr routeArrowsData = msg->AcceptRouteArrowsData(); + + if (routeArrowsData->m_recacheId > 0 && routeArrowsData->m_recacheId < m_lastRecacheRouteId) + break; + m_routeRenderer->SetRouteArrows(move(routeArrowsData), make_ref(m_gpuProgramManager)); break; } @@ -515,6 +527,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; m_routeRenderer->Clear(); + ++m_lastRecacheRouteId; if (msg->NeedDeactivateFollowing()) { m_myPositionController->DeactivateRouting(); @@ -724,13 +737,15 @@ unique_ptr FrontendRenderer::CreateRoutine() void FrontendRenderer::UpdateGLResources() { + ++m_lastRecacheRouteId; + // Invalidate route. if (m_routeRenderer->GetStartPoint()) { m2::PointD const & position = m_routeRenderer->GetStartPoint()->m_position; m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(position, true /* isStart */, - true /* isValid */), + true /* isValid */, m_lastRecacheRouteId), MessagePriority::High); } @@ -739,7 +754,7 @@ void FrontendRenderer::UpdateGLResources() m2::PointD const & position = m_routeRenderer->GetFinishPoint()->m_position; m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(position, false /* isStart */, - true /* isValid */), + true /* isValid */, m_lastRecacheRouteId), MessagePriority::High); } @@ -749,7 +764,8 @@ void FrontendRenderer::UpdateGLResources() auto recacheRouteMsg = make_unique_dp(routeData->m_sourcePolyline, routeData->m_sourceTurns, routeData->m_color, - routeData->m_pattern); + routeData->m_pattern, + m_lastRecacheRouteId); m_routeRenderer->ClearGLDependentResources(); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(recacheRouteMsg), MessagePriority::Normal); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index fd19a10e81..47c443e668 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -309,6 +309,8 @@ private: uint64_t m_maxGeneration; int m_mergeBucketsCounter = 0; + int m_lastRecacheRouteId = 0; + struct FollowRouteData { FollowRouteData(int preferredZoomLevel, diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index e2263ee5fa..1eb8253915 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -595,10 +595,16 @@ class AddRouteMessage : public Message public: AddRouteMessage(m2::PolylineD const & routePolyline, vector const & turns, df::ColorConstant color, df::RoutePattern const & pattern) + : AddRouteMessage(routePolyline, turns, color, pattern, -1 /* invalid recache id */) + {} + + AddRouteMessage(m2::PolylineD const & routePolyline, vector const & turns, + df::ColorConstant color, df::RoutePattern const & pattern, int recacheId) : m_routePolyline(routePolyline) , m_color(color) , m_turns(turns) , m_pattern(pattern) + , m_recacheId(recacheId) {} Type GetType() const override { return Message::AddRoute; } @@ -607,21 +613,28 @@ public: df::ColorConstant GetColor() const { return m_color; } vector const & GetTurns() const { return m_turns; } df::RoutePattern const & GetPattern() const { return m_pattern; } + int GetRechacheId() const { return m_recacheId; } private: m2::PolylineD m_routePolyline; df::ColorConstant m_color; vector m_turns; df::RoutePattern m_pattern; + int const m_recacheId; }; class CacheRouteSignMessage : public Message { public: CacheRouteSignMessage(m2::PointD const & pos, bool isStart, bool isValid) + : CacheRouteSignMessage(pos, isStart, isValid, -1 /* invalid recache id */) + {} + + CacheRouteSignMessage(m2::PointD const & pos, bool isStart, bool isValid, int recacheId) : m_position(pos) , m_isStart(isStart) , m_isValid(isValid) + , m_recacheId(recacheId) {} Type GetType() const override { return Message::CacheRouteSign; } @@ -629,29 +642,38 @@ public: m2::PointD const & GetPosition() const { return m_position; } bool IsStart() const { return m_isStart; } bool IsValid() const { return m_isValid; } + int GetRechacheId() const { return m_recacheId; } private: m2::PointD const m_position; bool const m_isStart; bool const m_isValid; + int const m_recacheId; }; class CacheRouteArrowsMessage : public Message { public: CacheRouteArrowsMessage(int routeIndex, vector const & borders) + : CacheRouteArrowsMessage(routeIndex, borders, -1 /* invalid recache id */) + {} + + CacheRouteArrowsMessage(int routeIndex, vector const & borders, int recacheId) : m_routeIndex(routeIndex) , m_borders(borders) + , m_recacheId(recacheId) {} Type GetType() const override { return Message::CacheRouteArrows; } int GetRouteIndex() const { return m_routeIndex; } vector const & GetBorders() const { return m_borders; } + int GetRechacheId() const { return m_recacheId; } private: int m_routeIndex; vector m_borders; + int const m_recacheId; }; class RemoveRouteMessage : public Message diff --git a/drape_frontend/route_builder.cpp b/drape_frontend/route_builder.cpp index 95946eb44f..e167ea8003 100644 --- a/drape_frontend/route_builder.cpp +++ b/drape_frontend/route_builder.cpp @@ -15,7 +15,7 @@ RouteBuilder::RouteBuilder(TFlushRouteFn const & flushRouteFn, void RouteBuilder::Build(m2::PolylineD const & routePolyline, vector const & turns, df::ColorConstant color, df::RoutePattern const & pattern, - ref_ptr textures) + ref_ptr textures, int recacheId) { drape_ptr routeData = make_unique_dp(); routeData->m_routeIndex = m_routeIndex++; @@ -24,6 +24,7 @@ void RouteBuilder::Build(m2::PolylineD const & routePolyline, vector con routeData->m_sourceTurns = turns; routeData->m_pattern = pattern; routeData->m_pivot = routePolyline.GetLimitRect().Center(); + routeData->m_recacheId = recacheId; RouteShape::CacheRoute(textures, *routeData.get()); m_routeCache.insert(make_pair(routeData->m_routeIndex, routePolyline)); @@ -40,12 +41,13 @@ void RouteBuilder::ClearRouteCache() } void RouteBuilder::BuildSign(m2::PointD const & pos, bool isStart, bool isValid, - ref_ptr textures) + ref_ptr textures, int recacheId) { drape_ptr routeSignData = make_unique_dp(); routeSignData->m_isStart = isStart; routeSignData->m_position = pos; routeSignData->m_isValid = isValid; + routeSignData->m_recacheId = recacheId; if (isValid) RouteShape::CacheRouteSign(textures, *routeSignData.get()); @@ -57,7 +59,7 @@ void RouteBuilder::BuildSign(m2::PointD const & pos, bool isStart, bool isValid, } void RouteBuilder::BuildArrows(int routeIndex, vector const & borders, - ref_ptr textures) + ref_ptr textures, int recacheId) { auto it = m_routeCache.find(routeIndex); if (it == m_routeCache.end()) @@ -65,6 +67,7 @@ void RouteBuilder::BuildArrows(int routeIndex, vector const & bord drape_ptr routeArrowsData = make_unique_dp(); routeArrowsData->m_pivot = it->second.GetLimitRect().Center(); + routeArrowsData->m_recacheId = recacheId; RouteShape::CacheRouteArrows(textures, it->second, borders, *routeArrowsData.get()); // Flush route arrows geometry. diff --git a/drape_frontend/route_builder.hpp b/drape_frontend/route_builder.hpp index 6851988644..9c74653ce1 100644 --- a/drape_frontend/route_builder.hpp +++ b/drape_frontend/route_builder.hpp @@ -27,13 +27,13 @@ public: void Build(m2::PolylineD const & routePolyline, vector const & turns, df::ColorConstant color, df::RoutePattern const & pattern, - ref_ptr textures); + ref_ptr textures, int recacheId); void BuildArrows(int routeIndex, vector const & borders, - ref_ptr textures); + ref_ptr textures, int recacheId); void BuildSign(m2::PointD const & pos, bool isStart, bool isValid, - ref_ptr textures); + ref_ptr textures, int recacheId); void ClearRouteCache(); diff --git a/drape_frontend/route_shape.hpp b/drape_frontend/route_shape.hpp index 8495826f02..a8afbc0fc4 100644 --- a/drape_frontend/route_shape.hpp +++ b/drape_frontend/route_shape.hpp @@ -67,6 +67,7 @@ struct RouteData double m_length; RouteRenderProperty m_route; RoutePattern m_pattern; + int m_recacheId; }; struct RouteSignData @@ -75,12 +76,14 @@ struct RouteSignData bool m_isStart; bool m_isValid; m2::PointD m_position; + int m_recacheId; }; struct RouteArrowsData { RouteRenderProperty m_arrows; m2::PointD m_pivot; + int m_recacheId; }; class RouteShape