use crate::CameraProjection; use bevy_app::{Events, GetEventReader}; use bevy_property::Properties; use bevy_window::WindowResized; use glam::Mat4; use legion::{prelude::*, storage::Component}; #[derive(Default, Debug, Properties)] pub struct Camera { pub view_matrix: Mat4, pub name: Option, } pub fn camera_system( resources: &mut Resources, ) -> Box { let mut window_resized_event_reader = resources.get_event_reader::(); (move |world: &mut SubWorld, window_resized_events: Res>, query: &mut Query<(Write, Write)>| { let primary_window_resized_event = window_resized_event_reader .find_latest(&window_resized_events, |event| event.is_primary); if let Some(primary_window_resized_event) = primary_window_resized_event { for (mut camera, mut camera_projection) in query.iter_mut(world) { camera_projection.update( primary_window_resized_event.width, primary_window_resized_event.height, ); camera.view_matrix = camera_projection.get_view_matrix(); } } }) .system() }