From 147a9d3a85d1c1ab8ffb127edf5a56710771d8ca Mon Sep 17 00:00:00 2001 From: reo Date: Sun, 10 Aug 2025 13:35:16 +0300 Subject: [PATCH] Improve Scene & SceneManager system - Implement AsRef and AsMut for Scene - Add "new" method to SceneManager --- raidillon_core/src/scene.rs | 55 +++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/raidillon_core/src/scene.rs b/raidillon_core/src/scene.rs index ebd272c..809c646 100644 --- a/raidillon_core/src/scene.rs +++ b/raidillon_core/src/scene.rs @@ -1,30 +1,63 @@ +use std::collections::HashMap; + pub struct Scene { title: String, world: hecs::World, skybox_texture_path: String, } +impl AsRef for Scene { + fn as_ref(&self) -> &Scene { + &self + } +} + +impl AsMut for Scene { + fn as_mut(&mut self) -> &mut Scene { + self + } +} + +type SceneID = String; + pub struct SceneManager { - scenes: Vec>, - active_index: usize, + scenes: HashMap, + active_scene: Option, } impl SceneManager { + pub fn new() -> Self { + let scenes = HashMap::new(); + Self { + scenes, + active_scene: None, + } + } + pub fn current(&self) -> &Scene { - self.scenes[self.active_index].as_ref().unwrap() + match &self.active_scene { + Some(id) => self.scenes[id].as_ref(), + None => panic!("No active scene"), + } + } pub fn current_mut(&mut self) -> &mut Scene { - self.scenes[self.active_index].as_mut().unwrap() + match &mut self.active_scene { + Some(id) => self.scenes.get_mut(id.as_mut()).unwrap().as_mut(), + None => panic!("No active scene"), + } } - pub fn add_scene(&mut self, scene: Scene) -> usize { - let idx = self.scenes.len(); - self.scenes.push(Some(scene)); - idx + pub fn set_active_scene(&mut self, scene: SceneID) { + self.active_scene = Some(scene); } - pub fn remove_scene(&mut self, idx: usize) { - self.scenes[idx] = None; + pub fn add_scene(&mut self, id: SceneID, scene: Scene) { + self.scenes.insert(id, scene); } -} \ No newline at end of file + + pub fn remove_scene(&mut self, id: SceneID) { + self.scenes.remove(&id); + } +}