2
0
Эх сурвалжийг харах

Merge pull request #20587 from groud/fix_2deditor_scrollable_zone

Fixes bugs on the 2D editor scrollable area
Rémi Verschelde 7 жил өмнө
parent
commit
2062d6126d

+ 17 - 43
editor/plugins/canvas_item_editor_plugin.cpp

@@ -375,33 +375,24 @@ Rect2 CanvasItemEditor::_get_encompassing_rect_from_list(List<CanvasItem *> p_li
 
 	// Handles the first element
 	CanvasItem *canvas_item = p_list.front()->get();
-	Rect2 rect;
-	if (canvas_item->_edit_use_rect()) {
-		rect = Rect2(canvas_item->get_global_transform_with_canvas().xform(canvas_item->_edit_get_rect().position + canvas_item->_edit_get_rect().size / 2), Size2());
-	} else {
-		rect = Rect2(canvas_item->get_global_transform_with_canvas().xform(Point2()), Size2());
-	}
+	Rect2 rect = Rect2(canvas_item->get_global_transform_with_canvas().xform(canvas_item->_edit_get_rect().position + canvas_item->_edit_get_rect().size / 2), Size2());
 
 	// Expand with the other ones
 	for (List<CanvasItem *>::Element *E = p_list.front(); E; E = E->next()) {
 		CanvasItem *canvas_item = E->get();
 		Transform2D xform = canvas_item->get_global_transform_with_canvas();
-		if (canvas_item->_edit_use_rect()) {
-			Rect2 current_rect = canvas_item->_edit_get_rect();
 
-			rect.expand_to(xform.xform(current_rect.position));
-			rect.expand_to(xform.xform(current_rect.position + Vector2(current_rect.size.x, 0)));
-			rect.expand_to(xform.xform(current_rect.position + current_rect.size));
-			rect.expand_to(xform.xform(current_rect.position + Vector2(0, current_rect.size.y)));
-		} else {
-			rect.expand_to(xform.xform(Point2()));
-		}
+		Rect2 current_rect = canvas_item->_edit_get_rect();
+		rect.expand_to(xform.xform(current_rect.position));
+		rect.expand_to(xform.xform(current_rect.position + Vector2(current_rect.size.x, 0)));
+		rect.expand_to(xform.xform(current_rect.position + current_rect.size));
+		rect.expand_to(xform.xform(current_rect.position + Vector2(0, current_rect.size.y)));
 	}
 
 	return rect;
 }
 
-void CanvasItemEditor::_expand_encompassing_rect_using_children(Rect2 &r_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) {
+void CanvasItemEditor::_expand_encompassing_rect_using_children(Rect2 &r_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, bool include_locked_nodes) {
 	if (!p_node)
 		return;
 	if (Object::cast_to<Viewport>(p_node))
@@ -409,12 +400,6 @@ void CanvasItemEditor::_expand_encompassing_rect_using_children(Rect2 &r_rect, c
 
 	const CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
 
-	/*bool inherited = p_node != get_tree()->get_edited_scene_root() && p_node->get_filename() != "";
-	bool editable = !inherited || EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(p_node);
-	bool lock_children = p_node->has_meta("_edit_group_") && p_node->get_meta("_edit_group_");
-
-	if (!lock_children && editable) {}*/
-
 	for (int i = p_node->get_child_count() - 1; i >= 0; i--) {
 		if (canvas_item && !canvas_item->is_set_as_toplevel()) {
 			_expand_encompassing_rect_using_children(r_rect, p_node->get_child(i), r_first, p_parent_xform * canvas_item->get_transform(), p_canvas_xform);
@@ -424,28 +409,17 @@ void CanvasItemEditor::_expand_encompassing_rect_using_children(Rect2 &r_rect, c
 		}
 	}
 
-	if (canvas_item && canvas_item->is_visible_in_tree() && !canvas_item->has_meta("_edit_lock_")) {
+	if (canvas_item && canvas_item->is_visible_in_tree() && (include_locked_nodes || !canvas_item->has_meta("_edit_lock_"))) {
 		Transform2D xform = p_parent_xform * p_canvas_xform * canvas_item->get_transform();
-		if (canvas_item->_edit_use_rect()) {
-			Rect2 rect = canvas_item->_edit_get_rect();
-			if (r_first) {
-				r_rect = Rect2(xform.xform(rect.position + rect.size / 2), Size2());
-				r_first = false;
-			}
-			if (r_rect.size != Size2()) {
-				r_rect.expand_to(xform.xform(rect.position));
-				r_rect.expand_to(xform.xform(rect.position + Point2(rect.size.x, 0)));
-				r_rect.expand_to(xform.xform(rect.position + Point2(0, rect.size.y)));
-				r_rect.expand_to(xform.xform(rect.position + rect.size));
-			}
-		} else {
-			if (r_first) {
-				r_rect = Rect2(xform.xform(Point2()), Size2());
-				r_first = false;
-			} else {
-				r_rect.expand_to(xform.xform(Point2()));
-			}
-		}
+		Rect2 rect = canvas_item->_edit_get_rect();
+		if (r_first) {
+			r_rect = Rect2(xform.xform(rect.position + rect.size / 2), Size2());
+			r_first = false;
+		}
+		r_rect.expand_to(xform.xform(rect.position));
+		r_rect.expand_to(xform.xform(rect.position + Point2(rect.size.x, 0)));
+		r_rect.expand_to(xform.xform(rect.position + Point2(0, rect.size.y)));
+		r_rect.expand_to(xform.xform(rect.position + rect.size));
 	}
 }
 

+ 1 - 1
editor/plugins/canvas_item_editor_plugin.h

@@ -390,7 +390,7 @@ class CanvasItemEditor : public VBoxContainer {
 
 	List<CanvasItem *> _get_edited_canvas_items(bool retreive_locked = false, bool remove_canvas_item_if_parent_in_selection = true);
 	Rect2 _get_encompassing_rect_from_list(List<CanvasItem *> p_list);
-	void _expand_encompassing_rect_using_children(Rect2 &p_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
+	void _expand_encompassing_rect_using_children(Rect2 &p_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D(), bool include_locked_nodes = true);
 	Rect2 _get_encompassing_rect(const Node *p_node);
 
 	Object *_get_editor_data(Object *p_what);

+ 6 - 5
scene/2d/tile_map.cpp

@@ -631,11 +631,7 @@ void TileMap::_recompute_rect_cache() {
 			r_total = r_total.merge(r);
 	}
 
-	if (r_total == Rect2()) {
-		rect_cache = Rect2(-10, -10, 20, 20);
-	} else {
-		rect_cache = r_total.grow(MAX(cell_size.x, cell_size.y) * _get_quadrant_size());
-	}
+	rect_cache = r_total;
 
 	item_rect_changed();
 
@@ -1152,6 +1148,11 @@ PoolVector<int> TileMap::_get_tile_data() const {
 	return data;
 }
 
+Rect2 TileMap::_edit_get_rect() const {
+	const_cast<TileMap *>(this)->update_dirty_quadrants();
+	return rect_cache;
+}
+
 void TileMap::set_collision_layer(uint32_t p_layer) {
 
 	collision_layer = p_layer;

+ 2 - 0
scene/2d/tile_map.h

@@ -223,6 +223,8 @@ public:
 		INVALID_CELL = -1
 	};
 
+	virtual Rect2 _edit_get_rect() const;
+
 	void set_tileset(const Ref<TileSet> &p_tileset);
 	Ref<TileSet> get_tileset() const;