From 0a3f2cef1c2fadf51fb1705465a9e33b714a047c Mon Sep 17 00:00:00 2001 From: Aleksandar Stojiljkovic Date: Thu, 1 Aug 2019 12:23:04 +0300 Subject: [core] Enable opaque pass for background layer. fix heatmap+background test. Follow the approach from mapbox-gl-js for enabling opaque pass for background layer (same as for fill layer). Fix combinations/heatmap-translucent--background-opaque render test. --- src/mbgl/renderer/layers/render_background_layer.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/mbgl/renderer/layers/render_background_layer.cpp') diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 885b6fe9b2..4725bce435 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -37,8 +37,14 @@ void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶met parameters.getCrossfadeParameters(), unevaluated.evaluate(parameters)); - passes = properties->evaluated.get() > 0 ? RenderPass::Translucent - : RenderPass::None; + passes = properties->evaluated.get() == 0.0f + ? RenderPass::None + : (!unevaluated.get().isUndefined() + || properties->evaluated.get() < 1.0f + || properties->evaluated.get().a < 1.0f) + ? RenderPass::Translucent + // Supply both - evaluated based on opaquePassCutoff in render(). + : RenderPass::Opaque | RenderPass::Translucent; properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -77,7 +83,9 @@ void RenderBackgroundLayer::render(PaintParameters& parameters) { parameters.context, *parameters.renderPass, gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), + parameters.depthModeForSublayer(0, parameters.pass == RenderPass::Opaque + ? gfx::DepthMaskType::ReadWrite + : gfx::DepthMaskType::ReadOnly), gfx::StencilMode::disabled(), parameters.colorModeForRenderPass(), gfx::CullFaceMode::disabled(), @@ -118,6 +126,12 @@ void RenderBackgroundLayer::render(PaintParameters& parameters) { ); } } else { + auto backgroundRenderPass = (evaluated.get().a >= 1.0f + && evaluated.get() >= 1.0f + && parameters.currentLayer >= parameters.opaquePassCutoff) ? RenderPass::Opaque : RenderPass::Translucent; + if (parameters.pass != backgroundRenderPass) { + return; + } for (const auto& tileID : util::tileCover(parameters.state, parameters.state.getIntegerZoom())) { draw( parameters.programs.getBackgroundLayerPrograms().background, -- cgit v1.2.1