Skip to main content

mittens_engine/engine/ecs/component/
audio_gain.rs

1use crate::engine::ecs::ComponentId;
2use crate::engine::ecs::component::Component;
3
4#[derive(Debug, Clone, Copy)]
5pub struct AudioGainComponent {
6    pub gain: f32,
7}
8
9impl AudioGainComponent {
10    pub fn new(gain: f32) -> Self {
11        Self { gain }
12    }
13}
14
15impl Default for AudioGainComponent {
16    fn default() -> Self {
17        Self { gain: 1.0 }
18    }
19}
20
21impl Component for AudioGainComponent {
22    fn name(&self) -> &'static str {
23        "audio_gain"
24    }
25
26    fn as_any(&self) -> &dyn std::any::Any {
27        self
28    }
29
30    fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
31        self
32    }
33
34    fn init(&mut self, emit: &mut dyn crate::engine::ecs::SignalEmitter, component: ComponentId) {
35        emit.push_intent_now(
36            component,
37            crate::engine::ecs::IntentValue::AudioGraphDirtyImmediate {
38                component_ids: vec![component],
39            },
40        );
41    }
42
43    fn encode(&self) -> std::collections::HashMap<String, serde_json::Value> {
44        let mut map = std::collections::HashMap::new();
45        map.insert("gain".to_string(), serde_json::json!(self.gain));
46        map
47    }
48
49    fn decode(
50        &mut self,
51        data: &std::collections::HashMap<String, serde_json::Value>,
52    ) -> Result<(), String> {
53        if let Some(v) = data.get("gain") {
54            self.gain = serde_json::from_value(v.clone())
55                .map_err(|e| format!("Failed to decode gain: {e}"))?;
56        }
57        Ok(())
58    }
59}