From 98f5305d4ba9d2376c3805a6ea42d6ec0916aeb0 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:03:26 +0100 Subject: [PATCH] Fix NavBase properties not requesting sync Fixes that setters of NavBase properties never made the link or region dirty and requested a sync. --- modules/navigation/nav_base.h | 8 +++--- modules/navigation/nav_link.cpp | 42 ++++++++++++++++++++++++++++ modules/navigation/nav_link.h | 6 ++++ modules/navigation/nav_region.cpp | 46 ++++++++++++++++++++++++++++++- modules/navigation/nav_region.h | 13 ++++++--- 5 files changed, 106 insertions(+), 9 deletions(-) diff --git a/modules/navigation/nav_base.h b/modules/navigation/nav_base.h index d2308abfaf7d..23ecea90dcbe 100644 --- a/modules/navigation/nav_base.h +++ b/modules/navigation/nav_base.h @@ -52,16 +52,16 @@ class NavBase : public NavRid { virtual void set_use_edge_connections(bool p_enabled) {} virtual bool get_use_edge_connections() const { return false; } - void set_navigation_layers(uint32_t p_navigation_layers) { navigation_layers = p_navigation_layers; } + virtual void set_navigation_layers(uint32_t p_navigation_layers) {} uint32_t get_navigation_layers() const { return navigation_layers; } - void set_enter_cost(real_t p_enter_cost) { enter_cost = MAX(p_enter_cost, 0.0); } + virtual void set_enter_cost(real_t p_enter_cost) {} real_t get_enter_cost() const { return enter_cost; } - void set_travel_cost(real_t p_travel_cost) { travel_cost = MAX(p_travel_cost, 0.0); } + virtual void set_travel_cost(real_t p_travel_cost) {} real_t get_travel_cost() const { return travel_cost; } - void set_owner_id(ObjectID p_owner_id) { owner_id = p_owner_id; } + virtual void set_owner_id(ObjectID p_owner_id) {} ObjectID get_owner_id() const { return owner_id; } virtual ~NavBase() {} diff --git a/modules/navigation/nav_link.cpp b/modules/navigation/nav_link.cpp index 511edc719738..9bffd0c3d6d4 100644 --- a/modules/navigation/nav_link.cpp +++ b/modules/navigation/nav_link.cpp @@ -94,6 +94,48 @@ void NavLink::set_end_position(const Vector3 p_position) { request_sync(); } +void NavLink::set_navigation_layers(uint32_t p_navigation_layers) { + if (navigation_layers == p_navigation_layers) { + return; + } + navigation_layers = p_navigation_layers; + link_dirty = true; + + request_sync(); +} + +void NavLink::set_enter_cost(real_t p_enter_cost) { + real_t new_enter_cost = MAX(p_enter_cost, 0.0); + if (enter_cost == new_enter_cost) { + return; + } + enter_cost = new_enter_cost; + link_dirty = true; + + request_sync(); +} + +void NavLink::set_travel_cost(real_t p_travel_cost) { + real_t new_travel_cost = MAX(p_travel_cost, 0.0); + if (travel_cost == new_travel_cost) { + return; + } + travel_cost = new_travel_cost; + link_dirty = true; + + request_sync(); +} + +void NavLink::set_owner_id(ObjectID p_owner_id) { + if (owner_id == p_owner_id) { + return; + } + owner_id = p_owner_id; + link_dirty = true; + + request_sync(); +} + bool NavLink::is_dirty() const { return link_dirty; } diff --git a/modules/navigation/nav_link.h b/modules/navigation/nav_link.h index e6fd7a0e57c8..e06a10d5bf36 100644 --- a/modules/navigation/nav_link.h +++ b/modules/navigation/nav_link.h @@ -86,6 +86,12 @@ class NavLink : public NavBase { return end_position; } + // NavBase properties. + virtual void set_navigation_layers(uint32_t p_navigation_layers) override; + virtual void set_enter_cost(real_t p_enter_cost) override; + virtual void set_travel_cost(real_t p_travel_cost) override; + virtual void set_owner_id(ObjectID p_owner_id) override; + bool is_dirty() const; void sync(); void request_sync(); diff --git a/modules/navigation/nav_region.cpp b/modules/navigation/nav_region.cpp index fbd98c129192..9be180f8554b 100644 --- a/modules/navigation/nav_region.cpp +++ b/modules/navigation/nav_region.cpp @@ -141,10 +141,54 @@ Vector3 NavRegion::get_random_point(uint32_t p_navigation_layers, bool p_uniform return NavMeshQueries3D::polygons_get_random_point(get_polygons(), p_navigation_layers, p_uniformly); } +void NavRegion::set_navigation_layers(uint32_t p_navigation_layers) { + if (navigation_layers == p_navigation_layers) { + return; + } + navigation_layers = p_navigation_layers; + region_dirty = true; + + request_sync(); +} + +void NavRegion::set_enter_cost(real_t p_enter_cost) { + real_t new_enter_cost = MAX(p_enter_cost, 0.0); + if (enter_cost == new_enter_cost) { + return; + } + enter_cost = new_enter_cost; + region_dirty = true; + + request_sync(); +} + +void NavRegion::set_travel_cost(real_t p_travel_cost) { + real_t new_travel_cost = MAX(p_travel_cost, 0.0); + if (travel_cost == new_travel_cost) { + return; + } + travel_cost = new_travel_cost; + region_dirty = true; + + request_sync(); +} + +void NavRegion::set_owner_id(ObjectID p_owner_id) { + if (owner_id == p_owner_id) { + return; + } + owner_id = p_owner_id; + region_dirty = true; + + request_sync(); +} + bool NavRegion::sync() { RWLockWrite write_lock(region_rwlock); - bool something_changed = polygons_dirty /* || something_dirty? */; + bool something_changed = region_dirty || polygons_dirty; + + region_dirty = false; update_polygons(); diff --git a/modules/navigation/nav_region.h b/modules/navigation/nav_region.h index 09e92159f004..1ea4195adc11 100644 --- a/modules/navigation/nav_region.h +++ b/modules/navigation/nav_region.h @@ -48,6 +48,7 @@ class NavRegion : public NavBase { bool use_edge_connections = true; + bool region_dirty = true; bool polygons_dirty = true; LocalVector navmesh_polygons; @@ -77,10 +78,8 @@ class NavRegion : public NavBase { return map; } - void set_use_edge_connections(bool p_enabled); - bool get_use_edge_connections() const { - return use_edge_connections; - } + virtual void set_use_edge_connections(bool p_enabled) override; + virtual bool get_use_edge_connections() const override { return use_edge_connections; } void set_transform(Transform3D transform); const Transform3D &get_transform() const { @@ -100,6 +99,12 @@ class NavRegion : public NavBase { real_t get_surface_area() const { return surface_area; } AABB get_bounds() const { return bounds; } + // NavBase properties. + virtual void set_navigation_layers(uint32_t p_navigation_layers) override; + virtual void set_enter_cost(real_t p_enter_cost) override; + virtual void set_travel_cost(real_t p_travel_cost) override; + virtual void set_owner_id(ObjectID p_owner_id) override; + bool sync(); void request_sync(); void cancel_sync_request();