diff options
feat: what the fuck am i doing here
-rw-r--r-- | src/interpolation.rs | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/src/interpolation.rs b/src/interpolation.rs index d088bf8..17e4a48 100644 --- a/src/interpolation.rs +++ b/src/interpolation.rs @@ -104,35 +104,53 @@ impl< sorted_keyframes: Vec<KeyFrame<ValueType>>, time: f64, ) -> Option<(KeyFrame<ValueType>, KeyFrame<ValueType>)> { - // TODO: maybe refactor the internals of this to be faster - let idx = { - let mut idx = 0; - let mut found = false; - for f in &sorted_keyframes { - if f.time > time { - found = true; - break; - } else { - idx += 1; - } - } - if found { - Some(idx) - } else { + let length = AnimationTrack::length(( + *sorted_keyframes.first().unwrap(), + *sorted_keyframes.last().unwrap(), + )); + // This can be removed if size restrictions call for it + match if time > length { + if time > length * f64::from(self.loop_count) { None + } else { + Some(time % length) } - }; - match idx { + } else { + Some(time) + } { None => None, - Some(idx) => { - // If it's the last item, we don't have a 2nd - if idx + 1 == sorted_keyframes.len() { - None - } else { - Some(( - *sorted_keyframes.index(idx), - *sorted_keyframes.index(idx + 1), - )) + Some(time) => { + // TODO: maybe refactor the internals of this to be faster + let idx = { + let mut idx = 0; + let mut found = false; + for f in &sorted_keyframes { + if f.time > time { + found = true; + break; + } else { + idx += 1; + } + } + if found { + Some(idx) + } else { + None + } + }; + match idx { + None => None, + Some(idx) => { + // If it's the last item, we don't have a 2nd + if idx + 1 == sorted_keyframes.len() { + None + } else { + Some(( + *sorted_keyframes.index(idx), + *sorted_keyframes.index(idx + 1), + )) + } + } } } } |