Kaynağa Gözat

Merge pull request #8031 from RandomShaper/fix-redundant-connections-2.1

Fix redundant connections (2.1)
Rémi Verschelde 8 yıl önce
ebeveyn
işleme
58455f03f7

+ 3 - 0
core/string_db.cpp

@@ -288,6 +288,9 @@ StringName::StringName(const String& p_name) {
 
 	ERR_FAIL_COND(!configured);
 
+	if (p_name.empty())
+		return;
+
 	_global_lock();
 
 	uint32_t hash = p_name.hash();

+ 27 - 20
scene/resources/packed_scene.cpp

@@ -1548,34 +1548,41 @@ Array SceneState::get_connection_binds(int p_idx) const {
 	return binds;
 }
 
-bool SceneState::has_connection(const NodePath& p_node_from, const StringName& p_signal, const NodePath& p_node_to, const StringName& p_method) const {
+bool SceneState::has_connection(const NodePath& p_node_from, const StringName& p_signal, const NodePath& p_node_to, const StringName& p_method) {
 
-	for(int i=0;i<connections.size();i++) {
-		const ConnectionData &c = connections[i];
+	// this method cannot be const because of this
+	Ref<SceneState> ss=this;
 
-		NodePath np_from;
+	do {
+		for(int i=0;i<ss->connections.size();i++) {
+			const ConnectionData &c = ss->connections[i];
 
-		if (c.from&FLAG_ID_IS_PATH) {
-			np_from=node_paths[c.from&FLAG_MASK];
-		} else {
-			np_from=get_node_path(c.from);
-		}
+			NodePath np_from;
 
-		NodePath np_to;
+			if (c.from&FLAG_ID_IS_PATH) {
+				np_from=ss->node_paths[c.from&FLAG_MASK];
+			} else {
+				np_from=ss->get_node_path(c.from);
+			}
 
-		if (c.to&FLAG_ID_IS_PATH) {
-			np_to=node_paths[c.to&FLAG_MASK];
-		} else {
-			np_to=get_node_path(c.to);
-		}
+			NodePath np_to;
 
-		StringName sn_signal=names[c.signal];
-		StringName sn_method=names[c.method];
+			if (c.to&FLAG_ID_IS_PATH) {
+				np_to=ss->node_paths[c.to&FLAG_MASK];
+			} else {
+				np_to=ss->get_node_path(c.to);
+			}
 
-		if (np_from==p_node_from && sn_signal==p_signal && np_to==p_node_to && sn_method==p_method) {
-			return true;
+			StringName sn_signal=ss->names[c.signal];
+			StringName sn_method=ss->names[c.method];
+
+			if (np_from==p_node_from && sn_signal==p_signal && np_to==p_node_to && sn_method==p_method) {
+				return true;
+			}
 		}
-	}
+
+		ss=ss->_get_base_scene_state();
+	} while (ss.is_valid());
 
 	return false;
 }

+ 1 - 1
scene/resources/packed_scene.h

@@ -165,7 +165,7 @@ public:
 	int get_connection_flags(int p_idx) const;
 	Array get_connection_binds(int p_idx) const;
 
-	bool has_connection(const NodePath &p_node_from, const StringName& p_signal, const NodePath &p_node_to, const StringName& p_method) const;
+	bool has_connection(const NodePath &p_node_from, const StringName& p_signal, const NodePath &p_node_to, const StringName& p_method);
 
 	Vector<NodePath> get_editable_instances() const;