Topic/drawable extrusion (#1288)

Co-authored-by: Alex Cristici <alex.cristici@gmail.com>
This commit is contained in:
Tim Sylvester
2023-07-03 11:55:50 -07:00
committed by Bart Louwers
parent 813ddb024a
commit 8d9fe37a6b
67 changed files with 1744 additions and 383 deletions

View File

@@ -153,21 +153,40 @@ void Renderer::Impl::render(const RenderTree& renderTree) {
// -------------------------------------------------------------------------------------
// Renders any 3D layers bottom-to-top to unique FBOs with texture
// attachments, but share the same depth rbo between them.
if (parameters.staticData.has3D) {
parameters.staticData.backendSize = parameters.backend.getDefaultRenderable().getSize();
const auto common3DPass = [&] {
if (parameters.staticData.has3D) {
parameters.staticData.backendSize = parameters.backend.getDefaultRenderable().getSize();
const auto debugGroup(parameters.encoder->createDebugGroup("3d"));
parameters.pass = RenderPass::Pass3D;
const auto debugGroup(parameters.encoder->createDebugGroup("common-3d"));
parameters.pass = RenderPass::Pass3D;
if (!parameters.staticData.depthRenderbuffer ||
parameters.staticData.depthRenderbuffer->getSize() != parameters.staticData.backendSize) {
parameters.staticData.depthRenderbuffer =
parameters.context.createRenderbuffer<gfx::RenderbufferPixelType::Depth>(
parameters.staticData.backendSize);
if (!parameters.staticData.depthRenderbuffer ||
parameters.staticData.depthRenderbuffer->getSize() != parameters.staticData.backendSize) {
parameters.staticData.depthRenderbuffer =
parameters.context.createRenderbuffer<gfx::RenderbufferPixelType::Depth>(
parameters.staticData.backendSize);
}
parameters.staticData.depthRenderbuffer->setShouldClear(true);
}
parameters.staticData.depthRenderbuffer->setShouldClear(true);
};
#if MLN_DRAWABLE_RENDERER
const auto drawable3DPass = [&] {
const auto debugGroup(parameters.encoder->createDebugGroup("drawables-3d"));
assert(parameters.pass == RenderPass::Pass3D);
parameters.currentLayer = 0;
// draw layer groups, opaque pass
orchestrator.observeLayerGroups([&](LayerGroupBase& layerGroup) {
layerGroup.render(orchestrator, parameters);
parameters.currentLayer++;
});
};
#endif // MLN_DRAWABLE_RENDERER
#if MLN_LEGACY_RENDERER
const auto renderLayer3DPass = [&] {
const auto debugGroup(parameters.encoder->createDebugGroup("3d"));
int32_t i = static_cast<int32_t>(layerRenderItems.size()) - 1;
for (auto it = layerRenderItems.begin(); it != layerRenderItems.end() && i >= 0; ++it, --i) {
parameters.currentLayer = i;
@@ -177,29 +196,33 @@ void Renderer::Impl::render(const RenderTree& renderTree) {
renderItem.render(parameters);
}
}
#endif
}
};
#endif // MLN_LEGACY_RENDERER
#if MLN_DRAWABLE_RENDERER
// draw render targets
orchestrator.observeRenderTargets(
[&](RenderTarget& renderTarget) { renderTarget.render(orchestrator, renderTree, parameters); });
const auto drawableTargetsPass = [&] {
// draw render targets
orchestrator.observeRenderTargets(
[&](RenderTarget& renderTarget) { renderTarget.render(orchestrator, renderTree, parameters); });
};
#endif
// - CLEAR
// -------------------------------------------------------------------------------------
// Renders the backdrop of the OpenGL view. This also paints in areas where
// we don't have any tiles whatsoever.
{
std::optional<Color> color;
if (parameters.debugOptions & MapDebugOptions::Overdraw) {
color = Color::black();
} else if (!backend.contextIsShared()) {
color = renderTreeParameters.backgroundColor;
const auto commonClearPass = [&] {
// - CLEAR
// -------------------------------------------------------------------------------------
// Renders the backdrop of the OpenGL view. This also paints in areas where
// we don't have any tiles whatsoever.
{
std::optional<Color> color;
if (parameters.debugOptions & MapDebugOptions::Overdraw) {
color = Color::black();
} else if (!backend.contextIsShared()) {
color = renderTreeParameters.backgroundColor;
}
parameters.renderPass = parameters.encoder->createRenderPass(
"main buffer", {parameters.backend.getDefaultRenderable(), color, 1.0f, 0});
}
parameters.renderPass = parameters.encoder->createRenderPass(
"main buffer", {parameters.backend.getDefaultRenderable(), color, 1.0f, 0});
}
};
// Actually render the layers
#if MLN_DRAWABLE_RENDERER
@@ -274,9 +297,20 @@ void Renderer::Impl::render(const RenderTree& renderTree) {
#endif // MLN_LEGACY_RENDERER
#if (MLN_DRAWABLE_RENDERER && !MLN_LEGACY_RENDERER)
if (parameters.staticData.has3D) {
common3DPass();
drawable3DPass();
}
drawableTargetsPass();
commonClearPass();
drawableOpaquePass();
drawableTranslucentPass();
#elif (MLN_LEGACY_RENDERER && !MLN_DRAWABLE_RENDERER)
if (parameters.staticData.has3D) {
common3DPass();
renderLayer3DPass();
}
commonClearPass();
renderLayerOpaquePass();
renderLayerTranslucentPass();
#elif (MLN_DRAWABLE_RENDERER && MLN_LEGACY_RENDERER)
@@ -289,44 +323,69 @@ void Renderer::Impl::render(const RenderTree& renderTree) {
0.5f);
platform::glEnable(GL_SCISSOR_TEST);
#if MLN_RENDERER_QUAD_SPLIT_VIEW
if (parameters.staticData.has3D) {
common3DPass();
drawable3DPass();
renderLayer3DPass();
parameters.clearStencil();
}
// Drawable LayerGroups on the left
// Opaque only on top
platform::glScissor(0, 0, halfW, H);
drawableTargetsPass();
commonClearPass();
drawableOpaquePass();
// Composite (Opaque+Translucent) on bottom
platform::glScissor(0, 0, halfW, halfH);
// Clipping masks were drawn only on the other side
parameters.clearTileClippingMasks();
drawableTranslucentPass();
// RenderLayers on the right
// Opaque only on top
platform::glScissor(halfW, 0, halfW, H);
commonClearPass();
// Clipping masks were drawn only on the other side
parameters.clearTileClippingMasks();
renderLayerOpaquePass();
// Composite (Opaque+Translucent) on bottom
platform::glScissor(halfW, 0, halfW, halfH);
parameters.clearTileClippingMasks();
renderLayerTranslucentPass();
#else
#else // MLN_RENDERER_QUAD_SPLIT_VIEW
if (parameters.staticData.has3D) {
common3DPass();
drawable3DPass();
renderLayer3DPass();
parameters.clearStencil();
}
// Drawable LayerGroups on the left
platform::glScissor(0, 0, halfW, H);
drawableTargetsPass();
commonClearPass();
parameters.clearTileClippingMasks();
drawableOpaquePass();
drawableTranslucentPass();
// RenderLayers on the right
platform::glScissor(halfW, 0, W, H);
commonClearPass();
parameters.clearTileClippingMasks();
renderLayerOpaquePass();
renderLayerTranslucentPass();
#endif
#endif // MLN_RENDERER_QUAD_SPLIT_VIEW
// Reset viewport
platform::glScissor(0, 0, W, H);
platform::glDisable(GL_SCISSOR_TEST);
#else // ifdef MLN_RENDERER_SPLIT_VIEW
#else // if MLN_RENDERER_SPLIT_VIEW
if (parameters.staticData.has3D) {
common3DPass();
renderLayer3DPass();
drawable3DPass();
parameters.clearStencil();
}
commonClearPass();
// Do RenderLayers first, drawables last
renderLayerOpaquePass();
renderLayerTranslucentPass();