use crate::{
multi_image_edge_translated, multi_image_edges_raw, single_image_edge_raw,
single_image_edge_translated,
};
use bevy::prelude::{Image, Vec2};
use bevy_rapier2d::prelude::{Collider, Real};
pub fn single_polyline_collider_translated(image: &Image) -> Collider {
Collider::polyline(single_image_edge_translated(image), None)
}
pub fn single_polyline_collider_raw(image: &Image) -> Collider {
Collider::polyline(single_image_edge_raw(image), None)
}
pub fn single_convex_polyline_collider_translated(image: &Image) -> Option<Collider> {
Collider::convex_polyline(single_image_edge_translated(image))
}
pub fn single_convex_polyline_collider_raw(image: &Image) -> Option<Collider> {
Collider::convex_polyline(single_image_edge_raw(image))
}
pub fn single_convex_hull_collider_translated(image: &Image) -> Option<Collider> {
let points = single_image_edge_translated(image);
Collider::convex_hull(&points)
}
pub fn single_convex_hull_collider_raw(image: &Image) -> Option<Collider> {
let points = single_image_edge_translated(image);
Collider::convex_hull(&points)
}
pub fn single_heightfield_collider_translated(image: &Image) -> Collider {
heightfield_collider_from_points(&single_image_edge_translated(image))
}
pub fn single_heightfield_collider_raw(image: &Image) -> Collider {
heightfield_collider_from_points(&single_image_edge_raw(image))
}
pub fn multi_polyline_collider_translated(image: &Image) -> Vec<Collider> {
multi_image_edge_translated(image)
.into_iter()
.map(|e| Collider::polyline(e, None))
.collect()
}
pub fn multi_polyline_collider_raw(image: &Image) -> Vec<Collider> {
multi_image_edges_raw(image)
.into_iter()
.map(|e| Collider::polyline(e, None))
.collect()
}
pub fn multi_convex_polyline_collider_translated(image: &Image) -> Vec<Option<Collider>> {
multi_image_edge_translated(image)
.into_iter()
.map(Collider::convex_polyline)
.collect()
}
pub fn multi_convex_polyline_collider_raw(image: &Image) -> Vec<Option<Collider>> {
multi_image_edges_raw(image)
.into_iter()
.map(Collider::convex_polyline)
.collect()
}
pub fn multi_heightfield_collider_translated(image: &Image) -> Vec<Collider> {
multi_image_edge_translated(image)
.into_iter()
.map(|e| heightfield_collider_from_points(&e))
.collect()
}
pub fn multi_heightfield_collider_raw(image: &Image) -> Vec<Collider> {
multi_image_edges_raw(image)
.into_iter()
.map(|e| heightfield_collider_from_points(&e))
.collect()
}
pub fn multi_convex_hull_collider_translated(image: &Image) -> Vec<Option<Collider>> {
multi_image_edge_translated(image)
.into_iter()
.map(|e| Collider::convex_hull(&e))
.collect()
}
pub fn multi_convex_hull_collider_raw(image: &Image) -> Vec<Option<Collider>> {
multi_image_edges_raw(image)
.into_iter()
.map(|e| Collider::convex_hull(&e))
.collect()
}
fn heightfield_collider_from_points(v: &[Vec2]) -> Collider {
let hf = heights_from_points(v);
let x_scale = hf.len() as f32 - 1.0;
Collider::heightfield(hf, Vec2::new(x_scale, 1.0))
}
fn heights_from_points(points: &[Vec2]) -> Vec<Real> {
let mut heights: Vec<Vec2> = vec![];
for p in points {
let elem = heights.iter().enumerate().find(|(_, e)| e.x == p.x);
if let Some((i, e)) = elem {
if e.y < p.y {
heights.remove(i);
heights.insert(i, *p);
}
} else {
heights.push(*p);
}
}
heights.iter().map(|e| e.y).collect::<Vec<Real>>()
}