blender_armature/action/
action_keyframes.rs

1use crate::Keyframe;
2
3pub use self::sample::*;
4use std::ops::Deref;
5
6mod action_keyframes_serde;
7mod sample;
8
9/// All of the keyframes in an action.
10#[derive(Debug, PartialEq, Default)]
11#[cfg_attr(test, derive(Clone))]
12pub struct ActionKeyframes {
13    keyframes: Vec<Keyframe>,
14    smallest_frame: u16,
15    largest_frame: u16,
16}
17
18impl ActionKeyframes {
19    /// # Panics
20    ///
21    /// Panics if the provided list of keyframes is empty.
22    pub fn new(keyframes: Vec<Keyframe>) -> Self {
23        let mut smallest_frame = u16::max_value();
24        let mut largest_frame = u16::min_value();
25
26        for frame in keyframes.iter() {
27            smallest_frame = smallest_frame.min(frame.frame);
28            largest_frame = largest_frame.max(frame.frame);
29        }
30
31        let mut keyframes = ActionKeyframes {
32            keyframes,
33            smallest_frame,
34            largest_frame,
35        };
36
37        keyframes.sort_keyframes_ascending();
38
39        keyframes
40    }
41
42    /// Keyframes are guaranteed to be ordered from smallest frame first to largest frame last.
43    pub fn keyframes(&self) -> &Vec<Keyframe> {
44        &self.keyframes
45    }
46
47    pub fn smallest_frame(&self) -> u16 {
48        self.smallest_frame
49    }
50
51    pub fn largest_frame(&self) -> u16 {
52        self.largest_frame
53    }
54
55    /// Insert a keyframe into the list of keyframes for the action
56    pub fn insert_keyframe(&mut self, keyframe: Keyframe) {
57        self.keyframes.push(keyframe);
58        self.sort_keyframes_ascending();
59    }
60
61    fn sort_keyframes_ascending(&mut self) {
62        self.keyframes.sort_by(|a, b| a.frame.cmp(&b.frame));
63    }
64}
65
66impl ActionKeyframes {
67    /// We use crate visibility to prevent users from being able to modify keyframes without
68    /// updating the cached smallest/largest frame number.
69    pub(crate) fn keyframes_mut(&mut self) -> &mut Vec<Keyframe> {
70        &mut self.keyframes
71    }
72}
73
74impl Deref for ActionKeyframes {
75    type Target = Vec<Keyframe>;
76
77    fn deref(&self) -> &Self::Target {
78        &self.keyframes
79    }
80}