use core::ops::{Add, Mul, Sub}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Vec2 { pub x: f32, pub y: f32, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Vec3 { pub x: f32, pub y: f32, pub z: f32, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Vec4 { pub x: f32, pub y: f32, pub z: f32, pub w: f32, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Mat4 { pub m: [f32; 16], } #[allow(non_camel_case_types)] pub type pxl8_vec2 = Vec2; #[allow(non_camel_case_types)] pub type pxl8_vec3 = Vec3; #[allow(non_camel_case_types)] pub type pxl8_vec4 = Vec4; #[allow(non_camel_case_types)] pub type pxl8_mat4 = Mat4; pub const VEC3_ZERO: Vec3 = Vec3 { x: 0.0, y: 0.0, z: 0.0 }; pub const VEC3_Y: Vec3 = Vec3 { x: 0.0, y: 1.0, z: 0.0 }; pub trait Vec3Ext { fn new(x: f32, y: f32, z: f32) -> Self; fn dot(self, rhs: Self) -> f32; } impl Vec3Ext for pxl8_vec3 { fn new(x: f32, y: f32, z: f32) -> Self { Self { x, y, z } } fn dot(self, rhs: Self) -> f32 { self.x * rhs.x + self.y * rhs.y + self.z * rhs.z } } impl Default for pxl8_vec3 { fn default() -> Self { VEC3_ZERO } } impl Add for pxl8_vec3 { type Output = Self; fn add(self, rhs: Self) -> Self { Self { x: self.x + rhs.x, y: self.y + rhs.y, z: self.z + rhs.z, } } } impl Sub for pxl8_vec3 { type Output = Self; fn sub(self, rhs: Self) -> Self { Self { x: self.x - rhs.x, y: self.y - rhs.y, z: self.z - rhs.z, } } } impl Mul for pxl8_vec3 { type Output = Self; fn mul(self, rhs: f32) -> Self { Self { x: self.x * rhs, y: self.y * rhs, z: self.z * rhs, } } }