You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
932 B

  1. use std::cmp::PartialOrd;
  2. use std::ops::{Mul, Sub};
  3. use super::numeric::Float;
  4. #[inline]
  5. pub fn min<T>(a: T, b: T) -> T
  6. where
  7. T: PartialOrd,
  8. {
  9. if a.lt(&b) {
  10. a
  11. } else {
  12. b
  13. }
  14. }
  15. #[inline]
  16. pub fn max<T>(a: T, b: T) -> T
  17. where
  18. T: PartialOrd,
  19. {
  20. if a.gt(&b) {
  21. a
  22. } else {
  23. b
  24. }
  25. }
  26. #[inline]
  27. pub fn sqr<T>(a: T) -> T
  28. where
  29. T: Mul<T, Output = T> + Copy,
  30. {
  31. a * a
  32. }
  33. #[inline]
  34. pub fn clamp<T>(low: T, high: T, value: T) -> T
  35. where
  36. T: PartialOrd,
  37. {
  38. min(max(value, low), high)
  39. }
  40. #[inline]
  41. pub fn linear_step<T>(low: T, high: T, value: T) -> T
  42. where
  43. T: Float + PartialOrd,
  44. {
  45. clamp(T::zero(), T::one(), (value - low) / (high - low))
  46. }
  47. #[inline]
  48. pub fn smooth_step<T>(low: T, high: T, value: T) -> T
  49. where
  50. T: Float + PartialOrd,
  51. f32: Mul<T, Output = T> + Sub<T, Output = T>,
  52. {
  53. let x = linear_step(low, high, value);
  54. x * x * (3.0 - 2.0 * x)
  55. }