From b7e5ea8a398b9b30e5e5c0a984559c9e0e3df491 Mon Sep 17 00:00:00 2001
From: kleonc <9283098+kleonc@users.noreply.github.com>
Date: Fri, 14 Jul 2023 02:18:05 +0200
Subject: [PATCH] Update Y-sort position of the first item in the sorted
subtree
---
doc/classes/CanvasItem.xml | 2 +-
servers/rendering/renderer_canvas_cull.cpp | 6 ++++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml
index 33f6a02c526..769b971a9ab 100644
--- a/doc/classes/CanvasItem.xml
+++ b/doc/classes/CanvasItem.xml
@@ -600,7 +600,7 @@
[b]Note:[/b] For controls that inherit [Popup], the correct way to make them visible is to call one of the multiple [code]popup*()[/code] functions instead.
- If [code]true[/code], child nodes with the lowest Y position are drawn before those with a higher Y position. If [code]false[/code], Y-sorting is disabled. Y-sorting only affects children that inherit from [CanvasItem].
+ If [code]true[/code], this [CanvasItem] and its [CanvasItem] child nodes are sorted according to the Y position. Nodes with a lower Y position are drawn before those with a higher Y position. If [code]false[/code], Y-sorting is disabled.
You can nest nodes with Y-sorting. Child Y-sorted nodes are sorted in the same space as the parent Y-sort. This feature allows you to organize a scene better or divide it into multiple ones without changing your scene tree.
diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp
index 2cb7f32cc30..6e489671c9f 100644
--- a/servers/rendering/renderer_canvas_cull.cpp
+++ b/servers/rendering/renderer_canvas_cull.cpp
@@ -306,12 +306,14 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2
child_item_count = ci->ysort_children_count + 1;
child_items = (Item **)alloca(child_item_count * sizeof(Item *));
+ ci->ysort_xform = ci->xform.affine_inverse();
+ ci->ysort_pos = Vector2();
+ ci->ysort_modulate = Color(1, 1, 1, 1);
+ ci->ysort_index = 0;
ci->ysort_parent_abs_z_index = parent_z;
child_items[0] = ci;
int i = 1;
_collect_ysort_children(ci, Transform2D(), p_material_owner, Color(1, 1, 1, 1), child_items, i, p_z);
- ci->ysort_xform = ci->xform.affine_inverse();
- ci->ysort_modulate = Color(1, 1, 1, 1);
SortArray- sorter;
sorter.sort(child_items, child_item_count);