use super::corridor::NavmeshCorridor;
use crate::{Navmesh, Point2};
pub fn pull_string(
navmesh: &Navmesh,
corridor: &NavmeshCorridor,
initial_points: Vec<Point2>,
) -> Vec<Point2> {
let mut deduped = Vec::with_capacity(initial_points.len() + 2);
deduped.push(corridor.start);
for point in initial_points {
if deduped
.last()
.is_some_and(|last| points_equal(*last, point))
{
continue;
}
deduped.push(point);
}
if deduped
.last()
.is_none_or(|last| !points_equal(*last, corridor.goal))
{
deduped.push(corridor.goal);
}
let mut taut = Vec::with_capacity(deduped.len());
for point in deduped {
while taut.len() >= 2 && navmesh.segment_is_walkable(taut[taut.len() - 2], point) {
taut.pop();
}
taut.push(point);
}
taut
}
fn points_equal(a: Point2, b: Point2) -> bool {
(a.x - b.x).abs() <= 1e-9 && (a.y - b.y).abs() <= 1e-9
}