summaryrefslogtreecommitdiff
path: root/scene
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2022-01-05 14:00:04 +0100
committerPedro J. Estébanez <pedrojrulez@gmail.com>2022-01-05 14:00:49 +0100
commit2db9397fb949086cd403cd6180240334a3272c30 (patch)
tree59044f9f9f8574e11b9510656e4b96520d43313c /scene
parentd2ac67d55e693e26b1927ca25b9b1037acb1a256 (diff)
Clear only owners that are no longer in the same tree
Diffstat (limited to 'scene')
-rw-r--r--scene/main/node.cpp21
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);
}