From 750a441a8c7c76b240db238283e9cbdab8d6932d Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 19 May 2020 19:55:05 +0200 Subject: Move `Transformation` to `iced_graphics` --- graphics/Cargo.toml | 1 + graphics/src/lib.rs | 2 ++ graphics/src/transformation.rs | 54 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 graphics/src/transformation.rs (limited to 'graphics') diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index dcbf5ce4..a81807d6 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -9,6 +9,7 @@ canvas = ["lyon"] [dependencies] bytemuck = "1.2" +glam = "0.8" [dependencies.iced_native] version = "0.2" diff --git a/graphics/src/lib.rs b/graphics/src/lib.rs index 596f72a4..6e5105d2 100644 --- a/graphics/src/lib.rs +++ b/graphics/src/lib.rs @@ -1,6 +1,7 @@ mod defaults; mod primitive; mod renderer; +mod transformation; mod widget; pub mod backend; @@ -13,3 +14,4 @@ pub use backend::Backend; pub use defaults::Defaults; pub use primitive::Primitive; pub use renderer::Renderer; +pub use transformation::Transformation; diff --git a/graphics/src/transformation.rs b/graphics/src/transformation.rs new file mode 100644 index 00000000..ff3b1d00 --- /dev/null +++ b/graphics/src/transformation.rs @@ -0,0 +1,54 @@ +use glam::{Mat4, Vec3, Vec4}; +use std::ops::Mul; + +/// A 2D transformation matrix. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Transformation(Mat4); + +impl Transformation { + /// Get the identity transformation. + pub fn identity() -> Transformation { + Transformation(Mat4::identity()) + } + + /// Creates an orthographic projection. + #[rustfmt::skip] + pub fn orthographic(width: u32, height: u32) -> Transformation { + Transformation(Mat4::from_cols( + Vec4::new(2.0 / width as f32, 0.0, 0.0, 0.0), + Vec4::new(0.0, -2.0 / height as f32, 0.0, 0.0), + Vec4::new(0.0, 0.0, -1.0, 0.0), + Vec4::new(-1.0, 1.0, 0.0, 1.0) + )) + } + + /// Creates a translate transformation. + pub fn translate(x: f32, y: f32) -> Transformation { + Transformation(Mat4::from_translation(Vec3::new(x, y, 0.0))) + } + + /// Creates a scale transformation. + pub fn scale(x: f32, y: f32) -> Transformation { + Transformation(Mat4::from_scale(Vec3::new(x, y, 1.0))) + } +} + +impl Mul for Transformation { + type Output = Self; + + fn mul(self, rhs: Self) -> Self { + Transformation(self.0 * rhs.0) + } +} + +impl AsRef<[f32; 16]> for Transformation { + fn as_ref(&self) -> &[f32; 16] { + self.0.as_ref() + } +} + +impl From for [f32; 16] { + fn from(t: Transformation) -> [f32; 16] { + *t.as_ref() + } +} -- cgit