Skip to content

Commit

Permalink
Simplify NavMeshQueries3D::simplify_path_segment
Browse files Browse the repository at this point in the history
  • Loading branch information
kiroxas committed Dec 16, 2024
1 parent dc5f1b7 commit 774e914
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 32 deletions.
39 changes: 8 additions & 31 deletions modules/navigation/3d/nav_mesh_queries_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -920,40 +920,16 @@ LocalVector<uint32_t> NavMeshQueries3D::get_simplified_path_indices(const LocalV
p_epsilon = MAX(0.0, p_epsilon);
real_t squared_epsilon = p_epsilon * p_epsilon;

LocalVector<bool> valid_points;
valid_points.resize(p_path.size());
for (uint32_t i = 0; i < valid_points.size(); i++) {
valid_points[i] = false;
}

simplify_path_segment(0, p_path.size() - 1, p_path, squared_epsilon, valid_points);

int valid_point_index = 0;

for (bool valid : valid_points) {
if (valid) {
valid_point_index += 1;
}
}

LocalVector<uint32_t> simplified_path_indices;
simplified_path_indices.resize(valid_point_index);
valid_point_index = 0;

for (uint32_t i = 0; i < valid_points.size(); i++) {
if (valid_points[i]) {
simplified_path_indices[valid_point_index] = i;
valid_point_index += 1;
}
}
simplified_path_indices.reserve(p_path.size());
simplified_path_indices.push_back(0);
simplify_path_segment(0, p_path.size() - 1, p_path, squared_epsilon, simplified_path_indices);
simplified_path_indices.push_back(p_path.size() - 1);

return simplified_path_indices;
}

void NavMeshQueries3D::simplify_path_segment(int p_start_inx, int p_end_inx, const LocalVector<Vector3> &p_points, real_t p_epsilon, LocalVector<bool> &r_valid_points) {
r_valid_points[p_start_inx] = true;
r_valid_points[p_end_inx] = true;

void NavMeshQueries3D::simplify_path_segment(int p_start_inx, int p_end_inx, const LocalVector<Vector3> &p_points, real_t p_epsilon, LocalVector<uint32_t> &r_simplified_path_indices) {
Vector3 path_segment[2] = { p_points[p_start_inx], p_points[p_end_inx] };

real_t point_max_distance = 0.0;
Expand All @@ -972,8 +948,9 @@ void NavMeshQueries3D::simplify_path_segment(int p_start_inx, int p_end_inx, con
}

if (point_max_distance > p_epsilon) {
simplify_path_segment(p_start_inx, point_max_index, p_points, p_epsilon, r_valid_points);
simplify_path_segment(point_max_index, p_end_inx, p_points, p_epsilon, r_valid_points);
simplify_path_segment(p_start_inx, point_max_index, p_points, p_epsilon, r_simplified_path_indices);
r_simplified_path_indices.push_back(point_max_index);
simplify_path_segment(point_max_index, p_end_inx, p_points, p_epsilon, r_simplified_path_indices);
}
}

Expand Down
2 changes: 1 addition & 1 deletion modules/navigation/3d/nav_mesh_queries_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class NavMeshQueries3D {
static void clip_path(NavMeshPathQueryTask3D &p_query_task, const LocalVector<gd::NavigationPoly> &p_navigation_polys, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly, const Vector3 &p_map_up);
static void _query_task_simplified_path_points(NavMeshPathQueryTask3D &p_query_task);

static void simplify_path_segment(int p_start_inx, int p_end_inx, const LocalVector<Vector3> &p_points, real_t p_epsilon, LocalVector<bool> &r_valid_points);
static void simplify_path_segment(int p_start_inx, int p_end_inx, const LocalVector<Vector3> &p_points, real_t p_epsilon, LocalVector<uint32_t> &r_simplified_path_indices);
static LocalVector<uint32_t> get_simplified_path_indices(const LocalVector<Vector3> &p_path, real_t p_epsilon);
};

Expand Down

0 comments on commit 774e914

Please sign in to comment.