pub use self::force::ForceAccumulator;
pub use self::mass::{Inertia, Mass};
pub use self::resolution::{resolve_contact, ResolveData};
pub use self::util::PartialCrossProduct;
pub use self::velocity::{ApplyAngular, Velocity};
pub use self::volumes::Volume;
pub mod prelude2d;
pub mod prelude3d;
pub mod simple;
mod resolution;
mod volumes;
mod mass;
mod velocity;
mod force;
mod util;
use cgmath::BaseFloat;
#[derive(Debug)]
#[cfg_attr(feature = "eders", 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)]
#[cfg_attr(feature = "eders", derive(Serialize, Deserialize))]
pub struct RigidBody<S> {
material: Material,
gravity_scale: S,
}
impl<S> Default for RigidBody<S>
where
S: BaseFloat,
{
fn default() -> Self {
RigidBody::new(Material::default(), S::one())
}
}
impl<S> RigidBody<S>
where
S: BaseFloat,
{
pub fn new(material: Material, gravity_scale: S) -> Self {
Self {
material,
gravity_scale,
}
}
pub fn material(&self) -> &Material {
&self.material
}
pub fn gravity_scale(&self) -> S {
self.gravity_scale
}
}