From b002ade3ed0dab2f0175c1b0f5455b151e38779d Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Fri, 25 Apr 2025 20:48:25 +0200 Subject: [PATCH] Add function to get navigation link iteration id from NavigationServer Adds function to get navigation link iteration id from NavigationServer. --- doc/classes/NavigationServer2D.xml | 8 ++++++++ doc/classes/NavigationServer3D.xml | 8 ++++++++ modules/navigation_2d/2d/godot_navigation_server_2d.cpp | 7 +++++++ modules/navigation_2d/2d/godot_navigation_server_2d.h | 1 + modules/navigation_2d/nav_link_2d.cpp | 4 ++++ modules/navigation_2d/nav_link_2d.h | 4 ++++ modules/navigation_3d/3d/godot_navigation_server_3d.cpp | 7 +++++++ modules/navigation_3d/3d/godot_navigation_server_3d.h | 1 + modules/navigation_3d/nav_link_3d.cpp | 4 ++++ modules/navigation_3d/nav_link_3d.h | 4 ++++ servers/navigation_server_2d.cpp | 1 + servers/navigation_server_2d.h | 1 + servers/navigation_server_2d_dummy.h | 1 + servers/navigation_server_3d.cpp | 1 + servers/navigation_server_3d.h | 1 + servers/navigation_server_3d_dummy.h | 1 + 16 files changed, 54 insertions(+) diff --git a/doc/classes/NavigationServer2D.xml b/doc/classes/NavigationServer2D.xml index f486c79823a..2257f1e5039 100644 --- a/doc/classes/NavigationServer2D.xml +++ b/doc/classes/NavigationServer2D.xml @@ -344,6 +344,14 @@ Returns the enter cost of this [param link]. + + + + + Returns the current iteration ID of the navigation link. Every time the navigation link changes and synchronizes, the iteration ID increases. An iteration ID of [code]0[/code] means the navigation link has never synchronized. + [b]Note:[/b] The iteration ID will wrap around to [code]1[/code] after reaching its range limit. + + diff --git a/doc/classes/NavigationServer3D.xml b/doc/classes/NavigationServer3D.xml index 8349fe19905..07ec3203a6e 100644 --- a/doc/classes/NavigationServer3D.xml +++ b/doc/classes/NavigationServer3D.xml @@ -376,6 +376,14 @@ Returns the enter cost of this [param link]. + + + + + Returns the current iteration ID of the navigation link. Every time the navigation link changes and synchronizes, the iteration ID increases. An iteration ID of [code]0[/code] means the navigation link has never synchronized. + [b]Note:[/b] The iteration ID will wrap around to [code]1[/code] after reaching its range limit. + + diff --git a/modules/navigation_2d/2d/godot_navigation_server_2d.cpp b/modules/navigation_2d/2d/godot_navigation_server_2d.cpp index 048208f5e52..498b27ed35e 100644 --- a/modules/navigation_2d/2d/godot_navigation_server_2d.cpp +++ b/modules/navigation_2d/2d/godot_navigation_server_2d.cpp @@ -644,6 +644,13 @@ RID GodotNavigationServer2D::link_create() { return rid; } +uint32_t GodotNavigationServer2D::link_get_iteration_id(RID p_link) const { + NavLink2D *link = link_owner.get_or_null(p_link); + ERR_FAIL_NULL_V(link, 0); + + return link->get_iteration_id(); +} + COMMAND_2(link_set_map, RID, p_link, RID, p_map) { NavLink2D *link = link_owner.get_or_null(p_link); ERR_FAIL_NULL(link); diff --git a/modules/navigation_2d/2d/godot_navigation_server_2d.h b/modules/navigation_2d/2d/godot_navigation_server_2d.h index 13f07d044ff..f2505de95a7 100644 --- a/modules/navigation_2d/2d/godot_navigation_server_2d.h +++ b/modules/navigation_2d/2d/godot_navigation_server_2d.h @@ -177,6 +177,7 @@ public: virtual Rect2 region_get_bounds(RID p_region) const override; virtual RID link_create() override; + virtual uint32_t link_get_iteration_id(RID p_link) const override; /// Set the map of this link. COMMAND_2(link_set_map, RID, p_link, RID, p_map); diff --git a/modules/navigation_2d/nav_link_2d.cpp b/modules/navigation_2d/nav_link_2d.cpp index 26c5229e8e1..fcf4afeccbd 100644 --- a/modules/navigation_2d/nav_link_2d.cpp +++ b/modules/navigation_2d/nav_link_2d.cpp @@ -141,6 +141,10 @@ bool NavLink2D::is_dirty() const { } void NavLink2D::sync() { + if (link_dirty) { + iteration_id = iteration_id % UINT32_MAX + 1; + } + link_dirty = false; } diff --git a/modules/navigation_2d/nav_link_2d.h b/modules/navigation_2d/nav_link_2d.h index 1d324e1e2b7..954308c825d 100644 --- a/modules/navigation_2d/nav_link_2d.h +++ b/modules/navigation_2d/nav_link_2d.h @@ -57,10 +57,14 @@ class NavLink2D : public NavBase2D { SelfList sync_dirty_request_list_element; + uint32_t iteration_id = 0; + public: NavLink2D(); ~NavLink2D(); + uint32_t get_iteration_id() const { return iteration_id; } + void set_map(NavMap2D *p_map); NavMap2D *get_map() const { return map; diff --git a/modules/navigation_3d/3d/godot_navigation_server_3d.cpp b/modules/navigation_3d/3d/godot_navigation_server_3d.cpp index d4469d3c3ea..c64db013d4c 100644 --- a/modules/navigation_3d/3d/godot_navigation_server_3d.cpp +++ b/modules/navigation_3d/3d/godot_navigation_server_3d.cpp @@ -613,6 +613,13 @@ RID GodotNavigationServer3D::link_create() { return rid; } +uint32_t GodotNavigationServer3D::link_get_iteration_id(RID p_link) const { + NavLink3D *link = link_owner.get_or_null(p_link); + ERR_FAIL_NULL_V(link, 0); + + return link->get_iteration_id(); +} + COMMAND_2(link_set_map, RID, p_link, RID, p_map) { NavLink3D *link = link_owner.get_or_null(p_link); ERR_FAIL_NULL(link); diff --git a/modules/navigation_3d/3d/godot_navigation_server_3d.h b/modules/navigation_3d/3d/godot_navigation_server_3d.h index 0e08f85cf90..742b08fe58f 100644 --- a/modules/navigation_3d/3d/godot_navigation_server_3d.h +++ b/modules/navigation_3d/3d/godot_navigation_server_3d.h @@ -185,6 +185,7 @@ public: virtual AABB region_get_bounds(RID p_region) const override; virtual RID link_create() override; + virtual uint32_t link_get_iteration_id(RID p_link) const override; COMMAND_2(link_set_map, RID, p_link, RID, p_map); virtual RID link_get_map(RID p_link) const override; COMMAND_2(link_set_enabled, RID, p_link, bool, p_enabled); diff --git a/modules/navigation_3d/nav_link_3d.cpp b/modules/navigation_3d/nav_link_3d.cpp index 74fe0da72a0..de4755c041c 100644 --- a/modules/navigation_3d/nav_link_3d.cpp +++ b/modules/navigation_3d/nav_link_3d.cpp @@ -141,6 +141,10 @@ bool NavLink3D::is_dirty() const { } void NavLink3D::sync() { + if (link_dirty) { + iteration_id = iteration_id % UINT32_MAX + 1; + } + link_dirty = false; } diff --git a/modules/navigation_3d/nav_link_3d.h b/modules/navigation_3d/nav_link_3d.h index 865fa9f9975..075e4488d3c 100644 --- a/modules/navigation_3d/nav_link_3d.h +++ b/modules/navigation_3d/nav_link_3d.h @@ -57,10 +57,14 @@ class NavLink3D : public NavBase3D { SelfList sync_dirty_request_list_element; + uint32_t iteration_id = 0; + public: NavLink3D(); ~NavLink3D(); + uint32_t get_iteration_id() const { return iteration_id; } + void set_map(NavMap3D *p_map); NavMap3D *get_map() const { return map; diff --git a/servers/navigation_server_2d.cpp b/servers/navigation_server_2d.cpp index 2b7c95ff375..0289cc45306 100644 --- a/servers/navigation_server_2d.cpp +++ b/servers/navigation_server_2d.cpp @@ -102,6 +102,7 @@ void NavigationServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("region_get_bounds", "region"), &NavigationServer2D::region_get_bounds); ClassDB::bind_method(D_METHOD("link_create"), &NavigationServer2D::link_create); + ClassDB::bind_method(D_METHOD("link_get_iteration_id", "link"), &NavigationServer2D::link_get_iteration_id); ClassDB::bind_method(D_METHOD("link_set_map", "link", "map"), &NavigationServer2D::link_set_map); ClassDB::bind_method(D_METHOD("link_get_map", "link"), &NavigationServer2D::link_get_map); ClassDB::bind_method(D_METHOD("link_set_enabled", "link", "enabled"), &NavigationServer2D::link_set_enabled); diff --git a/servers/navigation_server_2d.h b/servers/navigation_server_2d.h index 85c095472f4..7bd1ef3d566 100644 --- a/servers/navigation_server_2d.h +++ b/servers/navigation_server_2d.h @@ -161,6 +161,7 @@ public: /// Creates a new link between positions in the nav map. virtual RID link_create() = 0; + virtual uint32_t link_get_iteration_id(RID p_link) const = 0; /// Set the map of this link. virtual void link_set_map(RID p_link, RID p_map) = 0; diff --git a/servers/navigation_server_2d_dummy.h b/servers/navigation_server_2d_dummy.h index 427101300a3..8e0e0b6bada 100644 --- a/servers/navigation_server_2d_dummy.h +++ b/servers/navigation_server_2d_dummy.h @@ -90,6 +90,7 @@ public: Rect2 region_get_bounds(RID p_region) const override { return Rect2(); } RID link_create() override { return RID(); } + uint32_t link_get_iteration_id(RID p_link) const override { return 0; } void link_set_map(RID p_link, RID p_map) override {} RID link_get_map(RID p_link) const override { return RID(); } void link_set_enabled(RID p_link, bool p_enabled) override {} diff --git a/servers/navigation_server_3d.cpp b/servers/navigation_server_3d.cpp index 4459253d937..25d978adefc 100644 --- a/servers/navigation_server_3d.cpp +++ b/servers/navigation_server_3d.cpp @@ -115,6 +115,7 @@ void NavigationServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("region_get_bounds", "region"), &NavigationServer3D::region_get_bounds); ClassDB::bind_method(D_METHOD("link_create"), &NavigationServer3D::link_create); + ClassDB::bind_method(D_METHOD("link_get_iteration_id", "link"), &NavigationServer3D::link_get_iteration_id); ClassDB::bind_method(D_METHOD("link_set_map", "link", "map"), &NavigationServer3D::link_set_map); ClassDB::bind_method(D_METHOD("link_get_map", "link"), &NavigationServer3D::link_get_map); ClassDB::bind_method(D_METHOD("link_set_enabled", "link", "enabled"), &NavigationServer3D::link_set_enabled); diff --git a/servers/navigation_server_3d.h b/servers/navigation_server_3d.h index 4014df213b7..8f6981adfbc 100644 --- a/servers/navigation_server_3d.h +++ b/servers/navigation_server_3d.h @@ -185,6 +185,7 @@ public: /// Creates a new link between positions in the nav map. virtual RID link_create() = 0; + virtual uint32_t link_get_iteration_id(RID p_link) const = 0; /// Set the map of this link. virtual void link_set_map(RID p_link, RID p_map) = 0; diff --git a/servers/navigation_server_3d_dummy.h b/servers/navigation_server_3d_dummy.h index a89c3eaa0ee..b376ccb0f07 100644 --- a/servers/navigation_server_3d_dummy.h +++ b/servers/navigation_server_3d_dummy.h @@ -102,6 +102,7 @@ public: AABB region_get_bounds(RID p_region) const override { return AABB(); } RID link_create() override { return RID(); } + uint32_t link_get_iteration_id(RID p_link) const override { return 0; } void link_set_map(RID p_link, RID p_map) override {} RID link_get_map(RID p_link) const override { return RID(); } void link_set_enabled(RID p_link, bool p_enabled) override {}