Skip to main content

gled_model/asset/scene/
effect.rs

1use crate::{
2    asset::{
3        animation::{Animation, config::AnimationConfig},
4        curve::multiplied_curve::{MultipliedCurve, RangeDegrees, RangePercentage},
5    },
6    asset_id::AssetId,
7    sound::trigger_ref::{CollectSoundTriggers, SoundTriggerSet},
8};
9use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
12#[serde(default)]
13pub struct Effect {
14    pub color_shift: MultipliedCurve<RangeDegrees>,
15    pub opacity: MultipliedCurve<RangePercentage>,
16    pub beat_progression: MultipliedCurve<RangePercentage>,
17    pub beat_progression_offset: MultipliedCurve<RangePercentage>,
18    /// In 2^n of bpm
19    pub speed_exponent: i32,
20    pub group_index: usize,
21    pub animation: Option<AssetId<Animation>>,
22    pub animation_config: AnimationConfig,
23}
24
25impl Eq for Effect {}
26
27impl Default for Effect {
28    fn default() -> Self {
29        Self {
30            color_shift: MultipliedCurve::new_multiplier(0.0),
31            opacity: MultipliedCurve::new_multiplier(1.0),
32            beat_progression: MultipliedCurve::new_curve([
33                0x2E, 0x07, 0x5C, 0xCB, 0x90, 0xC4, 0x47, 0x4B, 0x8D, 0x16, 0xC6, 0x70, 0x40, 0x54,
34                0x99, 0xA6,
35            ]),
36            beat_progression_offset: MultipliedCurve::new_multiplier(0.0),
37            speed_exponent: Default::default(),
38            group_index: Default::default(),
39            animation: Default::default(),
40            animation_config: Default::default(),
41        }
42    }
43}
44
45impl CollectSoundTriggers for Effect {
46    fn collect_sound_triggers(&self, triggers: &mut SoundTriggerSet) {
47        self.color_shift.collect_sound_triggers(triggers);
48        self.opacity.collect_sound_triggers(triggers);
49        self.beat_progression.collect_sound_triggers(triggers);
50        self.beat_progression_offset
51            .collect_sound_triggers(triggers);
52        self.animation_config.collect_sound_triggers(triggers);
53    }
54}