Sfoglia il codice sorgente

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 anni fa
parent
commit
3d08678e13
1 ha cambiato i file con 10 aggiunte e 7 eliminazioni
  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);
 			}
 		}
 	}