1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
use number_traits::Num; #[inline] pub fn set<'a, 'b, T: Copy + Num>(out: &'a mut [T; 6], m11: T, m12: T, m13: T, m21: T, m22: T, m23: T) -> &'a mut [T; 6] { out[0] = m11; out[2] = m21; out[4] = m13; out[1] = m12; out[3] = m22; out[5] = m23; out } #[test] fn test_set() { let mut v = [0, 0, 0, 0, 0, 0]; set(&mut v, 1, 2, 3, 4, 5, 6 ); assert!(v == [1, 2, 4, 5, 3, 6]); } #[inline] pub fn zero<'a, 'b, T: Copy + Num>(out: &'a mut [T; 6]) -> &'a mut [T; 6] { set(out, T::zero(), T::zero(), T::zero(), T::zero(), T::zero(), T::zero()) } #[inline] pub fn identity<'a, 'b, T: Copy + Num>(out: &'a mut [T; 6]) -> &'a mut [T; 6] { set(out, T::one(), T::zero(), T::zero(), T::zero(), T::one(), T::zero()) } #[inline] pub fn from_mat2<'a, 'b, T: Copy + Num>(out: &'a mut [T; 6], m: &'b [T; 4]) -> &'a mut [T; 6] { set( out, m[0], m[2], T::zero(), m[1], m[3], T::zero() ) } #[inline] pub fn from_mat3<'a, 'b, T: Copy + Num>(out: &'a mut [T; 6], m: &'b [T; 9]) -> &'a mut [T; 6] { set( out, m[0], m[3], T::zero(), m[1], m[4], T::zero() ) } #[inline] pub fn from_mat4<'a, 'b, T: Copy + Num>(out: &'a mut [T; 6], m: &'b [T; 16]) -> &'a mut [T; 6] { set( out, m[0], m[4], m[12], m[1], m[5], m[13] ) } #[test] fn test_from_mat4() { let mut m32 = [ 1, 0, 0, 1, 0, 0 ]; let m4 = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2, 2, 0, 1, ]; from_mat4(&mut m32, &m4); assert!(m32 == [1, 0, 0, 1, 2, 2]); }