From ff212dce36d5974faae62894954638984df828ab Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Sun, 10 Nov 2019 10:28:20 -0800 Subject: [PATCH] Add 2D matrix uniform types and a couple more useful geometry methods --- Cargo.lock | 2 -- geometry/src/rect.rs | 5 +++++ geometry/src/transform2d.rs | 7 +++++++ gl/src/lib.rs | 7 +++++++ gpu/src/lib.rs | 1 + metal/src/lib.rs | 9 +++++++++ 6 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a2e00f4b..1293c2a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1486,11 +1486,9 @@ name = "pathfinder_gl" version = "0.1.0" dependencies = [ "gl 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "image 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "pathfinder_geometry 0.3.0", "pathfinder_gpu 0.1.0", - "pathfinder_renderer 0.1.0", "pathfinder_simd 0.3.0", ] diff --git a/geometry/src/rect.rs b/geometry/src/rect.rs index 9116acd1..58c59cd0 100644 --- a/geometry/src/rect.rs +++ b/geometry/src/rect.rs @@ -127,6 +127,11 @@ impl RectF { self.0[3] } + #[inline] + pub fn scale(self, factor: f32) -> RectF { + RectF(self.0 * F32x4::splat(factor)) + } + #[inline] pub fn scale_xy(self, factors: Vector2F) -> RectF { RectF(self.0 * factors.0.concat_xy_xy(factors.0)) diff --git a/geometry/src/transform2d.rs b/geometry/src/transform2d.rs index 5979ee21..04f309b0 100644 --- a/geometry/src/transform2d.rs +++ b/geometry/src/transform2d.rs @@ -270,6 +270,13 @@ impl Transform2F { pub fn scale_factor(&self) -> f32 { Vector2F(self.matrix.0.zw()).length() } + + #[inline] + pub fn inverse(&self) -> Transform2F { + let matrix_inv = self.matrix.inverse(); + let vector_inv = -(matrix_inv * self.vector); + Transform2F { matrix: matrix_inv, vector: vector_inv } + } } impl Mul for Transform2F { diff --git a/gl/src/lib.rs b/gl/src/lib.rs index 1c832544..6e300c55 100644 --- a/gl/src/lib.rs +++ b/gl/src/lib.rs @@ -156,6 +156,13 @@ impl GLDevice { UniformData::Int(value) => { gl::Uniform1i(uniform.location, value); ck(); } + UniformData::Mat2(data) => { + assert_eq!(mem::size_of::(), 4 * 4); + gl::UniformMatrix2fv(uniform.location, + 1, + gl::FALSE, + &data as *const F32x4 as *const GLfloat); + } UniformData::Mat4(data) => { assert_eq!(mem::size_of::<[F32x4; 4]>(), 4 * 4 * 4); let data_ptr: *const F32x4 = data.as_ptr(); diff --git a/gpu/src/lib.rs b/gpu/src/lib.rs index 1ef7ae76..5e295c8d 100644 --- a/gpu/src/lib.rs +++ b/gpu/src/lib.rs @@ -152,6 +152,7 @@ pub enum ShaderKind { #[derive(Clone, Copy)] pub enum UniformData { Int(i32), + Mat2(F32x4), Mat4([F32x4; 4]), Vec2(F32x2), Vec4(F32x4), diff --git a/metal/src/lib.rs b/metal/src/lib.rs index 1535acd1..cd9da434 100644 --- a/metal/src/lib.rs +++ b/metal/src/lib.rs @@ -800,6 +800,12 @@ impl MetalDevice { UniformData::Int(value) => { uniform_buffer_data.write_i32::(value).unwrap() } + UniformData::Mat2(matrix) => { + uniform_buffer_data.write_f32::(matrix.x()).unwrap(); + uniform_buffer_data.write_f32::(matrix.y()).unwrap(); + uniform_buffer_data.write_f32::(matrix.z()).unwrap(); + uniform_buffer_data.write_f32::(matrix.w()).unwrap(); + } UniformData::Mat4(matrix) => { for column in &matrix { uniform_buffer_data.write_f32::(column.x()).unwrap(); @@ -1142,6 +1148,9 @@ impl UniformDataExt for UniformData { UniformData::Int(ref data) => { Some(slice::from_raw_parts(data as *const i32 as *const u8, 4 * 1)) } + UniformData::Mat2(ref data) => { + Some(slice::from_raw_parts(data as *const F32x4 as *const u8, 4 * 4)) + } UniformData::Mat4(ref data) => { Some(slice::from_raw_parts(&data[0] as *const F32x4 as *const u8, 4 * 16)) }