use bevy::prelude::*;
use crate::util::*;
pub(crate) trait Constraint {
fn apply(&self, swing: Quat, twist: Quat) -> (Quat, Quat);
}
#[derive(Component, Clone, Reflect)]
pub struct SwingConstraint(pub f32);
impl Constraint for SwingConstraint {
fn apply(&self, swing: Quat, twist: Quat) -> (Quat, Quat) {
(Quat::constrain(swing, self.0), twist)
}
}
#[derive(Component, Clone, Reflect)]
pub struct TwistConstraint(pub f32);
impl Constraint for TwistConstraint {
fn apply(&self, swing: Quat, twist: Quat) -> (Quat, Quat) {
(swing, Quat::constrain(twist, self.0))
}
}