Skip to content

Commit

Permalink
Picking: Filter out invisible sprites early (#15819)
Browse files Browse the repository at this point in the history
# Objective

- We don't have to `collect` and `sort` invisible sprites in
`sprite_picking` system.

## Solution

- Filter by `ViewVisibility::get()` earlier

## Testing

- `sprite_picking` example still works.
  • Loading branch information
akimakinai authored Oct 10, 2024
1 parent dd812b3 commit 922a25d
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions crates/bevy_sprite/src/picking_backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,13 @@ pub fn sprite_picking(
) {
let mut sorted_sprites: Vec<_> = sprite_query
.iter()
.filter(|x| !x.2.affine().is_nan())
.filter_map(|(entity, sprite, transform, picking_behavior, vis)| {
if !transform.affine().is_nan() && vis.get() {
Some((entity, sprite, transform, picking_behavior))
} else {
None
}
})
.collect();
sorted_sprites.sort_by_key(|x| Reverse(FloatOrd(x.2.translation().z)));

Expand Down Expand Up @@ -74,8 +80,7 @@ pub fn sprite_picking(
let picks: Vec<(Entity, HitData)> = sorted_sprites
.iter()
.copied()
.filter(|(.., visibility)| visibility.get())
.filter_map(|(entity, sprite, sprite_transform, picking_behavior, ..)| {
.filter_map(|(entity, sprite, sprite_transform, picking_behavior)| {
if blocked {
return None;
}
Expand Down Expand Up @@ -125,7 +130,9 @@ pub fn sprite_picking(
let is_cursor_in_sprite = rect.contains(cursor_pos_sprite);

blocked = is_cursor_in_sprite
&& picking_behavior.map(|p| p.should_block_lower) != Some(false);
&& picking_behavior
.map(|p| p.should_block_lower)
.unwrap_or(true);

is_cursor_in_sprite.then(|| {
let hit_pos_world =
Expand Down

0 comments on commit 922a25d

Please sign in to comment.