pub use self::force::ForceAccumulator;
pub use self::mass::{Inertia, Mass};
pub use self::resolution::{resolve_contact, ResolveData, SingleChangeSet};
pub use self::util::PartialCrossProduct;
pub use self::velocity::{ApplyAngular, Velocity};
pub use self::volumes::Volume;
pub mod simple;
mod resolution;
mod force;
mod mass;
mod util;
mod velocity;
mod volumes;
use cgmath::{BaseFloat, VectorSpace};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct WorldParameters<V, S> {
gravity: V,
damping: S,
}
impl<V, S> Default for WorldParameters<V, S>
where
V: VectorSpace,
S: BaseFloat,
{
fn default() -> Self {
WorldParameters::new(V::zero())
}
}
impl<V, S> WorldParameters<V, S>
where
V: VectorSpace,
S: BaseFloat,
{
pub fn new(gravity: V) -> Self {
WorldParameters {
gravity,
damping: S::from(0.99).unwrap(),
}
}
pub fn with_damping(mut self, damping: S) -> Self {
self.damping = damping;
self
}
pub fn gravity(&self) -> V {
self.gravity
}
pub fn damping(&self) -> S {
self.damping
}
pub fn entity_damping(&self, body: Option<S>) -> S {
body.unwrap_or(self.damping)
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Material {
density: f32,
restitution: f32,
}
impl Default for Material {
fn default() -> Self {
Material::new(1., 1.)
}
}
impl Material {
pub const ROCK: Material = Material {
density: 0.6,
restitution: 0.1,
};
pub const WOOD: Material = Material {
density: 0.3,
restitution: 0.2,
};
pub const METAL: Material = Material {
density: 1.2,
restitution: 0.05,
};
pub const BOUNCY_BALL: Material = Material {
density: 0.3,
restitution: 0.8,
};
pub const SUPER_BALL: Material = Material {
density: 0.3,
restitution: 0.95,
};
pub const PILLOW: Material = Material {
density: 0.1,
restitution: 0.2,
};
pub const STATIC: Material = Material {
density: 0.0,
restitution: 0.4,
};
pub fn new(density: f32, restitution: f32) -> Self {
Self {
density,
restitution,
}
}
pub fn density<S>(&self) -> S
where
S: BaseFloat,
{
S::from(self.density).unwrap()
}
pub fn restitution<S>(&self) -> S
where
S: BaseFloat,
{
S::from(self.restitution).unwrap()
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PhysicalEntity<S> {
material: Material,
gravity_scale: S,
damping: Option<S>,
active: bool,
}
impl<S> Default for PhysicalEntity<S>
where
S: BaseFloat,
{
fn default() -> Self {
PhysicalEntity::new(Material::default())
}
}
impl<S> PhysicalEntity<S>
where
S: BaseFloat,
{
pub fn new(material: Material) -> Self {
Self {
material,
gravity_scale: S::one(),
damping: None,
active: true,
}
}
pub fn with_gravity_scale(mut self, gravity_scale: S) -> Self {
self.gravity_scale = gravity_scale;
self
}
pub fn with_damping(mut self, damping: S) -> Self {
self.damping = Some(damping);
self
}
pub fn material(&self) -> &Material {
&self.material
}
pub fn gravity_scale(&self) -> S {
self.gravity_scale
}
pub fn damping(&self) -> Option<S> {
self.damping
}
pub fn active(&self) -> bool {
self.active
}
pub fn activate(&mut self) {
self.active = true;
}
pub fn deactivate(&mut self) {
self.active = false;
}
}