gled-model 2.31.2

The data model of gled: projects, scenes, effects, animations, curves and assets
Documentation
pub mod float_value;

use float_value::FloatValue;
use serde::{Deserialize, Serialize};

use crate::{
    collection::Collections,
    sound::trigger_ref::{CollectSoundTriggers, SoundLevels, SoundTriggerSet},
};

#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
#[serde(default)]
pub struct AnimationConfig {
    pub(crate) u32_0: u32,
    pub(crate) u32_1: u32,
    pub(crate) u32_2: u32,
    pub float_0: FloatValue,
    pub float_1: FloatValue,
    pub float_2: FloatValue,
    pub float_3: FloatValue,
    pub float_4: FloatValue,
    pub float_5: FloatValue,
}

impl AnimationConfig {
    pub fn write_data(
        &self,
        data: &mut [u8],
        beat_progression: f32,
        collections: &Collections,
        sound_data: &dyn SoundLevels,
    ) {
        data[0..4].copy_from_slice(&self.u32_0.to_le_bytes());
        data[4..8].copy_from_slice(&self.u32_1.to_le_bytes());
        data[8..12].copy_from_slice(&self.u32_2.to_le_bytes());
        for (index, value) in self.floats().into_iter().enumerate() {
            let start = 12 + index * 4;
            data[start..start + 4].copy_from_slice(
                &value
                    .value(beat_progression, collections, sound_data)
                    .to_le_bytes(),
            );
        }
    }

    /// The float settings in order.
    pub fn floats(&self) -> [&FloatValue; 6] {
        [
            &self.float_0,
            &self.float_1,
            &self.float_2,
            &self.float_3,
            &self.float_4,
            &self.float_5,
        ]
    }

    pub const fn size() -> usize {
        36
    }

    pub fn u32(&mut self, index: usize) -> Option<&mut u32> {
        Some(match index {
            0 => &mut self.u32_0,
            1 => &mut self.u32_1,
            2 => &mut self.u32_2,
            _ => return None,
        })
    }

    pub fn float(&mut self, index: usize) -> Option<&mut FloatValue> {
        Some(match index {
            0 => &mut self.float_0,
            1 => &mut self.float_1,
            2 => &mut self.float_2,
            3 => &mut self.float_3,
            4 => &mut self.float_4,
            5 => &mut self.float_5,
            _ => return None,
        })
    }
}

impl CollectSoundTriggers for AnimationConfig {
    fn collect_sound_triggers(&self, triggers: &mut SoundTriggerSet) {
        for value in [
            &self.float_0,
            &self.float_1,
            &self.float_2,
            &self.float_3,
            &self.float_4,
            &self.float_5,
        ] {
            value.collect_sound_triggers(triggers);
        }
    }
}