diff options
author | Pedro J. Estébanez <pedrojrulez@gmail.com> | 2022-01-05 14:00:04 +0100 |
---|---|---|
committer | Pedro J. Estébanez <pedrojrulez@gmail.com> | 2022-01-05 14:00:49 +0100 |
commit | 2db9397fb949086cd403cd6180240334a3272c30 (patch) | |
tree | 59044f9f9f8574e11b9510656e4b96520d43313c /scene | |
parent | d2ac67d55e693e26b1927ca25b9b1037acb1a256 (diff) |
Clear only owners that are no longer in the same tree
Diffstat (limited to 'scene')
-rw-r--r-- | scene/main/node.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp index bec01762d8..8b5883a742 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -229,15 +229,32 @@ void Node::_propagate_enter_tree() { } void Node::_propagate_after_exit_tree() { + // Clear owner if it was not part of the pruned branch if (data.owner) { - data.owner->data.owned.erase(data.OW); - data.owner = nullptr; + bool found = false; + Node *parent = data.parent; + + while (parent) { + if (parent == data.owner) { + found = true; + break; + } + + parent = parent->data.parent; + } + + if (!found) { + data.owner->data.owned.erase(data.OW); + data.owner = nullptr; + } } + data.blocked++; for (int i = data.children.size() - 1; i >= 0; i--) { data.children[i]->_propagate_after_exit_tree(); } data.blocked--; + emit_signal(SceneStringNames::get_singleton()->tree_exited); } |