Skip to content

Commit ce07448

Browse files
committed
Merge pull request godotengine#90747 from smix8/remove_constrain_avoidance
Remove experimental `constrain_avoidance` from `NavigationRegion2D`
2 parents dc68025 + df66a55 commit ce07448

File tree

4 files changed

+13
-196
lines changed

4 files changed

+13
-196
lines changed

doc/classes/NavigationRegion2D.xml

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,6 @@
2323
Bakes the [NavigationPolygon]. If [param on_thread] is set to [code]true[/code] (default), the baking is done on a separate thread.
2424
</description>
2525
</method>
26-
<method name="get_avoidance_layer_value" qualifiers="const">
27-
<return type="bool" />
28-
<param index="0" name="layer_number" type="int" />
29-
<description>
30-
Returns whether or not the specified layer of the [member avoidance_layers] bitmask is enabled, given a [param layer_number] between 1 and 32.
31-
</description>
32-
</method>
3326
<method name="get_navigation_layer_value" qualifiers="const">
3427
<return type="bool" />
3528
<param index="0" name="layer_number" type="int" />
@@ -61,14 +54,6 @@
6154
Returns [code]true[/code] when the [NavigationPolygon] is being baked on a background thread.
6255
</description>
6356
</method>
64-
<method name="set_avoidance_layer_value">
65-
<return type="void" />
66-
<param index="0" name="layer_number" type="int" />
67-
<param index="1" name="value" type="bool" />
68-
<description>
69-
Based on [param value], enables or disables the specified layer in the [member avoidance_layers] bitmask, given a [param layer_number] between 1 and 32.
70-
</description>
71-
</method>
7257
<method name="set_navigation_layer_value">
7358
<return type="void" />
7459
<param index="0" name="layer_number" type="int" />
@@ -86,12 +71,6 @@
8671
</method>
8772
</methods>
8873
<members>
89-
<member name="avoidance_layers" type="int" setter="set_avoidance_layers" getter="get_avoidance_layers" default="1">
90-
A bitfield determining all avoidance layers for the avoidance constrain.
91-
</member>
92-
<member name="constrain_avoidance" type="bool" setter="set_constrain_avoidance" getter="get_constrain_avoidance" default="false" experimental="When enabled, agents are known to get stuck on the navigation polygon corners and edges, especially at a high frame rate. Not recommended for use in production at this stage.">
93-
If [code]true[/code] constraints avoidance agent's with an avoidance mask bit that matches with a bit of the [member avoidance_layers] to the navigation polygon. Due to each navigation polygon outline creating an obstacle and each polygon edge creating an avoidance line constrain keep the navigation polygon shape as simple as possible for performance.
94-
</member>
9574
<member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true">
9675
Determines if the [NavigationRegion2D] is enabled or disabled.
9776
</member>

misc/extension_api_validation/4.2-stable.expected

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,16 @@ Validate extension JSON: API was removed: classes/BoneAttachment3D/methods/on_bo
280280
Validate extension JSON: API was removed: classes/Skeleton3D/signals/bone_pose_changed
281281

282282
They have been replaced by a safer API due to performance concerns. Compatibility method registered.
283+
284+
GH-90747
285+
--------
286+
Validate extension JSON: API was removed: classes/NavigationRegion2D/methods/get_avoidance_layers
287+
Validate extension JSON: API was removed: classes/NavigationRegion2D/methods/set_avoidance_layers
288+
Validate extension JSON: API was removed: classes/NavigationRegion2D/properties/avoidance_layers
289+
Validate extension JSON: API was removed: classes/NavigationRegion2D/methods/get_avoidance_layer_value
290+
Validate extension JSON: API was removed: classes/NavigationRegion2D/methods/set_avoidance_layer_value
291+
Validate extension JSON: API was removed: classes/NavigationRegion2D/methods/set_constrain_avoidance
292+
Validate extension JSON: API was removed: classes/NavigationRegion2D/methods/get_constrain_avoidance
293+
Validate extension JSON: API was removed: classes/NavigationRegion2D/properties/constrain_avoidance
294+
295+
Experimental NavigationRegion2D feature "constrain_avoidance" was discontinued with no replacement.

scene/2d/navigation_region_2d.cpp

Lines changed: 0 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#include "navigation_region_2d.h"
3232

3333
#include "core/math/geometry_2d.h"
34-
#include "scene/2d/navigation_obstacle_2d.h"
3534
#include "scene/resources/world_2d.h"
3635
#include "servers/navigation_server_2d.h"
3736

