use crate::constants::MAX_SHAPE_CAST_POINTS;
use crate::core::NULL_INDEX;
use crate::math_functions::{Quat, Transform, Vec3, QUAT_IDENTITY, VEC3_ZERO};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ShapeProxy {
pub points: [Vec3; MAX_SHAPE_CAST_POINTS],
pub count: i32,
pub radius: f32,
}
impl Default for ShapeProxy {
fn default() -> Self {
ShapeProxy {
points: [VEC3_ZERO; MAX_SHAPE_CAST_POINTS],
count: 0,
radius: 0.0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct SimplexCache {
pub metric: f32,
pub count: u16,
pub index_a: [u8; 4],
pub index_b: [u8; 4],
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ShapeCastPairInput {
pub proxy_a: ShapeProxy,
pub proxy_b: ShapeProxy,
pub transform: Transform,
pub translation_b: Vec3,
pub max_fraction: f32,
pub can_encroach: bool,
}
#[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: Vec3,
pub point_b: Vec3,
pub normal: Vec3,
pub distance: f32,
pub iterations: i32,
pub simplex_count: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct SimplexVertex {
pub w_a: Vec3,
pub w_b: Vec3,
pub w: Vec3,
pub a: f32,
pub index_a: i32,
pub index_b: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct Simplex {
pub vertices: [SimplexVertex; 4],
pub count: i32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CastOutput {
pub normal: Vec3,
pub point: Vec3,
pub fraction: f32,
pub iterations: i32,
pub triangle_index: i32,
pub child_index: i32,
pub material_index: i32,
pub hit: bool,
}
impl Default for CastOutput {
fn default() -> Self {
CastOutput {
normal: VEC3_ZERO,
point: VEC3_ZERO,
fraction: 0.0,
iterations: 0,
triangle_index: NULL_INDEX,
child_index: 0,
material_index: 0,
hit: false,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Sweep {
pub local_center: Vec3,
pub c1: Vec3,
pub c2: Vec3,
pub q1: Quat,
pub q2: Quat,
}
impl Default for Sweep {
fn default() -> Self {
Sweep {
local_center: VEC3_ZERO,
c1: VEC3_ZERO,
c2: VEC3_ZERO,
q1: QUAT_IDENTITY,
q2: QUAT_IDENTITY,
}
}
}
#[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: Vec3,
pub normal: Vec3,
pub fraction: f32,
pub distance: f32,
pub distance_iterations: i32,
pub push_back_iterations: i32,
pub root_iterations: i32,
pub used_fallback: bool,
}