gled-model 2.30.1

The data model of gled: projects, scenes, effects, animations, curves and assets
Documentation
use crate::{
    asset::curve::multiplied_curve::{MultipliedCurve, RangeDegrees, RangePercentage},
    collection::Collections,
    sound::trigger_ref::{CollectSoundTriggers, SoundLevels, SoundTriggerSet},
};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum FloatValue {
    F32(f32),
    Percentage(MultipliedCurve<RangePercentage>),
    Degrees(MultipliedCurve<RangeDegrees>),
}

impl Eq for FloatValue {}

impl Default for FloatValue {
    fn default() -> Self {
        Self::F32(0.0)
    }
}

impl FloatValue {
    pub fn percentage(&mut self) -> &mut MultipliedCurve<RangePercentage> {
        match self {
            Self::Percentage(value) => value,
            _ => {
                *self = Self::Percentage(Default::default());
                if let Self::Percentage(value) = self {
                    value
                } else {
                    unreachable!()
                }
            }
        }
    }

    pub fn degrees(&mut self) -> &mut MultipliedCurve<RangeDegrees> {
        match self {
            Self::Degrees(value) => value,
            _ => {
                *self = Self::Degrees(Default::default());
                if let Self::Degrees(value) = self {
                    value
                } else {
                    unreachable!()
                }
            }
        }
    }

    pub(crate) fn value(
        &self,
        beat_progression: f32,
        collection: &Collections,
        sound_data: &dyn SoundLevels,
    ) -> f32 {
        match self {
            Self::F32(value) => *value,
            Self::Percentage(value) => value.value(beat_progression, collection, sound_data),
            Self::Degrees(value) => value.value(beat_progression, collection, sound_data),
        }
    }
}

impl CollectSoundTriggers for FloatValue {
    fn collect_sound_triggers(&self, triggers: &mut SoundTriggerSet) {
        match self {
            Self::F32(_) => {}
            Self::Percentage(value) => value.collect_sound_triggers(triggers),
            Self::Degrees(value) => value.collect_sound_triggers(triggers),
        }
    }
}