diff --git a/libs/drape_frontend/apply_feature_functors.cpp b/libs/drape_frontend/apply_feature_functors.cpp index 2d24fd36a..fc1574b13 100644 --- a/libs/drape_frontend/apply_feature_functors.cpp +++ b/libs/drape_frontend/apply_feature_functors.cpp @@ -517,7 +517,10 @@ void ApplyPointFeature::ProcessPointRules(SymbolRuleProto const * symbolRule, Ca { PoiSymbolViewParams params; FillCommonParams(params); - params.m_depthLayer = DepthLayer::OverlayLayer; + if (ftypes::IsUnderBuildingChecker::Instance()(m_f)) + params.m_depthLayer = DepthLayer::OverlayUnderBuildingLayer; + else + params.m_depthLayer = DepthLayer::OverlayLayer; params.m_depthTestEnabled = false; params.m_depth = PriorityToDepth(symbolRule->priority(), drule::symbol, 0); params.m_symbolName = symbolRule->name(); diff --git a/libs/drape_frontend/frontend_renderer.cpp b/libs/drape_frontend/frontend_renderer.cpp index d31c0db61..3e38022b7 100644 --- a/libs/drape_frontend/frontend_renderer.cpp +++ b/libs/drape_frontend/frontend_renderer.cpp @@ -1383,6 +1383,8 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram Render2dLayer(modelView); RenderUserMarksLayer(modelView, DepthLayer::UserLineLayer); + RenderOverlayUnderBuildingLayer(modelView); + bool const hasTransitRouteData = HasTransitRouteData(); if (m_buildingsFramebuffer->IsSupported() && !m_routeRenderer->IsRulerRoute()) { @@ -1546,6 +1548,17 @@ void FrontendRenderer::RenderOverlayLayer(ScreenBase const & modelView) RenderSingleGroup(m_context, modelView, make_ref(group)); } +void FrontendRenderer::RenderOverlayUnderBuildingLayer(ScreenBase const & modelView) +{ + TRACE_SECTION("[drape] RenderOverlayUnderBuildingLayer"); + CHECK(m_context != nullptr, ()); + DEBUG_LABEL(m_context, "Overlay Under Building Layer"); + RenderLayer & overlay = m_layers[static_cast(DepthLayer::OverlayUnderBuildingLayer)]; + BuildOverlayTree(modelView); + for (drape_ptr & group : overlay.m_renderGroups) + RenderSingleGroup(m_context, modelView, make_ref(group)); +} + bool FrontendRenderer::HasTransitRouteData() const { return m_routeRenderer->HasTransitData(); @@ -1814,7 +1827,7 @@ void FrontendRenderer::BuildOverlayTree(ScreenBase const & modelView) BeginUpdateOverlayTree(modelView); for (auto const layerId : - {DepthLayer::OverlayLayer, DepthLayer::RoutingBottomMarkLayer, DepthLayer::RoutingMarkLayer}) + {DepthLayer::OverlayUnderBuildingLayer, DepthLayer::OverlayLayer, DepthLayer::RoutingBottomMarkLayer, DepthLayer::RoutingMarkLayer}) { RenderLayer & overlay = m_layers[static_cast(layerId)]; overlay.Sort(make_ref(m_overlayTree)); @@ -2504,7 +2517,7 @@ void FrontendRenderer::UpdateScene(ScreenBase const & modelView) uint32_t constexpr kMaxGenerationRange = 5; TileKey const & key = group->GetTileKey(); - return (GetDepthLayer(group->GetState()) == DepthLayer::OverlayLayer && key.m_zoomLevel > GetCurrentZoom()) || + return ((GetDepthLayer(group->GetState()) == DepthLayer::OverlayLayer || GetDepthLayer(group->GetState()) == DepthLayer::OverlayUnderBuildingLayer) && key.m_zoomLevel > GetCurrentZoom()) || (m_maxGeneration - key.m_generation > kMaxGenerationRange) || (group->IsUserMark() && (m_maxUserMarksGeneration - key.m_userMarksGeneration > kMaxGenerationRange)); }; diff --git a/libs/drape_frontend/frontend_renderer.hpp b/libs/drape_frontend/frontend_renderer.hpp index b2070f155..a594ef604 100644 --- a/libs/drape_frontend/frontend_renderer.hpp +++ b/libs/drape_frontend/frontend_renderer.hpp @@ -184,6 +184,7 @@ private: void PreRender3dLayer(ScreenBase const & modelView); void Render3dLayer(ScreenBase const & modelView); void RenderOverlayLayer(ScreenBase const & modelView); + void RenderOverlayUnderBuildingLayer(ScreenBase const & modelView); void RenderUserMarksLayer(ScreenBase const & modelView, DepthLayer layerId); void RenderNonDisplaceableUserMarksLayer(ScreenBase const & modelView, DepthLayer layerId); void RenderTransitSchemeLayer(ScreenBase const & modelView); diff --git a/libs/drape_frontend/render_state_extension.cpp b/libs/drape_frontend/render_state_extension.cpp index 53538a945..b535d9207 100644 --- a/libs/drape_frontend/render_state_extension.cpp +++ b/libs/drape_frontend/render_state_extension.cpp @@ -7,11 +7,12 @@ 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::RoutingBottomMarkLayer), RenderStateExtension(DepthLayer::RoutingMarkLayer), - RenderStateExtension(DepthLayer::SearchMarkLayer), RenderStateExtension(DepthLayer::GuiLayer)}; + RenderStateExtension(DepthLayer::GeometryLayer), RenderStateExtension(DepthLayer::Geometry3dLayer), + RenderStateExtension(DepthLayer::UserLineLayer), RenderStateExtension(DepthLayer::OverlayLayer), + RenderStateExtension(DepthLayer::TransitSchemeLayer), RenderStateExtension(DepthLayer::UserMarkLayer), + RenderStateExtension(DepthLayer::RoutingBottomMarkLayer), RenderStateExtension(DepthLayer::RoutingMarkLayer), + RenderStateExtension(DepthLayer::SearchMarkLayer), RenderStateExtension(DepthLayer::GuiLayer), + RenderStateExtension(DepthLayer::OverlayUnderBuildingLayer)}; struct RenderStateExtensionFactory { diff --git a/libs/drape_frontend/render_state_extension.hpp b/libs/drape_frontend/render_state_extension.hpp index ef820c4a4..9ecbf2626 100644 --- a/libs/drape_frontend/render_state_extension.hpp +++ b/libs/drape_frontend/render_state_extension.hpp @@ -22,6 +22,7 @@ enum class DepthLayer : uint8_t RoutingMarkLayer, SearchMarkLayer, GuiLayer, + OverlayUnderBuildingLayer, LayersCount }; @@ -51,6 +52,7 @@ inline std::string DebugPrint(DepthLayer layer) case DepthLayer::Geometry3dLayer: return "Geometry3dLayer"; case DepthLayer::UserLineLayer: return "UserLineLayer"; case DepthLayer::OverlayLayer: return "OverlayLayer"; + case DepthLayer::OverlayUnderBuildingLayer: return "OverlayUnderBuildingLayer"; case DepthLayer::TransitSchemeLayer: return "TransitSchemeLayer"; case DepthLayer::UserMarkLayer: return "UserMarkLayer"; case DepthLayer::RoutingBottomMarkLayer: return "RoutingBottomMarkLayer"; diff --git a/libs/indexer/ftypes_matcher.cpp b/libs/indexer/ftypes_matcher.cpp index df041ae4f..5e0136a6a 100644 --- a/libs/indexer/ftypes_matcher.cpp +++ b/libs/indexer/ftypes_matcher.cpp @@ -436,6 +436,12 @@ IsBuildingHasPartsChecker::IsBuildingHasPartsChecker() : BaseChecker(2 /* level m_types.push_back(classif().GetTypeByPath({"building", "has_parts"})); } +IsUnderBuildingChecker::IsUnderBuildingChecker() +{ + Classificator const & c = classif(); + m_types.push_back(c.GetTypeByPath({"natural", "tree"})); +} + IsIsolineChecker::IsIsolineChecker() : BaseChecker(1 /* level */) { m_types.push_back(classif().GetTypeByPath({"isoline"})); diff --git a/libs/indexer/ftypes_matcher.hpp b/libs/indexer/ftypes_matcher.hpp index c87895857..a5689de48 100644 --- a/libs/indexer/ftypes_matcher.hpp +++ b/libs/indexer/ftypes_matcher.hpp @@ -280,6 +280,14 @@ public: uint32_t GetType() const { return m_types[0]; } }; +class IsUnderBuildingChecker : public BaseChecker +{ + IsUnderBuildingChecker(); + +public: + DECLARE_CHECKER_INSTANCE(IsUnderBuildingChecker); +}; + class IsIsolineChecker : public BaseChecker { IsIsolineChecker();