Skip to content

Commit a2a2f34

Browse files
committed
More disabling fixes
1 parent 9888685 commit a2a2f34

File tree

1 file changed

+39
-22
lines changed

1 file changed

+39
-22
lines changed

src/collider_tree/update.rs

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
346363
fn 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

Comments
 (0)