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"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gl 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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)",
|
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"pathfinder_geometry 0.3.0",
|
"pathfinder_geometry 0.3.0",
|
||||||
"pathfinder_gpu 0.1.0",
|
"pathfinder_gpu 0.1.0",
|
||||||
"pathfinder_renderer 0.1.0",
|
|
||||||
"pathfinder_simd 0.3.0",
|
"pathfinder_simd 0.3.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,11 @@ impl RectF {
|
||||||
self.0[3]
|
self.0[3]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn scale(self, factor: f32) -> RectF {
|
||||||
|
RectF(self.0 * F32x4::splat(factor))
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn scale_xy(self, factors: Vector2F) -> RectF {
|
pub fn scale_xy(self, factors: Vector2F) -> RectF {
|
||||||
RectF(self.0 * factors.0.concat_xy_xy(factors.0))
|
RectF(self.0 * factors.0.concat_xy_xy(factors.0))
|
||||||
|
|
|
@ -270,6 +270,13 @@ impl Transform2F {
|
||||||
pub fn scale_factor(&self) -> f32 {
|
pub fn scale_factor(&self) -> f32 {
|
||||||
Vector2F(self.matrix.0.zw()).length()
|
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 {
|
impl Mul<Transform2F> for Transform2F {
|
||||||
|
|
|
@ -156,6 +156,13 @@ impl GLDevice {
|
||||||
UniformData::Int(value) => {
|
UniformData::Int(value) => {
|
||||||
gl::Uniform1i(uniform.location, value); ck();
|
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) => {
|
UniformData::Mat4(data) => {
|
||||||
assert_eq!(mem::size_of::<[F32x4; 4]>(), 4 * 4 * 4);
|
assert_eq!(mem::size_of::<[F32x4; 4]>(), 4 * 4 * 4);
|
||||||
let data_ptr: *const F32x4 = data.as_ptr();
|
let data_ptr: *const F32x4 = data.as_ptr();
|
||||||
|
|
|
@ -152,6 +152,7 @@ pub enum ShaderKind {
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
pub enum UniformData {
|
pub enum UniformData {
|
||||||
Int(i32),
|
Int(i32),
|
||||||
|
Mat2(F32x4),
|
||||||
Mat4([F32x4; 4]),
|
Mat4([F32x4; 4]),
|
||||||
Vec2(F32x2),
|
Vec2(F32x2),
|
||||||
Vec4(F32x4),
|
Vec4(F32x4),
|
||||||
|
|
|
@ -800,6 +800,12 @@ impl MetalDevice {
|
||||||
UniformData::Int(value) => {
|
UniformData::Int(value) => {
|
||||||
uniform_buffer_data.write_i32::<NativeEndian>(value).unwrap()
|
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) => {
|
UniformData::Mat4(matrix) => {
|
||||||
for column in &matrix {
|
for column in &matrix {
|
||||||
uniform_buffer_data.write_f32::<NativeEndian>(column.x()).unwrap();
|
uniform_buffer_data.write_f32::<NativeEndian>(column.x()).unwrap();
|
||||||
|
@ -1142,6 +1148,9 @@ impl UniformDataExt for UniformData {
|
||||||
UniformData::Int(ref data) => {
|
UniformData::Int(ref data) => {
|
||||||
Some(slice::from_raw_parts(data as *const i32 as *const u8, 4 * 1))
|
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) => {
|
UniformData::Mat4(ref data) => {
|
||||||
Some(slice::from_raw_parts(&data[0] as *const F32x4 as *const u8, 4 * 16))
|
Some(slice::from_raw_parts(&data[0] as *const F32x4 as *const u8, 4 * 16))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue