Skip to content

Commit ce752d2

Browse files
TheRawMeatballcart
andcommitted
Increment last event count on next instead of iter (#2382)
# Objective Currently, simply calling `iter` on an event reader will mark all of it's events as read, even if the returned iterator is never used ## Solution With this, the cursor will simply move to the last unread, but available event when iter is called, and incremented by one per `next` call. Co-authored-by: Carter Anderson <[email protected]>
1 parent 6a499b1 commit ce752d2

File tree

2 files changed

+15
-34
lines changed

2 files changed

+15
-34
lines changed

crates/bevy_ecs/src/event.rs

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ impl<T> Default for ManualEventReader<T> {
194194

195195
impl<T> ManualEventReader<T> {
196196
/// See [`EventReader::iter`]
197-
pub fn iter<'a>(&mut self, events: &'a Events<T>) -> impl DoubleEndedIterator<Item = &'a T> {
197+
pub fn iter<'a>(&'a mut self, events: &'a Events<T>) -> impl DoubleEndedIterator<Item = &'a T> {
198198
internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e)
199199
}
200200

201201
/// See [`EventReader::iter_with_id`]
202202
pub fn iter_with_id<'a>(
203-
&mut self,
203+
&'a mut self,
204204
events: &'a Events<T>,
205205
) -> impl DoubleEndedIterator<Item = (&'a T, EventId<T>)> {
206206
internal_event_reader(&mut self.last_event_count, events)
@@ -210,7 +210,7 @@ impl<T> ManualEventReader<T> {
210210
/// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read
211211
/// messages.
212212
fn internal_event_reader<'a, T>(
213-
last_event_count: &mut usize,
213+
last_event_count: &'a mut usize,
214214
events: &'a Events<T>,
215215
) -> impl DoubleEndedIterator<Item = (&'a T, EventId<T>)> {
216216
// if the reader has seen some of the events in a buffer, find the proper index offset.
@@ -225,37 +225,17 @@ fn internal_event_reader<'a, T>(
225225
} else {
226226
0
227227
};
228-
*last_event_count = events.event_count;
229-
match events.state {
230-
State::A => events
231-
.events_b
232-
.get(b_index..)
233-
.unwrap_or_else(|| &[])
234-
.iter()
235-
.map(map_instance_event_with_id)
236-
.chain(
237-
events
238-
.events_a
239-
.get(a_index..)
240-
.unwrap_or_else(|| &[])
241-
.iter()
242-
.map(map_instance_event_with_id),
243-
),
244-
State::B => events
245-
.events_a
246-
.get(a_index..)
247-
.unwrap_or_else(|| &[])
248-
.iter()
249-
.map(map_instance_event_with_id)
250-
.chain(
251-
events
252-
.events_b
253-
.get(b_index..)
254-
.unwrap_or_else(|| &[])
255-
.iter()
256-
.map(map_instance_event_with_id),
257-
),
258-
}
228+
let a = events.events_a.get(a_index..).unwrap_or_else(|| &[]);
229+
let b = events.events_b.get(b_index..).unwrap_or_else(|| &[]);
230+
let unread_count = a.len() + b.len();
231+
*last_event_count = events.event_count - unread_count;
232+
let iterator = match events.state {
233+
State::A => b.iter().chain(a.iter()),
234+
State::B => a.iter().chain(b.iter()),
235+
};
236+
iterator
237+
.map(map_instance_event_with_id)
238+
.inspect(move |(_, id)| *last_event_count = (id.id + 1).max(*last_event_count))
259239
}
260240

261241
impl<'w, 's, T: Resource> EventReader<'w, 's, T> {

crates/bevy_scene/src/scene_spawner.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ pub fn scene_spawner_system(world: &mut World) {
316316
.unwrap();
317317

318318
let mut updated_spawned_scenes = Vec::new();
319+
let scene_spawner = &mut *scene_spawner;
319320
for event in scene_spawner
320321
.scene_asset_event_reader
321322
.iter(scene_asset_events)

0 commit comments

Comments
 (0)