bevy/crates/bevy_render/src/camera/camera.rs

35 lines
1.2 KiB
Rust

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<String>,
}
pub fn camera_system<T: CameraProjection + Component>(
resources: &mut Resources,
) -> Box<dyn Schedulable> {
let mut window_resized_event_reader = resources.get_event_reader::<WindowResized>();
(move |world: &mut SubWorld,
window_resized_events: Res<Events<WindowResized>>,
query: &mut Query<(Write<Camera>, Write<T>)>| {
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()
}