Merge pull request #3 from reo6/codex/refactor-system-id-to-typeids

This commit is contained in:
Emre Osmanoğlu 2025-09-10 15:22:50 +03:00 committed by GitHub
commit c32a452f17
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 68 additions and 73 deletions

View file

@ -1,12 +1,10 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use winit::event::Event;
use raidillon_core::scene::{Scene, SceneManager}; use raidillon_core::scene::{Scene, SceneManager};
use crate::system::{SystemContext, SystemManager}; use crate::system::{SystemContext, SystemManager};
use raidillon_assets::{ModelManager, ModelManagerRef};
use raidillon_core::context::PlatformContext; use raidillon_core::context::PlatformContext;
use raidillon_core::DebugUIBuffer; use raidillon_core::DebugUIBuffer;
use raidillon_core::engine::{EngineTrait}; use raidillon_core::engine::EngineTrait;
pub struct Engine { pub struct Engine {
pub scene_manager: SceneManager, pub scene_manager: SceneManager,
@ -28,7 +26,7 @@ impl EngineTrait for Engine {
/// Initialize systems, load the world. /// Initialize systems, load the world.
fn initialize(&mut self, platform_context: PlatformContext) { fn initialize(&mut self, platform_context: PlatformContext) {
// Engine Loading Stage 1: initialize systems // Engine Loading Stage 1: initialize systems
for (system_id, system) in self.system_manager.systems.iter_mut() { for system in self.system_manager.systems.values_mut() {
system.initialize(); system.initialize();
} }
@ -39,7 +37,7 @@ impl EngineTrait for Engine {
}; };
// Engine Loading Stage 2: load world // Engine Loading Stage 2: load world
for (system_id, system) in self.system_manager.systems.iter_mut() { for system in self.system_manager.systems.values_mut() {
system.load_world(&mut ctx); system.load_world(&mut ctx);
} }
} }
@ -53,7 +51,7 @@ impl EngineTrait for Engine {
debug_ui_buffer: self.debug_ui_buffer.clone(), debug_ui_buffer: self.debug_ui_buffer.clone(),
}; };
for (system_id, system) in self.system_manager.systems.iter_mut() { for system in self.system_manager.systems.values_mut() {
system.update(&mut ctx); system.update(&mut ctx);
} }
} }

View file

@ -1,9 +1,9 @@
use std::any::TypeId;
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use raidillon_core::scene::Scene;
use indexmap::IndexMap; use indexmap::IndexMap;
use winit::event::Event;
use raidillon_core::context::PlatformContext; use raidillon_core::context::PlatformContext;
use raidillon_core::scene::Scene;
use raidillon_core::DebugUIBuffer; use raidillon_core::DebugUIBuffer;
pub struct SystemContext<'a> { pub struct SystemContext<'a> {
@ -17,26 +17,27 @@ pub trait System {
/// Initialize the system. /// Initialize the system.
fn initialize(&mut self) {} fn initialize(&mut self) {}
/// Spawn the first entities of the world. /// Spawn the first entities of the world.
fn load_world(&mut self, ctx: &mut SystemContext) {} fn load_world(&mut self, _ctx: &mut SystemContext) {}
fn update(&mut self, ctx: &mut SystemContext) {} fn update(&mut self, _ctx: &mut SystemContext) {}
} }
pub type SystemID = &'static str;
pub struct SystemManager { pub struct SystemManager {
pub systems: IndexMap<SystemID, Box<dyn System>>, pub systems: IndexMap<TypeId, Box<dyn System>>,
} }
impl SystemManager { impl SystemManager {
pub fn new() -> Self { pub fn new() -> Self {
let systems = IndexMap::default(); Self {
Self { systems } systems: IndexMap::default(),
}
} }
pub fn add_system(&mut self, id: SystemID, system: Box<dyn System>) { pub fn add<S: System + Default + 'static>(&mut self) {
self.systems.insert(id, system); self.systems
.insert(TypeId::of::<S>(), Box::new(S::default()));
} }
pub fn remove_system(&mut self, id: SystemID) { pub fn remove<S: 'static>(&mut self) {
self.systems.shift_remove(&id); self.systems.shift_remove(&TypeId::of::<S>());
} }
} }

View file

