@@ -9,6 +9,7 @@ use crate::{
99} ;
1010use bevy_ecs_macros:: all_tuples;
1111use std:: {
12+ cell:: UnsafeCell ,
1213 marker:: PhantomData ,
1314 ptr:: { self , NonNull } ,
1415} ;
@@ -343,7 +344,7 @@ impl<'w, T: Component> Fetch<'w> for ReadFetch<T> {
343344 let column = tables[ archetype. table_id ( ) ]
344345 . get_column ( state. component_id )
345346 . unwrap ( ) ;
346- self . table_components = column. get_ptr ( ) . cast :: < T > ( ) ;
347+ self . table_components = column. get_data_ptr ( ) . cast :: < T > ( ) ;
347348 }
348349 StorageType :: SparseSet => self . entities = archetype. entities ( ) . as_ptr ( ) ,
349350 }
@@ -354,7 +355,7 @@ impl<'w, T: Component> Fetch<'w> for ReadFetch<T> {
354355 self . table_components = table
355356 . get_column ( state. component_id )
356357 . unwrap ( )
357- . get_ptr ( )
358+ . get_data_ptr ( )
358359 . cast :: < T > ( ) ;
359360 }
360361
@@ -387,7 +388,7 @@ impl<T: Component> WorldQuery for &mut T {
387388pub struct WriteFetch < T > {
388389 storage_type : StorageType ,
389390 table_components : NonNull < T > ,
390- table_ticks : * mut ComponentTicks ,
391+ table_ticks : * const UnsafeCell < ComponentTicks > ,
391392 entities : * const Entity ,
392393 entity_table_rows : * const usize ,
393394 sparse_set : * const ComponentSparseSet ,
@@ -482,7 +483,7 @@ impl<'w, T: Component> Fetch<'w> for WriteFetch<T> {
482483 entities : ptr:: null :: < Entity > ( ) ,
483484 entity_table_rows : ptr:: null :: < usize > ( ) ,
484485 sparse_set : ptr:: null :: < ComponentSparseSet > ( ) ,
485- table_ticks : ptr:: null_mut :: < ComponentTicks > ( ) ,
486+ table_ticks : ptr:: null :: < UnsafeCell < ComponentTicks > > ( ) ,
486487 last_change_tick,
487488 change_tick,
488489 } ;
@@ -509,8 +510,8 @@ impl<'w, T: Component> Fetch<'w> for WriteFetch<T> {
509510 let column = tables[ archetype. table_id ( ) ]
510511 . get_column ( state. component_id )
511512 . unwrap ( ) ;
512- self . table_components = column. get_ptr ( ) . cast :: < T > ( ) ;
513- self . table_ticks = column. get_ticks_mut_ptr ( ) ;
513+ self . table_components = column. get_data_ptr ( ) . cast :: < T > ( ) ;
514+ self . table_ticks = column. get_ticks_ptr ( ) ;
514515 }
515516 StorageType :: SparseSet => self . entities = archetype. entities ( ) . as_ptr ( ) ,
516517 }
@@ -519,8 +520,8 @@ impl<'w, T: Component> Fetch<'w> for WriteFetch<T> {
519520 #[ inline]
520521 unsafe fn set_table ( & mut self , state : & Self :: State , table : & Table ) {
521522 let column = table. get_column ( state. component_id ) . unwrap ( ) ;
522- self . table_components = column. get_ptr ( ) . cast :: < T > ( ) ;
523- self . table_ticks = column. get_ticks_mut_ptr ( ) ;
523+ self . table_components = column. get_data_ptr ( ) . cast :: < T > ( ) ;
524+ self . table_ticks = column. get_ticks_ptr ( ) ;
524525 }
525526
526527 #[ inline]
@@ -531,7 +532,7 @@ impl<'w, T: Component> Fetch<'w> for WriteFetch<T> {
531532 Mut {
532533 value : & mut * self . table_components . as_ptr ( ) . add ( table_row) ,
533534 ticks : Ticks {
534- component_ticks : & mut * self . table_ticks . add ( table_row) ,
535+ component_ticks : & mut * ( & * self . table_ticks . add ( table_row) ) . get ( ) ,
535536 change_tick : self . change_tick ,
536537 last_change_tick : self . last_change_tick ,
537538 } ,
@@ -558,7 +559,7 @@ impl<'w, T: Component> Fetch<'w> for WriteFetch<T> {
558559 Mut {
559560 value : & mut * self . table_components . as_ptr ( ) . add ( table_row) ,
560561 ticks : Ticks {
561- component_ticks : & mut * self . table_ticks . add ( table_row) ,
562+ component_ticks : & mut * ( & * self . table_ticks . add ( table_row) ) . get ( ) ,
562563 change_tick : self . change_tick ,
563564 last_change_tick : self . last_change_tick ,
564565 } ,
@@ -860,7 +861,7 @@ impl<'w, T: Component> Fetch<'w> for ChangeTrackersFetch<T> {
860861 let column = tables[ archetype. table_id ( ) ]
861862 . get_column ( state. component_id )
862863 . unwrap ( ) ;
863- self . table_ticks = column. get_ticks_mut_ptr ( ) . cast :: < ComponentTicks > ( ) ;
864+ self . table_ticks = column. get_ticks_const_ptr ( ) ;
864865 }
865866 StorageType :: SparseSet => self . entities = archetype. entities ( ) . as_ptr ( ) ,
866867 }
@@ -871,8 +872,7 @@ impl<'w, T: Component> Fetch<'w> for ChangeTrackersFetch<T> {
871872 self . table_ticks = table
872873 . get_column ( state. component_id )
873874 . unwrap ( )
874- . get_ticks_mut_ptr ( )
875- . cast :: < ComponentTicks > ( ) ;
875+ . get_ticks_const_ptr ( ) ;
876876 }
877877
878878 #[ inline]
@@ -881,7 +881,7 @@ impl<'w, T: Component> Fetch<'w> for ChangeTrackersFetch<T> {
881881 StorageType :: Table => {
882882 let table_row = * self . entity_table_rows . add ( archetype_index) ;
883883 ChangeTrackers {
884- component_ticks : * self . table_ticks . add ( table_row) ,
884+ component_ticks : ( & * self . table_ticks . add ( table_row) ) . clone ( ) ,
885885 marker : PhantomData ,
886886 last_change_tick : self . last_change_tick ,
887887 change_tick : self . change_tick ,
@@ -890,7 +890,7 @@ impl<'w, T: Component> Fetch<'w> for ChangeTrackersFetch<T> {
890890 StorageType :: SparseSet => {
891891 let entity = * self . entities . add ( archetype_index) ;
892892 ChangeTrackers {
893- component_ticks : * ( * self . sparse_set ) . get_ticks ( entity) . unwrap ( ) ,
893+ component_ticks : ( & * self . sparse_set ) . get_ticks ( entity) . cloned ( ) . unwrap ( ) ,
894894 marker : PhantomData ,
895895 last_change_tick : self . last_change_tick ,
896896 change_tick : self . change_tick ,
@@ -902,7 +902,7 @@ impl<'w, T: Component> Fetch<'w> for ChangeTrackersFetch<T> {
902902 #[ inline]
903903 unsafe fn table_fetch ( & mut self , table_row : usize ) -> Self :: Item {
904904 ChangeTrackers {
905- component_ticks : * self . table_ticks . add ( table_row) ,
905+ component_ticks : ( & * self . table_ticks . add ( table_row) ) . clone ( ) ,
906906 marker : PhantomData ,
907907 last_change_tick : self . last_change_tick ,
908908 change_tick : self . change_tick ,
0 commit comments