@@ -89,6 +89,7 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
8989 if let Ok ( ( collider, pos, rot, collision_margin, mut aabb, mut enlarged_aabb) ) =
9090 query. get_mut ( trigger. entity )
9191 {
92+ // TODO: Should we instead do this in `add_to_tree_on`?
9293 let collision_margin = collision_margin. map_or ( 0.0 , |m| m. 0 ) ;
9394 * aabb = collider
9495 . aabb_with_context ( pos. 0 , * rot, aabb_context)
@@ -115,7 +116,11 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
115116 app. add_observer ( add_to_tree_on :: < Insert , ( C , ColliderOf ) , Without < ColliderDisabled > > ) ;
116117
117118 // Case 2
118- app. add_observer ( remove_from_tree_on :: < Remove , C , Without < ColliderDisabled > > ) ;
119+ // Note: We also include disabled entities here for the edge case where
120+ // we despawn a disabled collider, which causes Case 4 to trigger first.
121+ // Ideally Case 4 would not trigger for despawned entities.
122+ // TODO: Clean up the edge case described above.
123+ app. add_observer ( remove_from_tree_on :: < Remove , C , Allow < Disabled > > ) ;
119124
120125 // Case 3
121126 app. add_observer (
@@ -129,7 +134,7 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
129134 Has < Sensor > ,
130135 Option < & ActiveCollisionHooks > ,
131136 ) ,
132- With < C > ,
137+ ( With < C > , Without < ColliderDisabled > ) ,
133138 > ,
134139 mut trees : ResMut < ColliderTrees > ,
135140 mut moved_proxies : ResMut < MovedProxies > | {
@@ -174,26 +179,33 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
174179 ) ;
175180
176181 // Cases 4
177- app. add_observer ( add_to_tree_on :: < Remove , Disabled , Without < ColliderDisabled > > ) ;
178- app. add_observer ( add_to_tree_on :: < Remove , ColliderDisabled , Without < Disabled > > ) ;
182+ // Note: We use `Replace` here to run before Case 2.
183+ app. add_observer (
184+ add_to_tree_on :: < Replace , Disabled , ( Without < ColliderDisabled > , Allow < Disabled > ) > ,
185+ ) ;
186+ app. add_observer ( add_to_tree_on :: < Replace , ColliderDisabled , ( ) > ) ;
179187
180188 // Case 5
181- app. add_observer ( remove_from_tree_on :: < Add , Disabled , Without < ColliderDisabled > > ) ;
182- app. add_observer ( remove_from_tree_on :: < Add , ColliderDisabled , Without < Disabled > > ) ;
189+ app. add_observer (
190+ remove_from_tree_on :: < Add , Disabled , ( Without < ColliderDisabled > , Allow < Disabled > ) > ,
191+ ) ;
192+ app. add_observer ( remove_from_tree_on :: < Add , ColliderDisabled , ( ) > ) ;
183193
184194 // Case 6
185195 app. add_observer (
186196 |trigger : On < Insert , RigidBody > ,
187197 body_query : Query < ( & RigidBody , & RigidBodyColliders ) > ,
188- mut collider_query : Query < (
189- Option < & ColliderOf > ,
190- & ColliderAabb ,
191- & EnlargedAabb ,
192- & mut ColliderTreeProxyKey ,
193- Option < & CollisionLayers > ,
194- Has < Sensor > ,
195- Option < & ActiveCollisionHooks > ,
196- ) > ,
198+ mut collider_query : Query <
199+ (
200+ & ColliderAabb ,
201+ & EnlargedAabb ,
202+ & mut ColliderTreeProxyKey ,
203+ Option < & CollisionLayers > ,
204+ Has < Sensor > ,
205+ Option < & ActiveCollisionHooks > ,
206+ ) ,
207+ Without < ColliderDisabled > ,
208+ > ,
197209 mut trees : ResMut < ColliderTrees > ,
198210 mut moved_proxies : ResMut < MovedProxies > | {
199211 let entity = trigger. entity ;
@@ -204,7 +216,6 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
204216
205217 for collider_entity in body_colliders. iter ( ) {
206218 let Ok ( (
207- collider_of,
208219 collider_aabb,
209220 enlarged_aabb,
210221 mut proxy_key,
@@ -234,7 +245,7 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
234245
235246 let proxy = ColliderTreeProxy {
236247 collider : collider_entity,
237- body : collider_of . map ( |c| c . body ) ,
248+ body : Some ( entity ) ,
238249 layers : layers. copied ( ) . unwrap_or_default ( ) ,
239250 aabb,
240251 flags : ColliderTreeProxyFlags :: new (
@@ -259,7 +270,7 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
259270 // Case 7
260271 app. add_observer (
261272 |trigger : On < Add , Sensor > ,
262- mut collider_query : Query < & ColliderTreeProxyKey > ,
273+ mut collider_query : Query < & ColliderTreeProxyKey , Without < ColliderDisabled > > ,
263274 mut trees : ResMut < ColliderTrees > | {
264275 let entity = trigger. entity ;
265276
@@ -279,7 +290,7 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
279290 // Case 8
280291 app. add_observer (
281292 |trigger : On < Remove , Sensor > ,
282- mut collider_query : Query < & ColliderTreeProxyKey > ,
293+ mut collider_query : Query < & ColliderTreeProxyKey , Without < ColliderDisabled > > ,
283294 mut trees : ResMut < ColliderTrees > | {
284295 let entity = trigger. entity ;
285296
@@ -299,7 +310,10 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
299310 // Case 9
300311 app. add_observer (
301312 |trigger : On < Replace , CollisionLayers > ,
302- mut collider_query : Query < ( & ColliderTreeProxyKey , Option < & CollisionLayers > ) > ,
313+ mut collider_query : Query <
314+ ( & ColliderTreeProxyKey , Option < & CollisionLayers > ) ,
315+ Without < ColliderDisabled > ,
316+ > ,
303317 mut trees : ResMut < ColliderTrees > | {
304318 let entity = trigger. entity ;
305319
@@ -319,7 +333,10 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
319333 // Case 10
320334 app. add_observer (
321335 |trigger : On < Replace , ActiveCollisionHooks > ,
322- mut collider_query : Query < ( & ColliderTreeProxyKey , Option < & ActiveCollisionHooks > ) > ,
336+ mut collider_query : Query <
337+ ( & ColliderTreeProxyKey , Option < & ActiveCollisionHooks > ) ,
338+ Without < ColliderDisabled > ,
339+ > ,
323340 mut trees : ResMut < ColliderTrees > | {
324341 let entity = trigger. entity ;
325342
@@ -345,7 +362,7 @@ impl<C: AnyCollider> Plugin for ColliderTreeUpdatePlugin<C> {
345362/// Adds a collider to the appropriate collider tree when the event `E` is triggered.
346363fn add_to_tree_on < E : EntityEvent , B : Bundle , F : QueryFilter > (
347364 trigger : On < E , B > ,
348- body_query : Query < & RigidBody > ,
365+ body_query : Query < & RigidBody , Allow < Disabled > > ,
349366 mut collider_query : Query <
350367 (
351368 Option < & ColliderOf > ,
0 commit comments