use bevy::math::{Mat3, Vec3};
use bevy::prelude::Component;
use symbios_shape::MassProperties;
#[derive(Component, Debug, Clone, Copy)]
pub struct TerminalMass {
pub mass: f32,
pub centroid: Vec3,
pub inertia: Option<Mat3>,
}
impl From<&MassProperties> for TerminalMass {
fn from(p: &MassProperties) -> Self {
Self {
mass: p.mass as f32,
centroid: Vec3::new(
p.centroid.x as f32,
p.centroid.y as f32,
p.centroid.z as f32,
),
inertia: p.inertia.map(|m| {
let c = m.to_cols_array();
Mat3::from_cols_array(&[
c[0] as f32,
c[1] as f32,
c[2] as f32,
c[3] as f32,
c[4] as f32,
c[5] as f32,
c[6] as f32,
c[7] as f32,
c[8] as f32,
])
}),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use glam::{DMat3, DVec3};
#[test]
fn from_upstream_box_mass_properties() {
let upstream = MassProperties {
mass: 12.5,
centroid: DVec3::new(1.0, 2.0, 3.0),
inertia: Some(DMat3::IDENTITY),
};
let c = TerminalMass::from(&upstream);
assert_eq!(c.mass, 12.5);
assert_eq!(c.centroid, Vec3::new(1.0, 2.0, 3.0));
assert!(c.inertia.is_some());
let m = c.inertia.unwrap();
assert_eq!(m.x_axis, Vec3::new(1.0, 0.0, 0.0));
assert_eq!(m.y_axis, Vec3::new(0.0, 1.0, 0.0));
assert_eq!(m.z_axis, Vec3::new(0.0, 0.0, 1.0));
}
#[test]
fn from_upstream_taper_no_inertia() {
let upstream = MassProperties {
mass: 5.0,
centroid: DVec3::ZERO,
inertia: None,
};
let c = TerminalMass::from(&upstream);
assert!(c.inertia.is_none());
}
}