From cdbac0d4ab03a5fe2bf243993118bb09e7d74834 Mon Sep 17 00:00:00 2001 From: reo Date: Mon, 30 Jun 2025 23:29:41 +0300 Subject: [PATCH] Improve ECS Use query_one_mut instead of query_mut for single objects --- src/ecs.rs | 13 ------------- src/main.rs | 19 ++++++++++++------- src/render.rs | 1 - 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/ecs.rs b/src/ecs.rs index 2fed082..0f47217 100644 --- a/src/ecs.rs +++ b/src/ecs.rs @@ -17,16 +17,3 @@ impl Transform { #[derive(Clone)] pub struct MeshHandle(pub usize); -/// ------------ systems ------------ -pub fn rotation_system(world: &mut World, dt: f32) { - for (_, transform) in world.query_mut::<&mut Transform>() { - transform.rotation *= Quat::from_rotation_y(dt); - } -} - -/// Update the aspect ratio for all camera components in the world. -pub fn set_camera_aspect(world: &mut World, aspect: f32) { - for (_, cam) in world.query_mut::<&mut crate::camera::Camera>() { - cam.aspect = aspect; - } -} diff --git a/src/main.rs b/src/main.rs index 7d0ac14..cebe8e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ mod render; use anyhow::Result; use camera::Camera; -use ecs::{rotation_system, MeshHandle, Transform}; +use ecs::{MeshHandle, Transform}; use glam::{Quat, Vec3}; use glium::backend::glutin::SimpleWindowBuilder; use render::{Renderer, GliumRenderer}; @@ -29,7 +29,7 @@ fn main() -> Result<()> { let mesh_id = renderer.meshes.len(); renderer.meshes.push(mesh); - world.spawn(( + let object_ent = world.spawn(( Transform { translation: Vec3::ZERO, rotation: Quat::IDENTITY, @@ -38,7 +38,8 @@ fn main() -> Result<()> { MeshHandle(mesh_id), )); - { + + let camera_ent = { let (w, h): (u32, u32) = window.inner_size().into(); world.spawn((Camera { eye: Vec3::new(3.0, 2.0, 3.0), @@ -48,8 +49,8 @@ fn main() -> Result<()> { aspect: w as f32 / h as f32, znear: 0.1, zfar: 100.0, - },)); - } + },)) + }; event_loop .run(move |event, el| { @@ -59,7 +60,9 @@ fn main() -> Result<()> { Event::WindowEvent { event, .. } => match event { WindowEvent::CloseRequested => el.exit(), WindowEvent::Resized(sz) => { - ecs::set_camera_aspect(&mut world, sz.width as f32 / sz.height as f32); + world.query_one_mut::<&mut crate::camera::Camera>(camera_ent).map(|mut cam| { + cam.aspect = sz.width as f32 / sz.height as f32; + }); } WindowEvent::RedrawRequested => { renderer.render(&world); @@ -74,7 +77,9 @@ fn main() -> Result<()> { let last = LAST.replace(now).unwrap_or(now); (now - last).as_secs_f32() }; - rotation_system(&mut world, dt); + world.query_one_mut::<&mut Transform>(object_ent).map(|mut object| { + object.rotation *= Quat::from_rotation_y(dt); + }); // ask for next frame window.request_redraw(); diff --git a/src/render.rs b/src/render.rs index 3f579c0..a4097db 100644 --- a/src/render.rs +++ b/src/render.rs @@ -72,7 +72,6 @@ impl Renderer for GliumRenderer { let mut frame = self.display.draw(); frame.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0); - // Expect exactly one active camera in the world. let cam = match world.query::<&Camera>().iter().next() { Some((_, cam)) => *cam, None => {