Explorar el Código

Merge pull request #95420 from TokisanGames/fix-crash-selecting-notdescendant

Fix crash by ensuring selected node is a descendant of the edited scene
Rémi Verschelde hace 1 año
padre
commit
45342d06a6
Se han modificado 1 ficheros con 11 adiciones y 9 borrados
  1. 11 9
      editor/plugins/node_3d_editor_plugin.cpp

+ 11 - 9
editor/plugins/node_3d_editor_plugin.cpp

@@ -1064,21 +1064,23 @@ void Node3DEditorViewport::_select_region() {
 		if (found_nodes.has(sp)) {
 			continue;
 		}
-
 		found_nodes.insert(sp);
 
 		Node *node = Object::cast_to<Node>(sp);
+
+		// Selection requires that the node is the edited scene or its descendant, and has an owner.
 		if (node != edited_scene) {
+			if (!node->get_owner() || !edited_scene->is_ancestor_of(node)) {
+				continue;
+			}
 			node = edited_scene->get_deepest_editable_node(node);
-		}
-
-		// Prevent selection of nodes not owned by the edited scene.
-		while (node && node != edited_scene->get_parent()) {
-			Node *node_owner = node->get_owner();
-			if (node_owner == edited_scene || node == edited_scene || (node_owner != nullptr && edited_scene->is_editable_instance(node_owner))) {
-				break;
+			while (node != edited_scene) {
+				Node *node_owner = node->get_owner();
+				if (node_owner == edited_scene || (node_owner != nullptr && edited_scene->is_editable_instance(node_owner))) {
+					break;
+				}
+				node = node->get_parent();
 			}
-			node = node->get_parent();
 		}
 
 		// Replace the node by the group if grouped