aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/string_db.cpp3
-rw-r--r--scene/main/node.cpp3
-rw-r--r--scene/resources/packed_scene.cpp47
-rw-r--r--scene/resources/packed_scene.h2
4 files changed, 34 insertions, 21 deletions
diff --git a/core/string_db.cpp b/core/string_db.cpp
index 02e0b5b26..6cd9ee506 100644
--- a/core/string_db.cpp
+++ b/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();
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index 92caeae95..5b2879dee 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -1080,6 +1080,9 @@ void Node::get_owned_by(Node *p_by,List<Node*> *p_owned) {
void Node::_set_owner_nocheck(Node* p_owner) {
+ if (data.owner==p_owner)
+ return;
+
ERR_FAIL_COND(data.owner);
data.owner=p_owner;
data.owner->data.owned.push_back( this );
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp
index f320570c2..3bbe5e13b 100644
--- a/scene/resources/packed_scene.cpp
+++ b/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;
}
diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h
index aedc4d70d..c7c30354e 100644
--- a/scene/resources/packed_scene.h
+++ b/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;