summaryrefslogtreecommitdiffstats
path: root/graphics/src/transformation.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-05-19 19:55:05 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-05-19 19:55:05 +0200
commit750a441a8c7c76b240db238283e9cbdab8d6932d (patch)
treef0e43b25375d1eace3e3d4871e7c19e01268f986 /graphics/src/transformation.rs
parent05af8d00d4c0f7b8e0ece85224fd90a92da86da8 (diff)
downloadiced-750a441a8c7c76b240db238283e9cbdab8d6932d.tar.gz
iced-750a441a8c7c76b240db238283e9cbdab8d6932d.tar.bz2
iced-750a441a8c7c76b240db238283e9cbdab8d6932d.zip
Move `Transformation` to `iced_graphics`
Diffstat (limited to 'graphics/src/transformation.rs')
-rw-r--r--graphics/src/transformation.rs54
1 files changed, 54 insertions, 0 deletions
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<Transformation> for [f32; 16] {
+ fn from(t: Transformation) -> [f32; 16] {
+ *t.as_ref()
+ }
+}