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
222216RID 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-
519384void 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
553403void 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
562407void 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 ();
0 commit comments