use crate::alloc_prelude::*;
use crate::dynamics::SpringCoefficients;
use crate::geometry::ColliderBuilder;
use crate::math::{DIM, Real, Vector};
#[cfg(not(feature = "std"))]
#[allow(unused_imports)]
use simba::scalar::{ComplexField as _, RealField as _};
use super::super::{SoftBody, SoftBodyCellModel, SoftBodyMaterial};
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub struct SoftBodyParticleSettings {
pub linear_damping: Real,
pub gravity_scale: Real,
pub additional_solver_iterations: usize,
pub additional_pgs_iterations: usize,
pub can_sleep: bool,
pub dominance_group: i8,
}
impl Default for SoftBodyParticleSettings {
fn default() -> Self {
Self {
linear_damping: 0.0,
gravity_scale: 1.0,
additional_solver_iterations: 0,
additional_pgs_iterations: 3,
can_sleep: true,
dominance_group: 0,
}
}
}
#[derive(Clone, Debug)]
pub struct SoftBodyBuilder {
pub positions: Vec<Vector>,
pub masses: Vec<Real>,
pub particle_mass: Real,
pub pinned: Vec<u32>,
pub edges: Vec<[u32; 2]>,
pub bend_edges: Vec<[u32; 2]>,
pub tension_only_edges: Vec<u32>,
pub edge_softness: Vec<(u32, SpringCoefficients<Real>)>,
pub edge_tear_resistance: Vec<(u32, Real)>,
#[cfg(feature = "dim3")]
pub dihedrals: Vec<[u32; 4]>,
pub cells: Vec<[u32; DIM + 1]>,
pub surface: Vec<[u32; DIM]>,
pub material: SoftBodyMaterial,
pub cell_model: SoftBodyCellModel,
#[cfg(feature = "fem")]
pub solver: super::SoftBodySolver,
pub volume_preservation: bool,
pub volume_factor: Real,
pub shape_matching: bool,
pub self_contacts: bool,
pub oriented: Option<bool>,
pub particle_radius: Real,
pub collider_template: Option<ColliderBuilder>,
pub skin: Option<(Vec<Vector>, Vec<[u32; DIM]>)>,
#[cfg(feature = "dim3")]
pub wire: Vec<[u32; 2]>,
pub skin_collision: bool,
pub particle_settings: SoftBodyParticleSettings,
pub user_data: u128,
}
impl Default for SoftBodyBuilder {
fn default() -> Self {
Self::new(Vec::new())
}
}
impl From<SoftBodyBuilder> for SoftBody {
fn from(builder: SoftBodyBuilder) -> Self {
builder.build()
}
}