gled_model/asset/scene/
instance.rs1use super::Scene;
2use crate::{
3 asset::{
4 Asset,
5 curve::multiplied_curve::{MultipliedCurve, RangePercentage},
6 group::{Group, Groups},
7 palette::Palette,
8 scene::color::SceneInstanceColor,
9 },
10 asset_id::AssetId,
11 collection::Collections,
12 input::event::InputEvent,
13 sound::trigger_ref::{CollectSoundTriggers, SoundTriggerSet},
14};
15use serde::{Deserialize, Serialize};
16use uuid::Uuid;
17
18#[derive(Serialize, Deserialize, Debug, PartialEq)]
19pub struct SceneInstance {
20 #[serde(default = "Uuid::new_v4")]
21 pub id: Uuid,
22 #[serde(default = "unnamed_scene")]
23 pub name: String,
24
25 #[serde(default)]
26 pub color: SceneInstanceColor,
27 #[serde(default)]
28 pub active: bool,
29 #[serde(default)]
30 pub opacity: MultipliedCurve<RangePercentage>,
31 #[serde(default)]
32 pub input_dimmer: f32,
33 #[serde(default)]
34 pub ignore_main_dimmer: bool,
35 #[serde(default)]
36 pub beat_progression_offset: MultipliedCurve<RangePercentage>,
37 #[serde(default)]
38 pub activation_input: Option<InputEvent>,
39 #[serde(default)]
40 pub flash_input: Option<InputEvent>,
41 #[serde(default)]
42 pub set_offset_on_flash: bool,
43 #[serde(default)]
44 pub dimmer_input: Option<InputEvent>,
45 pub(crate) scene_id: AssetId<Scene>,
46 pub scene: Scene,
47 #[serde(default)]
48 pub groups_overwrite: Option<Groups>,
49 #[serde(default)]
50 pub palette_overwrite: Option<Option<Palette>>,
51
52 #[serde(skip)]
53 pub flash: bool,
54}
55
56fn unnamed_scene() -> String {
57 "Unnamed Scene".to_string()
58}
59
60impl Clone for SceneInstance {
61 fn clone(&self) -> Self {
62 Self {
63 name: self.name.clone(),
64 id: self.id,
65 color: self.color,
66 active: self.active,
67 opacity: self.opacity.clone(),
68 input_dimmer: self.input_dimmer,
69 ignore_main_dimmer: self.ignore_main_dimmer,
70 beat_progression_offset: self.beat_progression_offset.clone(),
71 activation_input: self.activation_input,
72 flash_input: self.flash_input,
73 set_offset_on_flash: self.set_offset_on_flash,
74 dimmer_input: self.dimmer_input,
75 scene_id: self.scene_id,
76 scene: self.scene.clone(),
77 groups_overwrite: self.groups_overwrite.clone(),
78 palette_overwrite: self.palette_overwrite.clone(),
79 flash: self.flash,
80 }
81 }
82}
83
84impl SceneInstance {
85 pub fn from_scene_id(scene_id: AssetId<Scene>, collections: &Collections) -> Self {
86 let asset = Asset::get(scene_id, collections).unwrap_or_default();
87 let scene = asset.data.clone();
88
89 Self {
90 scene_id,
91 scene,
92 name: asset
93 .path
94 .last()
95 .map(|s| s.to_string())
96 .unwrap_or_else(unnamed_scene),
97 color: Default::default(),
98 id: Uuid::new_v4(),
99 active: Default::default(),
100 opacity: MultipliedCurve::new_multiplier(1.0),
101 input_dimmer: 1.0,
102 ignore_main_dimmer: false,
103 beat_progression_offset: MultipliedCurve::new_multiplier(0.0),
104 activation_input: Default::default(),
105 flash_input: Default::default(),
106 set_offset_on_flash: Default::default(),
107 dimmer_input: Default::default(),
108 flash: Default::default(),
109 groups_overwrite: Default::default(),
110 palette_overwrite: Default::default(),
111 }
112 }
113
114 pub fn cloned_with_new_id(&self) -> Self {
118 let mut clone = self.clone();
119 clone.id = Uuid::new_v4();
120 clone
121 }
122
123 pub(crate) fn remove_nonexistant_groups(&mut self, available: &[Group]) {
124 if let Some(groups) = self.groups_overwrite.as_mut() {
125 groups.remove_nonexistant_groups(available);
126 }
127 }
128}
129
130impl CollectSoundTriggers for SceneInstance {
131 fn collect_sound_triggers(&self, triggers: &mut SoundTriggerSet) {
132 self.opacity.collect_sound_triggers(triggers);
133 self.beat_progression_offset
134 .collect_sound_triggers(triggers);
135 self.scene.collect_sound_triggers(triggers);
136 }
137}