Add NavigationAgent Path Debug Visualization

Adds path debug visuals for NavigationAgent2D, NavigationAgent3D and NavigationServer.
This commit is contained in:
smix8 2023-01-16 17:45:03 +01:00
parent 2b710bc336
commit 0ab764e84b
12 changed files with 618 additions and 0 deletions

View File

@ -111,6 +111,21 @@
<member name="avoidance_enabled" type="bool" setter="set_avoidance_enabled" getter="get_avoidance_enabled" default="false"> <member name="avoidance_enabled" type="bool" setter="set_avoidance_enabled" getter="get_avoidance_enabled" default="false">
If [code]true[/code] the agent is registered for an RVO avoidance callback on the [NavigationServer2D]. When [method NavigationAgent2D.set_velocity] is used and the processing is completed a [code]safe_velocity[/code] Vector2 is received with a signal connection to [signal velocity_computed]. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it. If [code]true[/code] the agent is registered for an RVO avoidance callback on the [NavigationServer2D]. When [method NavigationAgent2D.set_velocity] is used and the processing is completed a [code]safe_velocity[/code] Vector2 is received with a signal connection to [signal velocity_computed]. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it.
</member> </member>
<member name="debug_enabled" type="bool" setter="set_debug_enabled" getter="get_debug_enabled" default="false">
If [code]true[/code] shows debug visuals for this agent.
</member>
<member name="debug_path_custom_color" type="Color" setter="set_debug_path_custom_color" getter="get_debug_path_custom_color" default="Color(1, 1, 1, 1)">
If [member debug_use_custom] is [code]true[/code] uses this color for this agent instead of global color.
</member>
<member name="debug_path_custom_line_width" type="float" setter="set_debug_path_custom_line_width" getter="get_debug_path_custom_line_width" default="1.0">
If [member debug_use_custom] is [code]true[/code] uses this line width for rendering paths for this agent instead of global line width.
</member>
<member name="debug_path_custom_point_size" type="float" setter="set_debug_path_custom_point_size" getter="get_debug_path_custom_point_size" default="4.0">
If [member debug_use_custom] is [code]true[/code] uses this rasterized point size for rendering path points for this agent instead of global point size.
</member>
<member name="debug_use_custom" type="bool" setter="set_debug_use_custom" getter="get_debug_use_custom" default="false">
If [code]true[/code] uses the defined [member debug_path_custom_color] for this agent instead of global color.
</member>
<member name="max_neighbors" type="int" setter="set_max_neighbors" getter="get_max_neighbors" default="10"> <member name="max_neighbors" type="int" setter="set_max_neighbors" getter="get_max_neighbors" default="10">
The maximum number of neighbors for the agent to consider. The maximum number of neighbors for the agent to consider.
</member> </member>

View File

@ -114,6 +114,18 @@
<member name="avoidance_enabled" type="bool" setter="set_avoidance_enabled" getter="get_avoidance_enabled" default="false"> <member name="avoidance_enabled" type="bool" setter="set_avoidance_enabled" getter="get_avoidance_enabled" default="false">
If [code]true[/code] the agent is registered for an RVO avoidance callback on the [NavigationServer3D]. When [method NavigationAgent3D.set_velocity] is used and the processing is completed a [code]safe_velocity[/code] Vector3 is received with a signal connection to [signal velocity_computed]. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it. If [code]true[/code] the agent is registered for an RVO avoidance callback on the [NavigationServer3D]. When [method NavigationAgent3D.set_velocity] is used and the processing is completed a [code]safe_velocity[/code] Vector3 is received with a signal connection to [signal velocity_computed]. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it.
</member> </member>
<member name="debug_enabled" type="bool" setter="set_debug_enabled" getter="get_debug_enabled" default="false">
If [code]true[/code] shows debug visuals for this agent.
</member>
<member name="debug_path_custom_color" type="Color" setter="set_debug_path_custom_color" getter="get_debug_path_custom_color" default="Color(1, 1, 1, 1)">
If [member debug_use_custom] is [code]true[/code] uses this color for this agent instead of global color.
</member>
<member name="debug_path_custom_point_size" type="float" setter="set_debug_path_custom_point_size" getter="get_debug_path_custom_point_size" default="4.0">
If [member debug_use_custom] is [code]true[/code] uses this rasterized point size for rendering path points for this agent instead of global point size.
</member>
<member name="debug_use_custom" type="bool" setter="set_debug_use_custom" getter="get_debug_use_custom" default="false">
If [code]true[/code] uses the defined [member debug_path_custom_color] for this agent instead of global color.
</member>
<member name="ignore_y" type="bool" setter="set_ignore_y" getter="get_ignore_y" default="true"> <member name="ignore_y" type="bool" setter="set_ignore_y" getter="get_ignore_y" default="true">
Ignores collisions on the Y axis. Must be true to move on a horizontal plane. Ignores collisions on the Y axis. Must be true to move on a horizontal plane.
</member> </member>

