diff options
| author | smix8 <52464204+smix8@users.noreply.github.com> | 2023-07-09 02:41:51 +0200 |
|---|---|---|
| committer | smix8 <52464204+smix8@users.noreply.github.com> | 2023-07-23 03:24:14 +0200 |
| commit | c51e2644466b96d414d4e42a9cfe283ce1162264 (patch) | |
| tree | ba2f352ac1804f6859828dbe7be443355ba2755a /modules/navigation | |
| parent | 6588a4a29af1621086feac0117d5d4d37af957fd (diff) | |
| download | redot-engine-c51e2644466b96d414d4e42a9cfe283ce1162264.tar.gz | |
Fix pathfinding funnel adding unwanted point
Fixes pathfinding funnel adding unwanted point due to precision issues.
Diffstat (limited to 'modules/navigation')
| -rw-r--r-- | modules/navigation/nav_map.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/modules/navigation/nav_map.cpp b/modules/navigation/nav_map.cpp index 3a1d412618..4a226589c9 100644 --- a/modules/navigation/nav_map.cpp +++ b/modules/navigation/nav_map.cpp @@ -431,6 +431,17 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p if (p_optimize) { // Set the apex poly/point to the end point gd::NavigationPoly *apex_poly = &navigation_polys[least_cost_id]; + + Vector3 back_pathway[2] = { apex_poly->back_navigation_edge_pathway_start, apex_poly->back_navigation_edge_pathway_end }; + const Vector3 back_edge_closest_point = Geometry3D::get_closest_point_to_segment(end_point, back_pathway); + if (end_point.is_equal_approx(back_edge_closest_point)) { + // The end point is basically on top of the last crossed edge, funneling around the corners would at best do nothing. + // At worst it would add an unwanted path point before the last point due to precision issues so skip to the next polygon. + if (apex_poly->back_navigation_poly_id != -1) { + apex_poly = &navigation_polys[apex_poly->back_navigation_poly_id]; + } + } + Vector3 apex_point = end_point; gd::NavigationPoly *left_poly = apex_poly; |
