Browse Source

Do not YSort canvas items that are not visible

Fixes an issue with nested YSorts not regarding visibility
Bojidar Marinov 6 years ago
parent
commit
11e62cdc79
1 changed files with 14 additions and 8 deletions
  1. 14 8
      servers/visual/visual_server_canvas.cpp

+ 14 - 8
servers/visual/visual_server_canvas.cpp

@@ -55,16 +55,18 @@ void _collect_ysort_children(VisualServerCanvas::Item *p_canvas_item, Transform2
 	int child_item_count = p_canvas_item->child_items.size();
 	VisualServerCanvas::Item **child_items = p_canvas_item->child_items.ptrw();
 	for (int i = 0; i < child_item_count; i++) {
-		if (r_items) {
-			r_items[r_index] = child_items[i];
-			child_items[i]->ysort_xform = p_transform;
-			child_items[i]->ysort_pos = p_transform.xform(child_items[i]->xform.elements[2]);
-		}
+		if (child_items[i]->visible) {
+			if (r_items) {
+				r_items[r_index] = child_items[i];
+				child_items[i]->ysort_xform = p_transform;
+				child_items[i]->ysort_pos = p_transform.xform(child_items[i]->xform.elements[2]);
+			}
 
-		r_index++;
+			r_index++;
 
-		if (child_items[i]->sort_y)
-			_collect_ysort_children(child_items[i], p_transform * child_items[i]->xform, r_items, r_index);
+			if (child_items[i]->sort_y)
+				_collect_ysort_children(child_items[i], p_transform * child_items[i]->xform, r_items, r_index);
+		}
 	}
 }
 
@@ -393,6 +395,10 @@ void VisualServerCanvas::canvas_item_set_visible(RID p_item, bool p_visible) {
 	ERR_FAIL_COND(!canvas_item);
 
 	canvas_item->visible = p_visible;
+
+	if (canvas_item->parent.is_valid() && canvas_item_owner.owns(canvas_item->parent)) {
+		_mark_ysort_dirty(canvas_item_owner.get(canvas_item->parent), canvas_item_owner);
+	}
 }
 void VisualServerCanvas::canvas_item_set_light_mask(RID p_item, int p_mask) {