Skip to content

Commit

Permalink
Merge pull request godotengine#102754 from smix8/fix_navbase_dirty
Browse files Browse the repository at this point in the history
Fix NavBase properties not requesting sync
  • Loading branch information
Repiteo committed Feb 13, 2025
2 parents 723f091 + 98f5305 commit d2c79f0
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 d2c79f0

Please sign in to comment.