use rustc_hash::FxHashSet; use serde::{Deserialize, Serialize}; use crate::script::{ScriptContext, ScriptManager}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Scene { pub name: Box, 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 { 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); } } }