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
This commit is contained in:
ZuBsPaCe 2022-09-09 11:28:01 +02:00
parent 047801693c
commit 3d08678e13
1 changed files with 10 additions and 7 deletions

View File

@ -73,33 +73,36 @@ static Transform2D _canvas_get_transform(RendererViewport::Viewport *p_viewport,
}
Vector<RendererViewport::Viewport *> 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<Viewport *> result;
List<Viewport *> 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);
}
}
}