From 4eaebd460816d0443fac055df9ecba4e25f31099 Mon Sep 17 00:00:00 2001 From: andriyDev Date: Thu, 14 Nov 2024 05:04:52 -0800 Subject: [PATCH] Fix sprite picking backend not considering the viewport of the camera. (#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 https://github.com/aevyrie/bevy_mod_picking/pull/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 --- crates/bevy_sprite/src/picking_backend.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/bevy_sprite/src/picking_backend.rs b/crates/bevy_sprite/src/picking_backend.rs index ad2afc33d1..b367efcc00 100644 --- a/crates/bevy_sprite/src/picking_backend.rs +++ b/crates/bevy_sprite/src/picking_backend.rs @@ -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;