View File

@ -528,5 +528,10 @@
Emitted when a navigation map is updated, when a region moves or is modified. Emitted when a navigation map is updated, when a region moves or is modified.
</description> </description>
</signal> </signal>
<signal name="navigation_debug_changed">
<description>
Emitted when navigation debug settings are changed. Only available in debug builds.
</description>
</signal>
</signals> </signals>
</class> </class>

View File

@ -528,9 +528,21 @@
<member name="debug/shapes/collision/shape_color" type="Color" setter="" getter="" default="Color(0, 0.6, 0.7, 0.42)"> <member name="debug/shapes/collision/shape_color" type="Color" setter="" getter="" default="Color(0, 0.6, 0.7, 0.42)">
Color of the collision shapes, visible when "Visible Collision Shapes" is enabled in the Debug menu. Color of the collision shapes, visible when "Visible Collision Shapes" is enabled in the Debug menu.
</member> </member>
<member name="debug/shapes/navigation/agent_path_color" type="Color" setter="" getter="" default="Color(1, 0, 0, 1)">
Color to display enabled navigation agent paths when an agent has debug enabled.
</member>
<member name="debug/shapes/navigation/agent_path_point_size" type="float" setter="" getter="" default="4.0">
Rasterized size (pixel) used to render navigation agent path points when an agent has debug enabled.
</member>
<member name="debug/shapes/navigation/edge_connection_color" type="Color" setter="" getter="" default="Color(1, 0, 1, 1)"> <member name="debug/shapes/navigation/edge_connection_color" type="Color" setter="" getter="" default="Color(1, 0, 1, 1)">
Color to display edge connections between navigation regions, visible when "Visible Navigation" is enabled in the Debug menu. Color to display edge connections between navigation regions, visible when "Visible Navigation" is enabled in the Debug menu.
</member> </member>
<member name="debug/shapes/navigation/enable_agent_paths" type="bool" setter="" getter="" default="true">
If enabled, displays navigation agent paths when an agent has debug enabled.
</member>
<member name="debug/shapes/navigation/enable_agent_paths_xray" type="bool" setter="" getter="" default="true">
If enabled, displays navigation agent paths through geometry when an agent has debug enabled.
</member>
<member name="debug/shapes/navigation/enable_edge_connections" type="bool" setter="" getter="" default="true"> <member name="debug/shapes/navigation/enable_edge_connections" type="bool" setter="" getter="" default="true">
If enabled, displays edge connections between navigation regions when "Visible Navigation" is enabled in the Debug menu. If enabled, displays edge connections between navigation regions when "Visible Navigation" is enabled in the Debug menu.
</member> </member>

View File

@ -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

View File

