diff --git a/crates/bevy_ecs/src/event.rs b/crates/bevy_ecs/src/event.rs index 11de10b34d084..1f710f1e8e1a6 100644 --- a/crates/bevy_ecs/src/event.rs +++ b/crates/bevy_ecs/src/event.rs @@ -188,13 +188,13 @@ impl Default for ManualEventReader { impl ManualEventReader { /// See [`EventReader::iter`] - pub fn iter<'a>(&mut self, events: &'a Events) -> impl DoubleEndedIterator { + pub fn iter<'a>(&'a mut self, events: &'a Events) -> impl DoubleEndedIterator { internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e) } /// See [`EventReader::iter_with_id`] pub fn iter_with_id<'a>( - &mut self, + &'a mut self, events: &'a Events, ) -> impl DoubleEndedIterator)> { internal_event_reader(&mut self.last_event_count, events) @@ -204,7 +204,7 @@ impl ManualEventReader { /// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read /// messages. fn internal_event_reader<'a, T>( - last_event_count: &mut usize, + last_event_count: &'a mut usize, events: &'a Events, ) -> impl DoubleEndedIterator)> { // if the reader has seen some of the events in a buffer, find the proper index offset. @@ -219,37 +219,17 @@ fn internal_event_reader<'a, T>( } else { 0 }; - *last_event_count = events.event_count; - match events.state { - State::A => events - .events_b - .get(b_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id) - .chain( - events - .events_a - .get(a_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id), - ), - State::B => events - .events_a - .get(a_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id) - .chain( - events - .events_b - .get(b_index..) - .unwrap_or_else(|| &[]) - .iter() - .map(map_instance_event_with_id), - ), - } + let a = events.events_a.get(a_index..).unwrap_or_else(|| &[]); + let b = events.events_b.get(b_index..).unwrap_or_else(|| &[]); + let unread_count = a.len() + b.len(); + *last_event_count = events.event_count - unread_count; + let iterator = match events.state { + State::A => b.iter().chain(a.iter()), + State::B => a.iter().chain(b.iter()), + }; + iterator + .map(map_instance_event_with_id) + .inspect(move |(_, id)| *last_event_count = (id.id + 1).max(*last_event_count)) } impl<'a, T: Component> EventReader<'a, T> { diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index b62015c5095e1..df5a1d5f0f7ef 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -303,6 +303,7 @@ pub fn scene_spawner_system(world: &mut World) { .unwrap(); let mut updated_spawned_scenes = Vec::new(); + let scene_spawner = &mut *scene_spawner; for event in scene_spawner .scene_asset_event_reader .iter(&scene_asset_events)