From 3d08678e133d2220531435399e4fed073bfd2ec2 Mon Sep 17 00:00:00 2001 From: ZuBsPaCe Date: Fri, 9 Sep 2022 11:28:01 +0200 Subject: [PATCH] Sibling SubViewports must be rendered from top to bottom Sibling SubViewports must be rendered in the same order as in the Scene Tree, from top to bottom. _sort_active_viewports() reversed their order. Fixes #65545 --- servers/rendering/renderer_viewport.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index d466f90e791..1e30a7f77e4 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -73,33 +73,36 @@ static Transform2D _canvas_get_transform(RendererViewport::Viewport *p_viewport, } Vector RendererViewport::_sort_active_viewports() { - // We need to sort the viewports in a "topological order", - // children first and parents last, we use the Kahn's algorithm to achieve that. + // We need to sort the viewports in a "topological order", children first and + // parents last. We also need to keep sibling viewports in the original order + // from top to bottom. Vector result; List nodes; - for (Viewport *viewport : active_viewports) { + for (int i = active_viewports.size() - 1; i >= 0; --i) { + Viewport *viewport = active_viewports[i]; if (viewport->parent.is_valid()) { continue; } nodes.push_back(viewport); + result.insert(0, viewport); } while (!nodes.is_empty()) { - Viewport *node = nodes[0]; + const Viewport *node = nodes[0]; nodes.pop_front(); - result.insert(0, node); - - for (Viewport *child : active_viewports) { + for (int i = active_viewports.size() - 1; i >= 0; --i) { + Viewport *child = active_viewports[i]; if (child->parent != node->self) { continue; } if (!nodes.find(child)) { nodes.push_back(child); + result.insert(0, child); } } }