diff options
32 files changed, 88 insertions, 49 deletions
diff --git a/drape/glstate.cpp b/drape/glstate.cpp index 5c5705b215..6f52e0bfc8 100644 --- a/drape/glstate.cpp +++ b/drape/glstate.cpp @@ -43,6 +43,16 @@ void GLState::SetDepthFunction(glConst functionName) m_depthFunction = functionName; } +bool GLState::GetDepthTestEnabled() const +{ + return m_depthTestEnabled; +} + +void GLState::SetDepthTestEnabled(bool enabled) +{ + m_depthTestEnabled = enabled; +} + glConst GLState::GetTextureFilter() const { return m_textureFilter; @@ -159,7 +169,15 @@ void ApplyState(GLState const & state, ref_ptr<GpuProgram> program) { TextureState::ApplyTextures(state, program); ApplyBlending(state); - GLFunctions::glDepthFunc(state.GetDepthFunction()); + if (state.GetDepthTestEnabled()) + { + GLFunctions::glEnable(gl_const::GLDepthTest); + GLFunctions::glDepthFunc(state.GetDepthFunction()); + } + else + { + GLFunctions::glDisable(gl_const::GLDepthTest); + } ASSERT_GREATER_OR_EQUAL(state.GetLineWidth(), 0, ()); GLFunctions::glLineWidth(static_cast<uint32_t>(state.GetLineWidth())); } diff --git a/drape/glstate.hpp b/drape/glstate.hpp index 195971ddd4..9c3ca73b6a 100644 --- a/drape/glstate.hpp +++ b/drape/glstate.hpp @@ -82,6 +82,9 @@ public: glConst GetDepthFunction() const; void SetDepthFunction(glConst functionName); + bool GetDepthTestEnabled() const; + void SetDepthTestEnabled(bool enabled); + glConst GetTextureFilter() const; void SetTextureFilter(glConst filter); @@ -99,7 +102,10 @@ private: size_t m_gpuProgram; size_t m_gpuProgram3d; Blending m_blending; + + bool m_depthTestEnabled = true; glConst m_depthFunction = gl_const::GLLessOrEqual; + glConst m_textureFilter = gl_const::GLLinear; ref_ptr<Texture> m_colorTexture; diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index f91c8818d8..c45f7aae2e 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -532,6 +532,8 @@ void ApplyPointFeature::ProcessPointRule(Stylist::TRuleWrapper const & rule) params.m_tileCenter = m_tileRect.Center(); ExtractCaptionParams(capRule, pRule->GetCaption(1), depth, params); params.m_depthLayer = m_depthLayer; + params.m_depthTestEnabled = m_depthLayer != RenderState::NavigationLayer && + m_depthLayer != RenderState::OverlayLayer; params.m_minVisibleScale = m_minVisibleScale; params.m_rank = m_rank; params.m_posZ = m_posZ; @@ -578,6 +580,8 @@ void ApplyPointFeature::Finish(ref_ptr<dp::TextureManager> texMng) { PoiSymbolViewParams params(m_id); params.m_tileCenter = m_tileRect.Center(); + params.m_depthTestEnabled = m_depthLayer != RenderState::NavigationLayer && + m_depthLayer != RenderState::OverlayLayer; params.m_depth = static_cast<float>(m_symbolDepth); params.m_depthLayer = m_depthLayer; params.m_minVisibleScale = m_minVisibleScale; @@ -633,6 +637,7 @@ void ApplyPointFeature::Finish(ref_ptr<dp::TextureManager> texMng) params.m_depthLayer = m_depthLayer; params.m_minVisibleScale = m_minVisibleScale; params.m_rank = m_rank; + params.m_depthTestEnabled = true; params.m_depth = static_cast<float>(m_symbolDepth); auto coloredShape = make_unique_dp<ColoredSymbolShape>(m2::PointD(m_centerPoint), params, @@ -1008,6 +1013,7 @@ void ApplyLineFeatureAdditional::GetRoadShieldsViewParams(ref_ptr<dp::TextureMan ShieldRuleProtoToFontDecl(m_shieldRule, baseFont); dp::FontDecl font = GetRoadShieldTextFont(baseFont, shield); textParams.m_tileCenter = m_tileRect.Center(); + textParams.m_depthTestEnabled = false; textParams.m_depth = m_depth; textParams.m_depthLayer = RenderState::OverlayLayer; textParams.m_minVisibleScale = kShieldMinVisibleZoomLevel; @@ -1038,6 +1044,7 @@ void ApplyLineFeatureAdditional::GetRoadShieldsViewParams(ref_ptr<dp::TextureMan // Generated symbol properties. symbolParams.m_featureID = m_id; symbolParams.m_tileCenter = m_tileRect.Center(); + symbolParams.m_depthTestEnabled = true; symbolParams.m_depth = m_depth; symbolParams.m_depthLayer = RenderState::OverlayLayer; symbolParams.m_minVisibleScale = kShieldMinVisibleZoomLevel; @@ -1066,6 +1073,7 @@ void ApplyLineFeatureAdditional::GetRoadShieldsViewParams(ref_ptr<dp::TextureMan std::string symbolName = GetRoadShieldSymbolName(shield, fontScale); poiParams.m_tileCenter = m_tileRect.Center(); poiParams.m_depth = m_depth; + poiParams.m_depthTestEnabled = false; poiParams.m_depthLayer = RenderState::OverlayLayer; poiParams.m_minVisibleScale = kShieldMinVisibleZoomLevel; poiParams.m_rank = m_rank; diff --git a/drape_frontend/area_shape.cpp b/drape_frontend/area_shape.cpp index 3d368ff873..334654900a 100644 --- a/drape_frontend/area_shape.cpp +++ b/drape_frontend/area_shape.cpp @@ -61,6 +61,7 @@ void AreaShape::DrawArea(ref_ptr<dp::Batcher> batcher, m2::PointD const & colorU }); auto state = CreateGLState(gpu::Program::Area, RenderState::GeometryLayer); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(texture); dp::AttributeProvider provider(1, static_cast<uint32_t>(vertexes.size())); @@ -82,6 +83,7 @@ void AreaShape::DrawArea(ref_ptr<dp::Batcher> batcher, m2::PointD const & colorU } auto outlineState = CreateGLState(gpu::Program::AreaOutline, RenderState::GeometryLayer); + outlineState.SetDepthTestEnabled(m_params.m_depthTestEnabled); outlineState.SetColorTexture(texture); outlineState.SetDrawAsLine(true); @@ -115,6 +117,7 @@ void AreaShape::DrawHatchingArea(ref_ptr<dp::Batcher> batcher, m2::PointD const } auto state = CreateGLState(gpu::Program::HatchingArea, RenderState::GeometryLayer); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(texture); state.SetMaskTexture(hatchingTexture); state.SetTextureFilter(gl_const::GLLinear); @@ -163,6 +166,7 @@ void AreaShape::DrawArea3D(ref_ptr<dp::Batcher> batcher, m2::PointD const & colo } auto state = CreateGLState(gpu::Program::Area3d, RenderState::Geometry3dLayer); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(texture); state.SetBlending(dp::Blending(false /* isEnabled */)); @@ -176,6 +180,7 @@ void AreaShape::DrawArea3D(ref_ptr<dp::Batcher> batcher, m2::PointD const & colo glsl::vec2 const ouv = glsl::ToVec2(outlineUv); auto outlineState = CreateGLState(gpu::Program::Area3dOutline, RenderState::Geometry3dLayer); + outlineState.SetDepthTestEnabled(m_params.m_depthTestEnabled); outlineState.SetColorTexture(texture); outlineState.SetBlending(dp::Blending(false /* isEnabled */)); outlineState.SetDrawAsLine(true); diff --git a/drape_frontend/arrow3d.cpp b/drape_frontend/arrow3d.cpp index 7aa7e03fb1..05d1efafb5 100644 --- a/drape_frontend/arrow3d.cpp +++ b/drape_frontend/arrow3d.cpp @@ -36,6 +36,7 @@ df::ColorConstant const kArrow3DOutlineColor = "Arrow3DOutline"; Arrow3d::Arrow3d() : m_state(CreateGLState(gpu::Program::Arrow3d, RenderState::OverlayLayer)) { + m_state.SetDepthTestEnabled(false); m_vertices = { 0.0f, 0.0f, -1.0f, 1.0f, -1.2f, -1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 2.0f, 0.0f, 1.0f, 1.2f, -1.0f, 0.0f, 1.0f, diff --git a/drape_frontend/circles_pack_shape.cpp b/drape_frontend/circles_pack_shape.cpp index e25b19fd91..7817864527 100644 --- a/drape_frontend/circles_pack_shape.cpp +++ b/drape_frontend/circles_pack_shape.cpp @@ -28,6 +28,7 @@ dp::GLState GetCirclesPackState(ref_ptr<dp::TextureManager> texMng) { auto state = CreateGLState(gpu::Program::CirclePoint, RenderState::OverlayLayer); state.SetColorTexture(texMng->GetSymbolsTexture()); + state.SetDepthTestEnabled(false); return state; } diff --git a/drape_frontend/colored_symbol_shape.cpp b/drape_frontend/colored_symbol_shape.cpp index 1daaaac18b..11a45bf21c 100644 --- a/drape_frontend/colored_symbol_shape.cpp +++ b/drape_frontend/colored_symbol_shape.cpp @@ -300,6 +300,7 @@ void ColoredSymbolShape::Draw(ref_ptr<dp::Batcher> batcher, } auto state = CreateGLState(gpu::Program::ColoredSymbol, m_params.m_depthLayer); state.SetProgram3d(gpu::Program::ColoredSymbolBillboard); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(colorRegion.GetTexture()); state.SetDepthFunction(gl_const::GLLess); diff --git a/drape_frontend/drape_api_builder.cpp b/drape_frontend/drape_api_builder.cpp index 8b1f79a7b4..1b2222fd2f 100644 --- a/drape_frontend/drape_api_builder.cpp +++ b/drape_frontend/drape_api_builder.cpp @@ -64,7 +64,7 @@ void DrapeApiBuilder::BuildLines(DrapeApi::TLines const & lines, ref_ptr<dp::Tex m2::SharedSpline spline(data.m_points); LineViewParams lvp; lvp.m_tileCenter = property->m_center; - lvp.m_depth = 0.0f; + lvp.m_depthTestEnabled = false; lvp.m_minVisibleScale = 1; lvp.m_cap = dp::RoundCap; lvp.m_color = data.m_color; @@ -76,7 +76,7 @@ void DrapeApiBuilder::BuildLines(DrapeApi::TLines const & lines, ref_ptr<dp::Tex { ColoredSymbolViewParams cvp; cvp.m_tileCenter = property->m_center; - cvp.m_depth = 0.0f; + cvp.m_depthTestEnabled = false; cvp.m_minVisibleScale = 1; cvp.m_shape = ColoredSymbolViewParams::Shape::Circle; cvp.m_color = data.m_color; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index ef77fa6c56..a271d88e04 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -833,6 +833,7 @@ drape_ptr<UserMarkRenderParams> DrapeEngine::GenerateMarkRenderInfo(UserPointMar { auto renderInfo = make_unique_dp<UserMarkRenderParams>(); renderInfo->m_anchor = mark->GetAnchor(); + renderInfo->m_depthTestEnabled = mark->GetDepthTestEnabled(); renderInfo->m_depth = mark->GetDepth(); renderInfo->m_depthLayer = mark->GetDepthLayer(); renderInfo->m_minZoom = mark->GetMinZoom(); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 0335dbb737..84939574a2 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1225,7 +1225,6 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram if (m_postprocessRenderer->BeginFrame(activeFrame)) { - GLFunctions::glEnable(gl_const::GLDepthTest); m_viewport.Apply(); RefreshBgColor(); GLFunctions::glClear(gl_const::GLColorBit | gl_const::GLDepthBit | gl_const::GLStencilBit); @@ -1248,7 +1247,6 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram RenderRouteLayer(modelView); } - GLFunctions::glDisable(gl_const::GLDepthTest); GLFunctions::glClear(gl_const::GLDepthBit); if (m_selectionShape != nullptr) @@ -1307,7 +1305,6 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram if (!m_postprocessRenderer->EndFrame(make_ref(m_gpuProgramManager))) return; - GLFunctions::glDisable(gl_const::GLDepthTest); m_myPositionController->Render(modelView, m_currentZoomLevel, make_ref(m_gpuProgramManager), m_frameValues); @@ -1352,8 +1349,6 @@ void FrontendRenderer::Render3dLayer(ScreenBase const & modelView, bool useFrame GLFunctions::glClear(gl_const::GLDepthBit); } - GLFunctions::glEnable(gl_const::GLDepthTest); - layer.Sort(make_ref(m_overlayTree)); for (drape_ptr<RenderGroup> const & group : layer.m_renderGroups) RenderSingleGroup(modelView, make_ref(group)); @@ -1401,26 +1396,22 @@ bool FrontendRenderer::HasRouteData() const void FrontendRenderer::RenderTransitSchemeLayer(ScreenBase const & modelView) { GLFunctions::glClear(gl_const::GLDepthBit); - GLFunctions::glEnable(gl_const::GLDepthTest); if (m_transitSchemeEnabled && m_transitSchemeRenderer->IsSchemeVisible(m_currentZoomLevel)) { RenderTransitBackground(); m_transitSchemeRenderer->RenderTransit(modelView, make_ref(m_gpuProgramManager), make_ref(m_postprocessRenderer), m_frameValues); } - GLFunctions::glDisable(gl_const::GLDepthTest); } void FrontendRenderer::RenderTrafficLayer(ScreenBase const & modelView) { GLFunctions::glClear(gl_const::GLDepthBit); - GLFunctions::glEnable(gl_const::GLDepthTest); if (m_trafficRenderer->HasRenderData()) { m_trafficRenderer->RenderTraffic(modelView, m_currentZoomLevel, 1.0f /* opacity */, make_ref(m_gpuProgramManager), m_frameValues); } - GLFunctions::glDisable(gl_const::GLDepthTest); } void FrontendRenderer::RenderTransitBackground() @@ -1447,34 +1438,20 @@ void FrontendRenderer::RenderRouteLayer(ScreenBase const & modelView) RenderTransitBackground(); GLFunctions::glClear(gl_const::GLDepthBit); - GLFunctions::glEnable(gl_const::GLDepthTest); m_routeRenderer->RenderRoute(modelView, m_trafficRenderer->HasRenderData(), make_ref(m_gpuProgramManager), m_frameValues); - GLFunctions::glDisable(gl_const::GLDepthTest); } -void FrontendRenderer::RenderUserMarksLayer(ScreenBase const & modelView, RenderState::DepthLayer layerId, - bool enableDepthTest) +void FrontendRenderer::RenderUserMarksLayer(ScreenBase const & modelView, RenderState::DepthLayer layerId) { auto & renderGroups = m_layers[layerId].m_renderGroups; if (renderGroups.empty()) return; - if (enableDepthTest) - { - GLFunctions::glEnable(gl_const::GLDepthTest); - GLFunctions::glClear(gl_const::GLDepthBit); - } - else - { - GLFunctions::glDisable(gl_const::GLDepthTest); - } + GLFunctions::glClear(gl_const::GLDepthBit); for (drape_ptr<RenderGroup> & group : renderGroups) RenderSingleGroup(modelView, make_ref(group)); - - if (enableDepthTest) - GLFunctions::glDisable(gl_const::GLDepthTest); } void FrontendRenderer::RenderSearchMarksLayer(ScreenBase const & modelView) @@ -1486,7 +1463,7 @@ void FrontendRenderer::RenderSearchMarksLayer(ScreenBase const & modelView) group->SetOverlayVisibility(true); group->Update(modelView); } - RenderUserMarksLayer(modelView, RenderState::SearchMarkLayer, false /* enableDepthTest */); + RenderUserMarksLayer(modelView, RenderState::SearchMarkLayer); } void FrontendRenderer::BuildOverlayTree(ScreenBase const & modelView) diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 20d7f4dfeb..353e15b04b 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -163,8 +163,7 @@ private: void Render3dLayer(ScreenBase const & modelView, bool useFramebuffer); void RenderOverlayLayer(ScreenBase const & modelView); void RenderNavigationOverlayLayer(ScreenBase const & modelView); - void RenderUserMarksLayer(ScreenBase const & modelView, RenderState::DepthLayer layerId, - bool enableDepthTest = true); + void RenderUserMarksLayer(ScreenBase const & modelView, RenderState::DepthLayer layerId); void RenderTransitSchemeLayer(ScreenBase const & modelView); void RenderTrafficLayer(ScreenBase const & modelView); void RenderRouteLayer(ScreenBase const & modelView); diff --git a/drape_frontend/gui/choose_position_mark.cpp b/drape_frontend/gui/choose_position_mark.cpp index 988b56455f..7b813aa83e 100644 --- a/drape_frontend/gui/choose_position_mark.cpp +++ b/drape_frontend/gui/choose_position_mark.cpp @@ -61,6 +61,7 @@ drape_ptr<ShapeRenderer> ChoosePositionMark::Draw(ref_ptr<dp::TextureManager> te auto state = df::CreateGLState(gpu::Program::TexturingGui, df::RenderState::GuiLayer); state.SetColorTexture(region.GetTexture()); + state.SetDepthTestEnabled(false); dp::AttributeProvider provider(1 /*streamCount*/, 4 /*vertexCount*/); dp::BindingInfo info(2 /*count*/); diff --git a/drape_frontend/gui/compass.cpp b/drape_frontend/gui/compass.cpp index efdfa7f64f..814603ebe9 100644 --- a/drape_frontend/gui/compass.cpp +++ b/drape_frontend/gui/compass.cpp @@ -108,6 +108,7 @@ drape_ptr<ShapeRenderer> Compass::Draw(m2::PointF & compassSize, ref_ptr<dp::Tex auto state = df::CreateGLState(gpu::Program::TexturingGui, df::RenderState::GuiLayer); state.SetColorTexture(region.GetTexture()); + state.SetDepthTestEnabled(false); dp::AttributeProvider provider(1, 4); dp::BindingInfo info(2); diff --git a/drape_frontend/gui/gui_text.cpp b/drape_frontend/gui/gui_text.cpp index 234fce2a5f..ccdd7d9eb9 100644 --- a/drape_frontend/gui/gui_text.cpp +++ b/drape_frontend/gui/gui_text.cpp @@ -107,7 +107,9 @@ dp::BindingInfo const & StaticLabel::Vertex::GetBindingInfo() StaticLabel::LabelResult::LabelResult() : m_state(df::CreateGLState(gpu::Program::TextOutlinedGui, df::RenderState::GuiLayer)) -{} +{ + m_state.SetDepthTestEnabled(false); +} char const * StaticLabel::DefaultDelim = "\n"; @@ -286,7 +288,9 @@ dp::BindingInfo const & MutableLabel::DynamicVertex::GetBindingInfo() MutableLabel::PrecacheResult::PrecacheResult() : m_state(df::CreateGLState(gpu::Program::TextOutlinedGui, df::RenderState::GuiLayer)) -{} +{ + m_state.SetDepthTestEnabled(false); +} MutableLabel::MutableLabel(dp::Anchor anchor) : m_anchor(anchor) diff --git a/drape_frontend/gui/ruler.cpp b/drape_frontend/gui/ruler.cpp index 58487f387a..536bffb372 100644 --- a/drape_frontend/gui/ruler.cpp +++ b/drape_frontend/gui/ruler.cpp @@ -215,6 +215,7 @@ void Ruler::DrawRuler(m2::PointF & size, ShapeControl & control, ref_ptr<dp::Tex auto state = df::CreateGLState(gpu::Program::Ruler, df::RenderState::GuiLayer); state.SetColorTexture(reg.GetTexture()); + state.SetDepthTestEnabled(false); dp::AttributeProvider provider(1, 4); provider.InitStream(0, GetBindingInfo(), make_ref(data.data())); diff --git a/drape_frontend/gui/watermark.cpp b/drape_frontend/gui/watermark.cpp index 85c9369bd1..0d544ba7ec 100644 --- a/drape_frontend/gui/watermark.cpp +++ b/drape_frontend/gui/watermark.cpp @@ -84,6 +84,7 @@ drape_ptr<ShapeRenderer> Watermark::Draw(m2::PointF & size, ref_ptr<dp::TextureM auto state = df::CreateGLState(gpu::Program::TexturingGui, df::RenderState::GuiLayer); state.SetColorTexture(region.GetTexture()); + state.SetDepthTestEnabled(false); dp::AttributeProvider provider(1 /* streamCount */, 4 /* vertexCount */); dp::BindingInfo info(2 /* count */); diff --git a/drape_frontend/line_shape.cpp b/drape_frontend/line_shape.cpp index b42ec47a27..6ddd32f949 100644 --- a/drape_frontend/line_shape.cpp +++ b/drape_frontend/line_shape.cpp @@ -59,6 +59,7 @@ struct BaseBuilderParams dp::TextureManager::ColorRegion m_color; float m_pxHalfWidth; float m_depth; + bool m_depthTestEnabled; RenderState::DepthLayer m_depthLayer; dp::LineCap m_cap; dp::LineJoin m_join; @@ -178,6 +179,7 @@ public: { auto state = CreateGLState(gpu::Program::Line, m_params.m_depthLayer); state.SetColorTexture(m_params.m_color.GetTexture()); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); return state; } @@ -206,6 +208,7 @@ public: return TBase::GetCapState(); auto state = CreateGLState(gpu::Program::CapJoin, m_params.m_depthLayer); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(m_params.m_color.GetTexture()); state.SetDepthFunction(gl_const::GLLess); return state; @@ -277,6 +280,7 @@ public: dp::GLState GetState() override { auto state = CreateGLState(gpu::Program::AreaOutline, m_params.m_depthLayer); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(m_params.m_color.GetTexture()); state.SetDrawAsLine(true); state.SetLineWidth(m_lineWidth); @@ -320,6 +324,7 @@ public: dp::GLState GetState() override { auto state = CreateGLState(gpu::Program::DashedLine, m_params.m_depthLayer); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(m_params.m_color.GetTexture()); state.SetMaskTexture(m_texCoordGen.GetRegion().GetTexture()); return state; @@ -488,6 +493,7 @@ void LineShape::Prepare(ref_ptr<dp::TextureManager> textures) const { p.m_cap = m_params.m_cap; p.m_color = colorRegion; + p.m_depthTestEnabled = m_params.m_depthTestEnabled; p.m_depth = m_params.m_depth; p.m_depthLayer = m_params.m_depthLayer; p.m_join = m_params.m_join; diff --git a/drape_frontend/my_position.cpp b/drape_frontend/my_position.cpp index b303fea498..67e1e77333 100644 --- a/drape_frontend/my_position.cpp +++ b/drape_frontend/my_position.cpp @@ -168,6 +168,7 @@ void MyPosition::CacheAccuracySector(ref_ptr<dp::TextureManager> mng) } auto state = CreateGLState(gpu::Program::Accuracy, RenderState::OverlayLayer); + state.SetDepthTestEnabled(false); state.SetColorTexture(color.GetTexture()); { @@ -219,6 +220,7 @@ void MyPosition::CachePointPosition(ref_ptr<dp::TextureManager> mng) m_arrow3d.SetTexture(mng); auto state = CreateGLState(gpu::Program::MyPosition, RenderState::OverlayLayer); + state.SetDepthTestEnabled(false); state.SetColorTexture(pointSymbol.GetTexture()); dp::TextureManager::SymbolRegion * symbols[kSymbolsCount] = { &pointSymbol }; diff --git a/drape_frontend/path_symbol_shape.cpp b/drape_frontend/path_symbol_shape.cpp index b9f45b1221..4d9ffa87c4 100644 --- a/drape_frontend/path_symbol_shape.cpp +++ b/drape_frontend/path_symbol_shape.cpp @@ -55,6 +55,7 @@ void PathSymbolShape::Draw(ref_ptr<dp::Batcher> batcher, ref_ptr<dp::TextureMana auto state = CreateGLState(gpu::Program::PathSymbol, RenderState::GeometryLayer); state.SetColorTexture(region.GetTexture()); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); dp::AttributeProvider provider(1, static_cast<uint32_t>(buffer.size())); provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(buffer.data())); diff --git a/drape_frontend/path_text_shape.cpp b/drape_frontend/path_text_shape.cpp index efd476ff4d..57b3d3fbb5 100644 --- a/drape_frontend/path_text_shape.cpp +++ b/drape_frontend/path_text_shape.cpp @@ -87,6 +87,7 @@ void PathTextShape::DrawPathTextPlain(ref_ptr<dp::TextureManager> textures, RenderState::OverlayLayer); state.SetProgram3d(layout->GetFixedHeight() > 0 ? gpu::Program::TextFixedBillboard : gpu::Program::TextBillboard); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(color.GetTexture()); state.SetMaskTexture(layout->GetMaskTexture()); @@ -125,6 +126,7 @@ void PathTextShape::DrawPathTextOutlined(ref_ptr<dp::TextureManager> textures, auto state = CreateGLState(gpu::Program::TextOutlined, RenderState::OverlayLayer); state.SetProgram3d(gpu::Program::TextOutlinedBillboard); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); state.SetColorTexture(color.GetTexture()); state.SetMaskTexture(layout->GetMaskTexture()); diff --git a/drape_frontend/poi_symbol_shape.cpp b/drape_frontend/poi_symbol_shape.cpp index 3edd88b185..038dbeba23 100644 --- a/drape_frontend/poi_symbol_shape.cpp +++ b/drape_frontend/poi_symbol_shape.cpp @@ -69,6 +69,7 @@ void Batch<SV>(ref_ptr<dp::Batcher> batcher, drape_ptr<dp::OverlayHandle> && han auto state = df::CreateGLState(gpu::Program::Texturing, params.m_depthLayer); state.SetProgram3d(gpu::Program::TexturingBillboard); + state.SetDepthTestEnabled(params.m_depthTestEnabled); state.SetColorTexture(symbolRegion.GetTexture()); state.SetTextureFilter(gl_const::GLNearest); @@ -102,6 +103,7 @@ void Batch<MV>(ref_ptr<dp::Batcher> batcher, drape_ptr<dp::OverlayHandle> && han auto state = df::CreateGLState(gpu::Program::MaskedTexturing, params.m_depthLayer); state.SetProgram3d(gpu::Program::MaskedTexturingBillboard); + state.SetDepthTestEnabled(params.m_depthTestEnabled); state.SetColorTexture(symbolRegion.GetTexture()); state.SetMaskTexture(colorRegion.GetTexture()); // Here mask is a color. state.SetTextureFilter(gl_const::GLNearest); diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index 102f681215..02b45c82fe 100755 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -84,15 +84,6 @@ void RenderGroup::Render(ScreenBase const & screen, ref_ptr<gpu::ProgramManager> auto const program = m_state.GetProgram<gpu::Program>(); auto const program3d = m_state.GetProgram3d<gpu::Program>(); - // TODO: hide GLDepthTest under the state. - if (IsOverlay()) - { - if (program == gpu::Program::ColoredSymbol || program3d == gpu::Program::ColoredSymbolBillboard) - GLFunctions::glEnable(gl_const::GLDepthTest); - else - GLFunctions::glDisable(gl_const::GLDepthTest); - } - // Set frame values to group's params. frameValues.SetTo(m_params); diff --git a/drape_frontend/selection_shape.cpp b/drape_frontend/selection_shape.cpp index 56ab21edda..deb55c7cab 100644 --- a/drape_frontend/selection_shape.cpp +++ b/drape_frontend/selection_shape.cpp @@ -85,6 +85,7 @@ SelectionShape::SelectionShape(ref_ptr<dp::TextureManager> mng) auto state = CreateGLState(gpu::Program::Accuracy, RenderState::OverlayLayer); state.SetColorTexture(color.GetTexture()); + state.SetDepthTestEnabled(false); { dp::Batcher batcher(kTriangleCount * dp::Batcher::IndexPerTriangle, kVertexCount); diff --git a/drape_frontend/shape_view_params.hpp b/drape_frontend/shape_view_params.hpp index 14b21740d5..0fc2156805 100644 --- a/drape_frontend/shape_view_params.hpp +++ b/drape_frontend/shape_view_params.hpp @@ -23,6 +23,7 @@ struct CommonViewParams { RenderState::DepthLayer m_depthLayer = RenderState::GeometryLayer; float m_depth = 0.0f; + bool m_depthTestEnabled = true; int m_minVisibleScale = 0; uint8_t m_rank = 0; m2::PointD m_tileCenter; diff --git a/drape_frontend/text_shape.cpp b/drape_frontend/text_shape.cpp index 68f9978710..2df3ce6b42 100644 --- a/drape_frontend/text_shape.cpp +++ b/drape_frontend/text_shape.cpp @@ -317,6 +317,7 @@ void TextShape::DrawSubStringPlain(StraightTextLayout const & layout, dp::FontDe bool const isNonSdfText = layout.GetFixedHeight() > 0; auto state = CreateGLState(isNonSdfText ? gpu::Program::TextFixed : gpu::Program::Text, m_params.m_depthLayer); state.SetProgram3d(isNonSdfText ? gpu::Program::TextFixedBillboard : gpu::Program::TextBillboard); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); ASSERT(color.GetTexture() == outline.GetTexture(), ()); state.SetColorTexture(color.GetTexture()); @@ -382,6 +383,7 @@ void TextShape::DrawSubStringOutlined(StraightTextLayout const & layout, dp::Fon auto state = CreateGLState(gpu::Program::TextOutlined, m_params.m_depthLayer); state.SetProgram3d(gpu::Program::TextOutlinedBillboard); + state.SetDepthTestEnabled(m_params.m_depthTestEnabled); ASSERT(color.GetTexture() == outline.GetTexture(), ()); state.SetColorTexture(color.GetTexture()); state.SetMaskTexture(layout.GetMaskTexture()); diff --git a/drape_frontend/transit_scheme_builder.cpp b/drape_frontend/transit_scheme_builder.cpp index 1fafea031a..0ff61a2eae 100644 --- a/drape_frontend/transit_scheme_builder.cpp +++ b/drape_frontend/transit_scheme_builder.cpp @@ -730,7 +730,7 @@ void TransitSchemeBuilder::GenerateTitles(StopNodeParams const & stopParams, m2: textParams.m_titleDecl = titleDecl; textParams.m_titleDecl.m_primaryText = title.m_text; textParams.m_titleDecl.m_anchor = title.m_anchor; - textParams.m_depth = kBaseTitleDepth; + textParams.m_depthTestEnabled = false; textParams.m_depthLayer = RenderState::TransitSchemeLayer; textParams.m_specialDisplacement = SpecialDisplacement::TransitScheme; textParams.m_specialPriority = priority; @@ -746,7 +746,7 @@ void TransitSchemeBuilder::GenerateTitles(StopNodeParams const & stopParams, m2: colorParams.m_color = dp::Color::Transparent(); colorParams.m_featureID = featureId; colorParams.m_tileCenter = pivot; - colorParams.m_depth = kBaseTitleDepth; + colorParams.m_depthTestEnabled = false; colorParams.m_depthLayer = RenderState::TransitSchemeLayer; colorParams.m_specialDisplacement = SpecialDisplacement::TransitScheme; colorParams.m_specialPriority = static_cast<uint16_t>(Priority::Stub); diff --git a/drape_frontend/transit_scheme_renderer.cpp b/drape_frontend/transit_scheme_renderer.cpp index 93fd5ea865..c41dd20ee5 100644 --- a/drape_frontend/transit_scheme_renderer.cpp +++ b/drape_frontend/transit_scheme_renderer.cpp @@ -175,7 +175,6 @@ void TransitSchemeRenderer::RemoveOverlays(ref_ptr<dp::OverlayTree> tree, std::v void TransitSchemeRenderer::RenderLinesCaps(ScreenBase const & screen, ref_ptr<gpu::ProgramManager> mng, FrameValues const & frameValues, float pixelHalfWidth) { - GLFunctions::glEnable(gl_const::GLDepthTest); GLFunctions::glClear(gl_const::GLDepthBit); for (auto & renderData : m_linesCapsRenderData) { @@ -198,7 +197,6 @@ void TransitSchemeRenderer::RenderLinesCaps(ScreenBase const & screen, ref_ptr<g void TransitSchemeRenderer::RenderLines(ScreenBase const & screen, ref_ptr<gpu::ProgramManager> mng, FrameValues const & frameValues, float pixelHalfWidth) { - GLFunctions::glEnable(gl_const::GLDepthTest); for (auto & renderData : m_linesRenderData) { ref_ptr<dp::GpuProgram> program = mng->GetProgram(renderData.m_state.GetProgram<gpu::Program>()); @@ -219,7 +217,6 @@ void TransitSchemeRenderer::RenderLines(ScreenBase const & screen, ref_ptr<gpu:: void TransitSchemeRenderer::RenderMarkers(ScreenBase const & screen, ref_ptr<gpu::ProgramManager> mng, FrameValues const & frameValues, float pixelHalfWidth) { - GLFunctions::glEnable(gl_const::GLDepthTest); GLFunctions::glClear(gl_const::GLDepthBit); for (auto & renderData : m_markersRenderData) { @@ -243,7 +240,6 @@ void TransitSchemeRenderer::RenderMarkers(ScreenBase const & screen, ref_ptr<gpu void TransitSchemeRenderer::RenderText(ScreenBase const & screen, ref_ptr<gpu::ProgramManager> mng, FrameValues const & frameValues) { - GLFunctions::glDisable(gl_const::GLDepthTest); auto const & glyphParams = df::VisualParams::Instance().GetGlyphVisualParams(); for (auto & renderData : m_textRenderData) { @@ -286,7 +282,6 @@ void TransitSchemeRenderer::RenderStubs(ScreenBase const & screen, ref_ptr<gpu:: params.m_modelView = glsl::make_mat4(mv.m_data); mng->GetParamsSetter()->Apply(program, params); - GLFunctions::glEnable(gl_const::GLDepthTest); renderData.m_bucket->Render(false /* draw as line */); renderData.m_bucket->RenderDebug(screen); diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index b3338de24b..f667a1fa5b 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -125,6 +125,7 @@ void GenerateColoredSymbolShapes(UserMarkRenderParams const & renderInfo, TileKe params.m_featureID = renderInfo.m_featureId; params.m_tileCenter = tileCenter; + params.m_depthTestEnabled = renderInfo.m_depthTestEnabled; params.m_depth = renderInfo.m_depth; params.m_depthLayer = renderInfo.m_depthLayer; params.m_minVisibleScale = renderInfo.m_minZoom; @@ -155,6 +156,7 @@ void GeneratePoiSymbolShape(UserMarkRenderParams const & renderInfo, TileKey con { PoiSymbolViewParams params(renderInfo.m_featureId); params.m_tileCenter = tileCenter; + params.m_depthTestEnabled = renderInfo.m_depthTestEnabled; params.m_depth = renderInfo.m_depth; params.m_depthLayer = renderInfo.m_depthLayer; params.m_minVisibleScale = renderInfo.m_minZoom; @@ -211,6 +213,7 @@ void GenerateTextShapes(UserMarkRenderParams const & renderInfo, TileKey const & params.m_titleDecl.m_secondaryTextFont.m_isSdf = params.m_titleDecl.m_secondaryTextFont.m_outlineColor != dp::Color::Transparent() ? true : isSdf; + params.m_depthTestEnabled = renderInfo.m_depthTestEnabled; params.m_depth = renderInfo.m_depth; params.m_depthLayer = renderInfo.m_depthLayer; params.m_minVisibleScale = renderInfo.m_minZoom; @@ -298,6 +301,7 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr<dp::TextureManager> texture dp::TextureManager::SymbolRegion region; dp::TextureManager::SymbolRegion backgroundRegion; RenderState::DepthLayer depthLayer = RenderState::UserMarkLayer; + bool depthTestEnabled = true; for (auto const id : marksId) { auto const it = renderParams.find(id); @@ -310,6 +314,7 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr<dp::TextureManager> texture m2::PointD const tileCenter = tileKey.GetGlobalRect().Center(); depthLayer = renderInfo.m_depthLayer; + depthTestEnabled = renderInfo.m_depthTestEnabled; m2::PointF symbolSize(0.0f, 0.0f); m2::PointF symbolOffset(0.0f, 0.0f); @@ -410,6 +415,7 @@ void CacheUserMarks(TileKey const & tileKey, ref_ptr<dp::TextureManager> texture : gpu::Program::BookmarkBillboard); state.SetColorTexture(region.GetTexture()); state.SetTextureFilter(gl_const::GLNearest); + state.SetDepthTestEnabled(depthTestEnabled); dp::AttributeProvider attribProvider(1, static_cast<uint32_t>(buffer.size())); attribProvider.InitStream(0, UPV::GetBinding(), make_ref(buffer.data())); @@ -505,6 +511,7 @@ void CacheUserLines(TileKey const & tileKey, ref_ptr<dp::TextureManager> texture params.m_cap = dp::RoundCap; params.m_join = dp::RoundJoin; params.m_color = layer.m_color; + params.m_depthTestEnabled = true; params.m_depth = layer.m_depth; params.m_depthLayer = renderInfo.m_depthLayer; params.m_width = static_cast<float>(layer.m_width * vs * diff --git a/drape_frontend/user_mark_shapes.hpp b/drape_frontend/user_mark_shapes.hpp index 96616a015f..716e2f7145 100644 --- a/drape_frontend/user_mark_shapes.hpp +++ b/drape_frontend/user_mark_shapes.hpp @@ -31,6 +31,7 @@ struct UserMarkRenderParams bool m_hasTitlePriority = false; uint16_t m_priority = 0; uint32_t m_index = 0; + bool m_depthTestEnabled = true; float m_depth = 0.0; RenderState::DepthLayer m_depthLayer = RenderState::UserMarkLayer; bool m_hasCreationAnimation = false; diff --git a/drape_frontend/user_marks_provider.hpp b/drape_frontend/user_marks_provider.hpp index c9d8aff872..b4933a4baf 100644 --- a/drape_frontend/user_marks_provider.hpp +++ b/drape_frontend/user_marks_provider.hpp @@ -55,6 +55,7 @@ public: virtual m2::PointD const & GetPivot() const = 0; virtual m2::PointD GetPixelOffset() const = 0; virtual dp::Anchor GetAnchor() const = 0; + virtual bool GetDepthTestEnabled() const = 0; virtual float GetDepth() const = 0; virtual RenderState::DepthLayer GetDepthLayer() const = 0; virtual bool IsVisible() const = 0; diff --git a/map/search_mark.hpp b/map/search_mark.hpp index 74f4212de4..8d28513630 100644 --- a/map/search_mark.hpp +++ b/map/search_mark.hpp @@ -42,6 +42,7 @@ public: df::RenderState::DepthLayer GetDepthLayer() const override; drape_ptr<SymbolNameZoomInfo> GetBadgeNames() const override; drape_ptr<SymbolOffsets> GetSymbolOffsets() const override; + bool GetDepthTestEnabled() const override { return false; } FeatureID GetFeatureID() const override { return m_featureID; } void SetFoundFeature(FeatureID const & feature); diff --git a/map/user_mark.hpp b/map/user_mark.hpp index e429901642..f4dced339f 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -59,6 +59,7 @@ public: m2::PointD const & GetPivot() const override; m2::PointD GetPixelOffset() const override; dp::Anchor GetAnchor() const override; + bool GetDepthTestEnabled() const override { return true; } float GetDepth() const override { return 0.0f; } df::RenderState::DepthLayer GetDepthLayer() const override; drape_ptr<TitlesInfo> GetTitleDecl() const override { return nullptr; } |