#[macro_export]
macro_rules! swizzle {
($vec:expr_2021 => $a:ident, $b:ident) => {{
let expr = $vec;
$crate::builtin::SwizzleToVector::swizzle_to_vector((expr.$a, expr.$b))
}};
($vec:expr_2021 => $a:ident, $b:ident, $c:ident) => {{
let expr = $vec;
$crate::builtin::SwizzleToVector::swizzle_to_vector((expr.$a, expr.$b, expr.$c))
}};
($vec:expr_2021 => $a:ident, $b:ident, $c:ident, $d:ident) => {{
let expr = $vec;
$crate::builtin::SwizzleToVector::swizzle_to_vector((expr.$a, expr.$b, expr.$c, expr.$d))
}};
}
#[doc(hidden)]
pub trait SwizzleToVector: Sized {
type Output;
fn swizzle_to_vector(self) -> Self::Output;
}
#[cfg(test)] #[cfg_attr(published_docs, doc(cfg(test)))]
mod test {
use crate::assert_eq_approx;
use crate::builtin::*;
#[test]
fn test_vector_swizzle() {
let vector2 = Vector2::new(1.0, 2.0);
let vector3 = Vector3::new(1.0, 2.0, 3.0);
let vector4 = Vector4::new(1.0, 2.0, 3.0, 4.0);
let vec2swiz2: Vector2 = swizzle!(vector2 => y, x);
let vec3swiz2: Vector2 = swizzle!(vector3 => y, x);
let vec4swiz2: Vector2 = swizzle!(vector4 => y, x);
assert_eq_approx!(vec2swiz2, Vector2::new(2.0, 1.0));
assert_eq_approx!(vec3swiz2, Vector2::new(2.0, 1.0));
assert_eq_approx!(vec4swiz2, Vector2::new(2.0, 1.0));
let vec2swiz3: Vector3 = swizzle!(vector2 => y, x, x);
let vec3swiz3: Vector3 = swizzle!(vector3 => y, x, z);
let vec4swiz3: Vector3 = swizzle!(vector4 => y, x, z);
assert_eq_approx!(vec2swiz3, Vector3::new(2.0, 1.0, 1.0),);
assert_eq_approx!(vec3swiz3, Vector3::new(2.0, 1.0, 3.0),);
assert_eq_approx!(vec4swiz3, Vector3::new(2.0, 1.0, 3.0),);
let vec2swiz4: Vector4 = swizzle!(vector2 => y, x, x, y);
let vec3swiz4: Vector4 = swizzle!(vector3 => y, x, z, y);
let vec4swiz4: Vector4 = swizzle!(vector4 => y, x, z, w);
assert_eq_approx!(vec2swiz4, Vector4::new(2.0, 1.0, 1.0, 2.0),);
assert_eq_approx!(vec3swiz4, Vector4::new(2.0, 1.0, 3.0, 2.0),);
assert_eq_approx!(vec4swiz4, Vector4::new(2.0, 1.0, 3.0, 4.0),);
let vector2i = Vector2i::new(1, 2);
let vector3i = Vector3i::new(1, 2, 3);
let vector4i = Vector4i::new(1, 2, 3, 4);
assert_eq!(Vector2i::new(2, 1), swizzle!(vector2i => y, x));
assert_eq!(swizzle!(vector3i => y, x), Vector2i::new(2, 1));
assert_eq!(swizzle!(vector4i => y, x), Vector2i::new(2, 1));
assert_eq!(swizzle!(vector2i => y, x, x), Vector3i::new(2, 1, 1));
assert_eq!(swizzle!(vector3i => y, x, z), Vector3i::new(2, 1, 3));
assert_eq!(swizzle!(vector4i => y, x, z), Vector3i::new(2, 1, 3));
assert_eq!(swizzle!(vector2i => y, x, x, y), Vector4i::new(2, 1, 1, 2));
assert_eq!(swizzle!(vector3i => y, x, z, y), Vector4i::new(2, 1, 3, 2));
assert_eq!(swizzle!(vector4i => y, x, z, w), Vector4i::new(2, 1, 3, 4));
}
}