#![doc = include_str!("README.md")]
use bevy::reflect::Reflect;
#[cfg(feature = "serialize")]
use bevy::reflect::{ReflectDeserialize, ReflectSerialize};
use crate::{Scalar, TAU};
#[derive(Clone, Copy, Debug, PartialEq, Reflect)]
pub struct SoftnessParameters {
double_damping_ratio: Scalar,
angular_frequency: Scalar,
}
impl SoftnessParameters {
#[inline]
pub fn new(damping_ratio: Scalar, frequency_hz: Scalar) -> Self {
Self {
double_damping_ratio: 2.0 * damping_ratio,
angular_frequency: TAU * frequency_hz,
}
}
#[inline]
pub fn damping_ratio(self) -> Scalar {
self.double_damping_ratio * 0.5
}
#[inline]
pub fn frequency(self) -> Scalar {
self.angular_frequency / TAU
}
#[inline]
pub const fn angular_frequency(self) -> Scalar {
self.angular_frequency
}
#[inline]
pub fn compute_coefficients(self, delta_secs: Scalar) -> SoftnessCoefficients {
let a1 = self.double_damping_ratio + self.angular_frequency * delta_secs;
let a2 = self.angular_frequency * delta_secs * a1;
let a3 = 1.0 / (1.0 + a2);
SoftnessCoefficients {
bias: self.angular_frequency / a1,
impulse_scale: a3,
mass_scale: a2 * a3,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Reflect)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serialize", reflect(Serialize, Deserialize))]
#[reflect(Debug, PartialEq)]
pub struct SoftnessCoefficients {
pub bias: Scalar,
pub mass_scale: Scalar,
pub impulse_scale: Scalar,
}