Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions scene/2d/navigation/navigation_agent_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,11 @@ void NavigationAgent2D::_notification(int p_what) {
set_agent_parent(get_parent());
set_physics_process_internal(true);

if (agent_parent && avoidance_enabled) {
NavigationServer2D::get_singleton()->agent_set_position(agent, agent_parent->get_global_position());
if (agent_parent) {
previous_origin = agent_parent->get_global_position();
if (avoidance_enabled) {
NavigationServer2D::get_singleton()->agent_set_position(agent, agent_parent->get_global_position());
}
}

#ifdef DEBUG_ENABLED
Expand Down Expand Up @@ -808,6 +811,8 @@ void NavigationAgent2D::_update_navigation() {
_transition_to_navigation_finished();
}
}

previous_origin = origin;
}

void NavigationAgent2D::_advance_waypoints(const Vector2 &p_origin) {
Expand Down Expand Up @@ -845,11 +850,14 @@ void NavigationAgent2D::_move_to_next_waypoint() {

bool NavigationAgent2D::_is_within_waypoint_distance(const Vector2 &p_origin) const {
const Vector<Vector2> &navigation_path = navigation_result->get_path();
return p_origin.distance_to(navigation_path[navigation_path_index]) < path_desired_distance;
Vector2 waypoint = navigation_path[navigation_path_index];
return p_origin.distance_to(waypoint) < path_desired_distance ||
waypoint.distance_squared_to(Geometry2D::get_closest_point_to_segment(waypoint, previous_origin, p_origin)) < path_desired_distance * path_desired_distance;
}

bool NavigationAgent2D::_is_within_target_distance(const Vector2 &p_origin) const {
return p_origin.distance_to(target_position) < target_desired_distance;
return p_origin.distance_to(target_position) < target_desired_distance ||
target_position.distance_squared_to(Geometry2D::get_closest_point_to_segment(target_position, previous_origin, p_origin)) < target_desired_distance * target_desired_distance;
}

void NavigationAgent2D::_trigger_waypoint_reached() {
Expand Down
2 changes: 2 additions & 0 deletions scene/2d/navigation/navigation_agent_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ class NavigationAgent2D : public Node {

Vector2 target_position;

Vector2 previous_origin;

Ref<NavigationPathQueryParameters2D> navigation_query;
Ref<NavigationPathQueryResult2D> navigation_result;
int navigation_path_index = 0;
Expand Down
19 changes: 15 additions & 4 deletions scene/3d/navigation/navigation_agent_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,11 @@ void NavigationAgent3D::_notification(int p_what) {
set_agent_parent(get_parent());
set_physics_process_internal(true);

if (agent_parent && avoidance_enabled) {
NavigationServer3D::get_singleton()->agent_set_position(agent, agent_parent->get_global_transform().origin);
if (agent_parent) {
previous_origin = agent_parent->get_global_position();
if (avoidance_enabled) {
NavigationServer3D::get_singleton()->agent_set_position(agent, agent_parent->get_global_transform().origin);
}
}

#ifdef DEBUG_ENABLED
Expand Down Expand Up @@ -878,6 +881,8 @@ void NavigationAgent3D::_update_navigation() {
_transition_to_navigation_finished();
}
}

previous_origin = origin;
}

void NavigationAgent3D::_advance_waypoints(const Vector3 &p_origin) {
Expand Down Expand Up @@ -916,11 +921,17 @@ void NavigationAgent3D::_move_to_next_waypoint() {
bool NavigationAgent3D::_is_within_waypoint_distance(const Vector3 &p_origin) const {
const Vector<Vector3> &navigation_path = navigation_result->get_path();
Vector3 waypoint = navigation_path[navigation_path_index] - Vector3(0, path_height_offset, 0);
return p_origin.distance_to(waypoint) < path_desired_distance;
Vector3 flattened_origin = p_origin - Vector3(0, path_height_offset, 0);
Vector3 flattened_prev_origin = previous_origin - Vector3(0, path_height_offset, 0);
return p_origin.distance_to(waypoint) < path_desired_distance ||
waypoint.distance_squared_to(Geometry3D::get_closest_point_to_segment(waypoint, flattened_prev_origin, flattened_origin)) < path_desired_distance * path_desired_distance;
}

bool NavigationAgent3D::_is_within_target_distance(const Vector3 &p_origin) const {
return p_origin.distance_to(target_position) < target_desired_distance;
Vector3 flattened_origin = p_origin - Vector3(0, path_height_offset, 0);
Vector3 flattened_prev_origin = previous_origin - Vector3(0, path_height_offset, 0);
return p_origin.distance_to(target_position) < target_desired_distance ||
target_position.distance_squared_to(Geometry3D::get_closest_point_to_segment(target_position, flattened_prev_origin, flattened_origin)) < target_desired_distance * target_desired_distance;
}

void NavigationAgent3D::_trigger_waypoint_reached() {
Expand Down
2 changes: 2 additions & 0 deletions scene/3d/navigation/navigation_agent_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ class NavigationAgent3D : public Node {

Vector3 target_position;

Vector3 previous_origin;

Ref<NavigationPathQueryParameters3D> navigation_query;
Ref<NavigationPathQueryResult3D> navigation_result;
int navigation_path_index = 0;
Expand Down
Loading