use rustc_hash::FxHashSet;
use serde::{Deserialize, Serialize};
use crate::{
file::FileManager,
script::{ScriptContext, ScriptManager, WasmRunner},
};
#[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<'_>,
files: &mut FileManager,
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);
}
}
}
|