use cgmath::{ BaseFloat, BaseNum, InnerSpace, Quaternion, Vector1, Vector2, Vector3, Vector4, VectorSpace }; use crate::interpolate::{Additive, Interpolate, Linear, One, cubic_hermite_def}; macro_rules! impl_interpolate_vec { ($($t:tt)*) => { impl Linear for $($t)* where T: BaseNum { #[inline(always)] fn outer_mul(self, t: T) -> Self { self * t } #[inline(always)] fn outer_div(self, t: T) -> Self { self / t } } impl Interpolate for $($t)* where Self: InnerSpace, T: Additive + BaseFloat + One { #[inline(always)] fn lerp(a: Self, b: Self, t: T) -> Self { a.lerp(b, t) } #[inline(always)] fn cubic_hermite(x: (Self, T), a: (Self, T), b: (Self, T), y: (Self, T), t: T) -> Self { cubic_hermite_def(x, a, b, y, t) } } } } impl_interpolate_vec!(Vector1); impl_interpolate_vec!(Vector2); impl_interpolate_vec!(Vector3); impl_interpolate_vec!(Vector4); impl Linear for Quaternion where T: BaseFloat { #[inline(always)] fn outer_mul(self, t: T) -> Self { self * t } #[inline(always)] fn outer_div(self, t: T) -> Self { self / t } } impl Interpolate for Quaternion where Self: InnerSpace, T: Additive + BaseFloat + One { #[inline(always)] fn lerp(a: Self, b: Self, t: T) -> Self { a.nlerp(b, t) } #[inline(always)] fn cubic_hermite(x: (Self, T), a: (Self, T), b: (Self, T), y: (Self, T), t: T) -> Self { cubic_hermite_def(x, a, b, y, t) } }