diff options
| author | Mica White <botahamec@outlook.com> | 2026-06-28 11:09:28 -0400 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2026-06-28 11:09:28 -0400 |
| commit | 3eb02cbe5b106cd332f25d658430f7e0ae320745 (patch) | |
| tree | 20153b185b2e7d5c41b2b2d29c6c28bba8bd31b9 /src/scene.rs | |
| parent | b9570962cfc214bbac0f3fef1e6c1f9848f52658 (diff) | |
initial commit
Diffstat (limited to 'src/scene.rs')
| -rw-r--r-- | src/scene.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/scene.rs b/src/scene.rs new file mode 100644 index 0000000..143eb0b --- /dev/null +++ b/src/scene.rs @@ -0,0 +1,43 @@ +use rustc_hash::FxHashSet; +use serde::{Deserialize, Serialize}; + +use crate::script::{ScriptContext, ScriptManager}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Scene { + pub name: Box<str>, + pub scripts: ResourceRequirements, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct ResourceRequirements { + pub required: Box<[usize]>, + pub preload: Box<[usize]>, +} + +pub fn scene_id_by_name(scenes: &[Scene], name: &str) -> Option<usize> { + for (i, scene) in scenes.iter().enumerate() { + if &*scene.name == name { + return Some(i); + } + } + + None +} + +pub fn switch_scenes( + scenes: &[Scene], + scripts: &mut ScriptManager, + context: &mut ScriptContext<'_>, + new: usize, +) { + let active_scripts = FxHashSet::from_iter(scripts.active_scripts.iter().cloned()); + let scripts_to_load = &scenes[new].scripts.required; + for script in scripts_to_load { + if !active_scripts.contains(script) { + scripts.activate_script(*script, context); + } else { + scripts.reset_script(*script, context); + } + } +} |
