Browse Source

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
ZuBsPaCe 3 years ago
parent
commit
3d08678e13
1 changed files with 10 additions and 7 deletions
  1. 10 7
      servers/rendering/renderer_viewport.cpp

+ 10 - 7
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);
 			}
 		}
 	}