From e8f85e4a723b772c099a3c03a6cb721c48561e4b Mon Sep 17 00:00:00 2001 From: Mica White Date: Mon, 6 Jul 2026 13:59:36 -0400 Subject: Fully support WASM (in some contexts) --- src/scene.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 7 deletions(-) (limited to 'src/scene.rs') diff --git a/src/scene.rs b/src/scene.rs index 34ff877..28a4e6a 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -9,6 +9,7 @@ use crate::{ #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Scene { pub name: Box, + pub preload_scenes: Box<[usize]>, pub scripts: ResourceRequirements, } @@ -28,6 +29,34 @@ pub fn scene_id_by_name(scenes: &[Scene], name: &str) -> Option { None } +pub fn preload_scene( + scenes: &[Scene], + scripts: &mut ScriptManager, + files: &mut FileManager, + wasm_runner: &WasmRunner, + id: usize, +) { + let scene = &scenes[id]; + for script in &scene.scripts.required { + scripts.preload_script(*script, files, wasm_runner); + } +} + +pub fn is_scene_loaded( + scenes: &[Scene], + scripts: &mut ScriptManager, + files: &mut FileManager, + id: usize, +) -> bool { + let scene = &scenes[id]; + scene + .scripts + .required + .iter() + .cloned() + .all(|script_id| scripts.is_script_loaded(script_id, files)) +} + pub fn switch_scenes( scenes: &[Scene], scripts: &mut ScriptManager, @@ -36,13 +65,36 @@ pub fn switch_scenes( wasm_runner: &WasmRunner, 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, wasm_runner, files); - } else { - scripts.reset_script(*script, context, wasm_runner, files); + let active_scripts = scripts + .active_scripts + .iter() + .cloned() + .collect::>(); + for script_id in &active_scripts { + scripts.deactivate_script(*script_id, context, wasm_runner, files); + } + + let mut needed_scripts = FxHashSet::default(); + let scene = &scenes[new]; + for script_id in &scene.scripts.required { + needed_scripts.insert(*script_id); + scripts.activate_script(*script_id, context, wasm_runner, files); + } + for script_id in &scene.scripts.preload { + needed_scripts.insert(*script_id); + scripts.preload_script(*script_id, files, wasm_runner); + } + for scene_to_preload in &scene.preload_scenes { + let scene_to_preload = &scenes[*scene_to_preload]; + for script_id in &scene_to_preload.scripts.required { + needed_scripts.insert(*script_id); + scripts.preload_script(*script_id, files, wasm_runner); } } + + let active_scripts: FxHashSet = active_scripts.iter().cloned().collect(); + let unneeded_scripts = active_scripts.difference(&needed_scripts); + for script_id in unneeded_scripts { + scripts.unload_script(*script_id, files); + } } -- cgit v1.2.3