Skip to content

Commit

Permalink
Fix sprite picking backend not considering the viewport of the camera. (
Browse files Browse the repository at this point in the history
bevyengine#16386)

# Objective

- When picking sprites, the pointer is offset from the mouse, causing
you to pick sprites you're not mousing over!

## Solution

- Shift over the cursor by the minimum of the viewport.

## Testing

- I was already using the bevy_mod_picking PR for my project, so it
seems to work!
- I tested this on the sprite_example (making the camera only render to
part of the viewport), and it also works there.

## Notes

- This is just aevyrie/bevy_mod_picking#365 but
in Bevy form.
- We don't need to renormalize the viewport in any way since the
viewport is specified in pixels, so all that matters is that the origin
is correct.

Co-authored-by: johanhelsing <[email protected]>
  • Loading branch information
andriyDev and johanhelsing authored Nov 14, 2024
1 parent 6beeaa8 commit 4eaebd4
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions crates/bevy_sprite/src/picking_backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,13 @@ pub fn sprite_picking(
continue;
};

let Ok(cursor_ray_world) = camera.viewport_to_world(cam_transform, location.position)
else {
let viewport_pos = camera
.logical_viewport_rect()
.map(|v| v.min)
.unwrap_or_default();
let pos_in_viewport = location.position - viewport_pos;

let Ok(cursor_ray_world) = camera.viewport_to_world(cam_transform, pos_in_viewport) else {
continue;
};
let cursor_ray_len = cam_ortho.far - cam_ortho.near;
Expand Down

0 comments on commit 4eaebd4

Please sign in to comment.