//! This contains regular vector types for use in packed buffers (i.e. vertex). //! zeus types are all aligned to f32x4 use binrw::BinRead; use bytemuck::{Pod, Zeroable}; #[derive(Copy, Clone, Debug, PartialEq, BinRead, Default)] #[repr(C)] pub(crate) struct Vec3 + Pod> { pub(crate) x: T, pub(crate) y: T, pub(crate) z: T, } impl + Pod> Vec3 { // TODO const pub fn new(x: T, y: T, z: T) -> Self { Self { x, y, z } } } unsafe impl + Pod> Zeroable for Vec3 {} unsafe impl + Pod> Pod for Vec3 {} impl + Pod> From for Vec3 { fn from(v: T) -> Self { Vec3:: { x: v, y: v, z: v } } } impl + Pod> From> for Vec3 { fn from(v: cgmath::Vector3) -> Self { Self { x: v.x, y: v.y, z: v.z } } } impl + Pod> From> for cgmath::Vector3 { fn from(v: Vec3) -> Self { Self { x: v.x, y: v.y, z: v.z } } } impl + Pod> From> for Vec3 { fn from(v: cgmath::Point3) -> Self { Self { x: v.x, y: v.y, z: v.z } } } impl + Pod> From> for cgmath::Point3 { fn from(v: Vec3) -> Self { Self { x: v.x, y: v.y, z: v.z } } } // pub(crate) const fn vec3_splat + Pod>(v: T) -> Vec3 { // Vec3:: { x: v, y: v, z: v } // } #[derive(Copy, Clone, Debug, PartialEq, BinRead, Default)] #[repr(C)] pub(crate) struct Vec2 + Pod> { pub(crate) x: T, pub(crate) y: T, } impl + Pod> Vec2 { // TODO const pub fn new(x: T, y: T) -> Self { Self { x, y } } } unsafe impl + Pod> Zeroable for Vec2 {} unsafe impl + Pod> Pod for Vec2 {} impl + Pod> From for Vec2 { fn from(v: T) -> Self { Self { x: v, y: v } } } impl + Pod> From> for Vec2 { fn from(v: cgmath::Vector2) -> Self { Self { x: v.x, y: v.y } } } impl + Pod> From> for cgmath::Vector2 { fn from(v: Vec2) -> Self { Self { x: v.x, y: v.y } } } impl From> for Vec2 { fn from(v: Vec2) -> Self { Self { x: v.x as f32 / 32768.0, y: v.y as f32 / 32768.0 } } } // pub(crate) const fn vec2_splat + Pod>(v: T) -> Vec2 { // Vec2:: { x: v, y: v } // } #[inline(always)] pub(crate) fn align< T: Copy + std::ops::Sub + std::ops::Add + std::ops::Not + std::ops::BitAnd + num_traits::One + num_traits::Zero + std::cmp::PartialEq, >( n: T, a: T, ) -> T { if a == num_traits::Zero::zero() { return n; } (n + (a - num_traits::One::one())) & !(a - num_traits::One::one()) }