Add 2D matrix uniform types and a couple more useful geometry methods

This commit is contained in:
Patrick Walton 2019-11-10 10:28:20 -08:00
parent 5d5d30346b
commit ff212dce36
6 changed files with 29 additions and 2 deletions

2
Cargo.lock generated
View File

@ -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",
]

View File

@ -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))

View File

@ -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<Transform2F> for Transform2F {

View File

@ -156,6 +156,13 @@ impl GLDevice {
UniformData::Int(value) => {
gl::Uniform1i(uniform.location, value); ck();
}
UniformData::Mat2(data) => {
assert_eq!(mem::size_of::<F32x4>(), 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();

View File

@ -152,6 +152,7 @@ pub enum ShaderKind {
#[derive(Clone, Copy)]
pub enum UniformData {
Int(i32),
Mat2(F32x4),
Mat4([F32x4; 4]),
Vec2(F32x2),
Vec4(F32x4),

View File

@ -800,6 +800,12 @@ impl MetalDevice {
UniformData::Int(value) => {
uniform_buffer_data.write_i32::<NativeEndian>(value).unwrap()
}
UniformData::Mat2(matrix) => {
uniform_buffer_data.write_f32::<NativeEndian>(matrix.x()).unwrap();
uniform_buffer_data.write_f32::<NativeEndian>(matrix.y()).unwrap();
uniform_buffer_data.write_f32::<NativeEndian>(matrix.z()).unwrap();
uniform_buffer_data.write_f32::<NativeEndian>(matrix.w()).unwrap();
}
UniformData::Mat4(matrix) => {
for column in &matrix {
uniform_buffer_data.write_f32::<NativeEndian>(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))
}