1
1
use crate :: components:: { GlobalTransform , Transform } ;
2
- use bevy_ecs:: prelude:: { Changed , Entity , Query , With , Without } ;
2
+ use bevy_ecs:: {
3
+ change_detection:: Ref ,
4
+ prelude:: { Changed , DetectChanges , Entity , Query , With , Without } ,
5
+ } ;
3
6
use bevy_hierarchy:: { Children , Parent } ;
4
7
5
8
/// Update [`GlobalTransform`] component of entities that aren't in the hierarchy
@@ -24,32 +27,26 @@ pub fn sync_simple_transforms(
24
27
/// to propagate transforms correctly.
25
28
pub fn propagate_transforms (
26
29
mut root_query : Query <
27
- (
28
- Entity ,
29
- & Children ,
30
- & Transform ,
31
- Changed < Transform > ,
32
- Changed < Children > ,
33
- & mut GlobalTransform ,
34
- ) ,
30
+ ( Entity , Ref < Children > , Ref < Transform > , & mut GlobalTransform ) ,
35
31
Without < Parent > ,
36
32
> ,
37
- transform_query : Query < ( & Transform , Changed < Transform > , & mut GlobalTransform ) , With < Parent > > ,
33
+ transform_query : Query < ( Ref < Transform > , & mut GlobalTransform ) , With < Parent > > ,
38
34
parent_query : Query < & Parent > ,
39
- children_query : Query < ( & Children , Changed < Children > ) , ( With < Parent > , With < GlobalTransform > ) > ,
35
+ children_query : Query < Ref < Children > , ( With < Parent > , With < GlobalTransform > ) > ,
40
36
) {
41
37
root_query. par_for_each_mut (
42
38
// The differing depths and sizes of hierarchy trees causes the work for each root to be
43
39
// different. A batch size of 1 ensures that each tree gets it's own task and multiple
44
40
// large trees are not clumped together.
45
41
1 ,
46
- |( entity, children, transform, mut changed, children_changed, mut global_transform) | {
42
+ |( entity, children, transform, mut global_transform) | {
43
+ let mut changed = transform. is_changed ( ) ;
47
44
if changed {
48
45
* global_transform = GlobalTransform :: from ( * transform) ;
49
46
}
50
47
51
48
// If our `Children` has changed, we need to recalculate everything below us
52
- changed |= children_changed ;
49
+ changed |= children . is_changed ( ) ;
53
50
54
51
for child in children. iter ( ) {
55
52
// SAFETY:
@@ -87,12 +84,9 @@ pub fn propagate_transforms(
87
84
/// nor any of its descendants.
88
85
unsafe fn propagate_recursive (
89
86
parent : & GlobalTransform ,
90
- unsafe_transform_query : & Query <
91
- ( & Transform , Changed < Transform > , & mut GlobalTransform ) ,
92
- With < Parent > ,
93
- > ,
87
+ unsafe_transform_query : & Query < ( Ref < Transform > , & mut GlobalTransform ) , With < Parent > > ,
94
88
parent_query : & Query < & Parent > ,
95
- children_query : & Query < ( & Children , Changed < Children > ) , ( With < Parent > , With < GlobalTransform > ) > ,
89
+ children_query : & Query < Ref < Children > , ( With < Parent > , With < GlobalTransform > ) > ,
96
90
expected_parent : Entity ,
97
91
entity : Entity ,
98
92
mut changed : bool ,
@@ -106,7 +100,7 @@ unsafe fn propagate_recursive(
106
100
) ;
107
101
108
102
let global_matrix = {
109
- let Ok ( ( transform, transform_changed , mut global_transform) ) =
103
+ let Ok ( ( transform, mut global_transform) ) =
110
104
// SAFETY: This call cannot create aliased mutable references.
111
105
// - The top level iteration parallelizes on the roots of the hierarchy.
112
106
// - The above assertion ensures that each child has one and only one unique parent throughout the entire
@@ -137,19 +131,19 @@ unsafe fn propagate_recursive(
137
131
return ;
138
132
} ;
139
133
140
- changed |= transform_changed ;
134
+ changed |= transform . is_changed ( ) ;
141
135
if changed {
142
136
* global_transform = parent. mul_transform ( * transform) ;
143
137
}
144
138
* global_transform
145
139
} ;
146
140
147
- let Ok ( ( children, changed_children ) ) = children_query. get ( entity) else {
141
+ let Ok ( children) = children_query. get ( entity) else {
148
142
return
149
143
} ;
150
144
// If our `Children` has changed, we need to recalculate everything below us
151
- changed |= changed_children ;
152
- for child in children {
145
+ changed |= children . is_changed ( ) ;
146
+ for child in & children {
153
147
// SAFETY: The caller guarantees that `unsafe_transform_query` will not be fetched
154
148
// for any descendants of `entity`, so it is safe to call `propagate_recursive` for each child.
155
149
unsafe {
0 commit comments