use crate::{C_SQUARED, Real, sqrt};
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
pub struct Velocity {
pub vx: Real,
pub vy: Real,
pub vz: Real,
}
impl Velocity {
#[inline]
pub const fn new(vx: Real, vy: Real, vz: Real) -> Velocity {
Self { vx, vy, vz }
}
pub const ZERO: Self = Self::new(f!(0.0), f!(0.0), f!(0.0));
#[inline]
pub const fn from_speed(speed_m_s: Real) -> Velocity {
Self::new(speed_m_s, f!(0.0), f!(0.0))
}
#[inline]
pub const fn norm_squared(self) -> Real {
self.vx * self.vx + self.vy * self.vy + self.vz * self.vz
}
#[inline]
pub const fn speed(self) -> Real {
sqrt(self.norm_squared().max(f!(0.0)))
}
#[inline]
pub const fn beta(self) -> Real {
sqrt((self.norm_squared() / C_SQUARED).max(f!(0.0)))
}
}
#[cfg(feature = "wire")]
impl Velocity {
pub const WIRE_SIZE: usize = 24;
pub fn to_wire_bytes(&self) -> [u8; Self::WIRE_SIZE] {
let mut buf = [0u8; Self::WIRE_SIZE];
buf[0..8].copy_from_slice(&self.vx.to_le_bytes());
buf[8..16].copy_from_slice(&self.vy.to_le_bytes());
buf[16..24].copy_from_slice(&self.vz.to_le_bytes());
buf
}
pub fn from_wire_bytes(bytes: &[u8]) -> Option<Self> {
if bytes.len() != Self::WIRE_SIZE {
return None;
}
let vx = Real::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]);
let vy = Real::from_le_bytes([
bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15],
]);
let vz = Real::from_le_bytes([
bytes[16], bytes[17], bytes[18], bytes[19], bytes[20], bytes[21], bytes[22], bytes[23],
]);
Some(Self { vx, vy, vz })
}
}