#[cfg(feature = "avian")]
pub mod avian;
use std::fmt;
use crate::prelude::{
geo::{Centroid, TriangulateDelaunay},
*,
};
use bevy::{prelude::*, reflect::Reflectable};
pub trait TiledPhysicsBackend:
Default
+ Clone
+ fmt::Debug
+ 'static
+ std::marker::Sync
+ std::marker::Send
+ FromReflect
+ Reflectable
{
fn spawn_colliders(
&self,
commands: &mut Commands,
source: &TiledEvent<ColliderCreated>,
multi_polygon: &geo::MultiPolygon<f32>,
) -> Vec<Entity>;
}
pub fn multi_polygon_as_triangles(
multi_polygon: &geo::MultiPolygon<f32>,
) -> Vec<([Vec2; 3], Vec2)> {
multi_polygon
.constrained_triangulation(Default::default())
.unwrap()
.into_iter()
.map(|tri| {
let (c_x, c_y) = tri.centroid().0.x_y();
let d = Vec2::new(c_x, c_y);
let tri = tri.to_array().map(|p| Vec2::new(p.x, p.y)).map(|p| p - d);
(tri, d)
})
.collect()
}
pub fn multi_polygon_as_line_strings(
multi_polygon: &geo::MultiPolygon<f32>,
) -> Vec<geo::LineString<f32>> {
let mut out = vec![];
multi_polygon.iter().for_each(|p| {
[p.interiors(), &[p.exterior().clone()]]
.concat()
.into_iter()
.for_each(|ls| {
out.push(ls);
});
});
out
}
pub(crate) fn plugin(_app: &mut App) {
#[cfg(feature = "avian")]
_app.register_type::<avian::TiledPhysicsAvianBackend>();
}