use crate::Vec2;
#[repr(C)]
#[derive(Copy, Clone)]
#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))]
pub struct Fvec2 {
pub(crate) inner: [f32; 2],
}
impl std::fmt::Debug for Fvec2 {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.as_array().fmt(f)
}
}
impl Vec2<f32> for Fvec2 {
#[inline]
fn new(x: f32, y: f32) -> Fvec2 {
Fvec2 { inner: [x, y] }
}
#[inline]
fn as_array(&self) -> &[f32; 2] {
&self.inner
}
#[inline]
fn as_mut_array(&mut self) -> &mut [f32; 2] {
&mut self.inner
}
#[inline]
fn add_componentwise(&self, rhs: Fvec2) -> Fvec2 {
Fvec2 {
inner: [self.inner[0] + rhs.inner[0], self.inner[1] + rhs.inner[1]],
}
}
#[inline]
fn sub_componentwise(&self, rhs: Fvec2) -> Fvec2 {
Fvec2 {
inner: [self.inner[0] - rhs.inner[0], self.inner[1] - rhs.inner[1]],
}
}
#[inline]
fn mul_componentwise(&self, rhs: Fvec2) -> Fvec2 {
Fvec2 {
inner: [self.inner[0] * rhs.inner[0], self.inner[1] * rhs.inner[1]],
}
}
#[inline]
fn div_componentwise(&self, rhs: Fvec2) -> Fvec2 {
Fvec2 {
inner: [self.inner[0] / rhs.inner[0], self.inner[1] / rhs.inner[1]],
}
}
#[inline]
fn min_componentwise(&self, rhs: Fvec2) -> Fvec2 {
Fvec2 {
inner: [
self.inner[0].min(rhs.inner[0]),
self.inner[1].min(rhs.inner[1]),
],
}
}
#[inline]
fn max_componentwise(&self, rhs: Fvec2) -> Fvec2 {
Fvec2 {
inner: [
self.inner[0].max(rhs.inner[0]),
self.inner[1].max(rhs.inner[1]),
],
}
}
#[inline]
fn floor(&self) -> Fvec2 {
Fvec2 {
inner: [self.inner[0].floor(), self.inner[1].floor()],
}
}
#[inline]
fn min_reduce(&self) -> f32 {
self.inner[0].min(self.inner[1])
}
#[inline]
fn max_reduce(&self) -> f32 {
self.inner[0].max(self.inner[1])
}
#[inline]
fn eq_reduce(&self, rhs: Fvec2) -> bool {
self.inner[0] == rhs.inner[0] && self.inner[1] == rhs.inner[1]
}
#[inline]
fn dot(&self, rhs: Fvec2) -> f32 {
self.inner[0] * rhs.inner[0] + self.inner[1] * rhs.inner[1]
}
}
implement_scalarops!(Fvec2, f32);
implement_vecops!(Fvec2, f32);