diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp index 3eb8ac8b0b..0eda2f600f 100644 --- a/drape/overlay_tree.cpp +++ b/drape/overlay_tree.cpp @@ -153,13 +153,21 @@ void OverlayTree::StartOverlayPlacing(ScreenBase const & screen, int zoomLevel) m_zoomLevel = zoomLevel; } -void OverlayTree::Remove(ref_ptr handle) +bool OverlayTree::Remove(ref_ptr handle) { if (m_frameCounter == kInvalidFrame) - return; + { + if (!IsEmpty()) + Clear(); + return true; + } if (m_handlesCache.find(handle) != m_handlesCache.end()) - InvalidateOnNextFrame(); + { + Clear(); + return true; + } + return false; } void OverlayTree::Add(ref_ptr handle) @@ -205,7 +213,7 @@ void OverlayTree::Add(ref_ptr handle) ASSERT_GREATER_OR_EQUAL(handle->GetOverlayRank(), 0, ()); size_t const rank = static_cast(handle->GetOverlayRank()); ASSERT_LESS(rank, m_handles.size(), ()); - m_handles[rank].emplace_back(handle); + m_handles[rank].emplace_back(std::move(handle)); } void OverlayTree::InsertHandle(ref_ptr handle, int currentRank, diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp index 6593dc5ee3..577716f981 100644 --- a/drape/overlay_tree.hpp +++ b/drape/overlay_tree.hpp @@ -71,7 +71,8 @@ public: void StartOverlayPlacing(ScreenBase const & screen, int zoomLevel); void Add(ref_ptr handle); - void Remove(ref_ptr handle); + //! \return true if tree completely invalidated and next call has no sense + bool Remove(ref_ptr handle); void EndOverlayPlacing(); HandlesCache const & GetHandlesCache() const { return m_handlesCache; } diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index f5c4fd8d02..fcf3a311fd 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -79,10 +79,14 @@ bool RenderBucket::HasOverlayHandles() const return !m_overlay.empty(); } -void RenderBucket::RemoveOverlayHandles(ref_ptr tree) +bool RenderBucket::RemoveOverlayHandles(ref_ptr tree) { for (auto const & overlayHandle : m_overlay) - tree->Remove(make_ref(overlayHandle)); + { + if (tree->Remove(make_ref(overlayHandle))) + return true; + } + return false; } void RenderBucket::SetOverlayVisibility(bool isVisible) diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index 2b601c8fb5..cf97dfb9ba 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -32,7 +32,8 @@ public: void Update(ScreenBase const & modelView); void CollectOverlayHandles(ref_ptr tree); bool HasOverlayHandles() const; - void RemoveOverlayHandles(ref_ptr tree); + //! \return true if tree completely invalidated and next call has no sense + bool RemoveOverlayHandles(ref_ptr tree); void SetOverlayVisibility(bool isVisible); void Render(ref_ptr context, bool drawAsLine); diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index c6f29d078a..6f691c91fa 100755 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -60,7 +60,8 @@ bool RenderGroup::HasOverlayHandles() const void RenderGroup::RemoveOverlay(ref_ptr tree) { for (auto & renderBucket : m_renderBuckets) - renderBucket->RemoveOverlayHandles(tree); + if (renderBucket->RemoveOverlayHandles(tree)) + break; } void RenderGroup::SetOverlayVisibility(bool isVisible) diff --git a/drape_frontend/render_state_extension.cpp b/drape_frontend/render_state_extension.cpp index 4fd406632f..a99bda2156 100644 --- a/drape_frontend/render_state_extension.cpp +++ b/drape_frontend/render_state_extension.cpp @@ -2,22 +2,35 @@ #include +namespace +{ +using namespace df; + +std::array(DepthLayer::LayersCount)> kStateExtensions = { + RenderStateExtension(DepthLayer::GeometryLayer), + RenderStateExtension(DepthLayer::Geometry3dLayer), + RenderStateExtension(DepthLayer::UserLineLayer), + RenderStateExtension(DepthLayer::OverlayLayer), + RenderStateExtension(DepthLayer::TransitSchemeLayer), + RenderStateExtension(DepthLayer::UserMarkLayer), + RenderStateExtension(DepthLayer::NavigationLayer), + RenderStateExtension(DepthLayer::RoutingBottomMarkLayer), + RenderStateExtension(DepthLayer::RoutingMarkLayer), + RenderStateExtension(DepthLayer::SearchMarkLayer), + RenderStateExtension(DepthLayer::GuiLayer)}; + +struct RenderStateExtensionFactory +{ + static ref_ptr Get(DepthLayer depthLayer) + { + ASSERT_LESS(static_cast(depthLayer), kStateExtensions.size(), ()); + return make_ref(&kStateExtensions[static_cast(depthLayer)]); + } +}; +} // namespace + namespace df { -std::array, static_cast(DepthLayer::LayersCount)> kStateExtensions = { - make_unique_dp(DepthLayer::GeometryLayer), - make_unique_dp(DepthLayer::Geometry3dLayer), - make_unique_dp(DepthLayer::UserLineLayer), - make_unique_dp(DepthLayer::OverlayLayer), - make_unique_dp(DepthLayer::TransitSchemeLayer), - make_unique_dp(DepthLayer::UserMarkLayer), - make_unique_dp(DepthLayer::NavigationLayer), - make_unique_dp(DepthLayer::RoutingBottomMarkLayer), - make_unique_dp(DepthLayer::RoutingMarkLayer), - make_unique_dp(DepthLayer::SearchMarkLayer), - make_unique_dp(DepthLayer::GuiLayer) -}; - RenderStateExtension::RenderStateExtension(DepthLayer depthLayer) : m_depthLayer(depthLayer) {} @@ -36,13 +49,6 @@ bool RenderStateExtension::Equal(ref_ptr other) co return m_depthLayer == renderState->m_depthLayer; } -// static -ref_ptr RenderStateExtensionFactory::Get(DepthLayer depthLayer) -{ - ASSERT_LESS(static_cast(depthLayer), kStateExtensions.size(), ()); - return make_ref(kStateExtensions[static_cast(depthLayer)]); -} - DepthLayer GetDepthLayer(dp::RenderState const & state) { return state.GetRenderStateExtension()->GetDepthLayer(); diff --git a/drape_frontend/render_state_extension.hpp b/drape_frontend/render_state_extension.hpp index b55e38b1bc..60c46d593d 100644 --- a/drape_frontend/render_state_extension.hpp +++ b/drape_frontend/render_state_extension.hpp @@ -40,12 +40,6 @@ private: DepthLayer const m_depthLayer; }; -class RenderStateExtensionFactory -{ -public: - static ref_ptr Get(DepthLayer depthLayer); -}; - extern DepthLayer GetDepthLayer(dp::RenderState const & state); extern dp::RenderState CreateRenderState(gpu::Program program, DepthLayer depthLayer); diff --git a/shaders/program_manager.hpp b/shaders/program_manager.hpp index d6dbe0ea0b..0feb3e2354 100644 --- a/shaders/program_manager.hpp +++ b/shaders/program_manager.hpp @@ -40,8 +40,8 @@ private: using Programs = std::array, static_cast(Program::ProgramsCount)>; - Programs m_programs; drape_ptr m_pool; + Programs m_programs; drape_ptr m_paramsSetter; DECLARE_THREAD_CHECKER(m_threadChecker);