From 54c0fd70f82eb1a6814872c78bc22380f438c9d1 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 22 Oct 2023 19:29:11 +0200 Subject: feat(engine): add translating & scaling objects --- engine/src/matrix.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 engine/src/matrix.rs (limited to 'engine/src/matrix.rs') diff --git a/engine/src/matrix.rs b/engine/src/matrix.rs new file mode 100644 index 0000000..7e161f2 --- /dev/null +++ b/engine/src/matrix.rs @@ -0,0 +1,65 @@ +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); + } +} -- cgit v1.2.3-18-g5258