|
@@ -108,6 +108,26 @@ void NavigationAgent2D::_bind_methods() {
|
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_horizon", PROPERTY_HINT_RANGE, "0.1,10,0.01,suffix:s"), "set_time_horizon", "get_time_horizon");
|
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_horizon", PROPERTY_HINT_RANGE, "0.1,10,0.01,suffix:s"), "set_time_horizon", "get_time_horizon");
|
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_speed", PROPERTY_HINT_RANGE, "0.1,10000,0.01,suffix:px/s"), "set_max_speed", "get_max_speed");
|
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_speed", PROPERTY_HINT_RANGE, "0.1,10000,0.01,suffix:px/s"), "set_max_speed", "get_max_speed");
|
|
|
|
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_debug_enabled", "enabled"), &NavigationAgent2D::set_debug_enabled);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_debug_enabled"), &NavigationAgent2D::get_debug_enabled);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_debug_use_custom", "enabled"), &NavigationAgent2D::set_debug_use_custom);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_debug_use_custom"), &NavigationAgent2D::get_debug_use_custom);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_debug_path_custom_color", "color"), &NavigationAgent2D::set_debug_path_custom_color);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_debug_path_custom_color"), &NavigationAgent2D::get_debug_path_custom_color);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_debug_path_custom_point_size", "point_size"), &NavigationAgent2D::set_debug_path_custom_point_size);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_debug_path_custom_point_size"), &NavigationAgent2D::get_debug_path_custom_point_size);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_debug_path_custom_line_width", "line_width"), &NavigationAgent2D::set_debug_path_custom_line_width);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_debug_path_custom_line_width"), &NavigationAgent2D::get_debug_path_custom_line_width);
|
|
|
|
+
|
|
|
|
+ ADD_GROUP("Debug", "");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_enabled"), "set_debug_enabled", "get_debug_enabled");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_use_custom"), "set_debug_use_custom", "get_debug_use_custom");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_path_custom_color"), "set_debug_path_custom_color", "get_debug_path_custom_color");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "debug_path_custom_point_size", PROPERTY_HINT_RANGE, "1,50,1,suffix:px"), "set_debug_path_custom_point_size", "get_debug_path_custom_point_size");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "debug_path_custom_line_width", PROPERTY_HINT_RANGE, "1,50,1,suffix:px"), "set_debug_path_custom_line_width", "get_debug_path_custom_line_width");
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
|
|
+
|
|
ADD_SIGNAL(MethodInfo("path_changed"));
|
|
ADD_SIGNAL(MethodInfo("path_changed"));
|
|
ADD_SIGNAL(MethodInfo("target_reached"));
|
|
ADD_SIGNAL(MethodInfo("target_reached"));
|
|
ADD_SIGNAL(MethodInfo("waypoint_reached", PropertyInfo(Variant::DICTIONARY, "details")));
|
|
ADD_SIGNAL(MethodInfo("waypoint_reached", PropertyInfo(Variant::DICTIONARY, "details")));
|
|
@@ -123,6 +143,12 @@ void NavigationAgent2D::_notification(int p_what) {
|
|
// cannot use READY as ready does not get called if Node is readded to SceneTree
|
|
// cannot use READY as ready does not get called if Node is readded to SceneTree
|
|
set_agent_parent(get_parent());
|
|
set_agent_parent(get_parent());
|
|
set_physics_process_internal(true);
|
|
set_physics_process_internal(true);
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ if (NavigationServer2D::get_singleton()->get_debug_enabled()) {
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+ }
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
} break;
|
|
} break;
|
|
|
|
|
|
case NOTIFICATION_PARENTED: {
|
|
case NOTIFICATION_PARENTED: {
|
|
@@ -165,6 +191,12 @@ void NavigationAgent2D::_notification(int p_what) {
|
|
case NOTIFICATION_EXIT_TREE: {
|
|
case NOTIFICATION_EXIT_TREE: {
|
|
agent_parent = nullptr;
|
|
agent_parent = nullptr;
|
|
set_physics_process_internal(false);
|
|
set_physics_process_internal(false);
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ if (debug_path_instance.is_valid()) {
|
|
|
|
+ RenderingServer::get_singleton()->canvas_item_set_visible(debug_path_instance, false);
|
|
|
|
+ }
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
} break;
|
|
} break;
|
|
|
|
|
|
case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
|
|
case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
|
|
@@ -176,6 +208,12 @@ void NavigationAgent2D::_notification(int p_what) {
|
|
}
|
|
}
|
|
_check_distance_to_target();
|
|
_check_distance_to_target();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ if (debug_path_dirty) {
|
|
|
|
+ _update_debug_path();
|
|
|
|
+ }
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
} break;
|
|
} break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -194,12 +232,25 @@ NavigationAgent2D::NavigationAgent2D() {
|
|
|
|
|
|
navigation_result = Ref<NavigationPathQueryResult2D>();
|
|
navigation_result = Ref<NavigationPathQueryResult2D>();
|
|
navigation_result.instantiate();
|
|
navigation_result.instantiate();
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ NavigationServer2D::get_singleton()->connect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationAgent2D::_navigation_debug_changed));
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
}
|
|
}
|
|
|
|
|
|
NavigationAgent2D::~NavigationAgent2D() {
|
|
NavigationAgent2D::~NavigationAgent2D() {
|
|
ERR_FAIL_NULL(NavigationServer2D::get_singleton());
|
|
ERR_FAIL_NULL(NavigationServer2D::get_singleton());
|
|
NavigationServer2D::get_singleton()->free(agent);
|
|
NavigationServer2D::get_singleton()->free(agent);
|
|
agent = RID(); // Pointless
|
|
agent = RID(); // Pointless
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ NavigationServer2D::get_singleton()->disconnect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationAgent2D::_navigation_debug_changed));
|
|
|
|
+
|
|
|
|
+ ERR_FAIL_NULL(RenderingServer::get_singleton());
|
|
|
|
+ if (debug_path_instance.is_valid()) {
|
|
|
|
+ RenderingServer::get_singleton()->free(debug_path_instance);
|
|
|
|
+ }
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
}
|
|
}
|
|
|
|
|
|
void NavigationAgent2D::set_avoidance_enabled(bool p_enabled) {
|
|
void NavigationAgent2D::set_avoidance_enabled(bool p_enabled) {
|
|
@@ -463,6 +514,9 @@ void NavigationAgent2D::update_navigation() {
|
|
}
|
|
}
|
|
|
|
|
|
NavigationServer2D::get_singleton()->query_path(navigation_query, navigation_result);
|
|
NavigationServer2D::get_singleton()->query_path(navigation_query, navigation_result);
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+#endif // DEBUG_ENABLED
|
|
navigation_finished = false;
|
|
navigation_finished = false;
|
|
navigation_path_index = 0;
|
|
navigation_path_index = 0;
|
|
emit_signal(SNAME("path_changed"));
|
|
emit_signal(SNAME("path_changed"));
|
|
@@ -549,3 +603,111 @@ void NavigationAgent2D::_check_distance_to_target() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+////////DEBUG////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
|
+void NavigationAgent2D::set_debug_enabled(bool p_enabled) {
|
|
|
|
+ debug_enabled = p_enabled;
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool NavigationAgent2D::get_debug_enabled() const {
|
|
|
|
+ return debug_enabled;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void NavigationAgent2D::set_debug_use_custom(bool p_enabled) {
|
|
|
|
+ debug_use_custom = p_enabled;
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool NavigationAgent2D::get_debug_use_custom() const {
|
|
|
|
+ return debug_use_custom;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void NavigationAgent2D::set_debug_path_custom_color(Color p_color) {
|
|
|
|
+ debug_path_custom_color = p_color;
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Color NavigationAgent2D::get_debug_path_custom_color() const {
|
|
|
|
+ return debug_path_custom_color;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void NavigationAgent2D::set_debug_path_custom_point_size(float p_point_size) {
|
|
|
|
+ debug_path_custom_point_size = MAX(0.1, p_point_size);
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float NavigationAgent2D::get_debug_path_custom_point_size() const {
|
|
|
|
+ return debug_path_custom_point_size;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void NavigationAgent2D::set_debug_path_custom_line_width(float p_line_width) {
|
|
|
|
+ debug_path_custom_line_width = p_line_width;
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float NavigationAgent2D::get_debug_path_custom_line_width() const {
|
|
|
|
+ return debug_path_custom_line_width;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void NavigationAgent2D::_navigation_debug_changed() {
|
|
|
|
+ debug_path_dirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void NavigationAgent2D::_update_debug_path() {
|
|
|
|
+ if (!debug_path_dirty) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ debug_path_dirty = false;
|
|
|
|
+
|
|
|
|
+ if (!debug_path_instance.is_valid()) {
|
|
|
|
+ debug_path_instance = RenderingServer::get_singleton()->canvas_item_create();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ RenderingServer::get_singleton()->canvas_item_clear(debug_path_instance);
|
|
|
|
+
|
|
|
|
+ if (!(debug_enabled && NavigationServer2D::get_singleton()->get_debug_navigation_enable_agent_paths())) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!(agent_parent && agent_parent->is_inside_tree())) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ RenderingServer::get_singleton()->canvas_item_set_parent(debug_path_instance, agent_parent->get_canvas());
|
|
|
|
+ RenderingServer::get_singleton()->canvas_item_set_visible(debug_path_instance, agent_parent->is_visible_in_tree());
|
|
|
|
+
|
|
|
|
+ const Vector<Vector2> &navigation_path = navigation_result->get_path();
|
|
|
|
+
|
|
|
|
+ if (navigation_path.size() <= 1) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Color debug_path_color = NavigationServer2D::get_singleton()->get_debug_navigation_agent_path_color();
|
|
|
|
+ if (debug_use_custom) {
|
|
|
|
+ debug_path_color = debug_path_custom_color;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Vector<Color> debug_path_colors;
|
|
|
|
+ debug_path_colors.resize(navigation_path.size());
|
|
|
|
+ debug_path_colors.fill(debug_path_color);
|
|
|
|
+
|
|
|
|
+ RenderingServer::get_singleton()->canvas_item_add_polyline(debug_path_instance, navigation_path, debug_path_colors, debug_path_custom_line_width, false);
|
|
|
|
+
|
|
|
|
+ float point_size = NavigationServer2D::get_singleton()->get_debug_navigation_agent_path_point_size();
|
|
|
|
+ float half_point_size = point_size * 0.5;
|
|
|
|
+
|
|
|
|
+ if (debug_use_custom) {
|
|
|
|
+ point_size = debug_path_custom_point_size;
|
|
|
|
+ half_point_size = debug_path_custom_point_size * 0.5;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < navigation_path.size(); i++) {
|
|
|
|
+ const Vector2 &vert = navigation_path[i];
|
|
|
|
+ Rect2 path_point_rect = Rect2(vert.x - half_point_size, vert.y - half_point_size, point_size, point_size);
|
|
|
|
+ RenderingServer::get_singleton()->canvas_item_add_rect(debug_path_instance, path_point_rect, debug_path_color);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+#endif // DEBUG_ENABLED
|