@ -1,4 +1,3 @@
use std::path::Path;
use glam::{Quat, Vec3}; use glam::{Quat, Vec3};
use raidillon_engine::{Engine, system::System}; use raidillon_engine::{Engine, system::System};
use raidillon_engine::system::SystemContext; use raidillon_engine::system::SystemContext;
@ -10,31 +9,32 @@ use raidillon_ecs::Transform;
use raidillon_core::scene::Scene; use raidillon_core::scene::Scene;
#[cfg(feature = "glium")] #[cfg(feature = "glium")]
use raidillon_glium::GliumPlatform; use raidillon_glium::GliumPlatform;
use raidillon_core::DebugUIBuffer;
use winit::event::{Event, WindowEvent}; use winit::event::{Event, WindowEvent};
const TEST_GLTF: &str = "pink-monkey.gltf"; const TEST_GLTF: &str = "pink-monkey.gltf";
const RENDERING_TEST_SYSTEM: &str = "rendering_test_system";
const UPDATE_ASPECT_RATIO_SYSTEM: &str = "update_aspect_ratio_system";
const MAIN_SCENE_ID: &str = "main_scene"; const MAIN_SCENE_ID: &str = "main_scene";
#[derive(Default)]
struct UpdateAspectRatioSystem; struct UpdateAspectRatioSystem;
impl System for UpdateAspectRatioSystem { impl System for UpdateAspectRatioSystem {
fn initialize(&mut self) {} fn initialize(&mut self) {}
fn load_world(&mut self, ctx: &mut SystemContext) {} fn load_world(&mut self, _ctx: &mut SystemContext) {}
fn update(&mut self, ctx: &mut SystemContext) { fn update(&mut self, ctx: &mut SystemContext) {
// FIXME: Need an event handler rework for systems. // FIXME: Need an event handler rework for systems.
match &ctx.platform_context.current_event { match &ctx.platform_context.current_event {
Event::WindowEvent { event, .. } => match event { Event::WindowEvent { event, .. } => match event {
WindowEvent::Resized(sz) => { WindowEvent::Resized(sz) => {
let _ = ctx.scene.world.query_mut::<&mut Camera>().into_iter().map(|mut cam| { let _ = ctx
cam.1.aspect = sz.width as f32 / sz.height as f32; .scene
}); .world
.query_mut::<&mut Camera>()
.into_iter()
.map(|(_, cam)| {
cam.aspect = sz.width as f32 / sz.height as f32;
});
} }
_ => {} _ => {}
}, },
@ -43,6 +43,7 @@ impl System for UpdateAspectRatioSystem {
} }
} }
#[derive(Default)]
struct RenderingTestSystem; struct RenderingTestSystem;
impl System for RenderingTestSystem { impl System for RenderingTestSystem {
fn initialize(&mut self) {} fn initialize(&mut self) {}
@ -82,10 +83,8 @@ impl System for RenderingTestSystem {
fn main() { fn main() {
let mut engine = Engine::new(); let mut engine = Engine::new();
// Define systems // Define systems
// engine.system_manager.add_system("spawn_chunks".to_string(), ChunkSystem); engine.system_manager.add::<RenderingTestSystem>();
// engine.system_manager.add_system("movement".to_string(), MovementSystem); engine.system_manager.add::<UpdateAspectRatioSystem>();
engine.system_manager.add_system(RENDERING_TEST_SYSTEM, Box::new(RenderingTestSystem));
engine.system_manager.add_system(UPDATE_ASPECT_RATIO_SYSTEM, Box::new(UpdateAspectRatioSystem));
// Set up the scene // Set up the scene
let main_scene = Scene::new( let main_scene = Scene::new(
@ -97,7 +96,7 @@ fn main() {
#[cfg(feature = "glium")] #[cfg(feature = "glium")]
{ {
let mut platform = GliumPlatform::initialize( let platform = GliumPlatform::initialize(
engine, engine,
"Raidillon".to_string(), "Raidillon".to_string(),
1920, 1920,

View file

@ -1,25 +1,19 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use std::str::FromStr;
use std::sync::{Arc, RwLock};
use raidillon_platform::{Platform, PlatformContext}; use raidillon_platform::{Platform, PlatformContext};
use glium::backend::glutin::Display;
use glium::backend::glutin::SimpleWindowBuilder;
use glium::glutin::surface::WindowSurface;
use glium::winit::event_loop::EventLoop; use glium::winit::event_loop::EventLoop;
use glium::winit::window::Window; use glium::winit::window::Window;
use glium::backend::glutin::Display;
use glium::glutin::surface::WindowSurface;
use glium::backend::glutin::SimpleWindowBuilder;
use glium::Surface; use glium::Surface;
use crate::system::{RenderingSystemManager, RenderingSystem, RenderingContext, SystemID}; use crate::system::{RenderingContext, RenderingSystemManager};
use winit::event::{Event, WindowEvent}; use winit::event::{Event, WindowEvent};
use raidillon_assets::{ModelManager, ModelManagerRef}; use raidillon_assets::ModelManagerRef;
use raidillon_core::engine::EngineTrait; use raidillon_core::engine::EngineTrait;
use raidillon_engine::Engine;
use crate::{GliumAssetManager};
use crate::render::debug_ui::ImguiBridge; use crate::render::debug_ui::ImguiBridge;
use crate::render::BasicMeshRenderingSystem; use crate::render::BasicMeshRenderingSystem;
use crate::GliumAssetManager;
pub const MESH_RENDERER: &str = "mesh_renderer";
pub const DEBUG_UI_RENDERER: &str = "debug_ui_renderer";
pub struct GliumPlatform<E: EngineTrait> { pub struct GliumPlatform<E: EngineTrait> {
event_loop: EventLoop<()>, event_loop: EventLoop<()>,
@ -45,15 +39,8 @@ impl<E: EngineTrait> Platform<E> for GliumPlatform<E> {
let mut rendering_system_manager = RenderingSystemManager::new(); let mut rendering_system_manager = RenderingSystemManager::new();
// Install rendering systems // Install rendering systems
rendering_system_manager.add_system( rendering_system_manager.add::<BasicMeshRenderingSystem>(&display, &window);
MESH_RENDERER, rendering_system_manager.add::<ImguiBridge>(&display, &window);
Box::new(BasicMeshRenderingSystem::initialize(&display, &window))
);
rendering_system_manager.add_system(
DEBUG_UI_RENDERER,
Box::new(ImguiBridge::initialize(&display, &window)),
);
Self { Self {
event_loop, event_loop,
@ -77,8 +64,8 @@ impl<E: EngineTrait> Platform<E> for GliumPlatform<E> {
let _ = &self.event_loop.run(move |event, el| { let _ = &self.event_loop.run(move |event, el| {
self.rendering_system_manager self.rendering_system_manager
.systems .systems
.iter_mut() .values_mut()
.for_each(|(_, system)| system.handle_event(&mut self.window, event.clone())); .for_each(|system| system.handle_event(&mut self.window, event.clone()));
match event { match event {
Event::WindowEvent { event, .. } => match event { Event::WindowEvent { event, .. } => match event {
@ -100,8 +87,8 @@ impl<E: EngineTrait> Platform<E> for GliumPlatform<E> {
self.rendering_system_manager self.rendering_system_manager
.systems .systems
.iter_mut() .values_mut()
.for_each(|(_, system)| system.render(&mut context)); .for_each(|system| system.render(&mut context));
target.finish().unwrap(); target.finish().unwrap();
} }
_ => {}, _ => {},
@ -112,8 +99,8 @@ impl<E: EngineTrait> Platform<E> for GliumPlatform<E> {
self.engine.update(ctx2); self.engine.update(ctx2);
self.rendering_system_manager self.rendering_system_manager
.systems .systems
.iter_mut() .values_mut()
.for_each(|(_, system)| system.prepare_frame(&mut self.window)); .for_each(|system| system.prepare_frame(&mut self.window));
self.window.request_redraw(); self.window.request_redraw();
} }
_ => {}, _ => {},

View file

@ -1,12 +1,12 @@
use std::any::TypeId;
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use raidillon_core::scene::Scene; use indexmap::IndexMap;
use glium::{Display, Frame}; use glium::{Display, Frame};
use glium::glutin::surface::WindowSurface; use glium::glutin::surface::WindowSurface;
use indexmap::IndexMap;
use raidillon_assets::ModelManagerRef; use raidillon_assets::ModelManagerRef;
use raidillon_core::DebugUIBuffer; use raidillon_core::DebugUIBuffer;
use crate::GliumAssetManager; use raidillon_core::scene::Scene;
pub struct RenderingContext<'a> { pub struct RenderingContext<'a> {
pub scene: &'a Scene, pub scene: &'a Scene,
@ -19,16 +19,21 @@ pub struct RenderingContext<'a> {
/// The internal "rendering system" trait of glium_platform. /// The internal "rendering system" trait of glium_platform.
/// This is unrelated to the main System trait in core. /// This is unrelated to the main System trait in core.
pub trait RenderingSystem { pub trait RenderingSystem {
fn handle_event(&mut self, window: &mut glium::winit::window::Window, event: winit::event::Event<()>) {} fn handle_event(
fn prepare_frame(&mut self, window: &mut glium::winit::window::Window) {} &mut self,
_window: &mut glium::winit::window::Window,
_event: winit::event::Event<()>,
) {
}
fn prepare_frame(&mut self, _window: &mut glium::winit::window::Window) {}
fn render(&mut self, ctx: &mut RenderingContext); fn render(&mut self, ctx: &mut RenderingContext);
fn initialize(display: &Display<WindowSurface>, window: &glium::winit::window::Window) -> Self where Self: Sized; fn initialize(display: &Display<WindowSurface>, window: &glium::winit::window::Window) -> Self
where
Self: Sized;
} }
pub type SystemID = &'static str;
pub struct RenderingSystemManager { pub struct RenderingSystemManager {
pub systems: IndexMap<SystemID, Box<dyn RenderingSystem>>, pub systems: IndexMap<TypeId, Box<dyn RenderingSystem>>,
} }
impl RenderingSystemManager { impl RenderingSystemManager {
@ -37,11 +42,16 @@ impl RenderingSystemManager {
systems: IndexMap::default(), systems: IndexMap::default(),
} }
} }
pub fn add_system(&mut self, id: SystemID, system: Box<dyn RenderingSystem>) {
self.systems.insert(id, system); pub fn add<R>(&mut self, display: &Display<WindowSurface>, window: &glium::winit::window::Window)
where
R: RenderingSystem + 'static,
{
let system = R::initialize(display, window);
self.systems.insert(TypeId::of::<R>(), Box::new(system));
} }
pub fn remove_system(&mut self, id: SystemID) { pub fn remove<R: 'static>(&mut self) {
self.systems.shift_remove(&id); self.systems.shift_remove(&TypeId::of::<R>());
} }
} }