use crate::vector::Vec3; #[derive(Debug, Clone)] #[repr(C)] pub struct Matrix { /// Items must be layed out this way for it to work with OpenGL shaders. items: [[Value; ROWS]; COLUMNS], } impl Matrix { /// Sets the value at the specified cell. pub fn set_cell(&mut self, row: usize, column: usize, value: Value) { self.items[column][row] = value; } #[must_use] pub fn as_ptr(&self) -> *const Value { self.items[0].as_ptr() } } impl Matrix { /// Creates a new identity matrix. #[must_use] pub fn new_identity() -> Self { let mut index = 0; let items = [(); ROWS_COLS].map(|()| { let mut columns = [0.0; ROWS_COLS]; columns[index] = 1.0; index += 1; columns }); Self { items } } } impl Matrix { pub fn translate(&mut self, translation: &Vec3) { self.set_cell(0, 3, translation.x); self.set_cell(1, 3, translation.y); self.set_cell(2, 3, translation.z); self.set_cell(3, 3, 1.0); } pub fn scale(&mut self, scaling: &Vec3) { self.set_cell(0, 0, scaling.x); self.set_cell(1, 1, scaling.y); self.set_cell(2, 2, scaling.z); self.set_cell(3, 3, 1.0); } }