use crate::alloc_prelude::*;
use crate::geometry::ColliderHandle;
use crate::math::{DIM, Real, Vector};
use super::super::{SoftEdgeContact, SoftVertexContact};
use super::super::{SoftOverlapState, SoftOverlapWarm, SoftVolumeContact};
#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub struct SoftMeshCellBinding {
pub cell: u32,
pub weights: [Real; DIM + 1],
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub struct SoftMeshId {
pub cluster: u32,
pub mesh: u32,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub struct SoftMeshRef {
pub body: crate::dynamics::SoftBodyHandle,
pub id: SoftMeshId,
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub enum SoftMeshMapping {
Direct {
particles: Vec<u32>,
},
Skinned {
bindings: Vec<SoftMeshCellBinding>,
},
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub struct SoftCollisionMesh {
pub(crate) binding: SoftMeshMapping,
pub(crate) indices: Vec<[u32; DIM]>,
pub(crate) vertices: Vec<Vector>,
pub(crate) ring_offsets: Vec<u32>,
pub(crate) ring: Vec<u32>,
pub(crate) vertex_elements_offsets: Vec<u32>,
pub(crate) vertex_elements: Vec<u32>,
#[cfg(feature = "dim3")]
pub(crate) edges: Vec<[u32; 2]>,
#[cfg(feature = "dim3")]
pub(crate) element_edges: Vec<[u32; DIM]>,
#[cfg(feature = "dim3")]
pub(crate) edge_owners: Vec<u32>,
pub(crate) closed: bool,
#[cfg_attr(feature = "serde-serialize", serde(default))]
pub(crate) oriented: bool,
pub(crate) rest_signed_volume: Real,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) inverted: bool,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) orientation_unreliable: bool,
pub(crate) element_cells: Vec<u32>,
pub(crate) id: SoftMeshId,
pub(crate) follows_boundary: bool,
pub(crate) collision_enabled: bool,
pub(crate) collider: ColliderHandle,
pub(crate) self_contacts: bool,
pub(crate) edge_contacts: Vec<SoftEdgeContact>,
pub(crate) vertex_contacts: Vec<SoftVertexContact>,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) overlap_states: Vec<SoftOverlapState>,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) overlap_warm: Vec<SoftOverlapWarm>,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) volume_contacts: Vec<SoftVolumeContact>,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) crossing_sweep_travel: Real,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) crossed_partners: Vec<ColliderHandle>,
#[cfg_attr(feature = "serde-serialize", serde(default))]
pub(crate) topology_version: u32,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
pub(crate) vertex_cache: Vec<Vector>,
}
#[derive(Copy, Clone, Debug, Default)]
pub(crate) struct SoftTopologyRemap<'a> {
pub cells: &'a [u32],
pub particles: &'a [u32],
pub split: &'a [(u32, u32)],
pub inserted: &'a [[u32; 4]],
}