[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,7 +517,10 @@ void ApplyPointFeature::ProcessPointRules(SymbolRuleProto const * symbolRule, Ca
{ {
PoiSymbolViewParams params; PoiSymbolViewParams params;
FillCommonParams(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_depthTestEnabled = false;
params.m_depth = PriorityToDepth(symbolRule->priority(), drule::symbol, 0); params.m_depth = PriorityToDepth(symbolRule->priority(), drule::symbol, 0);
params.m_symbolName = symbolRule->name(); params.m_symbolName = symbolRule->name();

View File

@@ -1383,6 +1383,8 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram
Render2dLayer(modelView); Render2dLayer(modelView);
RenderUserMarksLayer(modelView, DepthLayer::UserLineLayer); RenderUserMarksLayer(modelView, DepthLayer::UserLineLayer);
RenderOverlayUnderBuildingLayer(modelView);
bool const hasTransitRouteData = HasTransitRouteData(); bool const hasTransitRouteData = HasTransitRouteData();
if (m_buildingsFramebuffer->IsSupported() && !m_routeRenderer->IsRulerRoute()) if (m_buildingsFramebuffer->IsSupported() && !m_routeRenderer->IsRulerRoute())
{ {
@@ -1546,6 +1548,17 @@ void FrontendRenderer::RenderOverlayLayer(ScreenBase const & modelView)
RenderSingleGroup(m_context, modelView, make_ref(group)); 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 bool FrontendRenderer::HasTransitRouteData() const
{ {
return m_routeRenderer->HasTransitData(); return m_routeRenderer->HasTransitData();
@@ -1814,7 +1827,7 @@ void FrontendRenderer::BuildOverlayTree(ScreenBase const & modelView)
BeginUpdateOverlayTree(modelView); BeginUpdateOverlayTree(modelView);
for (auto const layerId : 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)]; RenderLayer & overlay = m_layers[static_cast<size_t>(layerId)];
overlay.Sort(make_ref(m_overlayTree)); overlay.Sort(make_ref(m_overlayTree));
@@ -2504,7 +2517,7 @@ void FrontendRenderer::UpdateScene(ScreenBase const & modelView)
uint32_t constexpr kMaxGenerationRange = 5; uint32_t constexpr kMaxGenerationRange = 5;
TileKey const & key = group->GetTileKey(); 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) || (m_maxGeneration - key.m_generation > kMaxGenerationRange) ||
(group->IsUserMark() && (m_maxUserMarksGeneration - key.m_userMarksGeneration > kMaxGenerationRange)); (group->IsUserMark() && (m_maxUserMarksGeneration - key.m_userMarksGeneration > kMaxGenerationRange));
}; };

View File

@@ -184,6 +184,7 @@ private:
void PreRender3dLayer(ScreenBase const & modelView); void PreRender3dLayer(ScreenBase const & modelView);
void Render3dLayer(ScreenBase const & modelView); void Render3dLayer(ScreenBase const & modelView);
void RenderOverlayLayer(ScreenBase const & modelView); void RenderOverlayLayer(ScreenBase const & modelView);
void RenderOverlayUnderBuildingLayer(ScreenBase const & modelView);
void RenderUserMarksLayer(ScreenBase const & modelView, DepthLayer layerId); void RenderUserMarksLayer(ScreenBase const & modelView, DepthLayer layerId);
void RenderNonDisplaceableUserMarksLayer(ScreenBase const & modelView, DepthLayer layerId); void RenderNonDisplaceableUserMarksLayer(ScreenBase const & modelView, DepthLayer layerId);
void RenderTransitSchemeLayer(ScreenBase const & modelView); void RenderTransitSchemeLayer(ScreenBase const & modelView);

View File

@@ -7,11 +7,12 @@ namespace
using namespace df; using namespace df;
std::array<RenderStateExtension, static_cast<size_t>(DepthLayer::LayersCount)> kStateExtensions = { std::array<RenderStateExtension, static_cast<size_t>(DepthLayer::LayersCount)> kStateExtensions = {
RenderStateExtension(DepthLayer::GeometryLayer), RenderStateExtension(DepthLayer::Geometry3dLayer), RenderStateExtension(DepthLayer::GeometryLayer), RenderStateExtension(DepthLayer::Geometry3dLayer),
RenderStateExtension(DepthLayer::UserLineLayer), RenderStateExtension(DepthLayer::OverlayLayer), RenderStateExtension(DepthLayer::UserLineLayer), RenderStateExtension(DepthLayer::OverlayLayer),
RenderStateExtension(DepthLayer::TransitSchemeLayer), RenderStateExtension(DepthLayer::UserMarkLayer), RenderStateExtension(DepthLayer::TransitSchemeLayer), RenderStateExtension(DepthLayer::UserMarkLayer),
RenderStateExtension(DepthLayer::RoutingBottomMarkLayer), RenderStateExtension(DepthLayer::RoutingMarkLayer), RenderStateExtension(DepthLayer::RoutingBottomMarkLayer), RenderStateExtension(DepthLayer::RoutingMarkLayer),
RenderStateExtension(DepthLayer::SearchMarkLayer), RenderStateExtension(DepthLayer::GuiLayer)}; RenderStateExtension(DepthLayer::SearchMarkLayer), RenderStateExtension(DepthLayer::GuiLayer),
RenderStateExtension(DepthLayer::OverlayUnderBuildingLayer)};
struct RenderStateExtensionFactory struct RenderStateExtensionFactory
{ {

View File

@@ -22,6 +22,7 @@ enum class DepthLayer : uint8_t
RoutingMarkLayer, RoutingMarkLayer,
SearchMarkLayer, SearchMarkLayer,
GuiLayer, GuiLayer,
OverlayUnderBuildingLayer,
LayersCount LayersCount
}; };
@@ -51,6 +52,7 @@ inline std::string DebugPrint(DepthLayer layer)
case DepthLayer::Geometry3dLayer: return "Geometry3dLayer"; case DepthLayer::Geometry3dLayer: return "Geometry3dLayer";
case DepthLayer::UserLineLayer: return "UserLineLayer"; case DepthLayer::UserLineLayer: return "UserLineLayer";
case DepthLayer::OverlayLayer: return "OverlayLayer"; case DepthLayer::OverlayLayer: return "OverlayLayer";
case DepthLayer::OverlayUnderBuildingLayer: return "OverlayUnderBuildingLayer";
case DepthLayer::TransitSchemeLayer: return "TransitSchemeLayer"; case DepthLayer::TransitSchemeLayer: return "TransitSchemeLayer";
case DepthLayer::UserMarkLayer: return "UserMarkLayer"; case DepthLayer::UserMarkLayer: return "UserMarkLayer";
case DepthLayer::RoutingBottomMarkLayer: return "RoutingBottomMarkLayer"; 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"})); 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 */) IsIsolineChecker::IsIsolineChecker() : BaseChecker(1 /* level */)
{ {
m_types.push_back(classif().GetTypeByPath({"isoline"})); m_types.push_back(classif().GetTypeByPath({"isoline"}));

View File

@@ -280,6 +280,14 @@ public:
uint32_t GetType() const { return m_types[0]; } uint32_t GetType() const { return m_types[0]; }
}; };
class IsUnderBuildingChecker : public BaseChecker
{
IsUnderBuildingChecker();
public:
DECLARE_CHECKER_INSTANCE(IsUnderBuildingChecker);
};
class IsIsolineChecker : public BaseChecker class IsIsolineChecker : public BaseChecker
{ {
IsIsolineChecker(); IsIsolineChecker();