@@ -212,11 +211,6 @@ void NavigationRegion2D::set_navigation_map(RID p_navigation_map) {
212211
map_override = p_navigation_map;
213212

214213
NavigationServer2D::get_singleton()->region_set_map(region, map_override);
215-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
216-
if (constrain_avoidance_obstacles[i].is_valid()) {
217-
NavigationServer2D::get_singleton()->obstacle_set_map(constrain_avoidance_obstacles[i], map_override);
218-
}
219-
}
220214
}
221215

222216
RID NavigationRegion2D::get_navigation_map() const {
@@ -265,7 +259,6 @@ void NavigationRegion2D::_navigation_polygon_changed() {
265259
if (navigation_polygon.is_valid()) {
266260
NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, navigation_polygon);
267261
}
268-
_update_avoidance_constrain();
269262
}
270263

271264
#ifdef DEBUG_ENABLED
@@ -317,13 +310,6 @@ void NavigationRegion2D::_bind_methods() {
317310
ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationRegion2D::set_navigation_layer_value);
318311
ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationRegion2D::get_navigation_layer_value);
319312

320-
ClassDB::bind_method(D_METHOD("set_constrain_avoidance", "enabled"), &NavigationRegion2D::set_constrain_avoidance);
321-
ClassDB::bind_method(D_METHOD("get_constrain_avoidance"), &NavigationRegion2D::get_constrain_avoidance);
322-
ClassDB::bind_method(D_METHOD("set_avoidance_layers", "layers"), &NavigationRegion2D::set_avoidance_layers);
323-
ClassDB::bind_method(D_METHOD("get_avoidance_layers"), &NavigationRegion2D::get_avoidance_layers);
324-
ClassDB::bind_method(D_METHOD("set_avoidance_layer_value", "layer_number", "value"), &NavigationRegion2D::set_avoidance_layer_value);
325-
ClassDB::bind_method(D_METHOD("get_avoidance_layer_value", "layer_number"), &NavigationRegion2D::get_avoidance_layer_value);
326-
327313
ClassDB::bind_method(D_METHOD("get_region_rid"), &NavigationRegion2D::get_region_rid);
328314

329315
ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationRegion2D::set_enter_cost);
@@ -343,8 +329,6 @@ void NavigationRegion2D::_bind_methods() {
343329
ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers");
344330
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "enter_cost"), "set_enter_cost", "get_enter_cost");
345331
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "travel_cost"), "set_travel_cost", "get_travel_cost");
346-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "constrain_avoidance"), "set_constrain_avoidance", "get_constrain_avoidance");
347-
ADD_PROPERTY(PropertyInfo(Variant::INT, "avoidance_layers", PROPERTY_HINT_LAYERS_AVOIDANCE), "set_avoidance_layers", "get_avoidance_layers");
348332

349333
ADD_SIGNAL(MethodInfo("navigation_polygon_changed"));
350334
ADD_SIGNAL(MethodInfo("bake_finished"));
@@ -391,159 +375,25 @@ NavigationRegion2D::~NavigationRegion2D() {
391375
ERR_FAIL_NULL(NavigationServer2D::get_singleton());
392376
NavigationServer2D::get_singleton()->free(region);
393377

394-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
395-
if (constrain_avoidance_obstacles[i].is_valid()) {
396-
NavigationServer2D::get_singleton()->free(constrain_avoidance_obstacles[i]);
397-
}
398-
}
399-
constrain_avoidance_obstacles.clear();
400-
401378
#ifdef DEBUG_ENABLED
402379
NavigationServer2D::get_singleton()->disconnect(SNAME("map_changed"), callable_mp(this, &NavigationRegion2D::_navigation_map_changed));
403380
NavigationServer2D::get_singleton()->disconnect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationRegion2D::_navigation_debug_changed));
404381
#endif // DEBUG_ENABLED
405382
}
406383

