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 126 127 128
#[cfg(test)] use core::f32::consts::FRAC_PI_2; use vec3; use number_traits::{Num, Radical, Trig}; use length::{length, dot, length_values}; #[inline] pub fn transform_angle<'a, 'b, T: Copy + Num + Trig>(out: &'a mut [T; 2], a: &'b [T; 2], angle: T) -> &'a mut [T; 2] { let c = angle.cos(); let s = angle.sin(); out[0] = a[0] * c - a[1] * s; out[1] = a[0] * s + a[1] * c; out } #[test] fn test_transform_angle() { use misc::eq; let mut out = [0f32, 0f32]; let v = [0f32, 1f32]; transform_angle(&mut out, &v, FRAC_PI_2); assert_eq!(eq(&out, &[-1f32, 0f32]), true); } #[inline] pub fn transform_mat2<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], a: &'b [T; 2], m: &'b [T; 4]) -> &'a mut [T; 2] { out[0] = a[0] * m[0] + a[1] * m[2]; out[1] = a[0] * m[1] + a[1] * m[3]; out } #[inline] pub fn transform_mat32<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], a: &'b [T; 2], m: &'b [T; 6]) -> &'a mut [T; 2] { out[0] = a[0] * m[0] + a[1] * m[2] + m[4]; out[1] = a[0] * m[1] + a[1] * m[3] + m[5]; out } #[inline] pub fn transform_mat3<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], a: &'b [T; 2], m: &'b [T; 9]) -> &'a mut [T; 2] { out[0] = a[0] * m[0] + a[1] * m[3]; out[1] = a[0] * m[1] + a[1] * m[4]; out } #[inline] pub fn transform_mat4<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], a: &'b [T; 2], m: &'b [T; 16]) -> &'a mut [T; 2] { out[0] = a[0] * m[0] + a[1] * m[4] + m[12]; out[1] = a[0] * m[1] + a[1] * m[5] + m[13]; out } #[inline] pub fn transform_projection<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], a: &'b [T; 2], m: &'b [T; 16]) -> &'a mut [T; 2] { let mut d = a[0] * m[3] + a[1] * m[7] + m[11] + m[15]; d = if d != T::zero() {T::one() / d} else {d}; out[0] = (a[0] * m[0] + a[1] * m[4] + m[8] + m[12]) * d; out[1] = (a[0] * m[1] + a[1] * m[5] + m[9] + m[13]) * d; out } #[inline] pub fn transform_projection_no_position<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], a: &'b [T; 2], m: &'b [T; 16]) -> &'a mut [T; 2] { let mut d = a[0] * m[3] + a[1] * m[7] + m[11] + m[15]; d = if d != T::zero() {T::one() / d} else {d}; out[0] = (a[0] * m[0] + a[1] * m[4] + m[8]) * d; out[1] = (a[0] * m[1] + a[1] * m[5] + m[9]) * d; out } #[inline] pub fn position_mat32<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], m: &'b [T; 6]) -> &'a mut [T; 2] { out[0] = m[4]; out[1] = m[5]; out } #[inline] pub fn position_mat4<'a, 'b, T: Copy + Num>(out: &'a mut [T; 2], m: &'b [T; 16]) -> &'a mut [T; 2] { out[0] = m[12]; out[1] = m[13]; out } #[inline] pub fn scale_mat2<'a, 'b, T: Copy + Num + Radical>(out: &'a mut [T; 2], m: &'b [T; 4]) -> &'a mut [T; 2] { out[0] = length_values(m[0], m[2]); out[1] = length_values(m[1], m[3]); out } #[inline] pub fn scale_mat32<'a, 'b, T: Copy + Num + Radical>(out: &'a mut [T; 2], m: &'b [T; 6]) -> &'a mut [T; 2] { out[0] = length_values(m[0], m[2]); out[1] = length_values(m[1], m[3]); out } #[inline] pub fn scale_mat3<'a, 'b, T: Copy + Num + Radical>(out: &'a mut [T; 2], m: &'b [T; 9]) -> &'a mut [T; 2] { out[0] = vec3::length_values(m[0], m[3], m[6]); out[1] = vec3::length_values(m[1], m[4], m[7]); out } #[inline] pub fn scale_mat4<'a, 'b, T: Copy + Num + Radical>(out: &'a mut [T; 2], m: &'b [T; 16]) -> &'a mut [T; 2] { out[0] = vec3::length_values(m[0], m[4], m[8]); out[1] = vec3::length_values(m[1], m[5], m[9]); out } #[inline] pub fn angle<'a, T: Copy + Num + Radical + Trig>(a: &'a [T; 2], b: &'a [T; 2]) -> T { (dot(a, b) / (length(a) * length(b))).acos() } #[test] fn angle_test() { let rad = angle(&[0f32, 1f32], &[1f32, 0f32]); assert_eq!(rad, FRAC_PI_2); }