Skip to main content

gled_model/asset/animation/
config.rs

1pub mod float_value;
2
3use float_value::FloatValue;
4use serde::{Deserialize, Serialize};
5
6use crate::{
7    collection::Collections,
8    sound::trigger_ref::{CollectSoundTriggers, SoundLevels, SoundTriggerSet},
9};
10
11#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
12#[serde(default)]
13pub struct AnimationConfig {
14    pub(crate) u32_0: u32,
15    pub(crate) u32_1: u32,
16    pub(crate) u32_2: u32,
17    pub float_0: FloatValue,
18    pub float_1: FloatValue,
19    pub float_2: FloatValue,
20    pub float_3: FloatValue,
21    pub float_4: FloatValue,
22    pub float_5: FloatValue,
23}
24
25impl AnimationConfig {
26    pub fn write_data(
27        &self,
28        data: &mut [u8],
29        beat_progression: f32,
30        collections: &Collections,
31        sound_data: &dyn SoundLevels,
32    ) {
33        data[0..4].copy_from_slice(&self.u32_0.to_le_bytes());
34        data[4..8].copy_from_slice(&self.u32_1.to_le_bytes());
35        data[8..12].copy_from_slice(&self.u32_2.to_le_bytes());
36        for (index, value) in self.floats().into_iter().enumerate() {
37            let start = 12 + index * 4;
38            data[start..start + 4].copy_from_slice(
39                &value
40                    .value(beat_progression, collections, sound_data)
41                    .to_le_bytes(),
42            );
43        }
44    }
45
46    /// The float settings in order.
47    pub fn floats(&self) -> [&FloatValue; 6] {
48        [
49            &self.float_0,
50            &self.float_1,
51            &self.float_2,
52            &self.float_3,
53            &self.float_4,
54            &self.float_5,
55        ]
56    }
57
58    pub const fn size() -> usize {
59        36
60    }
61
62    pub fn u32(&mut self, index: usize) -> Option<&mut u32> {
63        Some(match index {
64            0 => &mut self.u32_0,
65            1 => &mut self.u32_1,
66            2 => &mut self.u32_2,
67            _ => return None,
68        })
69    }
70
71    pub fn float(&mut self, index: usize) -> Option<&mut FloatValue> {
72        Some(match index {
73            0 => &mut self.float_0,
74            1 => &mut self.float_1,
75            2 => &mut self.float_2,
76            3 => &mut self.float_3,
77            4 => &mut self.float_4,
78            5 => &mut self.float_5,
79            _ => return None,
80        })
81    }
82}
83
84impl CollectSoundTriggers for AnimationConfig {
85    fn collect_sound_triggers(&self, triggers: &mut SoundTriggerSet) {
86        for value in [
87            &self.float_0,
88            &self.float_1,
89            &self.float_2,
90            &self.float_3,
91            &self.float_4,
92            &self.float_5,
93        ] {
94            value.collect_sound_triggers(triggers);
95        }
96    }
97}