blob: 00d72799e64e6d010a630d86fa67b71571313c95 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
// Helpers for working with transforms.
struct Transform {
matrx: vec4<f32>,
translate: vec2<f32>,
}
fn transform_apply(transform: Transform, p: vec2<f32>) -> vec2<f32> {
return transform.matrx.xy * p.x + transform.matrx.zw * p.y + transform.translate;
}
fn transform_inverse(transform: Transform) -> Transform {
let inv_det = 1.0 / (transform.matrx.x * transform.matrx.w - transform.matrx.y * transform.matrx.z);
let inv_mat = inv_det * vec4(transform.matrx.w, -transform.matrx.y, -transform.matrx.z, transform.matrx.x);
let inv_tr = mat2x2(inv_mat.xy, inv_mat.zw) * -transform.translate;
return Transform(inv_mat, inv_tr);
}
fn transform_mul(a: Transform, b: Transform) -> Transform {
return Transform(
a.matrx.xyxy * b.matrx.xxzz + a.matrx.zwzw * b.matrx.yyww,
a.matrx.xy * b.translate.x + a.matrx.zw * b.translate.y + a.translate
);
}