You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-12-03 16:55:53 +00:00
Optimize scene tree groups
This commit is contained in:
@@ -246,12 +246,12 @@ void NavMeshGenerator2D::set_generator_parsers(LocalVector<NavMeshGeometryParser
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NavMeshGenerator2D::generator_parse_source_geometry_data(Ref<NavigationPolygon> p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_root_node) {
|
void NavMeshGenerator2D::generator_parse_source_geometry_data(Ref<NavigationPolygon> p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_root_node) {
|
||||||
List<Node *> parse_nodes;
|
Vector<Node *> parse_nodes;
|
||||||
|
|
||||||
if (p_navigation_mesh->get_source_geometry_mode() == NavigationPolygon::SOURCE_GEOMETRY_ROOT_NODE_CHILDREN) {
|
if (p_navigation_mesh->get_source_geometry_mode() == NavigationPolygon::SOURCE_GEOMETRY_ROOT_NODE_CHILDREN) {
|
||||||
parse_nodes.push_back(p_root_node);
|
parse_nodes.push_back(p_root_node);
|
||||||
} else {
|
} else {
|
||||||
p_root_node->get_tree()->get_nodes_in_group(p_navigation_mesh->get_source_geometry_group_name(), &parse_nodes);
|
parse_nodes = p_root_node->get_tree()->get_nodes_in_group(p_navigation_mesh->get_source_geometry_group_name());
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D root_node_transform = Transform2D();
|
Transform2D root_node_transform = Transform2D();
|
||||||
|
|||||||
@@ -278,12 +278,12 @@ void NavMeshGenerator3D::set_generator_parsers(LocalVector<NavMeshGeometryParser
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NavMeshGenerator3D::generator_parse_source_geometry_data(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_root_node) {
|
void NavMeshGenerator3D::generator_parse_source_geometry_data(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_root_node) {
|
||||||
List<Node *> parse_nodes;
|
Vector<Node *> parse_nodes;
|
||||||
|
|
||||||
if (p_navigation_mesh->get_source_geometry_mode() == NavigationMesh::SOURCE_GEOMETRY_ROOT_NODE_CHILDREN) {
|
if (p_navigation_mesh->get_source_geometry_mode() == NavigationMesh::SOURCE_GEOMETRY_ROOT_NODE_CHILDREN) {
|
||||||
parse_nodes.push_back(p_root_node);
|
parse_nodes.push_back(p_root_node);
|
||||||
} else {
|
} else {
|
||||||
p_root_node->get_tree()->get_nodes_in_group(p_navigation_mesh->get_source_group_name(), &parse_nodes);
|
parse_nodes = p_root_node->get_tree()->get_nodes_in_group(p_navigation_mesh->get_source_group_name());
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform3D root_node_transform = Transform3D();
|
Transform3D root_node_transform = Transform3D();
|
||||||
|
|||||||
@@ -117,8 +117,7 @@ PackedStringArray CanvasModulate::get_configuration_warnings() const {
|
|||||||
PackedStringArray warnings = Node2D::get_configuration_warnings();
|
PackedStringArray warnings = Node2D::get_configuration_warnings();
|
||||||
|
|
||||||
if (is_in_canvas && is_visible_in_tree()) {
|
if (is_in_canvas && is_visible_in_tree()) {
|
||||||
List<Node *> nodes;
|
Vector<Node *> nodes = get_tree()->get_nodes_in_group("_canvas_modulate_" + itos(get_canvas().get_id()));
|
||||||
get_tree()->get_nodes_in_group("_canvas_modulate_" + itos(get_canvas().get_id()), &nodes);
|
|
||||||
|
|
||||||
if (nodes.size() > 1) {
|
if (nodes.size() > 1) {
|
||||||
warnings.push_back(RTR("Only one visible CanvasModulate is allowed per canvas.\nWhen there are more than one, only one of them will be active. Which one is undefined."));
|
warnings.push_back(RTR("Only one visible CanvasModulate is allowed per canvas.\nWhen there are more than one, only one of them will be active. Which one is undefined."));
|
||||||
|
|||||||
@@ -1565,22 +1565,20 @@ Node *SceneTree::get_first_node_in_group(const StringName &p_group) {
|
|||||||
return E->value.nodes[0];
|
return E->value.nodes[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneTree::get_nodes_in_group(const StringName &p_group, List<Node *> *p_list) {
|
Vector<Node *> SceneTree::get_nodes_in_group(const StringName &p_group) {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
HashMap<StringName, Group>::Iterator E = group_map.find(p_group);
|
HashMap<StringName, Group>::Iterator E = group_map.find(p_group);
|
||||||
if (!E) {
|
if (!E) {
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
_update_group_order(E->value); //update order just in case
|
_update_group_order(E->value); //update order just in case
|
||||||
int nc = E->value.nodes.size();
|
int nc = E->value.nodes.size();
|
||||||
if (nc == 0) {
|
if (nc == 0) {
|
||||||
return;
|
return {};
|
||||||
}
|
|
||||||
Node **ptr = E->value.nodes.ptrw();
|
|
||||||
for (int i = 0; i < nc; i++) {
|
|
||||||
p_list->push_back(ptr[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return E->value.nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneTree::_flush_delete_queue() {
|
void SceneTree::_flush_delete_queue() {
|
||||||
|
|||||||
@@ -408,7 +408,7 @@ public:
|
|||||||
|
|
||||||
void queue_delete(Object *p_object);
|
void queue_delete(Object *p_object);
|
||||||
|
|
||||||
void get_nodes_in_group(const StringName &p_group, List<Node *> *p_list);
|
Vector<Node *> get_nodes_in_group(const StringName &p_group);
|
||||||
Node *get_first_node_in_group(const StringName &p_group);
|
Node *get_first_node_in_group(const StringName &p_group);
|
||||||
bool has_group(const StringName &p_identifier) const;
|
bool has_group(const StringName &p_identifier) const;
|
||||||
int get_node_count_in_group(const StringName &p_group) const;
|
int get_node_count_in_group(const StringName &p_group) const;
|
||||||
|
|||||||
@@ -226,8 +226,7 @@ void ShaderGlobalsOverride::_get_property_list(List<PropertyInfo> *p_list) const
|
|||||||
|
|
||||||
void ShaderGlobalsOverride::_activate() {
|
void ShaderGlobalsOverride::_activate() {
|
||||||
ERR_FAIL_NULL(get_tree());
|
ERR_FAIL_NULL(get_tree());
|
||||||
List<Node *> nodes;
|
Vector<Node *> nodes = get_tree()->get_nodes_in_group(SceneStringName(shader_overrides_group_active));
|
||||||
get_tree()->get_nodes_in_group(SceneStringName(shader_overrides_group_active), &nodes);
|
|
||||||
if (nodes.is_empty()) {
|
if (nodes.is_empty()) {
|
||||||
//good we are the only override, enable all
|
//good we are the only override, enable all
|
||||||
active = true;
|
active = true;
|
||||||
|
|||||||
@@ -4302,8 +4302,7 @@ Camera2D *Viewport::get_camera_2d() const {
|
|||||||
|
|
||||||
void Viewport::assign_next_enabled_camera_2d(const StringName &p_camera_group) {
|
void Viewport::assign_next_enabled_camera_2d(const StringName &p_camera_group) {
|
||||||
ERR_MAIN_THREAD_GUARD;
|
ERR_MAIN_THREAD_GUARD;
|
||||||
List<Node *> camera_list;
|
Vector<Node *> camera_list = get_tree()->get_nodes_in_group(p_camera_group);
|
||||||
get_tree()->get_nodes_in_group(p_camera_group, &camera_list);
|
|
||||||
|
|
||||||
Camera2D *new_camera = nullptr;
|
Camera2D *new_camera = nullptr;
|
||||||
for (Node *E : camera_list) {
|
for (Node *E : camera_list) {
|
||||||
|
|||||||
@@ -160,16 +160,15 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a very simple scene tr
|
|||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("Node should be accessible via group") {
|
SUBCASE("Node should be accessible via group") {
|
||||||
List<Node *> nodes;
|
Vector<Node *> nodes = SceneTree::get_singleton()->get_nodes_in_group("nodes");
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("nodes", &nodes);
|
|
||||||
CHECK(nodes.is_empty());
|
CHECK(nodes.is_empty());
|
||||||
|
|
||||||
node->add_to_group("nodes");
|
node->add_to_group("nodes");
|
||||||
|
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("nodes", &nodes);
|
nodes = SceneTree::get_singleton()->get_nodes_in_group("nodes");
|
||||||
CHECK_EQ(nodes.size(), 1);
|
CHECK_EQ(nodes.size(), 1);
|
||||||
List<Node *>::Element *E = nodes.front();
|
Node *E = nodes.get(0);
|
||||||
CHECK_EQ(E->get(), node);
|
CHECK_EQ(E, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("Node should be possible to find") {
|
SUBCASE("Node should be possible to find") {
|
||||||
@@ -394,11 +393,10 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple
|
|||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("Nodes should be accessible via their groups") {
|
SUBCASE("Nodes should be accessible via their groups") {
|
||||||
List<Node *> nodes;
|
Vector<Node *> nodes = SceneTree::get_singleton()->get_nodes_in_group("nodes");
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("nodes", &nodes);
|
|
||||||
CHECK(nodes.is_empty());
|
CHECK(nodes.is_empty());
|
||||||
|
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("other_nodes", &nodes);
|
nodes = SceneTree::get_singleton()->get_nodes_in_group("other_nodes");
|
||||||
CHECK(nodes.is_empty());
|
CHECK(nodes.is_empty());
|
||||||
|
|
||||||
node1->add_to_group("nodes");
|
node1->add_to_group("nodes");
|
||||||
@@ -406,34 +404,34 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple
|
|||||||
node1_1->add_to_group("nodes");
|
node1_1->add_to_group("nodes");
|
||||||
node1_1->add_to_group("other_nodes");
|
node1_1->add_to_group("other_nodes");
|
||||||
|
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("nodes", &nodes);
|
nodes = SceneTree::get_singleton()->get_nodes_in_group("nodes");
|
||||||
CHECK_EQ(nodes.size(), 2);
|
CHECK_EQ(nodes.size(), 2);
|
||||||
|
|
||||||
List<Node *>::Element *E = nodes.front();
|
Node *E = nodes.get(0);
|
||||||
CHECK_EQ(E->get(), node1);
|
CHECK_EQ(E, node1);
|
||||||
E = E->next();
|
E = nodes.get(1);
|
||||||
CHECK_EQ(E->get(), node1_1);
|
CHECK_EQ(E, node1_1);
|
||||||
|
|
||||||
// Clear and try again with the other group.
|
// Clear and try again with the other group.
|
||||||
nodes.clear();
|
nodes.clear();
|
||||||
|
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("other_nodes", &nodes);
|
nodes = SceneTree::get_singleton()->get_nodes_in_group("other_nodes");
|
||||||
CHECK_EQ(nodes.size(), 2);
|
CHECK_EQ(nodes.size(), 2);
|
||||||
|
|
||||||
E = nodes.front();
|
E = nodes.get(0);
|
||||||
CHECK_EQ(E->get(), node1_1);
|
CHECK_EQ(E, node1_1);
|
||||||
E = E->next();
|
E = nodes.get(1);
|
||||||
CHECK_EQ(E->get(), node2);
|
CHECK_EQ(E, node2);
|
||||||
|
|
||||||
// Clear and try again with the other group and one node removed.
|
// Clear and try again with the other group and one node removed.
|
||||||
nodes.clear();
|
nodes.clear();
|
||||||
|
|
||||||
node1->remove_from_group("nodes");
|
node1->remove_from_group("nodes");
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("nodes", &nodes);
|
nodes = SceneTree::get_singleton()->get_nodes_in_group("nodes");
|
||||||
CHECK_EQ(nodes.size(), 1);
|
CHECK_EQ(nodes.size(), 1);
|
||||||
|
|
||||||
E = nodes.front();
|
E = nodes.get(0);
|
||||||
CHECK_EQ(E->get(), node1_1);
|
CHECK_EQ(E, node1_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("Nodes added as siblings of another node should be right next to it") {
|
SUBCASE("Nodes added as siblings of another node should be right next to it") {
|
||||||
@@ -472,12 +470,11 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple
|
|||||||
node1->add_to_group("nodes");
|
node1->add_to_group("nodes");
|
||||||
node1->replace_by(node2, true);
|
node1->replace_by(node2, true);
|
||||||
|
|
||||||
List<Node *> nodes;
|
Vector<Node *> nodes = SceneTree::get_singleton()->get_nodes_in_group("nodes");
|
||||||
SceneTree::get_singleton()->get_nodes_in_group("nodes", &nodes);
|
|
||||||
CHECK_EQ(nodes.size(), 1);
|
CHECK_EQ(nodes.size(), 1);
|
||||||
|
|
||||||
List<Node *>::Element *E = nodes.front();
|
Node *E = nodes.get(0);
|
||||||
CHECK_EQ(E->get(), node2);
|
CHECK_EQ(E, node2);
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("Duplicating a node should also duplicate the children") {
|
SUBCASE("Duplicating a node should also duplicate the children") {
|
||||||
|
|||||||
Reference in New Issue
Block a user