Conversions for Isometry3d ⟷ Transform/GlobalTransform (#14478)
# Objective Allow interoperation between `Isometry3d` and the transform types from bevy_transform. At least in the short term, the primary goal is to allow the extraction of isometries from transform components by users. ## Solution - Add explicit `from_isometry`/`to_isometry` methods to `Transform`. - Add explicit `from_isometry`/`to_isometry` methods to `GlobalTransform`. The former is hidden (primarily for internal use), and the latter has the caveats originating in [`Affine3A::to_scale_rotation_translation`](https://docs.rs/glam/latest/glam/f32/struct.Affine3A.html#method.to_scale_rotation_translation). - Implement the `TransformPoint` trait for `Isometry3d`.
This commit is contained in:
		
							parent
							
								
									e7e10f2c0f
								
							
						
					
					
						commit
						5aa998dc07
					
				| @ -3,7 +3,7 @@ use std::ops::Mul; | |||||||
| use super::Transform; | use super::Transform; | ||||||
| #[cfg(feature = "bevy-support")] | #[cfg(feature = "bevy-support")] | ||||||
| use bevy_ecs::{component::Component, reflect::ReflectComponent}; | use bevy_ecs::{component::Component, reflect::ReflectComponent}; | ||||||
| use bevy_math::{Affine3A, Dir3, Mat4, Quat, Vec3, Vec3A}; | use bevy_math::{Affine3A, Dir3, Isometry3d, Mat4, Quat, Vec3, Vec3A}; | ||||||
| #[cfg(feature = "bevy-support")] | #[cfg(feature = "bevy-support")] | ||||||
| use bevy_reflect::{std_traits::ReflectDefault, Reflect}; | use bevy_reflect::{std_traits::ReflectDefault, Reflect}; | ||||||
| 
 | 
 | ||||||
| @ -87,6 +87,12 @@ impl GlobalTransform { | |||||||
|         GlobalTransform(Affine3A::from_scale(scale)) |         GlobalTransform(Affine3A::from_scale(scale)) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     #[doc(hidden)] | ||||||
|  |     #[inline] | ||||||
|  |     pub fn from_isometry(iso: Isometry3d) -> Self { | ||||||
|  |         Self(iso.into()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// Returns the 3d affine transformation matrix as a [`Mat4`].
 |     /// Returns the 3d affine transformation matrix as a [`Mat4`].
 | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn compute_matrix(&self) -> Mat4 { |     pub fn compute_matrix(&self) -> Mat4 { | ||||||
| @ -113,6 +119,19 @@ impl GlobalTransform { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// Returns the isometric part of the transformation as an [isometry]. Any scaling done by the
 | ||||||
|  |     /// transformation will be ignored.
 | ||||||
|  |     ///
 | ||||||
|  |     /// The transform is expected to be non-degenerate and without shearing, or the output
 | ||||||
|  |     /// will be invalid.
 | ||||||
|  |     ///
 | ||||||
|  |     /// [isometry]: Isometry3d
 | ||||||
|  |     #[inline] | ||||||
|  |     pub fn to_isometry(&self) -> Isometry3d { | ||||||
|  |         let (_, rotation, translation) = self.0.to_scale_rotation_translation(); | ||||||
|  |         Isometry3d::new(translation, rotation) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// Returns the [`Transform`] `self` would have if it was a child of an entity
 |     /// Returns the [`Transform`] `self` would have if it was a child of an entity
 | ||||||
|     /// with the `parent` [`GlobalTransform`].
 |     /// with the `parent` [`GlobalTransform`].
 | ||||||
|     ///
 |     ///
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| use super::GlobalTransform; | use super::GlobalTransform; | ||||||
| #[cfg(feature = "bevy-support")] | #[cfg(feature = "bevy-support")] | ||||||
| use bevy_ecs::{component::Component, reflect::ReflectComponent}; | use bevy_ecs::{component::Component, reflect::ReflectComponent}; | ||||||
| use bevy_math::{Affine3A, Dir3, Mat3, Mat4, Quat, Vec3}; | use bevy_math::{Affine3A, Dir3, Isometry3d, Mat3, Mat4, Quat, Vec3}; | ||||||
| #[cfg(feature = "bevy-support")] | #[cfg(feature = "bevy-support")] | ||||||
| use bevy_reflect::{prelude::*, Reflect}; | use bevy_reflect::{prelude::*, Reflect}; | ||||||
| use std::ops::Mul; | use std::ops::Mul; | ||||||
| @ -120,6 +120,18 @@ impl Transform { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// Creates a new [`Transform`] that is equivalent to the given [isometry].
 | ||||||
|  |     ///
 | ||||||
|  |     /// [isometry]: Isometry3d
 | ||||||
|  |     #[inline] | ||||||
|  |     pub fn from_isometry(iso: Isometry3d) -> Self { | ||||||
|  |         Transform { | ||||||
|  |             translation: iso.translation.into(), | ||||||
|  |             rotation: iso.rotation, | ||||||
|  |             ..Self::IDENTITY | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// Returns this [`Transform`] with a new rotation so that [`Transform::forward`]
 |     /// Returns this [`Transform`] with a new rotation so that [`Transform::forward`]
 | ||||||
|     /// points towards the `target` position and [`Transform::up`] points towards `up`.
 |     /// points towards the `target` position and [`Transform::up`] points towards `up`.
 | ||||||
|     ///
 |     ///
 | ||||||
| @ -525,6 +537,14 @@ impl Transform { | |||||||
|     pub fn is_finite(&self) -> bool { |     pub fn is_finite(&self) -> bool { | ||||||
|         self.translation.is_finite() && self.rotation.is_finite() && self.scale.is_finite() |         self.translation.is_finite() && self.rotation.is_finite() && self.scale.is_finite() | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /// Get the [isometry] defined by this transform's rotation and translation, ignoring scale.
 | ||||||
|  |     ///
 | ||||||
|  |     /// [isometry]: Isometry3d
 | ||||||
|  |     #[inline] | ||||||
|  |     pub fn to_isometry(&self) -> Isometry3d { | ||||||
|  |         Isometry3d::new(self.translation, self.rotation) | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for Transform { | impl Default for Transform { | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| use bevy_math::{Affine3A, Mat4, Vec3}; | use bevy_math::{Affine3A, Isometry3d, Mat4, Vec3}; | ||||||
| 
 | 
 | ||||||
| use crate::prelude::{GlobalTransform, Transform}; | use crate::prelude::{GlobalTransform, Transform}; | ||||||
| 
 | 
 | ||||||
| @ -35,3 +35,10 @@ impl TransformPoint for Affine3A { | |||||||
|         self.transform_point3(point.into()) |         self.transform_point3(point.into()) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | impl TransformPoint for Isometry3d { | ||||||
|  |     #[inline] | ||||||
|  |     fn transform_point(&self, point: impl Into<Vec3>) -> Vec3 { | ||||||
|  |         self.transform_point(point.into()).into() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Matty
						Matty