mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-19 13:03:36 +00:00
[drape] Render trees under buildings
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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"}));
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user