Add 2D matrix uniform types and a couple more useful geometry methods
This commit is contained in:
parent
5d5d30346b
commit
ff212dce36
|
@ -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",
|
||||
]
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -152,6 +152,7 @@ pub enum ShaderKind {
|
|||
#[derive(Clone, Copy)]
|
||||
pub enum UniformData {
|
||||
Int(i32),
|
||||
Mat2(F32x4),
|
||||
Mat4([F32x4; 4]),
|
||||
Vec2(F32x2),
|
||||
Vec4(F32x4),
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue