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
@ -169,6 +169,14 @@ impl Camera {
|
|||||||
/// of the current [`RenderTarget`].
|
/// of the current [`RenderTarget`].
|
||||||
/// For logic that requires the full logical size of the
|
/// For logic that requires the full logical size of the
|
||||||
/// [`RenderTarget`], prefer [`Camera::logical_target_size`].
|
/// [`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]
|
#[inline]
|
||||||
pub fn logical_viewport_size(&self) -> Option<Vec2> {
|
pub fn logical_viewport_size(&self) -> Option<Vec2> {
|
||||||
self.viewport
|
self.viewport
|
||||||
@ -218,6 +226,12 @@ impl Camera {
|
|||||||
///
|
///
|
||||||
/// To get the coordinates in Normalized Device Coordinates, you should use
|
/// To get the coordinates in Normalized Device Coordinates, you should use
|
||||||
/// [`world_to_ndc`](Self::world_to_ndc).
|
/// [`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")]
|
#[doc(alias = "world_to_screen")]
|
||||||
pub fn world_to_viewport(
|
pub fn world_to_viewport(
|
||||||
&self,
|
&self,
|
||||||
@ -226,7 +240,7 @@ impl Camera {
|
|||||||
) -> Option<Vec2> {
|
) -> Option<Vec2> {
|
||||||
let target_size = self.logical_viewport_size()?;
|
let target_size = self.logical_viewport_size()?;
|
||||||
let ndc_space_coords = self.world_to_ndc(camera_transform, world_position)?;
|
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 {
|
if ndc_space_coords.z < 0.0 || ndc_space_coords.z > 1.0 {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
@ -246,6 +260,11 @@ impl Camera {
|
|||||||
///
|
///
|
||||||
/// To get the world space coordinates with Normalized Device Coordinates, you should use
|
/// To get the world space coordinates with Normalized Device Coordinates, you should use
|
||||||
/// [`ndc_to_world`](Self::ndc_to_world).
|
/// [`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(
|
pub fn viewport_to_world(
|
||||||
&self,
|
&self,
|
||||||
camera_transform: &GlobalTransform,
|
camera_transform: &GlobalTransform,
|
||||||
@ -274,6 +293,11 @@ impl Camera {
|
|||||||
///
|
///
|
||||||
/// To get the world space coordinates with Normalized Device Coordinates, you should use
|
/// To get the world space coordinates with Normalized Device Coordinates, you should use
|
||||||
/// [`ndc_to_world`](Self::ndc_to_world).
|
/// [`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(
|
pub fn viewport_to_world_2d(
|
||||||
&self,
|
&self,
|
||||||
camera_transform: &GlobalTransform,
|
camera_transform: &GlobalTransform,
|
||||||
@ -295,6 +319,9 @@ impl Camera {
|
|||||||
/// and between 0.0 and 1.0 on the Z axis.
|
/// 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
|
/// To get the coordinates in the render target's viewport dimensions, you should use
|
||||||
/// [`world_to_viewport`](Self::world_to_viewport).
|
/// [`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(
|
pub fn world_to_ndc(
|
||||||
&self,
|
&self,
|
||||||
camera_transform: &GlobalTransform,
|
camera_transform: &GlobalTransform,
|
||||||
@ -315,6 +342,9 @@ impl Camera {
|
|||||||
/// and between 0.0 and 1.0 on the Z axis.
|
/// and between 0.0 and 1.0 on the Z axis.
|
||||||
/// To get the world space coordinates with the viewport position, you should use
|
/// To get the world space coordinates with the viewport position, you should use
|
||||||
/// [`world_to_viewport`](Self::world_to_viewport).
|
/// [`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> {
|
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
|
// Build a transformation matrix to convert from NDC to world space using camera data
|
||||||
let ndc_to_world =
|
let ndc_to_world =
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user