[drape] Render trees under buildings

Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
This commit is contained in:
Yannik Bloscheck
2025-11-17 15:00:09 +01:00
committed by x7z4w
parent dd106df592
commit f3b105ee33
7 changed files with 42 additions and 8 deletions

View File

@@ -517,6 +517,9 @@ void ApplyPointFeature::ProcessPointRules(SymbolRuleProto const * symbolRule, Ca
{
PoiSymbolViewParams params;
FillCommonParams(params);
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);

View File

@@ -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<size_t>(DepthLayer::OverlayUnderBuildingLayer)];
BuildOverlayTree(modelView);
for (drape_ptr<RenderGroup> & 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<size_t>(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));
};

View File

@@ -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);

View File

@@ -11,7 +11,8 @@ std::array<RenderStateExtension, static_cast<size_t>(DepthLayer::LayersCount)> k
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::SearchMarkLayer), RenderStateExtension(DepthLayer::GuiLayer),
RenderStateExtension(DepthLayer::OverlayUnderBuildingLayer)};
struct RenderStateExtensionFactory
{

View File

@@ -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";

View File

@@ -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"}));

View File

@@ -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();