Skip to content

Commit f7b2a02

Browse files
authored
Make sprite picking opt-in (#17842)
# Objective Fix #17108 See #17108 (comment) ## Solution - Make the query match `&Pickable` instead `Option<&Pickable>` ## Testing - Run the `sprite_picking` example and everything still work ## Migration Guide - Sprite picking are now opt-in, make sure you insert `Pickable` component when using sprite picking. ```diff -commands.spawn(Sprite { .. } ); +commands.spawn((Sprite { .. }, Pickable::default()); ```
1 parent cb62851 commit f7b2a02

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

crates/bevy_sprite/src/picking_backend.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub enum SpritePickingMode {
4242
#[reflect(Resource, Default)]
4343
pub struct SpritePickingSettings {
4444
/// When set to `true` sprite picking will only consider cameras marked with
45-
/// [`SpritePickingCamera`] and entities marked with [`Pickable`]. `false` by default.
45+
/// [`SpritePickingCamera`].
4646
///
4747
/// This setting is provided to give you fine-grained control over which cameras and entities
4848
/// should be used by the sprite picking backend at runtime.
@@ -94,16 +94,15 @@ fn sprite_picking(
9494
Entity,
9595
&Sprite,
9696
&GlobalTransform,
97-
Option<&Pickable>,
97+
&Pickable,
9898
&ViewVisibility,
9999
)>,
100100
mut output: EventWriter<PointerHits>,
101101
) {
102102
let mut sorted_sprites: Vec<_> = sprite_query
103103
.iter()
104104
.filter_map(|(entity, sprite, transform, pickable, vis)| {
105-
let marker_requirement = !settings.require_markers || pickable.is_some();
106-
if !transform.affine().is_nan() && vis.get() && marker_requirement {
105+
if !transform.affine().is_nan() && vis.get() {
107106
Some((entity, sprite, transform, pickable))
108107
} else {
109108
None
@@ -219,8 +218,7 @@ fn sprite_picking(
219218
}
220219
};
221220

222-
blocked = cursor_in_valid_pixels_of_sprite
223-
&& pickable.is_none_or(|p| p.should_block_lower);
221+
blocked = cursor_in_valid_pixels_of_sprite && pickable.should_block_lower;
224222

225223
cursor_in_valid_pixels_of_sprite.then(|| {
226224
let hit_pos_world =

examples/picking/sprite_picking.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
6060
.spawn((
6161
Sprite::from_color(Color::BLACK, sprite_size),
6262
Transform::from_xyz(i * len - len, j * len - len, -1.0),
63+
Pickable::default(),
6364
))
6465
.observe(recolor_on::<Pointer<Over>>(Color::srgb(0.0, 1.0, 1.0)))
6566
.observe(recolor_on::<Pointer<Out>>(Color::BLACK))
@@ -79,6 +80,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
7980
Transform::from_xyz(i * len - len, j * len - len, 0.0)
8081
.with_scale(Vec3::splat(1.0 + (i - 1.0) * 0.2))
8182
.with_rotation(Quat::from_rotation_z((j - 1.0) * 0.2)),
83+
Pickable::default(),
8284
))
8385
.observe(recolor_on::<Pointer<Over>>(Color::srgb(0.0, 1.0, 0.0)))
8486
.observe(recolor_on::<Pointer<Out>>(Color::srgb(1.0, 0.0, 0.0)))
@@ -140,6 +142,7 @@ fn setup_atlas(
140142
Transform::from_xyz(300.0, 0.0, 0.0).with_scale(Vec3::splat(6.0)),
141143
animation_indices,
142144
AnimationTimer(Timer::from_seconds(0.1, TimerMode::Repeating)),
145+
Pickable::default(),
143146
))
144147
.observe(recolor_on::<Pointer<Over>>(Color::srgb(0.0, 1.0, 1.0)))
145148
.observe(recolor_on::<Pointer<Out>>(Color::srgb(1.0, 1.0, 1.0)))

0 commit comments

Comments
 (0)