Skip to content

Commit d2c79f0

Browse files
committed
Merge pull request #102754 from smix8/fix_navbase_dirty
Fix NavBase properties not requesting sync
2 parents 723f091 + 98f5305 commit d2c79f0

File tree

5 files changed

+106
-9
lines changed

5 files changed

+106
-9
lines changed

modules/navigation/nav_base.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,16 @@ class NavBase : public NavRid {
5252
virtual void set_use_edge_connections(bool p_enabled) {}
5353
virtual bool get_use_edge_connections() const { return false; }
5454

55-
void set_navigation_layers(uint32_t p_navigation_layers) { navigation_layers = p_navigation_layers; }
55+
virtual void set_navigation_layers(uint32_t p_navigation_layers) {}
5656
uint32_t get_navigation_layers() const { return navigation_layers; }
5757

58-
void set_enter_cost(real_t p_enter_cost) { enter_cost = MAX(p_enter_cost, 0.0); }
58+
virtual void set_enter_cost(real_t p_enter_cost) {}
5959
real_t get_enter_cost() const { return enter_cost; }
6060

61-
void set_travel_cost(real_t p_travel_cost) { travel_cost = MAX(p_travel_cost, 0.0); }
61+
virtual void set_travel_cost(real_t p_travel_cost) {}
6262
real_t get_travel_cost() const { return travel_cost; }
6363

64-
void set_owner_id(ObjectID p_owner_id) { owner_id = p_owner_id; }
64+
virtual void set_owner_id(ObjectID p_owner_id) {}
6565
ObjectID get_owner_id() const { return owner_id; }
6666

6767
virtual ~NavBase() {}

modules/navigation/nav_link.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,48 @@ void NavLink::set_end_position(const Vector3 p_position) {
9494
request_sync();
9595
}
9696

97+
void NavLink::set_navigation_layers(uint32_t p_navigation_layers) {
98+
if (navigation_layers == p_navigation_layers) {
99+
return;
100+
}
101+
navigation_layers = p_navigation_layers;
102+
link_dirty = true;
103+
104+
request_sync();
105+
}
106+
107+
void NavLink::set_enter_cost(real_t p_enter_cost) {
108+
real_t new_enter_cost = MAX(p_enter_cost, 0.0);
109+
if (enter_cost == new_enter_cost) {
110+
return;
111+
}
112+
enter_cost = new_enter_cost;
113+
link_dirty = true;
114+
115+
request_sync();
116+
}
117+
118+
void NavLink::set_travel_cost(real_t p_travel_cost) {
119+
real_t new_travel_cost = MAX(p_travel_cost, 0.0);
120+
if (travel_cost == new_travel_cost) {
121+
return;
122+
}
123+
travel_cost = new_travel_cost;
124+
link_dirty = true;
125+
126+
request_sync();
127+
}
128+
129+
void NavLink::set_owner_id(ObjectID p_owner_id) {
130+
if (owner_id == p_owner_id) {
131+
return;
132+
}
133+
owner_id = p_owner_id;
134+
link_dirty = true;
135+
136+
request_sync();
137+
}
138+
97139
bool NavLink::is_dirty() const {
98140
return link_dirty;
99141
}

modules/navigation/nav_link.h

+6
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ class NavLink : public NavBase {
8686
return end_position;
8787
}
8888

89+
// NavBase properties.
90+
virtual void set_navigation_layers(uint32_t p_navigation_layers) override;
91+
virtual void set_enter_cost(real_t p_enter_cost) override;
92+
virtual void set_travel_cost(real_t p_travel_cost) override;
93+
virtual void set_owner_id(ObjectID p_owner_id) override;
94+
8995
bool is_dirty() const;
9096
void sync();
9197
void request_sync();

modules/navigation/nav_region.cpp

+45-1
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,54 @@ Vector3 NavRegion::get_random_point(uint32_t p_navigation_layers, bool p_uniform
141141
return NavMeshQueries3D::polygons_get_random_point(get_polygons(), p_navigation_layers, p_uniformly);
142142
}
143143

144+
void NavRegion::set_navigation_layers(uint32_t p_navigation_layers) {
145+
if (navigation_layers == p_navigation_layers) {
146+
return;
147+
}
148+
navigation_layers = p_navigation_layers;
149+
region_dirty = true;
150+
151+
request_sync();
152+
}
153+
154+
void NavRegion::set_enter_cost(real_t p_enter_cost) {
155+
real_t new_enter_cost = MAX(p_enter_cost, 0.0);
156+
if (enter_cost == new_enter_cost) {
157+
return;
158+
}
159+
enter_cost = new_enter_cost;
160+
region_dirty = true;
161+
162+
request_sync();
163+
}
164+
165+
void NavRegion::set_travel_cost(real_t p_travel_cost) {
166+
real_t new_travel_cost = MAX(p_travel_cost, 0.0);
167+
if (travel_cost == new_travel_cost) {
168+
return;
169+
}
170+
travel_cost = new_travel_cost;
171+
region_dirty = true;
172+
173+
request_sync();
174+
}
175+
176+
void NavRegion::set_owner_id(ObjectID p_owner_id) {
177+
if (owner_id == p_owner_id) {
178+
return;
179+
}
180+
owner_id = p_owner_id;
181+
region_dirty = true;
182+
183+
request_sync();
184+
}
185+
144186
bool NavRegion::sync() {
145187
RWLockWrite write_lock(region_rwlock);
146188

147-
bool something_changed = polygons_dirty /* || something_dirty? */;
189+
bool something_changed = region_dirty || polygons_dirty;
190+
191+
region_dirty = false;
148192

149193
update_polygons();
150194

modules/navigation/nav_region.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class NavRegion : public NavBase {
4848

4949
bool use_edge_connections = true;
5050

51+
bool region_dirty = true;
5152
bool polygons_dirty = true;
5253

5354
LocalVector<gd::Polygon> navmesh_polygons;
@@ -77,10 +78,8 @@ class NavRegion : public NavBase {
7778
return map;
7879
}
7980

80-
void set_use_edge_connections(bool p_enabled);
81-
bool get_use_edge_connections() const {
82-
return use_edge_connections;
83-
}
81+
virtual void set_use_edge_connections(bool p_enabled) override;
82+
virtual bool get_use_edge_connections() const override { return use_edge_connections; }
8483

8584
void set_transform(Transform3D transform);
8685
const Transform3D &get_transform() const {
@@ -100,6 +99,12 @@ class NavRegion : public NavBase {
10099
real_t get_surface_area() const { return surface_area; }
101100
AABB get_bounds() const { return bounds; }
102101

102+
// NavBase properties.
103+
virtual void set_navigation_layers(uint32_t p_navigation_layers) override;
104+
virtual void set_enter_cost(real_t p_enter_cost) override;
105+
virtual void set_travel_cost(real_t p_travel_cost) override;
106+
virtual void set_owner_id(ObjectID p_owner_id) override;
107+
103108
bool sync();
104109
void request_sync();
105110
void cancel_sync_request();

0 commit comments

Comments
 (0)