| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | /*  navigation_region_2d.cpp                                             */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2022-01-03 21:27:34 +01:00
										 |  |  | /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | #include "navigation_region_2d.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-28 18:29:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/core_string_names.h"
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:46:22 +01:00
										 |  |  | #include "scene/resources/world_2d.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-27 15:21:27 -03:00
										 |  |  | #include "servers/navigation_server_2d.h"
 | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #include "servers/navigation_server_3d.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-28 18:29:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | void NavigationRegion2D::set_enabled(bool p_enabled) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (enabled == p_enabled) { | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	enabled = p_enabled; | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!is_inside_tree()) { | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!enabled) { | 
					
						
							| 
									
										
										
										
											2020-03-27 15:21:27 -03:00
										 |  |  | 		NavigationServer2D::get_singleton()->region_set_map(region, RID()); | 
					
						
							| 
									
										
										
										
											2022-01-05 15:34:47 +01:00
										 |  |  | 		NavigationServer2D::get_singleton_mut()->disconnect("map_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2021-03-08 09:47:18 +01:00
										 |  |  | 		NavigationServer2D::get_singleton()->region_set_map(region, get_world_2d()->get_navigation_map()); | 
					
						
							| 
									
										
										
										
											2022-01-05 15:34:47 +01:00
										 |  |  | 		NavigationServer2D::get_singleton_mut()->connect("map_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	if (Engine::get_singleton()->is_editor_hint() || NavigationServer3D::get_singleton()->get_debug_enabled()) { | 
					
						
							| 
									
										
										
										
											2022-08-13 23:21:24 +02:00
										 |  |  | 		queue_redraw(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | bool NavigationRegion2D::is_enabled() const { | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 	return enabled; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 23:34:43 +02:00
										 |  |  | void NavigationRegion2D::set_navigation_layers(uint32_t p_navigation_layers) { | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 	if (navigation_layers == p_navigation_layers) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	navigation_layers = p_navigation_layers; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	NavigationServer2D::get_singleton()->region_set_navigation_layers(region, navigation_layers); | 
					
						
							| 
									
										
										
										
											2021-03-08 20:56:33 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 23:34:43 +02:00
										 |  |  | uint32_t NavigationRegion2D::get_navigation_layers() const { | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 	return navigation_layers; | 
					
						
							| 
									
										
										
										
											2021-03-08 20:56:33 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:23:13 +02:00
										 |  |  | void NavigationRegion2D::set_navigation_layer_value(int p_layer_number, bool p_value) { | 
					
						
							|  |  |  | 	ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:23:13 +02:00
										 |  |  | 	uint32_t _navigation_layers = get_navigation_layers(); | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:23:13 +02:00
										 |  |  | 	if (p_value) { | 
					
						
							|  |  |  | 		_navigation_layers |= 1 << (p_layer_number - 1); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		_navigation_layers &= ~(1 << (p_layer_number - 1)); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:23:13 +02:00
										 |  |  | 	set_navigation_layers(_navigation_layers); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool NavigationRegion2D::get_navigation_layer_value(int p_layer_number) const { | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:23:13 +02:00
										 |  |  | 	return get_navigation_layers() & (1 << (p_layer_number - 1)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 05:24:11 +02:00
										 |  |  | void NavigationRegion2D::set_enter_cost(real_t p_enter_cost) { | 
					
						
							|  |  |  | 	ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 	if (Math::is_equal_approx(enter_cost, p_enter_cost)) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	enter_cost = p_enter_cost; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	NavigationServer2D::get_singleton()->region_set_enter_cost(region, enter_cost); | 
					
						
							| 
									
										
										
										
											2022-06-06 05:24:11 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | real_t NavigationRegion2D::get_enter_cost() const { | 
					
						
							|  |  |  | 	return enter_cost; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NavigationRegion2D::set_travel_cost(real_t p_travel_cost) { | 
					
						
							|  |  |  | 	ERR_FAIL_COND_MSG(p_travel_cost < 0.0, "The travel_cost must be positive."); | 
					
						
							| 
									
										
										
										
											2022-08-20 19:21:01 -07:00
										 |  |  | 	if (Math::is_equal_approx(travel_cost, p_travel_cost)) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	travel_cost = p_travel_cost; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 10:40:33 -07:00
										 |  |  | 	NavigationServer2D::get_singleton()->region_set_travel_cost(region, travel_cost); | 
					
						
							| 
									
										
										
										
											2022-06-06 05:24:11 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | real_t NavigationRegion2D::get_travel_cost() const { | 
					
						
							|  |  |  | 	return travel_cost; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-30 13:27:30 +02:00
										 |  |  | RID NavigationRegion2D::get_region_rid() const { | 
					
						
							|  |  |  | 	return region; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 23:37:07 +02:00
										 |  |  | #ifdef TOOLS_ENABLED
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | Rect2 NavigationRegion2D::_edit_get_rect() const { | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	return navigation_polygon.is_valid() ? navigation_polygon->_edit_get_rect() : Rect2(); | 
					
						
							| 
									
										
										
										
											2017-12-27 09:28:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | bool NavigationRegion2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	return navigation_polygon.is_valid() ? navigation_polygon->_edit_is_selected_on_click(p_point, p_tolerance) : false; | 
					
						
							| 
									
										
										
										
											2017-12-27 09:28:02 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-10-21 23:37:07 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-12-27 09:28:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | void NavigationRegion2D::_notification(int p_what) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		case NOTIFICATION_ENTER_TREE: { | 
					
						
							| 
									
										
										
										
											2021-03-08 09:47:18 +01:00
										 |  |  | 			if (enabled) { | 
					
						
							|  |  |  | 				NavigationServer2D::get_singleton()->region_set_map(region, get_world_2d()->get_navigation_map()); | 
					
						
							| 
									
										
										
										
											2022-01-05 15:34:47 +01:00
										 |  |  | 				NavigationServer2D::get_singleton_mut()->connect("map_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		case NOTIFICATION_TRANSFORM_CHANGED: { | 
					
						
							| 
									
										
										
										
											2020-03-27 15:21:27 -03:00
										 |  |  | 			NavigationServer2D::get_singleton()->region_set_transform(region, get_global_transform()); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		case NOTIFICATION_EXIT_TREE: { | 
					
						
							| 
									
										
										
										
											2021-03-08 09:47:18 +01:00
										 |  |  | 			NavigationServer2D::get_singleton()->region_set_map(region, RID()); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 			if (enabled) { | 
					
						
							| 
									
										
										
										
											2022-01-05 15:34:47 +01:00
										 |  |  | 				NavigationServer2D::get_singleton_mut()->disconnect("map_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		case NOTIFICATION_DRAW: { | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 			if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer3D::get_singleton()->get_debug_enabled()) && navigation_polygon.is_valid()) { | 
					
						
							|  |  |  | 				Vector<Vector2> verts = navigation_polygon->get_vertices(); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 				if (verts.size() < 3) { | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 					return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				Color color; | 
					
						
							|  |  |  | 				if (enabled) { | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | 					color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color(); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | 					color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_disabled_color(); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | 				Color doors_color = NavigationServer3D::get_singleton()->get_debug_navigation_edge_connection_color(); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 				RandomPCG rand; | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 				for (int i = 0; i < navigation_polygon->get_polygon_count(); i++) { | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 					// An array of vertices for this polygon.
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 					Vector<int> polygon = navigation_polygon->get_polygon(i); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 					Vector<Vector2> vertices; | 
					
						
							|  |  |  | 					vertices.resize(polygon.size()); | 
					
						
							|  |  |  | 					for (int j = 0; j < polygon.size(); j++) { | 
					
						
							|  |  |  | 						ERR_FAIL_INDEX(polygon[j], verts.size()); | 
					
						
							|  |  |  | 						vertices.write[j] = verts[polygon[j]]; | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// Generate the polygon color, slightly randomly modified from the settings one.
 | 
					
						
							|  |  |  | 					Color random_variation_color; | 
					
						
							| 
									
										
										
										
											2022-08-06 23:54:57 -07:00
										 |  |  | 					random_variation_color.set_hsv(color.get_h() + rand.random(-1.0, 1.0) * 0.1, color.get_s(), color.get_v() + rand.random(-1.0, 1.0) * 0.2); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 					random_variation_color.a = color.a; | 
					
						
							|  |  |  | 					Vector<Color> colors; | 
					
						
							|  |  |  | 					colors.push_back(random_variation_color); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					RS::get_singleton()->canvas_item_add_polygon(get_canvas_item(), vertices, colors); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Draw the region
 | 
					
						
							|  |  |  | 				Transform2D xform = get_global_transform(); | 
					
						
							|  |  |  | 				const NavigationServer2D *ns = NavigationServer2D::get_singleton(); | 
					
						
							| 
									
										
										
										
											2021-08-09 17:15:17 -05:00
										 |  |  | 				real_t radius = ns->map_get_edge_connection_margin(get_world_2d()->get_navigation_map()) / 2.0; | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 				for (int i = 0; i < ns->region_get_connections_count(region); i++) { | 
					
						
							|  |  |  | 					// Two main points
 | 
					
						
							|  |  |  | 					Vector2 a = ns->region_get_connection_pathway_start(region, i); | 
					
						
							|  |  |  | 					a = xform.affine_inverse().xform(a); | 
					
						
							|  |  |  | 					Vector2 b = ns->region_get_connection_pathway_end(region, i); | 
					
						
							|  |  |  | 					b = xform.affine_inverse().xform(b); | 
					
						
							|  |  |  | 					draw_line(a, b, doors_color); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// Draw a circle to illustrate the margins.
 | 
					
						
							| 
									
										
										
										
											2021-11-17 20:21:53 +03:00
										 |  |  | 					real_t angle = a.angle_to_point(b); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 					draw_arc(a, radius, angle + Math_PI / 2.0, angle - Math_PI / 2.0 + Math_TAU, 10, doors_color); | 
					
						
							|  |  |  | 					draw_arc(b, radius, angle - Math_PI / 2.0, angle + Math_PI / 2.0, 10, doors_color); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | void NavigationRegion2D::set_navigation_polygon(const Ref<NavigationPolygon> &p_navigation_polygon) { | 
					
						
							|  |  |  | 	if (p_navigation_polygon == navigation_polygon) { | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:03:26 -02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	if (navigation_polygon.is_valid()) { | 
					
						
							|  |  |  | 		navigation_polygon->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NavigationRegion2D::_navigation_polygon_changed)); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-01-10 12:22:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	navigation_polygon = p_navigation_polygon; | 
					
						
							|  |  |  | 	NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, p_navigation_polygon); | 
					
						
							| 
									
										
										
										
											2020-01-10 12:22:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	if (navigation_polygon.is_valid()) { | 
					
						
							|  |  |  | 		navigation_polygon->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NavigationRegion2D::_navigation_polygon_changed)); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	_navigation_polygon_changed(); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-29 05:01:28 -05:00
										 |  |  | 	update_configuration_warnings(); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | Ref<NavigationPolygon> NavigationRegion2D::get_navigation_polygon() const { | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	return navigation_polygon; | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | void NavigationRegion2D::_navigation_polygon_changed() { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint())) { | 
					
						
							| 
									
										
										
										
											2022-08-13 23:21:24 +02:00
										 |  |  | 		queue_redraw(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	if (navigation_polygon.is_valid()) { | 
					
						
							|  |  |  | 		NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, navigation_polygon); | 
					
						
							| 
									
										
										
										
											2022-05-18 13:36:18 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | void NavigationRegion2D::_map_changed(RID p_map) { | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	if (is_inside_tree() && get_world_2d()->get_navigation_map() == p_map) { | 
					
						
							| 
									
										
										
										
											2022-08-13 23:21:24 +02:00
										 |  |  | 		queue_redraw(); | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2021-03-15 12:45:28 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-19 16:43:15 +01:00
										 |  |  | PackedStringArray NavigationRegion2D::get_configuration_warnings() const { | 
					
						
							|  |  |  | 	PackedStringArray warnings = Node2D::get_configuration_warnings(); | 
					
						
							| 
									
										
										
										
											2020-05-14 23:59:27 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-29 05:01:28 -05:00
										 |  |  | 	if (is_visible_in_tree() && is_inside_tree()) { | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 		if (!navigation_polygon.is_valid()) { | 
					
						
							| 
									
										
										
										
											2022-03-28 15:24:14 +02:00
										 |  |  | 			warnings.push_back(RTR("A NavigationMesh resource must be set or created for this node to work. Please set a property or draw a polygon.")); | 
					
						
							| 
									
										
										
										
											2020-05-14 23:59:27 +03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-29 05:01:28 -05:00
										 |  |  | 	return warnings; | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | void NavigationRegion2D::_bind_methods() { | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_navigation_polygon", "navigation_polygon"), &NavigationRegion2D::set_navigation_polygon); | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_navigation_polygon"), &NavigationRegion2D::get_navigation_polygon); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &NavigationRegion2D::set_enabled); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_enabled"), &NavigationRegion2D::is_enabled); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 23:34:43 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationRegion2D::set_navigation_layers); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationRegion2D::get_navigation_layers); | 
					
						
							| 
									
										
										
										
											2021-03-08 20:56:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:23:13 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationRegion2D::set_navigation_layer_value); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationRegion2D::get_navigation_layer_value); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-30 13:27:30 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_region_rid"), &NavigationRegion2D::get_region_rid); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 05:24:11 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationRegion2D::set_enter_cost); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_enter_cost"), &NavigationRegion2D::get_enter_cost); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("set_travel_cost", "travel_cost"), &NavigationRegion2D::set_travel_cost); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_travel_cost"), &NavigationRegion2D::get_travel_cost); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_navigation_polygon_changed"), &NavigationRegion2D::_navigation_polygon_changed); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 18:02:35 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "navigation_polygon", PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon"), "set_navigation_polygon", "get_navigation_polygon"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); | 
					
						
							| 
									
										
										
										
											2022-06-14 23:34:43 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); | 
					
						
							| 
									
										
										
										
											2022-06-06 05:24:11 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "enter_cost"), "set_enter_cost", "get_enter_cost"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "travel_cost"), "set_travel_cost", "get_travel_cost"); | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | NavigationRegion2D::NavigationRegion2D() { | 
					
						
							| 
									
										
										
										
											2017-01-12 20:35:46 -03:00
										 |  |  | 	set_notify_transform(true); | 
					
						
							| 
									
										
										
										
											2022-09-30 23:49:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 15:21:27 -03:00
										 |  |  | 	region = NavigationServer2D::get_singleton()->region_create(); | 
					
						
							| 
									
										
										
										
											2022-09-30 23:49:39 -06:00
										 |  |  | 	NavigationServer2D::get_singleton()->region_set_owner_id(region, get_instance_id()); | 
					
						
							| 
									
										
										
										
											2022-06-06 05:24:11 +02:00
										 |  |  | 	NavigationServer2D::get_singleton()->region_set_enter_cost(region, get_enter_cost()); | 
					
						
							|  |  |  | 	NavigationServer2D::get_singleton()->region_set_travel_cost(region, get_travel_cost()); | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	NavigationServer3D::get_singleton_mut()->connect("map_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							|  |  |  | 	NavigationServer3D::get_singleton_mut()->connect("navigation_debug_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							|  |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2020-01-10 12:22:34 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-28 08:05:04 +01:00
										 |  |  | NavigationRegion2D::~NavigationRegion2D() { | 
					
						
							| 
									
										
										
										
											2020-03-27 15:21:27 -03:00
										 |  |  | 	NavigationServer2D::get_singleton()->free(region); | 
					
						
							| 
									
										
										
										
											2022-07-01 18:58:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	NavigationServer3D::get_singleton_mut()->disconnect("map_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							|  |  |  | 	NavigationServer3D::get_singleton_mut()->disconnect("navigation_debug_changed", callable_mp(this, &NavigationRegion2D::_map_changed)); | 
					
						
							|  |  |  | #endif // DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2015-02-14 12:09:52 -03:00
										 |  |  | } |