|
@@ -106,12 +106,15 @@ void Spatial::_propagate_transform_changed(Spatial *p_origin) {
|
|
|
|
|
|
data.children_lock++;
|
|
|
|
|
|
- for (List<Spatial *>::Element *E = data.children.front(); E; E = E->next()) {
|
|
|
- if (E->get()->data.toplevel_active) {
|
|
|
- continue; //don't propagate to a toplevel
|
|
|
+ for (uint32_t n = 0; n < data.spatial_children.size(); n++) {
|
|
|
+ Spatial *s = data.spatial_children[n];
|
|
|
+
|
|
|
+ // Don't propagate to a toplevel.
|
|
|
+ if (!s->data.toplevel_active) {
|
|
|
+ s->_propagate_transform_changed(p_origin);
|
|
|
}
|
|
|
- E->get()->_propagate_transform_changed(p_origin);
|
|
|
}
|
|
|
+
|
|
|
#ifdef TOOLS_ENABLED
|
|
|
if ((data.gizmo.is_valid() || data.notify_transform) && !data.ignore_notification && !xform_change.in_list()) {
|
|
|
#else
|
|
@@ -154,10 +157,13 @@ void Spatial::_notification(int p_what) {
|
|
|
}
|
|
|
|
|
|
if (data.parent) {
|
|
|
- data.C = data.parent->data.children.push_back(this);
|
|
|
- } else {
|
|
|
- data.C = nullptr;
|
|
|
+ data.index_in_parent = data.parent->data.spatial_children.size();
|
|
|
+ data.parent->data.spatial_children.push_back(this);
|
|
|
+ } else if (data.index_in_parent != UINT32_MAX) {
|
|
|
+ data.index_in_parent = UINT32_MAX;
|
|
|
+ ERR_PRINT("Spatial ENTER_TREE detected without EXIT_TREE, recovering.");
|
|
|
}
|
|
|
+
|
|
|
_update_visible_in_tree();
|
|
|
|
|
|
if (data.toplevel && !Engine::get_singleton()->is_editor_hint()) {
|
|
@@ -212,11 +218,28 @@ void Spatial::_notification(int p_what) {
|
|
|
if (xform_change.in_list()) {
|
|
|
get_tree()->xform_change_list.remove(&xform_change);
|
|
|
}
|
|
|
- if (data.C) {
|
|
|
- data.parent->data.children.erase(data.C);
|
|
|
+
|
|
|
+ if (data.parent) {
|
|
|
+ if (data.index_in_parent != UINT32_MAX) {
|
|
|
+ // Aliases
|
|
|
+ uint32_t c = data.index_in_parent;
|
|
|
+ LocalVector<Spatial *> &parent_children = data.parent->data.spatial_children;
|
|
|
+
|
|
|
+ parent_children.remove_unordered(c);
|
|
|
+
|
|
|
+ // After unordered remove, we need to inform the moved child
|
|
|
+ // what their new id is in the parent children list.
|
|
|
+ if (parent_children.size() > c) {
|
|
|
+ parent_children[c]->data.index_in_parent = c;
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ ERR_PRINT("CanvasItem index_in_parent unset at EXIT_TREE.");
|
|
|
+ }
|
|
|
}
|
|
|
+ data.index_in_parent = UINT32_MAX;
|
|
|
+
|
|
|
data.parent = nullptr;
|
|
|
- data.C = nullptr;
|
|
|
data.toplevel_active = false;
|
|
|
|
|
|
_update_visible_in_tree();
|
|
@@ -861,12 +884,12 @@ void Spatial::_propagate_visibility_changed() {
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- for (List<Spatial *>::Element *E = data.children.front(); E; E = E->next()) {
|
|
|
- Spatial *c = E->get();
|
|
|
- if (!c || !c->data.visible) {
|
|
|
- continue;
|
|
|
+ for (uint32_t n = 0; n < data.spatial_children.size(); n++) {
|
|
|
+ Spatial *s = data.spatial_children[n];
|
|
|
+
|
|
|
+ if (s->data.visible) {
|
|
|
+ s->_propagate_visibility_changed();
|
|
|
}
|
|
|
- c->_propagate_visibility_changed();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -890,12 +913,9 @@ void Spatial::_propagate_merging_allowed(bool p_merging_allowed) {
|
|
|
|
|
|
data.merging_allowed = p_merging_allowed;
|
|
|
|
|
|
- for (List<Spatial *>::Element *E = data.children.front(); E; E = E->next()) {
|
|
|
- Spatial *c = E->get();
|
|
|
- if (!c) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- c->_propagate_merging_allowed(p_merging_allowed);
|
|
|
+ for (uint32_t n = 0; n < data.spatial_children.size(); n++) {
|
|
|
+ Spatial *s = data.spatial_children[n];
|
|
|
+ s->_propagate_merging_allowed(p_merging_allowed);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1286,7 +1306,6 @@ Spatial::Spatial() :
|
|
|
data.notify_transform_when_fti_off = false;
|
|
|
|
|
|
data.parent = nullptr;
|
|
|
- data.C = nullptr;
|
|
|
}
|
|
|
|
|
|
Spatial::~Spatial() {
|