1
1
//! Types that detect when their internal data mutate.
2
2
3
- use crate :: { component:: ComponentTicks , ptr:: PtrMut , system:: Resource } ;
3
+ use crate :: {
4
+ component:: { Tick , TickCells } ,
5
+ ptr:: PtrMut ,
6
+ system:: Resource ,
7
+ } ;
8
+ use bevy_ptr:: UnsafeCellDeref ;
4
9
use std:: ops:: { Deref , DerefMut } ;
5
10
6
11
/// The (arbitrarily chosen) minimum number of world tick increments between `check_tick` scans.
@@ -95,21 +100,21 @@ macro_rules! change_detection_impl {
95
100
#[ inline]
96
101
fn is_added( & self ) -> bool {
97
102
self . ticks
98
- . component_ticks
99
- . is_added ( self . ticks. last_change_tick, self . ticks. change_tick)
103
+ . added
104
+ . is_older_than ( self . ticks. last_change_tick, self . ticks. change_tick)
100
105
}
101
106
102
107
#[ inline]
103
108
fn is_changed( & self ) -> bool {
104
109
self . ticks
105
- . component_ticks
106
- . is_changed ( self . ticks. last_change_tick, self . ticks. change_tick)
110
+ . changed
111
+ . is_older_than ( self . ticks. last_change_tick, self . ticks. change_tick)
107
112
}
108
113
109
114
#[ inline]
110
115
fn set_changed( & mut self ) {
111
116
self . ticks
112
- . component_ticks
117
+ . changed
113
118
. set_changed( self . ticks. change_tick) ;
114
119
}
115
120
@@ -224,11 +229,30 @@ macro_rules! impl_debug {
224
229
}
225
230
226
231
pub ( crate ) struct Ticks < ' a > {
227
- pub ( crate ) component_ticks : & ' a mut ComponentTicks ,
232
+ pub ( crate ) added : & ' a mut Tick ,
233
+ pub ( crate ) changed : & ' a mut Tick ,
228
234
pub ( crate ) last_change_tick : u32 ,
229
235
pub ( crate ) change_tick : u32 ,
230
236
}
231
237
238
+ impl < ' a > Ticks < ' a > {
239
+ /// # Safety
240
+ /// This should never alias the underlying ticks. All access must be unique.
241
+ #[ inline]
242
+ pub ( crate ) unsafe fn from_tick_cells (
243
+ cells : TickCells < ' a > ,
244
+ last_change_tick : u32 ,
245
+ change_tick : u32 ,
246
+ ) -> Self {
247
+ Self {
248
+ added : cells. added . deref_mut ( ) ,
249
+ changed : cells. changed . deref_mut ( ) ,
250
+ last_change_tick,
251
+ change_tick,
252
+ }
253
+ }
254
+ }
255
+
232
256
/// Unique mutable borrow of a [`Resource`].
233
257
///
234
258
/// See the [`Resource`] documentation for usage.
@@ -381,22 +405,20 @@ impl<'a> DetectChanges for MutUntyped<'a> {
381
405
#[ inline]
382
406
fn is_added ( & self ) -> bool {
383
407
self . ticks
384
- . component_ticks
385
- . is_added ( self . ticks . last_change_tick , self . ticks . change_tick )
408
+ . added
409
+ . is_older_than ( self . ticks . last_change_tick , self . ticks . change_tick )
386
410
}
387
411
388
412
#[ inline]
389
413
fn is_changed ( & self ) -> bool {
390
414
self . ticks
391
- . component_ticks
392
- . is_changed ( self . ticks . last_change_tick , self . ticks . change_tick )
415
+ . changed
416
+ . is_older_than ( self . ticks . last_change_tick , self . ticks . change_tick )
393
417
}
394
418
395
419
#[ inline]
396
420
fn set_changed ( & mut self ) {
397
- self . ticks
398
- . component_ticks
399
- . set_changed ( self . ticks . change_tick ) ;
421
+ self . ticks . changed . set_changed ( self . ticks . change_tick ) ;
400
422
}
401
423
402
424
#[ inline]
@@ -429,10 +451,8 @@ mod tests {
429
451
430
452
use crate :: {
431
453
self as bevy_ecs,
432
- change_detection:: {
433
- ComponentTicks , Mut , NonSendMut , ResMut , Ticks , CHECK_TICK_THRESHOLD , MAX_CHANGE_AGE ,
434
- } ,
435
- component:: Component ,
454
+ change_detection:: { Mut , NonSendMut , ResMut , Ticks , CHECK_TICK_THRESHOLD , MAX_CHANGE_AGE } ,
455
+ component:: { Component , ComponentTicks , Tick } ,
436
456
query:: ChangeTrackers ,
437
457
system:: { IntoSystem , Query , System } ,
438
458
world:: World ,
@@ -514,8 +534,8 @@ mod tests {
514
534
515
535
let mut query = world. query :: < ChangeTrackers < C > > ( ) ;
516
536
for tracker in query. iter ( & world) {
517
- let ticks_since_insert = change_tick. wrapping_sub ( tracker. component_ticks . added ) ;
518
- let ticks_since_change = change_tick. wrapping_sub ( tracker. component_ticks . changed ) ;
537
+ let ticks_since_insert = change_tick. wrapping_sub ( tracker. component_ticks . added . tick ) ;
538
+ let ticks_since_change = change_tick. wrapping_sub ( tracker. component_ticks . changed . tick ) ;
519
539
assert ! ( ticks_since_insert > MAX_CHANGE_AGE ) ;
520
540
assert ! ( ticks_since_change > MAX_CHANGE_AGE ) ;
521
541
}
@@ -524,8 +544,8 @@ mod tests {
524
544
world. check_change_ticks ( ) ;
525
545
526
546
for tracker in query. iter ( & world) {
527
- let ticks_since_insert = change_tick. wrapping_sub ( tracker. component_ticks . added ) ;
528
- let ticks_since_change = change_tick. wrapping_sub ( tracker. component_ticks . changed ) ;
547
+ let ticks_since_insert = change_tick. wrapping_sub ( tracker. component_ticks . added . tick ) ;
548
+ let ticks_since_change = change_tick. wrapping_sub ( tracker. component_ticks . changed . tick ) ;
529
549
assert ! ( ticks_since_insert == MAX_CHANGE_AGE ) ;
530
550
assert ! ( ticks_since_change == MAX_CHANGE_AGE ) ;
531
551
}
@@ -534,11 +554,12 @@ mod tests {
534
554
#[ test]
535
555
fn mut_from_res_mut ( ) {
536
556
let mut component_ticks = ComponentTicks {
537
- added : 1 ,
538
- changed : 2 ,
557
+ added : Tick :: new ( 1 ) ,
558
+ changed : Tick :: new ( 2 ) ,
539
559
} ;
540
560
let ticks = Ticks {
541
- component_ticks : & mut component_ticks,
561
+ added : & mut component_ticks. added ,
562
+ changed : & mut component_ticks. changed ,
542
563
last_change_tick : 3 ,
543
564
change_tick : 4 ,
544
565
} ;
@@ -549,20 +570,21 @@ mod tests {
549
570
} ;
550
571
551
572
let into_mut: Mut < R > = res_mut. into ( ) ;
552
- assert_eq ! ( 1 , into_mut. ticks. component_ticks . added) ;
553
- assert_eq ! ( 2 , into_mut. ticks. component_ticks . changed) ;
573
+ assert_eq ! ( 1 , into_mut. ticks. added. tick ) ;
574
+ assert_eq ! ( 2 , into_mut. ticks. changed. tick ) ;
554
575
assert_eq ! ( 3 , into_mut. ticks. last_change_tick) ;
555
576
assert_eq ! ( 4 , into_mut. ticks. change_tick) ;
556
577
}
557
578
558
579
#[ test]
559
580
fn mut_from_non_send_mut ( ) {
560
581
let mut component_ticks = ComponentTicks {
561
- added : 1 ,
562
- changed : 2 ,
582
+ added : Tick :: new ( 1 ) ,
583
+ changed : Tick :: new ( 2 ) ,
563
584
} ;
564
585
let ticks = Ticks {
565
- component_ticks : & mut component_ticks,
586
+ added : & mut component_ticks. added ,
587
+ changed : & mut component_ticks. changed ,
566
588
last_change_tick : 3 ,
567
589
change_tick : 4 ,
568
590
} ;
@@ -573,8 +595,8 @@ mod tests {
573
595
} ;
574
596
575
597
let into_mut: Mut < R > = non_send_mut. into ( ) ;
576
- assert_eq ! ( 1 , into_mut. ticks. component_ticks . added) ;
577
- assert_eq ! ( 2 , into_mut. ticks. component_ticks . changed) ;
598
+ assert_eq ! ( 1 , into_mut. ticks. added. tick ) ;
599
+ assert_eq ! ( 2 , into_mut. ticks. changed. tick ) ;
578
600
assert_eq ! ( 3 , into_mut. ticks. last_change_tick) ;
579
601
assert_eq ! ( 4 , into_mut. ticks. change_tick) ;
580
602
}
@@ -584,13 +606,14 @@ mod tests {
584
606
use super :: * ;
585
607
struct Outer ( i64 ) ;
586
608
609
+ let ( last_change_tick, change_tick) = ( 2 , 3 ) ;
587
610
let mut component_ticks = ComponentTicks {
588
- added : 1 ,
589
- changed : 2 ,
611
+ added : Tick :: new ( 1 ) ,
612
+ changed : Tick :: new ( 2 ) ,
590
613
} ;
591
- let ( last_change_tick, change_tick) = ( 2 , 3 ) ;
592
614
let ticks = Ticks {
593
- component_ticks : & mut component_ticks,
615
+ added : & mut component_ticks. added ,
616
+ changed : & mut component_ticks. changed ,
594
617
last_change_tick,
595
618
change_tick,
596
619
} ;
0 commit comments