Iter added camera to update their projection (#488)

This commit is contained in:
Boutillier 2020-10-05 19:41:34 +02:00 committed by GitHub
parent 1bdb9d3b00
commit 219527ed7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,6 +1,6 @@
use super::CameraProjection; use super::CameraProjection;
use bevy_app::prelude::{EventReader, Events}; use bevy_app::prelude::{EventReader, Events};
use bevy_ecs::{Component, Local, Query, Res}; use bevy_ecs::{Added, Component, Entity, Local, Query, Res};
use bevy_math::Mat4; use bevy_math::Mat4;
use bevy_property::Properties; use bevy_property::Properties;
use bevy_window::{WindowCreated, WindowId, WindowResized, Windows}; use bevy_window::{WindowCreated, WindowId, WindowResized, Windows};
@ -38,7 +38,8 @@ pub fn camera_system<T: CameraProjection + Component>(
window_resized_events: Res<Events<WindowResized>>, window_resized_events: Res<Events<WindowResized>>,
window_created_events: Res<Events<WindowCreated>>, window_created_events: Res<Events<WindowCreated>>,
windows: Res<Windows>, windows: Res<Windows>,
mut query: Query<(&mut Camera, &mut T)>, mut query: Query<(Entity, &mut Camera, &mut T)>,
mut query_added: Query<(Entity, Added<Camera>)>,
) { ) {
let mut changed_window_ids = Vec::new(); let mut changed_window_ids = Vec::new();
// handle resize events. latest events are handled first because we only want to resize each window once // handle resize events. latest events are handled first because we only want to resize each window once
@ -67,9 +68,13 @@ pub fn camera_system<T: CameraProjection + Component>(
changed_window_ids.push(event.id); changed_window_ids.push(event.id);
} }
for (mut camera, mut camera_projection) in &mut query.iter() { let mut added_cameras = vec![];
for (entity, _camera) in &mut query_added.iter() {
added_cameras.push(entity);
}
for (entity, mut camera, mut camera_projection) in &mut query.iter() {
if let Some(window) = windows.get(camera.window) { if let Some(window) = windows.get(camera.window) {
if changed_window_ids.contains(&window.id) { if changed_window_ids.contains(&window.id) || added_cameras.contains(&entity) {
camera_projection.update(window.width as usize, window.height as usize); camera_projection.update(window.width as usize, window.height as usize);
camera.projection_matrix = camera_projection.get_projection_matrix(); camera.projection_matrix = camera_projection.get_projection_matrix();
camera.depth_calculation = camera_projection.depth_calculation(); camera.depth_calculation = camera_projection.depth_calculation();