407-
void NavigationRegion2D::_update_avoidance_constrain() {
408-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
409-
if (constrain_avoidance_obstacles[i].is_valid()) {
410-
NavigationServer2D::get_singleton()->free(constrain_avoidance_obstacles[i]);
411-
constrain_avoidance_obstacles[i] = RID();
412-
}
413-
}
414-
constrain_avoidance_obstacles.clear();
415-
416-
if (!constrain_avoidance) {
417-
return;
418-
}
419-
420-
if (get_navigation_polygon() == nullptr) {
421-
return;
422-
}
423-
424-
Ref<NavigationPolygon> _navpoly = get_navigation_polygon();
425-
int _outline_count = _navpoly->get_outline_count();
426-
if (_outline_count == 0) {
427-
return;
428-
}
429-
430-
for (int outline_index(0); outline_index < _outline_count; outline_index++) {
431-
const Vector<Vector2> &_outline = _navpoly->get_outline(outline_index);
432-
433-
const int outline_size = _outline.size();
434-
if (outline_size < 3) {
435-
ERR_FAIL_COND_MSG(_outline.size() < 3, "NavigationPolygon outline needs to have at least 3 vertex to create avoidance obstacles to constrain avoidance agent's");
436-
continue;
437-
}
438-
439-
RID obstacle_rid = NavigationServer2D::get_singleton()->obstacle_create();
440-
constrain_avoidance_obstacles.push_back(obstacle_rid);
441-
442-
Vector<Vector2> new_obstacle_outline;
443-
444-
if (outline_index == 0) {
445-
for (int i(0); i < outline_size; i++) {
446-
new_obstacle_outline.push_back(_outline[outline_size - i - 1]);
447-
}
448-
ERR_FAIL_COND_MSG(Geometry2D::is_polygon_clockwise(_outline), "Outer most outline needs to be clockwise to push avoidance agent inside");
449-
} else {
450-
for (int i(0); i < outline_size; i++) {
451-
new_obstacle_outline.push_back(_outline[i]);
452-
}
453-
}
454-
new_obstacle_outline.resize(outline_size);
455-
456-
NavigationServer2D::get_singleton()->obstacle_set_vertices(obstacle_rid, new_obstacle_outline);
457-
NavigationServer2D::get_singleton()->obstacle_set_avoidance_layers(obstacle_rid, avoidance_layers);
458-
if (is_inside_tree()) {
459-
if (map_override.is_valid()) {
460-
NavigationServer2D::get_singleton()->obstacle_set_map(obstacle_rid, map_override);
461-
} else {
462-
NavigationServer2D::get_singleton()->obstacle_set_map(obstacle_rid, get_world_2d()->get_navigation_map());
463-
}
464-
NavigationServer2D::get_singleton()->obstacle_set_position(obstacle_rid, get_global_position());
465-
}
466-
}
467-
constrain_avoidance_obstacles.resize(_outline_count);
468-
}
469-
470-
void NavigationRegion2D::set_constrain_avoidance(bool p_enabled) {
471-
constrain_avoidance = p_enabled;
472-
_update_avoidance_constrain();
473-
notify_property_list_changed();
474-
}
475-
476-
bool NavigationRegion2D::get_constrain_avoidance() const {
477-
return constrain_avoidance;
478-
}
479-
480-
void NavigationRegion2D::_validate_property(PropertyInfo &p_property) const {
481-
if (p_property.name == "avoidance_layers") {
482-
if (!constrain_avoidance) {
483-
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
484-
}
485-
}
486-
}
487-
488-
void NavigationRegion2D::set_avoidance_layers(uint32_t p_layers) {
489-
avoidance_layers = p_layers;
490-
if (constrain_avoidance_obstacles.size() > 0) {
491-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
492-
NavigationServer2D::get_singleton()->obstacle_set_avoidance_layers(constrain_avoidance_obstacles[i], avoidance_layers);
493-
}
494-
}
495-
}
496-
497-
uint32_t NavigationRegion2D::get_avoidance_layers() const {
498-
return avoidance_layers;
499-
}
500-
501-
void NavigationRegion2D::set_avoidance_layer_value(int p_layer_number, bool p_value) {
502-
ERR_FAIL_COND_MSG(p_layer_number < 1, "Avoidance layer number must be between 1 and 32 inclusive.");
503-
ERR_FAIL_COND_MSG(p_layer_number > 32, "Avoidance layer number must be between 1 and 32 inclusive.");
504-
uint32_t avoidance_layers_new = get_avoidance_layers();
505-
if (p_value) {
506-
avoidance_layers_new |= 1 << (p_layer_number - 1);
507-
} else {
508-
avoidance_layers_new &= ~(1 << (p_layer_number - 1));
509-
}
510-
set_avoidance_layers(avoidance_layers_new);
511-
}
512-
513-
bool NavigationRegion2D::get_avoidance_layer_value(int p_layer_number) const {
514-
ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Avoidance layer number must be between 1 and 32 inclusive.");
515-
ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Avoidance layer number must be between 1 and 32 inclusive.");
516-
return get_avoidance_layers() & (1 << (p_layer_number - 1));
517-
}
518-
519384
void NavigationRegion2D::_region_enter_navigation_map() {
520385
if (!is_inside_tree()) {
521386
return;
522387
}
523388

524389
if (map_override.is_valid()) {
525390
NavigationServer2D::get_singleton()->region_set_map(region, map_override);
526-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
527-
if (constrain_avoidance_obstacles[i].is_valid()) {
528-
NavigationServer2D::get_singleton()->obstacle_set_map(constrain_avoidance_obstacles[i], map_override);
529-
}
530-
}
531391
} else {
532392
NavigationServer2D::get_singleton()->region_set_map(region, get_world_2d()->get_navigation_map());
533-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
534-
if (constrain_avoidance_obstacles[i].is_valid()) {
535-
NavigationServer2D::get_singleton()->obstacle_set_map(constrain_avoidance_obstacles[i], get_world_2d()->get_navigation_map());
536-
}
537-
}
538393
}
539394

