use crate::hull::MAX_POLYGON_VERTICES;
use crate::math_functions::{Rot, Transform, Vec2};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ShapeProxy {
pub points: [Vec2; MAX_POLYGON_VERTICES],
pub count: i32,
pub radius: f32,
}
impl Default for ShapeProxy {
fn default() -> Self {
ShapeProxy {
points: [Vec2::default(); MAX_POLYGON_VERTICES],
count: 0,
radius: 0.0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct SegmentDistanceResult {
pub closest1: Vec2,
pub closest2: Vec2,
pub fraction1: f32,
pub fraction2: f32,
pub distance_squared: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct SimplexCache {
pub count: u16,
pub index_a: [u8; 3],
pub index_b: [u8; 3],
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct DistanceInput {
pub proxy_a: ShapeProxy,
pub proxy_b: ShapeProxy,
pub transform: Transform,
pub use_radii: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct DistanceOutput {
pub point_a: Vec2,
pub point_b: Vec2,
pub normal: Vec2,
pub distance: f32,
pub iterations: i32,
pub simplex_count: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct SimplexVertex {
pub w_a: Vec2,
pub w_b: Vec2,
pub w: Vec2,
pub a: f32,
pub index_a: i32,
pub index_b: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct Simplex {
pub v1: SimplexVertex,
pub v2: SimplexVertex,
pub v3: SimplexVertex,
pub count: i32,
}
impl Simplex {
pub(crate) fn vertex(&self, index: i32) -> &SimplexVertex {
match index {
0 => &self.v1,
1 => &self.v2,
_ => &self.v3,
}
}
pub(crate) fn vertex_mut(&mut self, index: i32) -> &mut SimplexVertex {
match index {
0 => &mut self.v1,
1 => &mut self.v2,
_ => &mut self.v3,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ShapeCastPairInput {
pub proxy_a: ShapeProxy,
pub proxy_b: ShapeProxy,
pub transform: Transform,
pub translation_b: Vec2,
pub max_fraction: f32,
pub can_encroach: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Sweep {
pub local_center: Vec2,
pub c1: Vec2,
pub c2: Vec2,
pub q1: Rot,
pub q2: Rot,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ToiInput {
pub proxy_a: ShapeProxy,
pub proxy_b: ShapeProxy,
pub sweep_a: Sweep,
pub sweep_b: Sweep,
pub max_fraction: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ToiState {
#[default]
Unknown,
Failed,
Overlapped,
Hit,
Separated,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct ToiOutput {
pub state: ToiState,
pub point: Vec2,
pub normal: Vec2,
pub fraction: f32,
}