mirror of
https://github.com/bevyengine/bevy
synced 2024-11-26 14:40:19 +00:00
Document when Camera::viewport_to_world and related methods return None (#8841)
# Objective Fixes #7171 ## Solution - Add documentation for when Camera::viewport_to_world and related methods return None
This commit is contained in:
parent
bbf1c23d50
commit
7ceb4dfd79
1 changed files with 31 additions and 1 deletions
|
@ -169,6 +169,14 @@ impl Camera {
|
|||
/// of the current [`RenderTarget`].
|
||||
/// For logic that requires the full logical size of the
|
||||
/// [`RenderTarget`], prefer [`Camera::logical_target_size`].
|
||||
///
|
||||
/// Returns `None` if either:
|
||||
/// - the function is called just after the `Camera` is created, before `camera_system` is executed,
|
||||
/// - the [`RenderTarget`] isn't correctly set:
|
||||
/// - it references the [`PrimaryWindow`](RenderTarget::Window) when there is none,
|
||||
/// - it references a [`Window`](RenderTarget::Window) entity that doesn't exist or doesn't actually have a `Window` component,
|
||||
/// - it references an [`Image`](RenderTarget::Image) that doesn't exist (invalid handle),
|
||||
/// - it references a [`TextureView`](RenderTarget::TextureView) that doesn't exist (invalid handle).
|
||||
#[inline]
|
||||
pub fn logical_viewport_size(&self) -> Option<Vec2> {
|
||||
self.viewport
|
||||
|
@ -218,6 +226,12 @@ impl Camera {
|
|||
///
|
||||
/// To get the coordinates in Normalized Device Coordinates, you should use
|
||||
/// [`world_to_ndc`](Self::world_to_ndc).
|
||||
///
|
||||
/// Returns `None` if any of these conditions occur:
|
||||
/// - The computed coordinates are beyond the near or far plane
|
||||
/// - The logical viewport size cannot be computed. See [`logical_viewport_size`](Camera::logical_viewport_size)
|
||||
/// - The world coordinates cannot be mapped to the Normalized Device Coordinates. See [`world_to_ndc`](Camera::world_to_ndc)
|
||||
/// May also panic if `glam_assert` is enabled. See [`world_to_ndc`](Camera::world_to_ndc).
|
||||
#[doc(alias = "world_to_screen")]
|
||||
pub fn world_to_viewport(
|
||||
&self,
|
||||
|
@ -226,7 +240,7 @@ impl Camera {
|
|||
) -> Option<Vec2> {
|
||||
let target_size = self.logical_viewport_size()?;
|
||||
let ndc_space_coords = self.world_to_ndc(camera_transform, world_position)?;
|
||||
// NDC z-values outside of 0 < z < 1 are outside the camera frustum and are thus not in viewport-space
|
||||
// NDC z-values outside of 0 < z < 1 are outside the (implicit) camera frustum and are thus not in viewport-space
|
||||
if ndc_space_coords.z < 0.0 || ndc_space_coords.z > 1.0 {
|
||||
return None;
|
||||
}
|
||||
|
@ -246,6 +260,11 @@ impl Camera {
|
|||
///
|
||||
/// To get the world space coordinates with Normalized Device Coordinates, you should use
|
||||
/// [`ndc_to_world`](Self::ndc_to_world).
|
||||
///
|
||||
/// Returns `None` if any of these conditions occur:
|
||||
/// - The logical viewport size cannot be computed. See [`logical_viewport_size`](Camera::logical_viewport_size)
|
||||
/// - The near or far plane cannot be computed. This can happen if the `camera_transform`, the `world_position`, or the projection matrix defined by [`CameraProjection`] contain `NAN`.
|
||||
/// Panics if the projection matrix is null and `glam_assert` is enabled.
|
||||
pub fn viewport_to_world(
|
||||
&self,
|
||||
camera_transform: &GlobalTransform,
|
||||
|
@ -274,6 +293,11 @@ impl Camera {
|
|||
///
|
||||
/// To get the world space coordinates with Normalized Device Coordinates, you should use
|
||||
/// [`ndc_to_world`](Self::ndc_to_world).
|
||||
///
|
||||
/// Returns `None` if any of these conditions occur:
|
||||
/// - The logical viewport size cannot be computed. See [`logical_viewport_size`](Camera::logical_viewport_size)
|
||||
/// - The viewport position cannot be mapped to the world. See [`ndc_to_world`](Camera::ndc_to_world)
|
||||
/// May panic. See [`ndc_to_world`](Camera::ndc_to_world).
|
||||
pub fn viewport_to_world_2d(
|
||||
&self,
|
||||
camera_transform: &GlobalTransform,
|
||||
|
@ -295,6 +319,9 @@ impl Camera {
|
|||
/// and between 0.0 and 1.0 on the Z axis.
|
||||
/// To get the coordinates in the render target's viewport dimensions, you should use
|
||||
/// [`world_to_viewport`](Self::world_to_viewport).
|
||||
///
|
||||
/// Returns `None` if the `camera_transform`, the `world_position`, or the projection matrix defined by [`CameraProjection`] contain `NAN`.
|
||||
/// Panics if the `camera_transform` contains `NAN` and the `glam_assert` feature is enabled.
|
||||
pub fn world_to_ndc(
|
||||
&self,
|
||||
camera_transform: &GlobalTransform,
|
||||
|
@ -315,6 +342,9 @@ impl Camera {
|
|||
/// and between 0.0 and 1.0 on the Z axis.
|
||||
/// To get the world space coordinates with the viewport position, you should use
|
||||
/// [`world_to_viewport`](Self::world_to_viewport).
|
||||
///
|
||||
/// Returns `None` if the `camera_transform`, the `world_position`, or the projection matrix defined by [`CameraProjection`] contain `NAN`.
|
||||
/// Panics if the projection matrix is null and `glam_assert` is enabled.
|
||||
pub fn ndc_to_world(&self, camera_transform: &GlobalTransform, ndc: Vec3) -> Option<Vec3> {
|
||||
// Build a transformation matrix to convert from NDC to world space using camera data
|
||||
let ndc_to_world =
|
||||
|
|
Loading…
Reference in a new issue