summaryrefslogtreecommitdiff
path: root/servers/rendering/renderer_viewport.cpp
diff options
context:
space:
mode:
authorZuBsPaCe <kurt.rudin@gmx.net>2022-09-09 11:28:01 +0200
committerZuBsPaCe <kurt.rudin@gmx.net>2022-09-09 17:50:14 +0200
commit3d08678e133d2220531435399e4fed073bfd2ec2 (patch)
treea5f7d693346c1b4ad88d2223aaf61d243033b2c9 /servers/rendering/renderer_viewport.cpp
parent047801693c9f5ad1aeb9b89f46b73828381282ba (diff)
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
Diffstat (limited to 'servers/rendering/renderer_viewport.cpp')
-rw-r--r--servers/rendering/renderer_viewport.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp
index d466f90e79..1e30a7f77e 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::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);
}
}
}