From 311ad2ed03f4e0ae385674a8c30ccf75fe3f9eae Mon Sep 17 00:00:00 2001 From: devil-ira Date: Sat, 12 Nov 2022 15:34:21 +0100 Subject: [PATCH] viewport_to_world_2d --- crates/bevy_render/src/camera/camera.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index 7d986c9a3125a..4b5a03462dda1 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -248,6 +248,25 @@ impl Camera { }) } + /// Returns a 2D world position computed from a position on this [`Camera`]'s viewport. + /// + /// Useful for 2D cameras and other cameras with an orthographic projection pointing along the Z axis. + /// + /// To get the world space coordinates with Normalized Device Coordinates, you should use + /// [`ndc_to_world`](Self::ndc_to_world). + pub fn viewport_to_world_2d( + &self, + camera_transform: &GlobalTransform, + viewport_position: Vec2, + ) -> Option { + let target_size = self.logical_viewport_size()?; + let ndc = viewport_position * 2. / target_size - Vec2::ONE; + + let world_near_plane = self.ndc_to_world(camera_transform, ndc.extend(1.))?; + + Some(world_near_plane.truncate()) + } + /// Given a position in world space, use the camera's viewport to compute the Normalized Device Coordinates. /// /// When the position is within the viewport the values returned will be between -1.0 and 1.0 on the X and Y axes,