@ -74,6 +74,20 @@ class NavigationAgent2D : public Node {
// No initialized on purpose // No initialized on purpose
uint32_t update_frame_id = 0; uint32_t update_frame_id = 0;
#ifdef DEBUG_ENABLED
bool debug_enabled = false;
bool debug_path_dirty = true;
RID debug_path_instance;
float debug_path_custom_point_size = 4.0;
float debug_path_custom_line_width = 1.0;
bool debug_use_custom = false;
Color debug_path_custom_color = Color(1.0, 1.0, 1.0, 1.0);
private:
void _navigation_debug_changed();
void _update_debug_path();
#endif // DEBUG_ENABLED
protected: protected:
static void _bind_methods(); static void _bind_methods();
void _notification(int p_what); void _notification(int p_what);
@ -169,6 +183,23 @@ public:
PackedStringArray get_configuration_warnings() const override; PackedStringArray get_configuration_warnings() const override;
#ifdef DEBUG_ENABLED
void set_debug_enabled(bool p_enabled);
bool get_debug_enabled() const;
void set_debug_use_custom(bool p_enabled);
bool get_debug_use_custom() const;
void set_debug_path_custom_color(Color p_color);
Color get_debug_path_custom_color() const;
void set_debug_path_custom_point_size(float p_point_size);
float get_debug_path_custom_point_size() const;
void set_debug_path_custom_line_width(float p_line_width);
float get_debug_path_custom_line_width() const;
#endif // DEBUG_ENABLED
private: private:
void update_navigation(); void update_navigation();
void _request_repath(); void _request_repath();

View File

@ -120,6 +120,23 @@ void NavigationAgent3D::_bind_methods() {
ADD_SIGNAL(MethodInfo("link_reached", PropertyInfo(Variant::DICTIONARY, "details"))); ADD_SIGNAL(MethodInfo("link_reached", PropertyInfo(Variant::DICTIONARY, "details")));
ADD_SIGNAL(MethodInfo("navigation_finished")); ADD_SIGNAL(MethodInfo("navigation_finished"));
ADD_SIGNAL(MethodInfo("velocity_computed", PropertyInfo(Variant::VECTOR3, "safe_velocity"))); ADD_SIGNAL(MethodInfo("velocity_computed", PropertyInfo(Variant::VECTOR3, "safe_velocity")));
#ifdef DEBUG_ENABLED
ClassDB::bind_method(D_METHOD("set_debug_enabled", "enabled"), &NavigationAgent3D::set_debug_enabled);
ClassDB::bind_method(D_METHOD("get_debug_enabled"), &NavigationAgent3D::get_debug_enabled);
ClassDB::bind_method(D_METHOD("set_debug_use_custom", "enabled"), &NavigationAgent3D::set_debug_use_custom);
ClassDB::bind_method(D_METHOD("get_debug_use_custom"), &NavigationAgent3D::get_debug_use_custom);
ClassDB::bind_method(D_METHOD("set_debug_path_custom_color", "color"), &NavigationAgent3D::set_debug_path_custom_color);
ClassDB::bind_method(D_METHOD("get_debug_path_custom_color"), &NavigationAgent3D::get_debug_path_custom_color);
ClassDB::bind_method(D_METHOD("set_debug_path_custom_point_size", "point_size"), &NavigationAgent3D::set_debug_path_custom_point_size);
ClassDB::bind_method(D_METHOD("get_debug_path_custom_point_size"), &NavigationAgent3D::get_debug_path_custom_point_size);
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");
#endif // DEBUG_ENABLED
} }
void NavigationAgent3D::_notification(int p_what) { void NavigationAgent3D::_notification(int p_what) {
@ -129,6 +146,12 @@ void NavigationAgent3D::_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 (NavigationServer3D::get_singleton()->get_debug_enabled()) {
debug_path_dirty = true;
}
#endif // DEBUG_ENABLED
} break; } break;
case NOTIFICATION_PARENTED: { case NOTIFICATION_PARENTED: {
@ -151,6 +174,12 @@ void NavigationAgent3D::_notification(int p_what) {
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
set_agent_parent(nullptr); set_agent_parent(nullptr);
set_physics_process_internal(false); set_physics_process_internal(false);
#ifdef DEBUG_ENABLED
if (debug_path_instance.is_valid()) {
RS::get_singleton()->instance_set_visible(debug_path_instance, false);
}
#endif // DEBUG_ENABLED
} break; } break;
case NOTIFICATION_PAUSED: { case NOTIFICATION_PAUSED: {
@ -182,6 +211,11 @@ void NavigationAgent3D::_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;
} }
} }
@ -201,12 +235,28 @@ NavigationAgent3D::NavigationAgent3D() {
navigation_result = Ref<NavigationPathQueryResult3D>(); navigation_result = Ref<NavigationPathQueryResult3D>();
navigation_result.instantiate(); navigation_result.instantiate();
#ifdef DEBUG_ENABLED
NavigationServer3D::get_singleton()->connect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationAgent3D::_navigation_debug_changed));
#endif // DEBUG_ENABLED
} }
NavigationAgent3D::~NavigationAgent3D() { NavigationAgent3D::~NavigationAgent3D() {
ERR_FAIL_NULL(NavigationServer3D::get_singleton()); ERR_FAIL_NULL(NavigationServer3D::get_singleton());
NavigationServer3D::get_singleton()->free(agent); NavigationServer3D::get_singleton()->free(agent);
agent = RID(); // Pointless agent = RID(); // Pointless
#ifdef DEBUG_ENABLED
NavigationServer3D::get_singleton()->disconnect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationAgent3D::_navigation_debug_changed));
ERR_FAIL_NULL(RenderingServer::get_singleton());
if (debug_path_instance.is_valid()) {
RenderingServer::get_singleton()->free(debug_path_instance);
}
if (debug_path_mesh.is_valid()) {
RenderingServer::get_singleton()->free(debug_path_mesh->get_rid());
}
#endif // DEBUG_ENABLED
} }
void NavigationAgent3D::set_avoidance_enabled(bool p_enabled) { void NavigationAgent3D::set_avoidance_enabled(bool p_enabled) {
@ -480,6 +530,9 @@ void NavigationAgent3D::update_navigation() {
} }
NavigationServer3D::get_singleton()->query_path(navigation_query, navigation_result); NavigationServer3D::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"));
@ -566,3 +619,130 @@ void NavigationAgent3D::_check_distance_to_target() {
} }
} }
} }
////////DEBUG////////////////////////////////////////////////////////////
#ifdef DEBUG_ENABLED
void NavigationAgent3D::set_debug_enabled(bool p_enabled) {
debug_enabled = p_enabled;
debug_path_dirty = true;
}
bool NavigationAgent3D::get_debug_enabled() const {
return debug_enabled;
}
void NavigationAgent3D::set_debug_use_custom(bool p_enabled) {
debug_use_custom = p_enabled;
debug_path_dirty = true;
}
bool NavigationAgent3D::get_debug_use_custom() const {
return debug_use_custom;
}
void NavigationAgent3D::set_debug_path_custom_color(Color p_color) {
debug_path_custom_color = p_color;
debug_path_dirty = true;
}
Color NavigationAgent3D::get_debug_path_custom_color() const {
return debug_path_custom_color;
}
void NavigationAgent3D::set_debug_path_custom_point_size(float p_point_size) {
debug_path_custom_point_size = p_point_size;
debug_path_dirty = true;
}
float NavigationAgent3D::get_debug_path_custom_point_size() const {
return debug_path_custom_point_size;
}
void NavigationAgent3D::_navigation_debug_changed() {
debug_path_dirty = true;
}
void NavigationAgent3D::_update_debug_path() {
if (!debug_path_dirty) {
return;
}
debug_path_dirty = false;
if (!debug_path_instance.is_valid()) {
debug_path_instance = RenderingServer::get_singleton()->instance_create();
}
if (!debug_path_mesh.is_valid()) {
debug_path_mesh = Ref<ArrayMesh>(memnew(ArrayMesh));
}
debug_path_mesh->clear_surfaces();
if (!(debug_enabled && NavigationServer3D::get_singleton()->get_debug_navigation_enable_agent_paths())) {
return;
}
if (!(agent_parent && agent_parent->is_inside_tree())) {
return;
}
const Vector<Vector3> &navigation_path = navigation_result->get_path();
if (navigation_path.size() <= 1) {
return;
}
Vector<Vector3> debug_path_lines_vertex_array;
for (int i = 0; i < navigation_path.size() - 1; i++) {
debug_path_lines_vertex_array.push_back(navigation_path[i]);
debug_path_lines_vertex_array.push_back(navigation_path[i + 1]);
}
Array debug_path_lines_mesh_array;
debug_path_lines_mesh_array.resize(Mesh::ARRAY_MAX);
debug_path_lines_mesh_array[Mesh::ARRAY_VERTEX] = debug_path_lines_vertex_array;
debug_path_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, debug_path_lines_mesh_array);
Ref<StandardMaterial3D> debug_agent_path_line_material = NavigationServer3D::get_singleton()->get_debug_navigation_agent_path_line_material();
if (debug_use_custom) {
if (!debug_agent_path_line_custom_material.is_valid()) {
debug_agent_path_line_custom_material = debug_agent_path_line_material->duplicate();
}
debug_agent_path_line_custom_material->set_albedo(debug_path_custom_color);
debug_path_mesh->surface_set_material(0, debug_agent_path_line_custom_material);
} else {
debug_path_mesh->surface_set_material(0, debug_agent_path_line_material);
}
Vector<Vector3> debug_path_points_vertex_array;
for (int i = 0; i < navigation_path.size(); i++) {
debug_path_points_vertex_array.push_back(navigation_path[i]);
}
Array debug_path_points_mesh_array;
debug_path_points_mesh_array.resize(Mesh::ARRAY_MAX);
debug_path_points_mesh_array[Mesh::ARRAY_VERTEX] = debug_path_lines_vertex_array;
debug_path_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_POINTS, debug_path_points_mesh_array);
Ref<StandardMaterial3D> debug_agent_path_point_material = NavigationServer3D::get_singleton()->get_debug_navigation_agent_path_point_material();
if (debug_use_custom) {
if (!debug_agent_path_point_custom_material.is_valid()) {
debug_agent_path_point_custom_material = debug_agent_path_point_material->duplicate();
}
debug_agent_path_point_custom_material->set_albedo(debug_path_custom_color);
debug_agent_path_point_custom_material->set_point_size(debug_path_custom_point_size);
debug_path_mesh->surface_set_material(1, debug_agent_path_point_custom_material);
} else {
debug_path_mesh->surface_set_material(1, debug_agent_path_point_material);
}
RS::get_singleton()->instance_set_base(debug_path_instance, debug_path_mesh->get_rid());
RS::get_singleton()->instance_set_scenario(debug_path_instance, agent_parent->get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_visible(debug_path_instance, agent_parent->is_visible_in_tree());
}
#endif // DEBUG_ENABLED

