Implemented Reflect for (almost) all bevy_math types (#13537)
				
					
				
			# Objective Fixes #13535. ## Solution I implemented `Reflect` for close to all math types now, except for some types that it would cause issues (like some boxed types). ## Testing - Everything seems to still build, will await CI though. --- ## Changelog - Made close to all math types implement `Reflect`.
This commit is contained in:
		
							parent
							
								
									cef31ffdd9
								
							
						
					
					
						commit
						d7fc20c484
					
				@ -20,7 +20,9 @@ rand = { version = "0.8", features = [
 | 
			
		||||
], default-features = false, optional = true }
 | 
			
		||||
smallvec = { version = "1.11" }
 | 
			
		||||
 | 
			
		||||
bevy_reflect = { path = "../bevy_reflect", version = "0.14.0-dev", optional = true }
 | 
			
		||||
bevy_reflect = { path = "../bevy_reflect", version = "0.14.0-dev", features = [
 | 
			
		||||
  "glam",
 | 
			
		||||
], optional = true }
 | 
			
		||||
 | 
			
		||||
[dev-dependencies]
 | 
			
		||||
approx = "0.5"
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,12 @@
 | 
			
		||||
use glam::{Affine3A, Mat3, Vec3, Vec3Swizzles, Vec4};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// Reduced-size version of `glam::Affine3A` for use when storage has
 | 
			
		||||
/// significant performance impact. Convert to `glam::Affine3A` to do
 | 
			
		||||
/// non-trivial calculations.
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
 | 
			
		||||
pub struct Affine3 {
 | 
			
		||||
    /// Scaling, rotation, shears, and other non-translation affine transforms
 | 
			
		||||
    pub matrix3: Mat3,
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,12 @@
 | 
			
		||||
 | 
			
		||||
use crate::Vec2;
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// An `AspectRatio` is the ratio of width to height.
 | 
			
		||||
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug, PartialEq))]
 | 
			
		||||
pub struct AspectRatio(f32);
 | 
			
		||||
 | 
			
		||||
impl AspectRatio {
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,9 @@ mod primitive_impls;
 | 
			
		||||
use super::{BoundingVolume, IntersectsVolume};
 | 
			
		||||
use crate::prelude::{Mat2, Rotation2d, Vec2};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// Computes the geometric center of the given set of points.
 | 
			
		||||
#[inline(always)]
 | 
			
