blender_armature/action/
action_keyframes.rs1use crate::Keyframe;
2
3pub use self::sample::*;
4use std::ops::Deref;
5
6mod action_keyframes_serde;
7mod sample;
8
9#[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 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 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 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 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}