Skip to content

Commit

Permalink
Fix NavBase properties not requesting sync
Browse files Browse the repository at this point in the history
Fixes that setters of NavBase properties never made the link or region dirty and requested a sync.
  • Loading branch information
smix8 committed Feb 12, 2025
1 parent ad9abe8 commit 98f5305
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 9 deletions.
8 changes: 4 additions & 4 deletions modules/navigation/nav_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}
Expand Down
42 changes: 42 additions & 0 deletions modules/navigation/nav_link.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
6 changes: 6 additions & 0 deletions modules/navigation/nav_link.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
46 changes: 45 additions & 1 deletion modules/navigation/nav_region.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
13 changes: 9 additions & 4 deletions modules/navigation/nav_region.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class NavRegion : public NavBase {

bool use_edge_connections = true;

bool region_dirty = true;
bool polygons_dirty = true;

LocalVector<gd::Polygon> navmesh_polygons;
Expand Down Expand Up @@ -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 {
Expand All @@ -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();
Expand Down

0 comments on commit 98f5305

Please sign in to comment.