Browse Source

Remove redundant data.inside_tree

kobewi 3 months ago
parent
commit
34152b3f39
2 changed files with 47 additions and 52 deletions
  1. 44 48
      scene/main/node.cpp
  2. 3 4
      scene/main/node.h

+ 44 - 48
scene/main/node.cpp

@@ -135,15 +135,15 @@ void Node::_notification(int p_notification) {
 
 		case NOTIFICATION_ENTER_TREE: {
 			ERR_FAIL_NULL(get_viewport());
-			ERR_FAIL_NULL(get_tree());
+			ERR_FAIL_NULL(data.tree);
 
-			if (get_tree()->is_accessibility_supported() && !is_part_of_edited_scene()) {
-				get_tree()->_accessibility_force_update();
-				get_tree()->_accessibility_notify_change(this);
+			if (data.tree->is_accessibility_supported() && !is_part_of_edited_scene()) {
+				data.tree->_accessibility_force_update();
+				data.tree->_accessibility_notify_change(this);
 				if (data.parent) {
-					get_tree()->_accessibility_notify_change(data.parent);
+					data.tree->_accessibility_notify_change(data.parent);
 				} else {
-					get_tree()->_accessibility_notify_change(get_window()); // Root node.
+					data.tree->_accessibility_notify_change(get_window()); // Root node.
 				}
 			}
 
@@ -210,7 +210,7 @@ void Node::_notification(int p_notification) {
 				add_to_group("_vp_unhandled_key_input" + itos(get_viewport()->get_instance_id()));
 			}
 
-			get_tree()->nodes_in_tree_count++;
+			data.tree->nodes_in_tree_count++;
 			orphan_node_count--;
 
 		} break;
@@ -223,22 +223,22 @@ void Node::_notification(int p_notification) {
 
 		case NOTIFICATION_EXIT_TREE: {
 			ERR_FAIL_NULL(get_viewport());
-			ERR_FAIL_NULL(get_tree());
+			ERR_FAIL_NULL(data.tree);
 
-			if (get_tree()->is_accessibility_supported() && !is_part_of_edited_scene()) {
+			if (data.tree->is_accessibility_supported() && !is_part_of_edited_scene()) {
 				if (data.accessibility_element.is_valid()) {
 					DisplayServer::get_singleton()->accessibility_free_element(data.accessibility_element);
 					data.accessibility_element = RID();
 				}
-				get_tree()->_accessibility_notify_change(this, true);
+				data.tree->_accessibility_notify_change(this, true);
 				if (data.parent) {
-					get_tree()->_accessibility_notify_change(data.parent);
+					data.tree->_accessibility_notify_change(data.parent);
 				} else {
-					get_tree()->_accessibility_notify_change(get_window()); // Root node.
+					data.tree->_accessibility_notify_change(get_window()); // Root node.
 				}
 			}
 
-			get_tree()->nodes_in_tree_count--;
+			data.tree->nodes_in_tree_count--;
 			orphan_node_count++;
 
 			if (data.input) {
@@ -313,7 +313,7 @@ void Node::_notification(int p_notification) {
 		} break;
 
 		case NOTIFICATION_PREDELETE: {
-			if (data.inside_tree && !Thread::is_main_thread()) {
+			if (data.tree && !Thread::is_main_thread()) {
 				cancel_free();
 				ERR_PRINT("Attempted to free a node that is currently added to the SceneTree from a thread. This is not permitted, use queue_free() instead. Node has not been freed.");
 				return;
@@ -340,7 +340,7 @@ void Node::_notification(int p_notification) {
 		} break;
 
 		case NOTIFICATION_TRANSLATION_CHANGED: {
-			if (data.inside_tree) {
+			if (data.tree) {
 				data.is_auto_translate_dirty = true;
 			}
 		} break;
@@ -380,8 +380,6 @@ void Node::_propagate_enter_tree() {
 		data.viewport = data.parent->data.viewport;
 	}
 
-	data.inside_tree = true;
-
 	for (KeyValue<StringName, GroupData> &E : data.grouped) {
 		E.value.group = data.tree->add_to_group(E.key, this);
 	}
@@ -480,7 +478,6 @@ void Node::_propagate_exit_tree() {
 		data.tree->tree_changed();
 	}
 
-	data.inside_tree = false;
 	data.ready_notified = false;
 	data.tree = nullptr;
 	data.depth = -1;
@@ -531,7 +528,7 @@ void Node::_propagate_physics_interpolation_reset_requested(bool p_requested) {
 }
 
 void Node::move_child(Node *p_child, int p_index) {
-	ERR_FAIL_COND_MSG(data.inside_tree && !Thread::is_main_thread(), "Moving child node positions inside the SceneTree is only allowed from the main thread. Use call_deferred(\"move_child\",child,index).");
+	ERR_FAIL_COND_MSG(data.tree && !Thread::is_main_thread(), "Moving child node positions inside the SceneTree is only allowed from the main thread. Use call_deferred(\"move_child\",child,index).");
 	ERR_FAIL_NULL(p_child);
 	ERR_FAIL_COND_MSG(p_child->data.parent != this, "Child is not a child of this node.");
 
@@ -747,7 +744,7 @@ void Node::set_process_mode(ProcessMode p_mode) {
 	// This is required for the editor to update the visibility of disabled nodes
 	// It's very expensive during runtime to change, so editor-only
 	if (Engine::get_singleton()->is_editor_hint()) {
-		get_tree()->emit_signal(SNAME("tree_process_mode_changed"));
+		data.tree->emit_signal(SNAME("tree_process_mode_changed"));
 	}
 
 	_emit_editor_state_changed();
@@ -914,7 +911,7 @@ Ref<MultiplayerAPI> Node::get_multiplayer() const {
 	if (!is_inside_tree()) {
 		return Ref<MultiplayerAPI>();
 	}
-	return get_tree()->get_multiplayer(get_path());
+	return data.tree->get_multiplayer(get_path());
 }
 
 //////////// end of rpc
@@ -936,7 +933,7 @@ bool Node::can_process_notification(int p_what) const {
 
 bool Node::can_process() const {
 	ERR_FAIL_COND_V(!is_inside_tree(), false);
-	return !get_tree()->is_suspended() && _can_process(get_tree()->is_paused());
+	return !data.tree->is_suspended() && _can_process(data.tree->is_paused());
 }
 
 bool Node::_can_process(bool p_paused) const {
@@ -1098,19 +1095,19 @@ void Node::set_process_internal(bool p_process_internal) {
 }
 
 void Node::_add_process_group() {
-	get_tree()->_add_process_group(this);
+	data.tree->_add_process_group(this);
 }
 
 void Node::_remove_process_group() {
-	get_tree()->_remove_process_group(this);
+	data.tree->_remove_process_group(this);
 }
 
 void Node::_remove_from_process_thread_group() {
-	get_tree()->_remove_node_from_process_group(this, data.process_thread_group_owner);
+	data.tree->_remove_node_from_process_group(this, data.process_thread_group_owner);
 }
 
 void Node::_add_to_process_thread_group() {
-	get_tree()->_add_node_to_process_group(this, data.process_thread_group_owner);
+	data.tree->_add_node_to_process_group(this, data.process_thread_group_owner);
 }
 
 void Node::_remove_tree_from_process_thread_group() {
@@ -1168,7 +1165,7 @@ void Node::set_process_thread_group_order(int p_order) {
 		return;
 	}
 
-	get_tree()->process_groups_dirty = true;
+	data.tree->process_groups_dirty = true;
 }
 
 int Node::get_process_thread_group_order() const {
@@ -1228,7 +1225,7 @@ int Node::get_physics_process_priority() const {
 }
 
 void Node::set_process_thread_group(ProcessThreadGroup p_mode) {
-	ERR_FAIL_COND_MSG(data.inside_tree && !Thread::is_main_thread(), "Changing the process thread group can only be done from the main thread. Use call_deferred(\"set_process_thread_group\",mode).");
+	ERR_FAIL_COND_MSG(data.tree && !Thread::is_main_thread(), "Changing the process thread group can only be done from the main thread. Use call_deferred(\"set_process_thread_group\",mode).");
 	if (data.process_thread_group == p_mode) {
 		return;
 	}
@@ -1370,7 +1367,7 @@ void Node::set_auto_translate_mode(AutoTranslateMode p_mode) {
 		return;
 	}
 
-	if (p_mode == AUTO_TRANSLATE_MODE_INHERIT && data.inside_tree && !data.parent) {
+	if (p_mode == AUTO_TRANSLATE_MODE_INHERIT && data.tree && !data.parent) {
 		ERR_FAIL_MSG("The root node can't be set to Inherit auto translate mode.");
 	}
 
@@ -1549,7 +1546,7 @@ void Node::_set_name_nocheck(const StringName &p_name) {
 }
 
 void Node::set_name(const StringName &p_name) {
-	ERR_FAIL_COND_MSG(data.inside_tree && !Thread::is_main_thread(), "Changing the name to nodes inside the SceneTree is only allowed from the main thread. Use `set_name.call_deferred(new_name)`.");
+	ERR_FAIL_COND_MSG(data.tree && !Thread::is_main_thread(), "Changing the name to nodes inside the SceneTree is only allowed from the main thread. Use `set_name.call_deferred(new_name)`.");
 	const StringName old_name = data.name;
 	{
 		const String input_name_str = String(p_name);
@@ -1580,8 +1577,8 @@ void Node::set_name(const StringName &p_name) {
 
 	if (is_inside_tree()) {
 		emit_signal(SNAME("renamed"));
-		get_tree()->node_renamed(this);
-		get_tree()->tree_changed();
+		data.tree->node_renamed(this);
+		data.tree->tree_changed();
 	}
 }
 
@@ -1810,7 +1807,7 @@ void Node::_add_child_nocheck(Node *p_child, const StringName &p_name, InternalM
 }
 
 void Node::add_child(Node *p_child, bool p_force_readable_name, InternalMode p_internal) {
-	ERR_FAIL_COND_MSG(data.inside_tree && !Thread::is_main_thread(), "Adding children to a node inside the SceneTree is only allowed from the main thread. Use call_deferred(\"add_child\",node).");
+	ERR_FAIL_COND_MSG(data.tree && !Thread::is_main_thread(), "Adding children to a node inside the SceneTree is only allowed from the main thread. Use call_deferred(\"add_child\",node).");
 
 	ERR_THREAD_GUARD
 	ERR_FAIL_NULL(p_child);
@@ -1834,7 +1831,7 @@ void Node::add_child(Node *p_child, bool p_force_readable_name, InternalMode p_i
 }
 
 void Node::add_sibling(Node *p_sibling, bool p_force_readable_name) {
-	ERR_FAIL_COND_MSG(data.inside_tree && !Thread::is_main_thread(), "Adding a sibling to a node inside the SceneTree is only allowed from the main thread. Use call_deferred(\"add_sibling\",node).");
+	ERR_FAIL_COND_MSG(data.tree && !Thread::is_main_thread(), "Adding a sibling to a node inside the SceneTree is only allowed from the main thread. Use call_deferred(\"add_sibling\",node).");
 	ERR_FAIL_NULL(p_sibling);
 	ERR_FAIL_COND_MSG(p_sibling == this, vformat("Can't add sibling '%s' to itself.", p_sibling->get_name())); // adding to itself!
 	ERR_FAIL_NULL(data.parent);
@@ -1846,7 +1843,7 @@ void Node::add_sibling(Node *p_sibling, bool p_force_readable_name) {
 }
 
 void Node::remove_child(Node *p_child) {
-	ERR_FAIL_COND_MSG(data.inside_tree && !Thread::is_main_thread(), "Removing children from a node inside the SceneTree is only allowed from the main thread. Use call_deferred(\"remove_child\",node).");
+	ERR_FAIL_COND_MSG(data.tree && !Thread::is_main_thread(), "Removing children from a node inside the SceneTree is only allowed from the main thread. Use call_deferred(\"remove_child\",node).");
 	ERR_FAIL_NULL(p_child);
 	ERR_FAIL_COND_MSG(data.blocked > 0, "Parent node is busy adding/removing children, `remove_child()` can't be called at this time. Consider using `remove_child.call_deferred(child)` instead.");
 	ERR_FAIL_COND(p_child->data.parent != this);
@@ -1879,7 +1876,7 @@ void Node::remove_child(Node *p_child) {
 	notification(NOTIFICATION_CHILD_ORDER_CHANGED);
 	emit_signal(SNAME("child_order_changed"));
 
-	if (data.inside_tree) {
+	if (data.tree) {
 		p_child->_propagate_after_exit_tree();
 	}
 }
@@ -1972,7 +1969,7 @@ Node *Node::get_node_or_null(const NodePath &p_path) const {
 		return nullptr;
 	}
 
-	ERR_FAIL_COND_V_MSG(!data.inside_tree && p_path.is_absolute(), nullptr, "Can't use get_node() with absolute paths from outside the active scene tree.");
+	ERR_FAIL_COND_V_MSG(!data.tree && p_path.is_absolute(), nullptr, "Can't use get_node() with absolute paths from outside the active scene tree.");
 
 	Node *current = nullptr;
 	Node *root = nullptr;
@@ -2212,8 +2209,8 @@ bool Node::is_ancestor_of(const Node *p_node) const {
 
 bool Node::is_greater_than(const Node *p_node) const {
 	ERR_FAIL_NULL_V(p_node, false);
-	ERR_FAIL_COND_V(!data.inside_tree, false);
-	ERR_FAIL_COND_V(!p_node->data.inside_tree, false);
+	ERR_FAIL_COND_V(!data.tree, false);
+	ERR_FAIL_COND_V(!p_node->data.tree, false);
 
 	ERR_FAIL_COND_V(data.depth < 0, false);
 	ERR_FAIL_COND_V(p_node->data.depth < 0, false);
@@ -2830,8 +2827,8 @@ StringName Node::get_property_store_alias(const StringName &p_property) const {
 }
 
 bool Node::is_part_of_edited_scene() const {
-	return Engine::get_singleton()->is_editor_hint() && is_inside_tree() && get_tree()->get_edited_scene_root() &&
-			get_tree()->get_edited_scene_root()->get_parent()->is_ancestor_of(this);
+	return Engine::get_singleton()->is_editor_hint() && is_inside_tree() && data.tree->get_edited_scene_root() &&
+			data.tree->get_edited_scene_root()->get_parent()->is_ancestor_of(this);
 }
 #endif
 
@@ -3536,8 +3533,8 @@ TypedArray<int> Node::get_orphan_node_ids() {
 void Node::queue_free() {
 	// There are users which instantiate multiple scene trees for their games.
 	// Use the node's own tree to handle its deletion when relevant.
-	if (is_inside_tree()) {
-		get_tree()->queue_delete(this);
+	if (data.tree) {
+		data.tree->queue_delete(this);
 	} else {
 		SceneTree *tree = SceneTree::get_singleton();
 		ERR_FAIL_NULL_MSG(tree, "Can't queue free a node when no SceneTree is available.");
@@ -3623,11 +3620,11 @@ PackedStringArray Node::get_configuration_warnings() const {
 void Node::update_configuration_warnings() {
 	ERR_THREAD_GUARD
 #ifdef TOOLS_ENABLED
-	if (!is_inside_tree()) {
+	if (!data.tree) {
 		return;
 	}
-	if (get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root() == this || get_tree()->get_edited_scene_root()->is_ancestor_of(this))) {
-		get_tree()->emit_signal(SceneStringName(node_configuration_warning_changed), this);
+	if (data.tree->get_edited_scene_root() && (data.tree->get_edited_scene_root() == this || data.tree->get_edited_scene_root()->is_ancestor_of(this))) {
+		data.tree->emit_signal(SceneStringName(node_configuration_warning_changed), this);
 	}
 #endif
 }
@@ -3820,7 +3817,7 @@ String Node::get_accessibility_container_name(const Node *p_node) const {
 
 void Node::queue_accessibility_update() {
 	if (is_inside_tree() && !is_part_of_edited_scene()) {
-		get_tree()->_accessibility_notify_change(this);
+		data.tree->_accessibility_notify_change(this);
 	}
 }
 
@@ -4226,7 +4223,6 @@ Node::Node() {
 	data.display_folded = false;
 	data.editable_instance = false;
 
-	data.inside_tree = false;
 	data.ready_notified = false; // This is a small hack, so if a node is added during _ready() to the tree, it correctly gets the _ready() notification.
 	data.ready_first = true;
 }

+ 3 - 4
scene/main/node.h

@@ -256,7 +256,6 @@ private:
 		bool display_folded : 1;
 		bool editable_instance : 1;
 
-		bool inside_tree : 1;
 		bool ready_notified : 1;
 		bool ready_first : 1;
 
@@ -517,7 +516,7 @@ public:
 		return data.tree;
 	}
 
-	_FORCE_INLINE_ bool is_inside_tree() const { return data.inside_tree; }
+	_FORCE_INLINE_ bool is_inside_tree() const { return data.tree; }
 	bool is_internal() const { return data.internal_mode != INTERNAL_MODE_DISABLED; }
 
 	bool is_ancestor_of(const Node *p_node) const;
@@ -655,7 +654,7 @@ public:
 			// No thread processing.
 			// Only accessible if node is outside the scene tree
 			// or access will happen from a node-safe thread.
-			return !data.inside_tree || is_current_thread_safe_for_nodes();
+			return !data.tree || is_current_thread_safe_for_nodes();
 		} else {
 			// Thread processing.
 			return current_process_thread_group == data.process_thread_group_owner;
@@ -667,7 +666,7 @@ public:
 			// No thread processing.
 			// Only accessible if node is outside the scene tree
 			// or access will happen from a node-safe thread.
-			return is_current_thread_safe_for_nodes() || unlikely(!data.inside_tree);
+			return is_current_thread_safe_for_nodes() || unlikely(!data.tree);
 		} else {
 			// Thread processing.
 			return true;