use crate::alloc_prelude::*;
use crate::dynamics::solver::solver_body::SolverBodies;
use crate::dynamics::{MultibodyLinkId, solver::SolverVel};
#[cfg(feature = "dim3")]
use crate::math::{AngVector, Rotation};
use crate::math::{DVector, Real};
#[cfg(feature = "dim3")]
#[derive(Copy, Clone)]
pub(crate) struct GyroParams {
pub principal_inertia: AngVector,
pub inv_principal_inertia: AngVector,
pub principal_frame: Rotation,
pub enabled: bool,
}
#[cfg(feature = "dim3")]
impl Default for GyroParams {
fn default() -> Self {
Self {
principal_inertia: AngVector::ZERO,
inv_principal_inertia: AngVector::ZERO,
principal_frame: Rotation::IDENTITY,
enabled: false,
}
}
}
pub(crate) struct VelocitySolver {
pub solver_bodies: SolverBodies,
pub solver_vels_increment: Vec<SolverVel<Real>>,
pub generic_solver_vels: DVector,
pub generic_solver_vels_increment: DVector,
pub multibody_roots: Vec<MultibodyLinkId>,
#[cfg(feature = "dim3")]
pub solver_gyro: Vec<GyroParams>,
}
impl VelocitySolver {
pub fn new() -> Self {
Self {
solver_bodies: SolverBodies::default(),
solver_vels_increment: Vec::new(),
generic_solver_vels: DVector::zeros(0),
generic_solver_vels_increment: DVector::zeros(0),
multibody_roots: Vec::new(),
#[cfg(feature = "dim3")]
solver_gyro: Vec::new(),
}
}
}