diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2022-01-05 15:32:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-05 15:32:06 +0100 |
commit | bb4157a9afbce9adfa95c69ee20442590d4d66de (patch) | |
tree | 5b89c1fbd6c55465cbf35dadc905e001e9c26bf6 /scene/main | |
parent | 75c06289c40b90275c3d715708e1924d920a8112 (diff) | |
parent | 2db9397fb949086cd403cd6180240334a3272c30 (diff) |
Merge pull request #56519 from RandomShaper/fix_scene_cleared
Diffstat (limited to 'scene/main')
-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); } |