use crate::constants::{MAX_MANIFOLD_POINTS, MAX_POINTS_PER_TRIANGLE};
use crate::math_functions::{Vec3, VEC3_ZERO};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[repr(u8)]
pub enum FeatureOwner {
#[default]
ShapeA = 0,
ShapeB = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[repr(u8)]
pub enum TriangleFeature {
#[default]
None = 0,
TriangleFace = 1,
HullFace = 2,
Edge1 = 3,
Edge2 = 4,
Edge3 = 5,
Vertex1 = 6,
Vertex2 = 7,
Vertex3 = 8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct FeaturePair {
pub owner1: u8,
pub index1: u8,
pub owner2: u8,
pub index2: u8,
}
pub const FEATURE_PAIR_SINGLE: FeaturePair = FeaturePair {
owner1: 0,
index1: 0,
owner2: 0,
index2: 0,
};
pub fn make_feature_pair(
owner1: FeatureOwner,
index1: i32,
owner2: FeatureOwner,
index2: i32,
) -> FeaturePair {
debug_assert!((0..=u8::MAX as i32).contains(&index1));
debug_assert!((0..=u8::MAX as i32).contains(&index2));
FeaturePair {
owner1: owner1 as u8,
index1: index1 as u8,
owner2: owner2 as u8,
index2: index2 as u8,
}
}
pub fn make_feature_id(pair: FeaturePair) -> u32 {
((pair.owner1 as u32) << 24)
| ((pair.index1 as u32) << 16)
| ((pair.owner2 as u32) << 8)
| (pair.index2 as u32)
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct LocalManifoldPoint {
pub point: Vec3,
pub separation: f32,
pub pair: FeaturePair,
pub triangle_index: i32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LocalManifold {
pub normal: Vec3,
pub triangle_normal: Vec3,
pub points: [LocalManifoldPoint; MAX_POINTS_PER_TRIANGLE],
pub point_count: i32,
pub triangle_index: i32,
pub i1: i32,
pub i2: i32,
pub i3: i32,
pub squared_distance: f32,
pub feature: TriangleFeature,
pub triangle_flags: i32,
}
impl Default for LocalManifold {
fn default() -> Self {
LocalManifold {
normal: VEC3_ZERO,
triangle_normal: VEC3_ZERO,
points: [LocalManifoldPoint::default(); MAX_POINTS_PER_TRIANGLE],
point_count: 0,
triangle_index: 0,
i1: 0,
i2: 0,
i3: 0,
squared_distance: 0.0,
feature: TriangleFeature::None,
triangle_flags: 0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub(crate) struct ClipVertex {
pub position: Vec3,
pub separation: f32,
pub pair: FeaturePair,
}
pub(crate) const MAX_CLIP_POINTS: usize = 64;
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub(crate) struct FaceQuery {
pub separation: f32,
pub face_index: i32,
pub vertex_index: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub(crate) struct EdgeQuery {
pub separation: f32,
pub index_a: i32,
pub index_b: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[repr(u8)]
pub enum SeparatingFeature {
#[default]
InvalidAxis = 0,
BacksideAxis = 1,
FaceAxisA = 2,
FaceAxisB = 3,
EdgePairAxis = 4,
ClosestPointsAxis = 5,
ManualFaceAxisA = 6,
ManualFaceAxisB = 7,
ManualEdgePairAxis = 8,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct SatCache {
pub separation: f32,
pub type_: u8,
pub index_a: u8,
pub index_b: u8,
pub hit: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct ManifoldPoint {
pub anchor_a: Vec3,
pub anchor_b: Vec3,
pub separation: f32,
pub base_separation: f32,
pub normal_impulse: f32,
pub total_normal_impulse: f32,
pub normal_velocity: f32,
pub feature_id: u32,
pub triangle_index: i32,
pub persisted: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Manifold {
pub points: [ManifoldPoint; MAX_MANIFOLD_POINTS],
pub normal: Vec3,
pub twist_impulse: f32,
pub friction_impulse: Vec3,
pub rolling_impulse: Vec3,
pub point_count: i32,
}
impl Default for Manifold {
fn default() -> Self {
Manifold {
points: [ManifoldPoint::default(); MAX_MANIFOLD_POINTS],
normal: VEC3_ZERO,
twist_impulse: 0.0,
friction_impulse: VEC3_ZERO,
rolling_impulse: VEC3_ZERO,
point_count: 0,
}
}
}