View File

@ -76,6 +76,22 @@ class NavigationAgent3D : public Node {
// No initialized on purpose // No initialized on purpose
uint32_t update_frame_id = 0; uint32_t update_frame_id = 0;
#ifdef DEBUG_ENABLED
bool debug_enabled = false;
bool debug_path_dirty = true;
RID debug_path_instance;
Ref<ArrayMesh> debug_path_mesh;
float debug_path_custom_point_size = 4.0;
bool debug_use_custom = false;
Color debug_path_custom_color = Color(1.0, 1.0, 1.0, 1.0);
Ref<StandardMaterial3D> debug_agent_path_line_custom_material;
Ref<StandardMaterial3D> debug_agent_path_point_custom_material;
private:
void _navigation_debug_changed();
void _update_debug_path();
#endif // DEBUG_ENABLED
protected: protected:
static void _bind_methods(); static void _bind_methods();
void _notification(int p_what); void _notification(int p_what);
@ -181,6 +197,20 @@ public:
PackedStringArray get_configuration_warnings() const override; PackedStringArray get_configuration_warnings() const override;
#ifdef DEBUG_ENABLED
void set_debug_enabled(bool p_enabled);
bool get_debug_enabled() const;
void set_debug_use_custom(bool p_enabled);
bool get_debug_use_custom() const;
void set_debug_path_custom_color(Color p_color);
Color get_debug_path_custom_color() const;
void set_debug_path_custom_point_size(float p_point_size);
float get_debug_path_custom_point_size() const;
#endif // DEBUG_ENABLED
private: private:
void update_navigation(); void update_navigation();
void _request_repath(); void _request_repath();

View File

@ -207,6 +207,30 @@ void NavigationServer2D::set_debug_navigation_enable_edge_connections(const bool
bool NavigationServer2D::get_debug_navigation_enable_edge_connections() const { bool NavigationServer2D::get_debug_navigation_enable_edge_connections() const {
return NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_connections(); return NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_connections();
} }
void NavigationServer2D::set_debug_navigation_agent_path_color(const Color &p_color) {
NavigationServer3D::get_singleton()->set_debug_navigation_agent_path_color(p_color);
}
Color NavigationServer2D::get_debug_navigation_agent_path_color() const {
return NavigationServer3D::get_singleton()->get_debug_navigation_agent_path_color();
}
void NavigationServer2D::set_debug_navigation_enable_agent_paths(const bool p_value) {
NavigationServer3D::get_singleton()->set_debug_navigation_enable_agent_paths(p_value);
}
bool NavigationServer2D::get_debug_navigation_enable_agent_paths() const {
return NavigationServer3D::get_singleton()->get_debug_navigation_enable_agent_paths();
}
void NavigationServer2D::set_debug_navigation_agent_path_point_size(float p_point_size) {
NavigationServer3D::get_singleton()->set_debug_navigation_agent_path_point_size(p_point_size);
}
float NavigationServer2D::get_debug_navigation_agent_path_point_size() const {
return NavigationServer3D::get_singleton()->get_debug_navigation_agent_path_point_size();
}
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
void NavigationServer2D::_bind_methods() { void NavigationServer2D::_bind_methods() {
@ -286,14 +310,26 @@ void NavigationServer2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer2D::free); ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer2D::free);
ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map"))); ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map")));
ADD_SIGNAL(MethodInfo("navigation_debug_changed"));
} }
NavigationServer2D::NavigationServer2D() { NavigationServer2D::NavigationServer2D() {
singleton = this; singleton = this;
ERR_FAIL_COND_MSG(!NavigationServer3D::get_singleton(), "The Navigation3D singleton should be initialized before the 2D one."); ERR_FAIL_COND_MSG(!NavigationServer3D::get_singleton(), "The Navigation3D singleton should be initialized before the 2D one.");
NavigationServer3D::get_singleton()->connect("map_changed", callable_mp(this, &NavigationServer2D::_emit_map_changed)); NavigationServer3D::get_singleton()->connect("map_changed", callable_mp(this, &NavigationServer2D::_emit_map_changed));
#ifdef DEBUG_ENABLED
NavigationServer3D::get_singleton()->connect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationServer2D::_emit_navigation_debug_changed_signal));
#endif // DEBUG_ENABLED
} }
#ifdef DEBUG_ENABLED
void NavigationServer2D::_emit_navigation_debug_changed_signal() {
emit_signal(SNAME("navigation_debug_changed"));
}
#endif // DEBUG_ENABLED
NavigationServer2D::~NavigationServer2D() { NavigationServer2D::~NavigationServer2D() {
singleton = nullptr; singleton = nullptr;
} }

