gled-model 2.30.2

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

pub mod grid;
pub mod instance;

use super::AssetTrait;
use crate::asset::group::GroupIndices;
use crate::sound::trigger_ref::{CollectSoundTriggers, SoundTriggerSet};
use effect::Effect;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct Scene {
    pub effects: Vec<Effect>,
}

impl Scene {
    pub fn group_indices(&self) -> GroupIndices {
        self.effects
            .iter()
            .map(|effect| effect.group_index)
            .collect()
    }

    pub fn effect(&mut self, index: usize) -> Option<&mut Effect> {
        self.effects.get_mut(index)
    }

    pub fn effects(&self) -> &[Effect] {
        &self.effects
    }

    /// Add an effect. Its GPU pipeline is built lazily by `ensure_pipelines`
    /// on whichever thread renders this scene.
    pub fn add_effect(&mut self, effect: Effect) -> usize {
        self.effects.push(effect);

        self.effects.len() - 1
    }

    pub fn remove_effect(&mut self, index: usize) -> Option<Effect> {
        let mut effect = None;

        if self.effects.len() > index {
            effect = Some(self.effects.remove(index));
        }

        effect
    }
}

impl AssetTrait for Scene {
    const DIR_NAME: &'static str = "scenes";
    const NAME: &'static str = "Scene";
    const SHOW_NAME_IF_SELECTED: bool = true;
}

impl CollectSoundTriggers for Scene {
    fn collect_sound_triggers(&self, triggers: &mut SoundTriggerSet) {
        for effect in &self.effects {
            effect.collect_sound_triggers(triggers);
        }
    }
}