use crate::object::{BodyHandle, ColliderHandle};
use crate::solver::{
BilateralConstraint, BilateralGroundConstraint, NonlinearUnilateralConstraint,
UnilateralConstraint, UnilateralGroundConstraint,
};
use na::RealField;
pub struct LinearConstraints<N: RealField + Copy, Id> {
pub unilateral_ground: Vec<UnilateralGroundConstraint<N, Id>>,
pub unilateral: Vec<UnilateralConstraint<N, Id>>,
pub bilateral_ground: Vec<BilateralGroundConstraint<N, Id>>,
pub bilateral: Vec<BilateralConstraint<N, Id>>,
}
impl<N: RealField + Copy, Id> LinearConstraints<N, Id> {
pub fn new() -> Self {
LinearConstraints {
unilateral_ground: Vec::new(),
unilateral: Vec::new(),
bilateral_ground: Vec::new(),
bilateral: Vec::new(),
}
}
pub fn len(&self) -> usize {
self.unilateral_ground.len()
+ self.unilateral.len()
+ self.bilateral_ground.len()
+ self.bilateral.len()
}
pub fn clear(&mut self) {
self.unilateral_ground.clear();
self.unilateral.clear();
self.bilateral_ground.clear();
self.bilateral.clear();
}
}
pub struct NonlinearConstraints<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle> {
pub unilateral: Vec<NonlinearUnilateralConstraint<N, Handle, CollHandle>>,
}
impl<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle>
NonlinearConstraints<N, Handle, CollHandle>
{
pub fn new() -> Self {
NonlinearConstraints {
unilateral: Vec::new(),
}
}
pub fn len(&self) -> usize {
self.unilateral.len()
}
pub fn clear(&mut self) {
self.unilateral.clear();
}
}
pub struct ConstraintSet<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle, Id> {
pub velocity: LinearConstraints<N, Id>,
pub position: NonlinearConstraints<N, Handle, CollHandle>,
}
impl<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle, Id>
ConstraintSet<N, Handle, CollHandle, Id>
{
pub fn new() -> Self {
ConstraintSet {
velocity: LinearConstraints::new(),
position: NonlinearConstraints::new(),
}
}
pub fn len(&self) -> usize {
self.velocity.len() + self.position.len()
}
pub fn clear(&mut self) {
self.velocity.clear();
self.position.clear();
}
}