Skip to content

Commit

Permalink
Merge pull request godotengine#65579 from ZuBsPaCe/fix-viewport-sibli…
Browse files Browse the repository at this point in the history
…ng-order

Sibling SubViewports must be rendered from top to bottom
  • Loading branch information
akien-mga committed Sep 13, 2022
2 parents ff824b6 + 3d08678 commit 22a09fe
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions servers/rendering/renderer_viewport.cpp
Expand Up @@ -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);
}
}
}
Expand Down

0 comments on commit 22a09fe

Please sign in to comment.