540395
current_global_transform = get_global_transform();
541396
NavigationServer2D::get_singleton()->region_set_transform(region, current_global_transform);
542-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
543-
if (constrain_avoidance_obstacles[i].is_valid()) {
544-
NavigationServer2D::get_singleton()->obstacle_set_position(constrain_avoidance_obstacles[i], get_global_position());
545-
}
546-
}
547397

548398
NavigationServer2D::get_singleton()->region_set_enabled(region, enabled);
549399

@@ -552,11 +402,6 @@ void NavigationRegion2D::_region_enter_navigation_map() {
552402

553403
void NavigationRegion2D::_region_exit_navigation_map() {
554404
NavigationServer2D::get_singleton()->region_set_map(region, RID());
555-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
556-
if (constrain_avoidance_obstacles[i].is_valid()) {
557-
NavigationServer2D::get_singleton()->obstacle_set_map(constrain_avoidance_obstacles[i], RID());
558-
}
559-
}
560405
}
561406

562407
void NavigationRegion2D::_region_update_transform() {
@@ -568,11 +413,6 @@ void NavigationRegion2D::_region_update_transform() {
568413
if (current_global_transform != new_global_transform) {
569414
current_global_transform = new_global_transform;
570415
NavigationServer2D::get_singleton()->region_set_transform(region, current_global_transform);
571-
for (uint32_t i = 0; i < constrain_avoidance_obstacles.size(); i++) {
572-
if (constrain_avoidance_obstacles[i].is_valid()) {
573-
NavigationServer2D::get_singleton()->obstacle_set_position(constrain_avoidance_obstacles[i], get_global_position());
574-
}
575-
}
576416
}
577417

578418
queue_redraw();

scene/2d/navigation_region_2d.h

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ class NavigationRegion2D : public Node2D {
4646
real_t travel_cost = 1.0;
4747
Ref<NavigationPolygon> navigation_polygon;
4848

49-
bool constrain_avoidance = false;
50-
LocalVector<RID> constrain_avoidance_obstacles;
51-
uint32_t avoidance_layers = 1;
52-
5349
Transform2D current_global_transform;
5450

5551
void _navigation_polygon_changed();
@@ -65,7 +61,6 @@ class NavigationRegion2D : public Node2D {
6561

6662
protected:
6763
void _notification(int p_what);
68-
void _validate_property(PropertyInfo &p_property) const;
6964
static void _bind_methods();
7065

7166
#ifndef DISABLE_DEPRECATED
@@ -106,15 +101,6 @@ class NavigationRegion2D : public Node2D {
106101
void set_navigation_polygon(const Ref<NavigationPolygon> &p_navigation_polygon);
107102
Ref<NavigationPolygon> get_navigation_polygon() const;
108103

109-
void set_constrain_avoidance(bool p_enabled);
110-
bool get_constrain_avoidance() const;
111-
112-
void set_avoidance_layers(uint32_t p_layers);
113-
uint32_t get_avoidance_layers() const;
114-
115-
void set_avoidance_layer_value(int p_layer_number, bool p_value);
116-
bool get_avoidance_layer_value(int p_layer_number) const;
117-
118104
PackedStringArray get_configuration_warnings() const override;
119105

120106
void bake_navigation_polygon(bool p_on_thread);
@@ -125,7 +111,6 @@ class NavigationRegion2D : public Node2D {
125111
~NavigationRegion2D();
126112

127113
private:
128-
void _update_avoidance_constrain();
129114
void _region_enter_navigation_map();
130115
void _region_exit_navigation_map();
131116
void _region_update_transform();

0 commit comments

Comments
 (0)