From 4d76c197a7856ae35833c39cd1af7bb832148fad Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Sat, 5 Apr 2025 22:50:48 +0200 Subject: [PATCH] Make navigation maps emit map_changed directly Makes navigation maps emit map_changed directly. --- .../navigation_2d/2d/godot_navigation_server_2d.cpp | 12 ------------ .../navigation_2d/2d/godot_navigation_server_2d.h | 1 - modules/navigation_2d/nav_map_2d.cpp | 3 +++ .../navigation_3d/3d/godot_navigation_server_3d.cpp | 12 ------------ .../navigation_3d/3d/godot_navigation_server_3d.h | 1 - modules/navigation_3d/nav_map_3d.cpp | 3 +++ 6 files changed, 6 insertions(+), 26 deletions(-) diff --git a/modules/navigation_2d/2d/godot_navigation_server_2d.cpp b/modules/navigation_2d/2d/godot_navigation_server_2d.cpp index a3caf0a889b..10fd97b3106 100644 --- a/modules/navigation_2d/2d/godot_navigation_server_2d.cpp +++ b/modules/navigation_2d/2d/godot_navigation_server_2d.cpp @@ -293,13 +293,11 @@ COMMAND_2(map_set_active, RID, p_map, bool, p_active) { if (p_active) { if (!map_is_active(p_map)) { active_maps.push_back(map); - active_maps_iteration_id.push_back(map->get_iteration_id()); } } else { int map_index = active_maps.find(map); ERR_FAIL_COND(map_index < 0); active_maps.remove_at(map_index); - active_maps_iteration_id.remove_at(map_index); } } @@ -1192,7 +1190,6 @@ COMMAND_1(free, RID, p_object) { int map_index = active_maps.find(map); if (map_index >= 0) { active_maps.remove_at(map_index); - active_maps_iteration_id.remove_at(map_index); } map_owner.free(p_object); @@ -1288,8 +1285,6 @@ void GodotNavigationServer2D::physics_process(double p_delta_time) { int _new_pm_edge_free_count = 0; int _new_pm_obstacle_count = 0; - // In c++ we can't be sure that this is performed in the main thread - // even with mutable functions. MutexLock lock(operations_mutex); for (uint32_t i(0); i < active_maps.size(); i++) { active_maps[i]->sync(); @@ -1305,13 +1300,6 @@ void GodotNavigationServer2D::physics_process(double p_delta_time) { _new_pm_edge_connection_count += active_maps[i]->get_pm_edge_connection_count(); _new_pm_edge_free_count += active_maps[i]->get_pm_edge_free_count(); _new_pm_obstacle_count += active_maps[i]->get_pm_obstacle_count(); - - // Emit a signal if a map changed. - const uint32_t new_map_iteration_id = active_maps[i]->get_iteration_id(); - if (new_map_iteration_id != active_maps_iteration_id[i]) { - emit_signal(SNAME("map_changed"), active_maps[i]->get_self()); - active_maps_iteration_id[i] = new_map_iteration_id; - } } pm_region_count = _new_pm_region_count; diff --git a/modules/navigation_2d/2d/godot_navigation_server_2d.h b/modules/navigation_2d/2d/godot_navigation_server_2d.h index 8398d3cdae5..249b758107d 100644 --- a/modules/navigation_2d/2d/godot_navigation_server_2d.h +++ b/modules/navigation_2d/2d/godot_navigation_server_2d.h @@ -84,7 +84,6 @@ class GodotNavigationServer2D : public NavigationServer2D { bool active = true; LocalVector active_maps; - LocalVector active_maps_iteration_id; #ifdef CLIPPER2_ENABLED NavMeshGenerator2D *navmesh_generator_2d = nullptr; diff --git a/modules/navigation_2d/nav_map_2d.cpp b/modules/navigation_2d/nav_map_2d.cpp index 9673f4861a0..c2020d92d04 100644 --- a/modules/navigation_2d/nav_map_2d.cpp +++ b/modules/navigation_2d/nav_map_2d.cpp @@ -40,6 +40,7 @@ #include "core/config/project_settings.h" #include "core/object/worker_thread_pool.h" +#include "servers/navigation_server_2d.h" #include @@ -418,6 +419,8 @@ void NavMap2D::sync() { } if (iteration_ready) { _sync_iteration(); + + NavigationServer2D::get_singleton()->emit_signal(SNAME("map_changed"), get_self()); } map_settings_dirty = false; diff --git a/modules/navigation_3d/3d/godot_navigation_server_3d.cpp b/modules/navigation_3d/3d/godot_navigation_server_3d.cpp index 4fd569e7267..ca312cd1884 100644 --- a/modules/navigation_3d/3d/godot_navigation_server_3d.cpp +++ b/modules/navigation_3d/3d/godot_navigation_server_3d.cpp @@ -120,13 +120,11 @@ COMMAND_2(map_set_active, RID, p_map, bool, p_active) { if (p_active) { if (!map_is_active(p_map)) { active_maps.push_back(map); - active_maps_iteration_id.push_back(map->get_iteration_id()); } } else { int map_index = active_maps.find(map); ERR_FAIL_COND(map_index < 0); active_maps.remove_at(map_index); - active_maps_iteration_id.remove_at(map_index); } } @@ -1224,7 +1222,6 @@ COMMAND_1(free, RID, p_object) { int map_index = active_maps.find(map); if (map_index >= 0) { active_maps.remove_at(map_index); - active_maps_iteration_id.remove_at(map_index); } map_owner.free(p_object); @@ -1369,8 +1366,6 @@ void GodotNavigationServer3D::physics_process(double p_delta_time) { int _new_pm_edge_free_count = 0; int _new_pm_obstacle_count = 0; - // In c++ we can't be sure that this is performed in the main thread - // even with mutable functions. MutexLock lock(operations_mutex); for (uint32_t i(0); i < active_maps.size(); i++) { active_maps[i]->sync(); @@ -1386,13 +1381,6 @@ void GodotNavigationServer3D::physics_process(double p_delta_time) { _new_pm_edge_connection_count += active_maps[i]->get_pm_edge_connection_count(); _new_pm_edge_free_count += active_maps[i]->get_pm_edge_free_count(); _new_pm_obstacle_count += active_maps[i]->get_pm_obstacle_count(); - - // Emit a signal if a map changed. - const uint32_t new_map_iteration_id = active_maps[i]->get_iteration_id(); - if (new_map_iteration_id != active_maps_iteration_id[i]) { - emit_signal(SNAME("map_changed"), active_maps[i]->get_self()); - active_maps_iteration_id[i] = new_map_iteration_id; - } } pm_region_count = _new_pm_region_count; diff --git a/modules/navigation_3d/3d/godot_navigation_server_3d.h b/modules/navigation_3d/3d/godot_navigation_server_3d.h index 35b905365d5..b1f9a746462 100644 --- a/modules/navigation_3d/3d/godot_navigation_server_3d.h +++ b/modules/navigation_3d/3d/godot_navigation_server_3d.h @@ -79,7 +79,6 @@ class GodotNavigationServer3D : public NavigationServer3D { bool active = true; LocalVector active_maps; - LocalVector active_maps_iteration_id; NavMeshGenerator3D *navmesh_generator_3d = nullptr; diff --git a/modules/navigation_3d/nav_map_3d.cpp b/modules/navigation_3d/nav_map_3d.cpp index 0ccbab23007..518c84c53fd 100644 --- a/modules/navigation_3d/nav_map_3d.cpp +++ b/modules/navigation_3d/nav_map_3d.cpp @@ -40,6 +40,7 @@ #include "core/config/project_settings.h" #include "core/object/worker_thread_pool.h" +#include "servers/navigation_server_3d.h" #include @@ -474,6 +475,8 @@ void NavMap3D::sync() { } if (iteration_ready) { _sync_iteration(); + + NavigationServer3D::get_singleton()->emit_signal(SNAME("map_changed"), get_self()); } map_settings_dirty = false;