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