		||||
fn point_cloud_2d_center(points: &[Vec2]) -> Vec2 {
 | 
			
		||||
@ -29,6 +32,7 @@ pub trait Bounded2d {
 | 
			
		||||
/// A 2D axis-aligned bounding box, or bounding rectangle
 | 
			
		||||
#[doc(alias = "BoundingRectangle")]
 | 
			
		||||
#[derive(Clone, Copy, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct Aabb2d {
 | 
			
		||||
    /// The minimum, conventionally bottom-left, point of the box
 | 
			
		||||
    pub min: Vec2,
 | 
			
		||||
@ -449,6 +453,7 @@ use crate::primitives::Circle;
 | 
			
		||||
 | 
			
		||||
/// A bounding circle
 | 
			
		||||
#[derive(Clone, Copy, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct BoundingCircle {
 | 
			
		||||
    /// The center of the bounding circle
 | 
			
		||||
    pub center: Vec2,
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,9 @@ use glam::Mat3;
 | 
			
		||||
use super::{BoundingVolume, IntersectsVolume};
 | 
			
		||||
use crate::{Quat, Vec3, Vec3A};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// Computes the geometric center of the given set of points.
 | 
			
		||||
#[inline(always)]
 | 
			
		||||
fn point_cloud_3d_center(points: impl Iterator<Item = impl Into<Vec3A>>) -> Vec3A {
 | 
			
		||||
@ -29,6 +32,7 @@ pub trait Bounded3d {
 | 
			
		||||
 | 
			
		||||
/// A 3D axis-aligned bounding box
 | 
			
		||||
#[derive(Clone, Copy, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct Aabb3d {
 | 
			
		||||
    /// The minimum point of the box
 | 
			
		||||
    pub min: Vec3A,
 | 
			
		||||
@ -448,6 +452,7 @@ use crate::primitives::Sphere;
 | 
			
		||||
 | 
			
		||||
/// A bounding sphere
 | 
			
		||||
#[derive(Clone, Copy, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct BoundingSphere {
 | 
			
		||||
    /// The center of the bounding sphere
 | 
			
		||||
    pub center: Vec3A,
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,12 @@
 | 
			
		||||
use super::{Aabb2d, BoundingCircle, IntersectsVolume};
 | 
			
		||||
use crate::{Dir2, Ray2d, Vec2};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// A raycast intersection test for 2D bounding volumes
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct RayCast2d {
 | 
			
		||||
    /// The ray for the test
 | 
			
		||||
    pub ray: Ray2d,
 | 
			
		||||
@ -100,6 +104,7 @@ impl IntersectsVolume<BoundingCircle> for RayCast2d {
 | 
			
		||||
 | 
			
		||||
/// An intersection test that casts an [`Aabb2d`] along a ray.
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct AabbCast2d {
 | 
			
		||||
    /// The ray along which to cast the bounding volume
 | 
			
		||||
    pub ray: RayCast2d,
 | 
			
		||||
@ -137,6 +142,7 @@ impl IntersectsVolume<Aabb2d> for AabbCast2d {
 | 
			
		||||
 | 
			
		||||
/// An intersection test that casts a [`BoundingCircle`] along a ray.
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct BoundingCircleCast {
 | 
			
		||||
    /// The ray along which to cast the bounding volume
 | 
			
		||||
    pub ray: RayCast2d,
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,12 @@
 | 
			
		||||
use super::{Aabb3d, BoundingSphere, IntersectsVolume};
 | 
			
		||||
use crate::{Dir3A, Ray3d, Vec3A};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// A raycast intersection test for 3D bounding volumes
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct RayCast3d {
 | 
			
		||||
    /// The origin of the ray.
 | 
			
		||||
    pub origin: Vec3A,
 | 
			
		||||
@ -95,6 +99,7 @@ impl IntersectsVolume<BoundingSphere> for RayCast3d {
 | 
			
		||||
 | 
			
		||||
/// An intersection test that casts an [`Aabb3d`] along a ray.
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct AabbCast3d {
 | 
			
		||||
    /// The ray along which to cast the bounding volume
 | 
			
		||||
    pub ray: RayCast3d,
 | 
			
		||||
@ -137,6 +142,7 @@ impl IntersectsVolume<Aabb3d> for AabbCast3d {
 | 
			
		||||
 | 
			
		||||
/// An intersection test that casts a [`BoundingSphere`] along a ray.
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct BoundingSphereCast {
 | 
			
		||||
    /// The ray along which to cast the bounding volume
 | 
			
		||||
    pub ray: RayCast3d,
 | 
			
		||||
 | 
			
		||||
@ -607,6 +607,7 @@ impl<P: VectorSpace> RationalGenerator<P> for CubicNurbs<P> {
 | 
			
		||||
/// ### Continuity
 | 
			
		||||
/// The curve is C0 continuous, meaning it has no holes or jumps.
 | 
			
		||||
#[derive(Clone, Debug)]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug))]
 | 
			
		||||
pub struct LinearSpline<P: VectorSpace> {
 | 
			
		||||
    /// The control points of the NURBS
 | 
			
		||||
    pub points: Vec<P>,
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,9 @@ use std::{
 | 
			
		||||
    ops::Neg,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
 | 
			
		||||
/// A wrapper for floats that implements [`Ord`], [`Eq`], and [`Hash`] traits.
 | 
			
		||||
///
 | 
			
		||||
/// This is a work around for the fact that the IEEE 754-2008 standard,
 | 
			
		||||
@ -14,6 +17,11 @@ use std::{
 | 
			
		||||
/// Wrapping a float with `FloatOrd` breaks conformance with the standard
 | 
			
		||||
/// by sorting `NaN` as less than all other numbers and equal to any other `NaN`.
 | 
			
		||||
#[derive(Debug, Copy, Clone)]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    feature = "bevy_reflect",
 | 
			
		||||
    derive(Reflect),
 | 
			
		||||
    reflect(Debug, PartialEq, Hash)
 | 
			
		||||
)]
 | 
			
		||||
pub struct FloatOrd(pub f32);
 | 
			
		||||
 | 
			
		||||
impl PartialOrd for FloatOrd {
 | 
			
		||||
 | 
			
		||||
@ -98,6 +98,15 @@ impl Measured2d for Circle {
 | 
			
		||||
#[derive(Clone, Copy, Debug, PartialEq)]
 | 
			
		||||
#[doc(alias("CircularArc", "CircleArc"))]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    feature = "bevy_reflect",
 | 
			
		||||
    derive(Reflect),
 | 
			
		||||
    reflect(Debug, PartialEq, Default)
 | 
			
		||||
)]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Serialize, Deserialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct Arc2d {
 | 
			
		||||
    /// The radius of the circle
 | 
			
		||||
    pub radius: f32,
 | 
			
		||||
@ -256,6 +265,15 @@ impl Arc2d {
 | 
			
		||||
/// We recommend normalizing circular sectors to have an angle in [0, 2π].
 | 
			
		||||
#[derive(Clone, Copy, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    feature = "bevy_reflect",
 | 
			
		||||
    derive(Reflect),
 | 
			
		||||
    reflect(Debug, PartialEq, Default)
 | 
			
		||||
)]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Serialize, Deserialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct CircularSector {
 | 
			
		||||
    /// The arc defining the sector
 | 
			
		||||
    #[cfg_attr(feature = "serialize", serde(flatten))]
 | 
			
		||||
@ -386,6 +404,15 @@ impl CircularSector {
 | 
			
		||||
/// We recommend normalizing circular segments to have an angle in [0, 2π].
 | 
			
		||||
#[derive(Clone, Copy, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    feature = "bevy_reflect",
 | 
			
		||||
    derive(Reflect),
 | 
			
		||||
    reflect(Debug, PartialEq, Default)
 | 
			
		||||
)]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Serialize, Deserialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct CircularSegment {
 | 
			
		||||
    /// The arc defining the segment
 | 
			
		||||
    #[cfg_attr(feature = "serialize", serde(flatten))]
 | 
			
		||||
@ -1217,6 +1244,10 @@ impl Segment2d {
 | 
			
		||||
#[derive(Clone, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug, PartialEq))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Serialize, Deserialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct Polyline2d<const N: usize> {
 | 
			
		||||
    /// The vertices of the polyline
 | 
			
		||||
    #[cfg_attr(feature = "serialize", serde(with = "super::serde::array"))]
 | 
			
		||||
@ -1538,6 +1569,10 @@ impl Measured2d for Rectangle {
 | 
			
		||||
#[derive(Clone, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug, PartialEq))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Serialize, Deserialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct Polygon<const N: usize> {
 | 
			
		||||
    /// The vertices of the `Polygon`
 | 
			
		||||
    #[cfg_attr(feature = "serialize", serde(with = "super::serde::array"))]
 | 
			
		||||
 | 
			
		||||
@ -296,6 +296,10 @@ impl Segment3d {
 | 
			
		||||
#[derive(Clone, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug, PartialEq))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Serialize, Deserialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct Polyline3d<const N: usize> {
 | 
			
		||||
    /// The vertices of the polyline
 | 
			
		||||
    #[cfg_attr(feature = "serialize", serde(with = "super::serde::array"))]
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,19 @@ use crate::{
 | 
			
		||||
    Dir2, Dir3, Vec2, Vec3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "bevy_reflect")]
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
#[cfg(all(feature = "serialize", feature = "bevy_reflect"))]
 | 
			
		||||
use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
 | 
			
		||||
 | 
			
		||||
/// An infinite half-line starting at `origin` and going in `direction` in 2D space.
 | 
			
		||||
#[derive(Clone, Copy, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug, PartialEq))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Deserialize, Serialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct Ray2d {
 | 
			
		||||
    /// The origin of the ray.
 | 
			
		||||
    pub origin: Vec2,
 | 
			
		||||
@ -50,6 +60,11 @@ impl Ray2d {
 | 
			
		||||
/// An infinite half-line starting at `origin` and going in `direction` in 3D space.
 | 
			
		||||
#[derive(Clone, Copy, Debug, PartialEq)]
 | 
			
		||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | 
			
		||||
#[cfg_attr(feature = "bevy_reflect", derive(Reflect), reflect(Debug, PartialEq))]
 | 
			
		||||
#[cfg_attr(
 | 
			
		||||
    all(feature = "serialize", feature = "bevy_reflect"),
 | 
			
		||||
    reflect(Deserialize, Serialize)
 | 
			
		||||
)]
 | 
			
		||||
pub struct Ray3d {
 | 
			
		||||
    /// The origin of the ray.
 | 
			
		||||
    pub origin: Vec3,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user