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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
use vec2; use vec3; use number_traits::Num; #[inline] pub fn transform_mat3<'a, T: Copy + Num>( out: &'a mut [T; 4], a: &[T; 4], m: &[T; 9], ) -> &'a mut [T; 4] { out[0] = a[0] * m[0] + a[1] * m[3] + a[2] * m[6]; out[1] = a[0] * m[1] + a[1] * m[4] + a[2] * m[7]; out[2] = a[0] * m[2] + a[1] * m[5] + a[2] * m[8]; out } #[inline] pub fn transform_mat4<'a, T: Copy + Num>( out: &'a mut [T; 4], a: &[T; 4], m: &[T; 16], ) -> &'a mut [T; 4] { out[0] = a[0] * m[0] + a[1] * m[4] + a[2] * m[8] + a[3] * m[12]; out[1] = a[0] * m[1] + a[1] * m[5] + a[2] * m[9] + a[3] * m[13]; out[2] = a[0] * m[2] + a[1] * m[6] + a[2] * m[10] + a[3] * m[14]; out[3] = a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15]; out } #[inline] pub fn transform_mat4_rotation<'a, T: Copy + Num>( out: &'a mut [T; 4], a: &[T; 4], m: &[T; 16], ) -> &'a mut [T; 4] { out[0] = a[0] * m[0] + a[1] * m[4] + a[2] * m[8]; out[1] = a[0] * m[1] + a[1] * m[5] + a[2] * m[9]; out[2] = a[0] * m[2] + a[1] * m[6] + a[2] * m[10]; out[3] = a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15]; out } #[inline] pub fn transform_projection<'a, T: Copy + Num>( out: &'a mut [T; 4], a: &[T; 4], m: &[T; 16], ) -> &'a mut [T; 4] { let mut d = a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15]; d = if d != T::zero() { T::one() / d } else { d }; out[0] = (a[0] * m[0] + a[1] * m[4] + a[2] * m[8] + a[3] * m[12]) * d; out[1] = (a[0] * m[1] + a[1] * m[5] + a[2] * m[9] + a[3] * m[13]) * d; out[2] = (a[0] * m[2] + a[1] * m[6] + a[2] * m[10] + a[3] * m[14]) * d; out[3] = (a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15]) * d; out } #[inline] pub fn transform_projection_no_position<'a, T: Copy + Num>( out: &'a mut [T; 4], a: &[T; 4], m: &[T; 16], ) -> &'a mut [T; 4] { let mut d = a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15]; d = if d != T::zero() { T::one() / d } else { d }; out[0] = (a[0] * m[0] + a[1] * m[4] + a[2] * m[8] + a[3]) * d; out[1] = (a[0] * m[1] + a[1] * m[5] + a[2] * m[9] + a[3]) * d; out[2] = (a[0] * m[2] + a[1] * m[6] + a[2] * m[10] + a[3]) * d; out[3] = (a[0] * m[3] + a[1] * m[7] + a[2] * m[11] + a[3] * m[15]) * d; out } #[inline] pub fn position_mat32<'a, T: Copy + Num>(out: &'a mut [T; 4], m: &[T; 6]) -> &'a mut [T; 4] { out[0] = m[4]; out[1] = m[5]; out } #[inline] pub fn position_mat4<'a, T: Copy + Num>(out: &'a mut [T; 4], m: &[T; 16]) -> &'a mut [T; 4] { out[0] = m[12]; out[1] = m[13]; out[2] = m[14]; out[3] = m[15]; out } #[inline] pub fn scale_mat2<'a, T: Copy + Num>(out: &'a mut [T; 4], m: &[T; 4]) -> &'a mut [T; 4] { out[0] = vec2::length_values(m[0], m[2]); out[1] = vec2::length_values(m[1], m[3]); out[2] = T::one(); out[3] = T::one(); out } #[inline] pub fn scale_mat32<'a, T: Copy + Num>(out: &'a mut [T; 4], m: &[T; 6]) -> &'a mut [T; 4] { out[0] = vec3::length_values(m[0], m[2], T::zero()); out[1] = vec3::length_values(m[1], m[3], T::zero()); out[2] = T::one(); out[3] = T::one(); out } #[inline] pub fn scale_mat3<'a, T: Copy + Num>(out: &'a mut [T; 4], m: &[T; 9]) -> &'a mut [T; 4] { out[0] = vec3::length_values(m[0], m[3], m[6]); out[1] = vec3::length_values(m[1], m[4], m[7]); out[2] = vec3::length_values(m[2], m[5], m[8]); out[3] = T::one(); out } #[inline] pub fn scale_mat4<'a, T: Copy + Num>(out: &'a mut [T; 4], m: &[T; 16]) -> &'a mut [T; 4] { out[0] = vec3::length_values(m[0], m[4], m[8]); out[1] = vec3::length_values(m[1], m[5], m[9]); out[2] = vec3::length_values(m[2], m[6], m[10]); out[3] = T::one(); out }