From 51c270495b6c959d63b5bb0c88995ce5d2772d5f Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Wed, 31 May 2023 10:40:38 -0700 Subject: [PATCH] Drawable Renderer (#1570), Improve drawable interaction with `opaquePassCutoff` --- include/mbgl/gfx/drawable.hpp | 1 - src/mbgl/gl/layer_group_gl.cpp | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index ce42725ae..50dfd93ab 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -72,7 +72,6 @@ public: void setRenderPass(mbgl::RenderPass value) { renderPass = value; } /// Test whether to draw this drawable in a given render pass. - /// If multiple render pass bits are set, all must be present. bool hasRenderPass(const mbgl::RenderPass value) const { return (mbgl::underlying_type(renderPass) & mbgl::underlying_type(value)) != 0; } diff --git a/src/mbgl/gl/layer_group_gl.cpp b/src/mbgl/gl/layer_group_gl.cpp index c19c803f3..43ec8e6e6 100644 --- a/src/mbgl/gl/layer_group_gl.cpp +++ b/src/mbgl/gl/layer_group_gl.cpp @@ -42,8 +42,15 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) if (!drawable.hasRenderPass(parameters.pass)) { return; } - if (drawable.hasRenderPass(RenderPass::Opaque) && parameters.currentLayer >= parameters.opaquePassCutoff) { - return; + + // If this drawable can render either opaque or translucent... + if (drawable.hasAllRenderPasses(RenderPass::Opaque | RenderPass::Translucent)) { + // Render it only in the translucent pass if we're below the cutoff, and only in the opaque pass otherwise + // (parameters.currentLayer >= parameters.opaquePassCutoff) ? RenderPass::Opaque : RenderPass::Translucent; + if ((parameters.currentLayer < parameters.opaquePassCutoff && parameters.pass != RenderPass::Translucent) || + (parameters.currentLayer >= parameters.opaquePassCutoff && parameters.pass != RenderPass::Opaque)) { + return; + } } #if !defined(NDEBUG)