material_color_utilities/utils/
math.rs

1use num_traits::{FromPrimitive, Num, Signed};
2
3#[inline]
4pub fn lerp<T>(start: T, stop: T, amount: T) -> T
5where
6  T: Num + FromPrimitive + Copy,
7{
8  (T::from_f64(1.0).unwrap() - amount) * start + amount * stop
9}
10
11pub fn sanitize_degrees<T>(mut degrees: T) -> T
12where
13  T: Num + PartialOrd + FromPrimitive,
14{
15  let zero = T::from_f64(0.0).unwrap();
16  degrees = degrees % T::from_f64(360.0).unwrap();
17  if degrees < zero {
18    degrees = degrees + T::from_f64(360.0).unwrap();
19  }
20  degrees
21}
22
23pub fn rotation_direction<T>(from: T, to: T) -> T
24where
25  T: Num + PartialOrd + FromPrimitive,
26{
27  let increasing_difference = sanitize_degrees(to - from);
28  if increasing_difference <= T::from_f64(180.0).unwrap() {
29    T::from_f64(1.0).unwrap()
30  } else {
31    T::from_f64(-1.0).unwrap()
32  }
33}
34
35pub fn difference_degrees<T>(a: T, b: T) -> T
36where
37  T: Num + Signed + FromPrimitive,
38{
39  T::from_f64(180.0).unwrap() - ((a - b).abs() - T::from_f64(180.0).unwrap()).abs()
40}
41
42pub fn matrix_multiply<T>(row: &[T; 3], matrix: &[[T; 3]; 3]) -> [T; 3]
43where
44  T: Num + Copy,
45{
46  let a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2];
47  let b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2];
48  let c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2];
49  [a, b, c]
50}