View File

@ -254,6 +254,20 @@ public:
void set_debug_navigation_enable_edge_connections(const bool p_value); void set_debug_navigation_enable_edge_connections(const bool p_value);
bool get_debug_navigation_enable_edge_connections() const; bool get_debug_navigation_enable_edge_connections() const;
void set_debug_navigation_agent_path_color(const Color &p_color);
Color get_debug_navigation_agent_path_color() const;
void set_debug_navigation_enable_agent_paths(const bool p_value);
bool get_debug_navigation_enable_agent_paths() const;
void set_debug_navigation_agent_path_point_size(float p_point_size);
float get_debug_navigation_agent_path_point_size() const;
#endif // DEBUG_ENABLED
#ifdef DEBUG_ENABLED
private:
void _emit_navigation_debug_changed_signal();
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
}; };

View File

@ -159,6 +159,7 @@ NavigationServer3D::NavigationServer3D() {
debug_navigation_geometry_face_disabled_color = GLOBAL_DEF("debug/shapes/navigation/geometry_face_disabled_color", Color(0.5, 0.5, 0.5, 0.4)); debug_navigation_geometry_face_disabled_color = GLOBAL_DEF("debug/shapes/navigation/geometry_face_disabled_color", Color(0.5, 0.5, 0.5, 0.4));
debug_navigation_link_connection_color = GLOBAL_DEF("debug/shapes/navigation/link_connection_color", Color(1.0, 0.5, 1.0, 1.0)); debug_navigation_link_connection_color = GLOBAL_DEF("debug/shapes/navigation/link_connection_color", Color(1.0, 0.5, 1.0, 1.0));
debug_navigation_link_connection_disabled_color = GLOBAL_DEF("debug/shapes/navigation/link_connection_disabled_color", Color(0.5, 0.5, 0.5, 1.0)); debug_navigation_link_connection_disabled_color = GLOBAL_DEF("debug/shapes/navigation/link_connection_disabled_color", Color(0.5, 0.5, 0.5, 1.0));
debug_navigation_agent_path_color = GLOBAL_DEF("debug/shapes/navigation/agent_path_color", Color(1.0, 0.0, 0.0, 1.0));
debug_navigation_enable_edge_connections = GLOBAL_DEF("debug/shapes/navigation/enable_edge_connections", true); debug_navigation_enable_edge_connections = GLOBAL_DEF("debug/shapes/navigation/enable_edge_connections", true);
debug_navigation_enable_edge_connections_xray = GLOBAL_DEF("debug/shapes/navigation/enable_edge_connections_xray", true); debug_navigation_enable_edge_connections_xray = GLOBAL_DEF("debug/shapes/navigation/enable_edge_connections_xray", true);
@ -168,6 +169,11 @@ NavigationServer3D::NavigationServer3D() {
debug_navigation_enable_link_connections = GLOBAL_DEF("debug/shapes/navigation/enable_link_connections", true); debug_navigation_enable_link_connections = GLOBAL_DEF("debug/shapes/navigation/enable_link_connections", true);
debug_navigation_enable_link_connections_xray = GLOBAL_DEF("debug/shapes/navigation/enable_link_connections_xray", true); debug_navigation_enable_link_connections_xray = GLOBAL_DEF("debug/shapes/navigation/enable_link_connections_xray", true);
debug_navigation_enable_agent_paths = GLOBAL_DEF("debug/shapes/navigation/enable_agent_paths", true);
debug_navigation_enable_agent_paths_xray = GLOBAL_DEF("debug/shapes/navigation/enable_agent_paths_xray", true);
debug_navigation_agent_path_point_size = GLOBAL_DEF("debug/shapes/navigation/agent_path_point_size", 4.0);
if (Engine::get_singleton()->is_editor_hint()) { if (Engine::get_singleton()->is_editor_hint()) {
// enable NavigationServer3D when in Editor or else navigation mesh edge connections are invisible // enable NavigationServer3D when in Editor or else navigation mesh edge connections are invisible
// on runtime tests SceneTree has "Visible Navigation" set and main iteration takes care of this // on runtime tests SceneTree has "Visible Navigation" set and main iteration takes care of this
@ -329,6 +335,42 @@ Ref<StandardMaterial3D> NavigationServer3D::get_debug_navigation_link_connection
return debug_navigation_link_connections_disabled_material; return debug_navigation_link_connections_disabled_material;
} }
Ref<StandardMaterial3D> NavigationServer3D::get_debug_navigation_agent_path_line_material() {
if (debug_navigation_agent_path_line_material.is_valid()) {
return debug_navigation_agent_path_line_material;
}
Ref<StandardMaterial3D> material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
material->set_albedo(debug_navigation_agent_path_color);
if (debug_navigation_enable_agent_paths_xray) {
material->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
}
material->set_render_priority(StandardMaterial3D::RENDER_PRIORITY_MAX - 2);
debug_navigation_agent_path_line_material = material;
return debug_navigation_agent_path_line_material;
}
Ref<StandardMaterial3D> NavigationServer3D::get_debug_navigation_agent_path_point_material() {
if (debug_navigation_agent_path_point_material.is_valid()) {
return debug_navigation_agent_path_point_material;
}
Ref<StandardMaterial3D> material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
material->set_albedo(debug_navigation_agent_path_color);
material->set_flag(StandardMaterial3D::FLAG_USE_POINT_SIZE, true);
material->set_point_size(debug_navigation_agent_path_point_size);
if (debug_navigation_enable_agent_paths_xray) {
material->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, true);
}
material->set_render_priority(StandardMaterial3D::RENDER_PRIORITY_MAX - 2);
debug_navigation_agent_path_point_material = material;
return debug_navigation_agent_path_point_material;
}
void NavigationServer3D::set_debug_navigation_edge_connection_color(const Color &p_color) { void NavigationServer3D::set_debug_navigation_edge_connection_color(const Color &p_color) {
debug_navigation_edge_connection_color = p_color; debug_navigation_edge_connection_color = p_color;
if (debug_navigation_edge_connections_material.is_valid()) { if (debug_navigation_edge_connections_material.is_valid()) {
@ -406,6 +448,31 @@ Color NavigationServer3D::get_debug_navigation_link_connection_disabled_color()
return debug_navigation_link_connection_disabled_color; return debug_navigation_link_connection_disabled_color;
} }
void NavigationServer3D::set_debug_navigation_agent_path_point_size(float p_point_size) {
debug_navigation_agent_path_point_size = MAX(0.1, p_point_size);
if (debug_navigation_agent_path_point_material.is_valid()) {
debug_navigation_agent_path_point_material->set_point_size(debug_navigation_agent_path_point_size);
}
}
float NavigationServer3D::get_debug_navigation_agent_path_point_size() const {
return debug_navigation_agent_path_point_size;
}
void NavigationServer3D::set_debug_navigation_agent_path_color(const Color &p_color) {
debug_navigation_agent_path_color = p_color;
if (debug_navigation_agent_path_line_material.is_valid()) {
debug_navigation_agent_path_line_material->set_albedo(debug_navigation_agent_path_color);
}
if (debug_navigation_agent_path_point_material.is_valid()) {
debug_navigation_agent_path_point_material->set_albedo(debug_navigation_agent_path_color);
}
}
Color NavigationServer3D::get_debug_navigation_agent_path_color() const {
return debug_navigation_agent_path_color;
}
void NavigationServer3D::set_debug_navigation_enable_edge_connections(const bool p_value) { void NavigationServer3D::set_debug_navigation_enable_edge_connections(const bool p_value) {
debug_navigation_enable_edge_connections = p_value; debug_navigation_enable_edge_connections = p_value;
debug_dirty = true; debug_dirty = true;
@ -494,6 +561,37 @@ void NavigationServer3D::set_debug_enabled(bool p_enabled) {
bool NavigationServer3D::get_debug_enabled() const { bool NavigationServer3D::get_debug_enabled() const {
return debug_enabled; return debug_enabled;
} }
void NavigationServer3D::set_debug_navigation_enable_agent_paths(const bool p_value) {
if (debug_navigation_enable_agent_paths != p_value) {
debug_dirty = true;
}
debug_navigation_enable_agent_paths = p_value;
if (debug_dirty) {
call_deferred("_emit_navigation_debug_changed_signal");
}
}
bool NavigationServer3D::get_debug_navigation_enable_agent_paths() const {
return debug_navigation_enable_agent_paths;
}
void NavigationServer3D::set_debug_navigation_enable_agent_paths_xray(const bool p_value) {
debug_navigation_enable_agent_paths_xray = p_value;
if (debug_navigation_agent_path_line_material.is_valid()) {
debug_navigation_agent_path_line_material->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, debug_navigation_enable_agent_paths_xray);
}
if (debug_navigation_agent_path_point_material.is_valid()) {
debug_navigation_agent_path_point_material->set_flag(StandardMaterial3D::FLAG_DISABLE_DEPTH_TEST, debug_navigation_enable_agent_paths_xray);
}
}
bool NavigationServer3D::get_debug_navigation_enable_agent_paths_xray() const {
return debug_navigation_enable_agent_paths_xray;
}
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////

View File

@ -287,6 +287,9 @@ private:
Color debug_navigation_geometry_face_disabled_color = Color(0.5, 0.5, 0.5, 0.4); Color debug_navigation_geometry_face_disabled_color = Color(0.5, 0.5, 0.5, 0.4);
Color debug_navigation_link_connection_color = Color(1.0, 0.5, 1.0, 1.0); Color debug_navigation_link_connection_color = Color(1.0, 0.5, 1.0, 1.0);
Color debug_navigation_link_connection_disabled_color = Color(0.5, 0.5, 0.5, 1.0); Color debug_navigation_link_connection_disabled_color = Color(0.5, 0.5, 0.5, 1.0);
Color debug_navigation_agent_path_color = Color(1.0, 0.0, 0.0, 1.0);
float debug_navigation_agent_path_point_size = 4.0;
bool debug_navigation_enable_edge_connections = true; bool debug_navigation_enable_edge_connections = true;
bool debug_navigation_enable_edge_connections_xray = true; bool debug_navigation_enable_edge_connections_xray = true;
@ -295,6 +298,8 @@ private:
bool debug_navigation_enable_geometry_face_random_color = true; bool debug_navigation_enable_geometry_face_random_color = true;
bool debug_navigation_enable_link_connections = true; bool debug_navigation_enable_link_connections = true;
bool debug_navigation_enable_link_connections_xray = true; bool debug_navigation_enable_link_connections_xray = true;
bool debug_navigation_enable_agent_paths = true;
bool debug_navigation_enable_agent_paths_xray = true;
Ref<StandardMaterial3D> debug_navigation_geometry_edge_material; Ref<StandardMaterial3D> debug_navigation_geometry_edge_material;
Ref<StandardMaterial3D> debug_navigation_geometry_face_material; Ref<StandardMaterial3D> debug_navigation_geometry_face_material;
@ -304,6 +309,9 @@ private:
Ref<StandardMaterial3D> debug_navigation_link_connections_material; Ref<StandardMaterial3D> debug_navigation_link_connections_material;
Ref<StandardMaterial3D> debug_navigation_link_connections_disabled_material; Ref<StandardMaterial3D> debug_navigation_link_connections_disabled_material;
Ref<StandardMaterial3D> debug_navigation_agent_path_line_material;
Ref<StandardMaterial3D> debug_navigation_agent_path_point_material;
public: public:
void set_debug_enabled(bool p_enabled); void set_debug_enabled(bool p_enabled);
bool get_debug_enabled() const; bool get_debug_enabled() const;
@ -329,6 +337,9 @@ public:
void set_debug_navigation_link_connection_disabled_color(const Color &p_color); void set_debug_navigation_link_connection_disabled_color(const Color &p_color);
Color get_debug_navigation_link_connection_disabled_color() const; Color get_debug_navigation_link_connection_disabled_color() const;
void set_debug_navigation_agent_path_color(const Color &p_color);
Color get_debug_navigation_agent_path_color() const;
void set_debug_navigation_enable_edge_connections(const bool p_value); void set_debug_navigation_enable_edge_connections(const bool p_value);
bool get_debug_navigation_enable_edge_connections() const; bool get_debug_navigation_enable_edge_connections() const;
@ -350,6 +361,15 @@ public:
void set_debug_navigation_enable_link_connections_xray(const bool p_value); void set_debug_navigation_enable_link_connections_xray(const bool p_value);
bool get_debug_navigation_enable_link_connections_xray() const; bool get_debug_navigation_enable_link_connections_xray() const;
void set_debug_navigation_enable_agent_paths(const bool p_value);
bool get_debug_navigation_enable_agent_paths() const;
void set_debug_navigation_enable_agent_paths_xray(const bool p_value);
bool get_debug_navigation_enable_agent_paths_xray() const;
void set_debug_navigation_agent_path_point_size(float p_point_size);
float get_debug_navigation_agent_path_point_size() const;
Ref<StandardMaterial3D> get_debug_navigation_geometry_face_material(); Ref<StandardMaterial3D> get_debug_navigation_geometry_face_material();
Ref<StandardMaterial3D> get_debug_navigation_geometry_edge_material(); Ref<StandardMaterial3D> get_debug_navigation_geometry_edge_material();
Ref<StandardMaterial3D> get_debug_navigation_geometry_face_disabled_material(); Ref<StandardMaterial3D> get_debug_navigation_geometry_face_disabled_material();
@ -357,6 +377,9 @@ public:
Ref<StandardMaterial3D> get_debug_navigation_edge_connections_material(); Ref<StandardMaterial3D> get_debug_navigation_edge_connections_material();
Ref<StandardMaterial3D> get_debug_navigation_link_connections_material(); Ref<StandardMaterial3D> get_debug_navigation_link_connections_material();
Ref<StandardMaterial3D> get_debug_navigation_link_connections_disabled_material(); Ref<StandardMaterial3D> get_debug_navigation_link_connections_disabled_material();
Ref<StandardMaterial3D> get_debug_navigation_agent_path_line_material();
Ref<StandardMaterial3D> get_debug_navigation_agent_path_point_material();
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
}; };