1use crate::{ops, DVec2, DVec3, DVec4, Dir2, Dir3, Dir3A, Quat, Rot2, Vec2, Vec3, Vec3A, Vec4};
4use core::{
5 convert::Infallible,
6 fmt::Debug,
7 ops::{Add, Div, Mul, Neg, Sub},
8};
9use thiserror::Error;
10use variadics_please::all_tuples_enumerated;
11
12pub trait VectorSpace:
32 Mul<Self::Scalar, Output = Self>
33 + Div<Self::Scalar, Output = Self>
34 + Add<Self, Output = Self>
35 + Sub<Self, Output = Self>
36 + Neg<Output = Self>
37 + Default
38 + Debug
39 + Clone
40 + Copy
41{
42 type Scalar: ScalarField;
44
45 const ZERO: Self;
47
48 #[inline]
55 fn lerp(self, rhs: Self, t: Self::Scalar) -> Self {
56 self * (Self::Scalar::ONE - t) + rhs * t
57 }
58}
59
60impl VectorSpace for Vec4 {
61 type Scalar = f32;
62 const ZERO: Self = Vec4::ZERO;
63}
64
65impl VectorSpace for Vec3 {
66 type Scalar = f32;
67 const ZERO: Self = Vec3::ZERO;
68}
69
70impl VectorSpace for Vec3A {
71 type Scalar = f32;
72 const ZERO: Self = Vec3A::ZERO;
73}
74
75impl VectorSpace for Vec2 {
76 type Scalar = f32;
77 const ZERO: Self = Vec2::ZERO;
78}
79
80impl VectorSpace for DVec4 {
81 type Scalar = f64;
82 const ZERO: Self = DVec4::ZERO;
83}
84
85impl VectorSpace for DVec3 {
86 type Scalar = f64;
87 const ZERO: Self = DVec3::ZERO;
88}
89
90impl VectorSpace for DVec2 {
91 type Scalar = f64;
92 const ZERO: Self = DVec2::ZERO;
93}
94
95impl<T: ScalarField> VectorSpace for T {
97 type Scalar = Self;
98 const ZERO: Self = Self::ZERO;
99}
100
101pub trait ScalarField:
119 Mul<Self, Output = Self>
120 + Div<Self, Output = Self>
121 + Add<Self, Output = Self>
122 + Sub<Self, Output = Self>
123 + Neg<Output = Self>
124 + Default
125 + Debug
126 + Clone
127 + Copy
128{
129 const ZERO: Self;
131 const ONE: Self;
133
134 fn recip(self) -> Self {
136 Self::ONE / self
137 }
138}
139
140impl ScalarField for f32 {
141 const ZERO: Self = 0.0;
142 const ONE: Self = 1.0;
143}
144
145impl ScalarField for f64 {
146 const ZERO: Self = 0.0;
147 const ONE: Self = 1.0;
148}
149
150#[derive(#[automatically_derived]
impl<V: ::core::fmt::Debug, W: ::core::fmt::Debug> ::core::fmt::Debug for
Sum<V, W> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Sum", &self.0,
&&self.1)
}
}Debug, #[automatically_derived]
impl<V: ::core::clone::Clone, W: ::core::clone::Clone> ::core::clone::Clone
for Sum<V, W> {
#[inline]
fn clone(&self) -> Sum<V, W> {
Sum(::core::clone::Clone::clone(&self.0),
::core::clone::Clone::clone(&self.1))
}
}Clone, #[automatically_derived]
impl<V: ::core::marker::Copy, W: ::core::marker::Copy> ::core::marker::Copy
for Sum<V, W> {
}Copy)]
158#[cfg_attr(feature = "serialize", derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<V, W> _serde::Serialize for Sum<V, W> where V: _serde::Serialize,
W: _serde::Serialize {
fn serialize<__S>(&self, __serializer: __S)
-> _serde::__private228::Result<__S::Ok, __S::Error> where
__S: _serde::Serializer {
let mut __serde_state =
_serde::Serializer::serialize_tuple_struct(__serializer,
"Sum", 0 + 1 + 1)?;
_serde::ser::SerializeTupleStruct::serialize_field(&mut __serde_state,
&self.0)?;
_serde::ser::SerializeTupleStruct::serialize_field(&mut __serde_state,
&self.1)?;
_serde::ser::SerializeTupleStruct::end(__serde_state)
}
}
};serde::Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de, V, W> _serde::Deserialize<'de> for Sum<V, W> where
V: _serde::Deserialize<'de>, W: _serde::Deserialize<'de> {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[doc(hidden)]
struct __Visitor<'de, V, W> where V: _serde::Deserialize<'de>,
W: _serde::Deserialize<'de> {
marker: _serde::__private228::PhantomData<Sum<V, W>>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de, V, W> _serde::de::Visitor<'de> for
__Visitor<'de, V, W> where V: _serde::Deserialize<'de>,
W: _serde::Deserialize<'de> {
type Value = Sum<V, W>;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"tuple struct Sum")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<V>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"tuple struct Sum with 2 elements")),
};
let __field1 =
match _serde::de::SeqAccess::next_element::<W>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
&"tuple struct Sum with 2 elements")),
};
_serde::__private228::Ok(Sum(__field0, __field1))
}
}
_serde::Deserializer::deserialize_tuple_struct(__deserializer,
"Sum", 2usize,
__Visitor {
marker: _serde::__private228::PhantomData::<Sum<V, W>>,
lifetime: _serde::__private228::PhantomData,
})
}
}
};serde::Deserialize))]
159#[cfg_attr(feature = "bevy_reflect", derive(const _: () =
{
impl<V, W> bevy_reflect::GetTypeRegistration for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath, V: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
W: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<V as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<W as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl<V, W> bevy_reflect::Typed for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath, V: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
W: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::GenericTypeInfoCell =
bevy_reflect::utility::GenericTypeInfoCell::new();
CELL.get_or_insert::<Self,
_>(||
{
bevy_reflect::TypeInfo::TupleStruct(bevy_reflect::tuple_struct::TupleStructInfo::new::<Self>(&[bevy_reflect::UnnamedField::new::<V>(0usize),
bevy_reflect::UnnamedField::new::<W>(1usize)]).with_generics(bevy_reflect::Generics::from_iter([bevy_reflect::GenericInfo::Type(bevy_reflect::TypeParamInfo::new::<V>(bevy_reflect::__macro_exports::alloc_utils::Cow::Borrowed("V"))),
bevy_reflect::GenericInfo::Type(bevy_reflect::TypeParamInfo::new::<W>(bevy_reflect::__macro_exports::alloc_utils::Cow::Borrowed("W")))])))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl<V, W> bevy_reflect::TypePath for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath {
fn type_path() -> &'static str {
static CELL: bevy_reflect::utility::GenericTypePathCell =
bevy_reflect::utility::GenericTypePathCell::new();
CELL.get_or_insert::<Self,
_>(||
{
::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string("bevy_math::common_traits::Sum<"),
&::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string(<V
as bevy_reflect::TypePath>::type_path()), ", "),
<W as bevy_reflect::TypePath>::type_path())), ">")
})
}
fn short_type_path() -> &'static str {
static CELL: bevy_reflect::utility::GenericTypePathCell =
bevy_reflect::utility::GenericTypePathCell::new();
CELL.get_or_insert::<Self,
_>(||
{
::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string("Sum<"),
&::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string(<V
as bevy_reflect::TypePath>::short_type_path()), ", "),
<W as bevy_reflect::TypePath>::short_type_path())), ">")
})
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("Sum")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_math::common_traits".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_math::common_traits")
}
}
impl<V, W> bevy_reflect::Reflect for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath, V: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
W: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
impl<V, W> bevy_reflect::tuple_struct::TupleStruct for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath, V: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
W: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn field(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.0),
1usize => ::core::option::Option::Some(&self.1),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.0),
1usize => ::core::option::Option::Some(&mut self.1),
_ => ::core::option::Option::None,
}
}
#[inline]
fn field_len(&self) -> usize { 2usize }
#[inline]
fn iter_fields(&self)
-> bevy_reflect::tuple_struct::TupleStructFieldIter {
bevy_reflect::tuple_struct::TupleStructFieldIter::new(self)
}
fn to_dynamic_tuple_struct(&self)
-> bevy_reflect::tuple_struct::DynamicTupleStruct {
let mut dynamic:
bevy_reflect::tuple_struct::DynamicTupleStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed(bevy_reflect::PartialReflect::to_dynamic(&self.0));
dynamic.insert_boxed(bevy_reflect::PartialReflect::to_dynamic(&self.1));
dynamic
}
}
impl<V, W> bevy_reflect::PartialReflect for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath, V: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
W: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::TupleStruct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (i, value) in
::core::iter::Iterator::enumerate(bevy_reflect::tuple_struct::TupleStruct::iter_fields(struct_value))
{
if let ::core::option::Option::Some(v) =
bevy_reflect::tuple_struct::TupleStruct::field_mut(self, i)
{
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::TupleStruct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::TupleStruct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::TupleStruct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::TupleStruct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::TupleStruct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::tuple_struct::tuple_struct_partial_eq)(self,
value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::tuple_struct::tuple_struct_partial_cmp)(self,
value)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(Self {
0: <V as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.0)?,
1: <W as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.1)?,
}))
}
}
impl<V, W> bevy_reflect::FromReflect for Sum<V, W> where
Sum<V, W>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, V: bevy_reflect::TypePath,
W: bevy_reflect::TypePath, V: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
W: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::TupleStruct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let __this =
Self {
0: <V as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::tuple_struct::TupleStruct::field(__ref_struct,
0)?)?,
1: <W as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::tuple_struct::TupleStruct::field(__ref_struct,
1)?)?,
};
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};bevy_reflect::Reflect))]
160pub struct Sum<V, W>(pub V, pub W);
161
162impl<F: ScalarField, V, W> Mul<F> for Sum<V, W>
163where
164 V: VectorSpace<Scalar = F>,
165 W: VectorSpace<Scalar = F>,
166{
167 type Output = Self;
168 fn mul(self, rhs: F) -> Self::Output {
169 Sum(self.0 * rhs, self.1 * rhs)
170 }
171}
172
173impl<F: ScalarField, V, W> Div<F> for Sum<V, W>
174where
175 V: VectorSpace<Scalar = F>,
176 W: VectorSpace<Scalar = F>,
177{
178 type Output = Self;
179 fn div(self, rhs: F) -> Self::Output {
180 Sum(self.0 / rhs, self.1 / rhs)
181 }
182}
183
184impl<V, W> Add<Self> for Sum<V, W>
185where
186 V: VectorSpace,
187 W: VectorSpace,
188{
189 type Output = Self;
190 fn add(self, other: Self) -> Self::Output {
191 Sum(self.0 + other.0, self.1 + other.1)
192 }
193}
194
195impl<V, W> Sub<Self> for Sum<V, W>
196where
197 V: VectorSpace,
198 W: VectorSpace,
199{
200 type Output = Self;
201 fn sub(self, other: Self) -> Self::Output {
202 Sum(self.0 - other.0, self.1 - other.1)
203 }
204}
205
206impl<V, W> Neg for Sum<V, W>
207where
208 V: VectorSpace,
209 W: VectorSpace,
210{
211 type Output = Self;
212 fn neg(self) -> Self::Output {
213 Sum(-self.0, -self.1)
214 }
215}
216
217impl<V, W> Default for Sum<V, W>
218where
219 V: VectorSpace,
220 W: VectorSpace,
221{
222 fn default() -> Self {
223 Sum(V::default(), W::default())
224 }
225}
226
227impl<F: ScalarField, V, W> VectorSpace for Sum<V, W>
228where
229 V: VectorSpace<Scalar = F>,
230 W: VectorSpace<Scalar = F>,
231{
232 type Scalar = F;
233 const ZERO: Self = Sum(V::ZERO, W::ZERO);
234}
235
236pub trait NormedVectorSpace: VectorSpace {
247 fn norm(self) -> Self::Scalar;
249
250 #[inline]
253 fn norm_squared(self) -> Self::Scalar {
254 self.norm() * self.norm()
255 }
256
257 #[inline]
259 fn distance(self, rhs: Self) -> Self::Scalar {
260 (rhs - self).norm()
261 }
262
263 #[inline]
266 fn distance_squared(self, rhs: Self) -> Self::Scalar {
267 (rhs - self).norm_squared()
268 }
269}
270
271impl NormedVectorSpace for Vec4 {
272 #[inline]
273 fn norm(self) -> f32 {
274 self.length()
275 }
276
277 #[inline]
278 fn norm_squared(self) -> f32 {
279 self.length_squared()
280 }
281}
282
283impl NormedVectorSpace for Vec3 {
284 #[inline]
285 fn norm(self) -> f32 {
286 self.length()
287 }
288
289 #[inline]
290 fn norm_squared(self) -> f32 {
291 self.length_squared()
292 }
293}
294
295impl NormedVectorSpace for Vec3A {
296 #[inline]
297 fn norm(self) -> f32 {
298 self.length()
299 }
300
301 #[inline]
302 fn norm_squared(self) -> f32 {
303 self.length_squared()
304 }
305}
306
307impl NormedVectorSpace for Vec2 {
308 #[inline]
309 fn norm(self) -> f32 {
310 self.length()
311 }
312
313 #[inline]
314 fn norm_squared(self) -> f32 {
315 self.length_squared()
316 }
317}
318
319impl NormedVectorSpace for f32 {
320 #[inline]
321 fn norm(self) -> f32 {
322 ops::abs(self)
323 }
324}
325
326impl NormedVectorSpace for DVec4 {
327 #[inline]
328 fn norm(self) -> f64 {
329 self.length()
330 }
331
332 #[inline]
333 fn norm_squared(self) -> f64 {
334 self.length_squared()
335 }
336}
337
338impl NormedVectorSpace for DVec3 {
339 #[inline]
340 fn norm(self) -> f64 {
341 self.length()
342 }
343
344 #[inline]
345 fn norm_squared(self) -> f64 {
346 self.length_squared()
347 }
348}
349
350impl NormedVectorSpace for DVec2 {
351 #[inline]
352 fn norm(self) -> f64 {
353 self.length()
354 }
355
356 #[inline]
357 fn norm_squared(self) -> f64 {
358 self.length_squared()
359 }
360}
361
362impl NormedVectorSpace for f64 {
363 #[inline]
364 #[cfg(feature = "std")]
365 fn norm(self) -> f64 {
366 f64::abs(self)
367 }
368
369 #[inline]
370 #[cfg(all(any(feature = "libm", feature = "nostd-libm"), not(feature = "std")))]
371 fn norm(self) -> f64 {
372 libm::fabs(self)
373 }
374}
375
376pub trait StableInterpolate: Clone {
427 fn interpolate_stable(&self, other: &Self, t: f32) -> Self;
434
435 fn interpolate_stable_assign(&mut self, other: &Self, t: f32) {
439 *self = self.interpolate_stable(other, t);
440 }
441
442 fn smooth_nudge(&mut self, target: &Self, decay_rate: f32, delta: f32) {
468 self.interpolate_stable_assign(target, 1.0 - ops::exp(-decay_rate * delta));
469 }
470}
471
472impl<V> StableInterpolate for V
476where
477 V: NormedVectorSpace<Scalar = f32>,
478{
479 #[inline]
480 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
481 self.lerp(*other, t)
482 }
483}
484
485impl StableInterpolate for Rot2 {
486 #[inline]
487 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
488 self.slerp(*other, t)
489 }
490}
491
492impl StableInterpolate for Quat {
493 #[inline]
494 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
495 self.slerp(*other, t)
496 }
497}
498
499impl StableInterpolate for Dir2 {
500 #[inline]
501 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
502 self.slerp(*other, t)
503 }
504}
505
506impl StableInterpolate for Dir3 {
507 #[inline]
508 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
509 self.slerp(*other, t)
510 }
511}
512
513impl StableInterpolate for Dir3A {
514 #[inline]
515 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
516 self.slerp(*other, t)
517 }
518}
519
520macro_rules! impl_stable_interpolate_tuple {
521 ($(#[$meta:meta])* $(($n:tt, $T:ident)),*) => {
522 $(#[$meta])*
523 impl<$($T: StableInterpolate),*> StableInterpolate for ($($T,)*) {
524 fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
525 (
526 $(
527 <$T as StableInterpolate>::interpolate_stable(&self.$n, &other.$n, t),
528 )*
529 )
530 }
531 }
532 };
533}
534
535#[doc(hidden)]
impl<T0: StableInterpolate, T1: StableInterpolate, T2: StableInterpolate,
T3: StableInterpolate, T4: StableInterpolate, T5: StableInterpolate,
T6: StableInterpolate, T7: StableInterpolate, T8: StableInterpolate,
T9: StableInterpolate, T10: StableInterpolate> StableInterpolate for
(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) {
fn interpolate_stable(&self, other: &Self, t: f32) -> Self {
(<T0 as StableInterpolate>::interpolate_stable(&self.0, &other.0, t),
<T1 as
StableInterpolate>::interpolate_stable(&self.1, &other.1,
t),
<T2 as
StableInterpolate>::interpolate_stable(&self.2, &other.2,
t),
<T3 as
StableInterpolate>::interpolate_stable(&self.3, &other.3,
t),
<T4 as
StableInterpolate>::interpolate_stable(&self.4, &other.4,
t),
<T5 as
StableInterpolate>::interpolate_stable(&self.5, &other.5,
t),
<T6 as
StableInterpolate>::interpolate_stable(&self.6, &other.6,
t),
<T7 as
StableInterpolate>::interpolate_stable(&self.7, &other.7,
t),
<T8 as
StableInterpolate>::interpolate_stable(&self.8, &other.8,
t),
<T9 as
StableInterpolate>::interpolate_stable(&self.9, &other.9,
t),
<T10 as
StableInterpolate>::interpolate_stable(&self.10, &other.10,
t))
}
}all_tuples_enumerated!(
536 #[doc(fake_variadic)]
537 impl_stable_interpolate_tuple,
538 1,
539 11,
540 T
541);
542
543#[derive(#[automatically_derived]
impl ::core::clone::Clone for MismatchedUnitsError {
#[inline]
fn clone(&self) -> MismatchedUnitsError { MismatchedUnitsError }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for MismatchedUnitsError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "MismatchedUnitsError")
}
}Debug, #[allow(unused_qualifications)]
#[automatically_derived]
impl ::core::fmt::Display for MismatchedUnitsError {
#[allow(clippy :: used_underscore_binding)]
fn fmt(&self, __formatter: &mut ::core::fmt::Formatter)
-> ::core::fmt::Result {
#[allow(unused_variables, deprecated)]
let Self {} = self;
__formatter.write_str("cannot interpolate between two values of different units")
}
}Error)]
545#[error("cannot interpolate between two values of different units")]
546pub struct MismatchedUnitsError;
547
548pub trait TryStableInterpolate: Clone {
578 type Error;
580
581 fn try_interpolate_stable(&self, other: &Self, t: f32) -> Result<Self, Self::Error>;
584}
585
586impl<T: StableInterpolate> TryStableInterpolate for T {
587 type Error = Infallible;
588 fn try_interpolate_stable(&self, other: &Self, t: f32) -> Result<Self, Self::Error> {
589 Ok(self.interpolate_stable(other, t))
590 }
591}
592
593pub trait HasTangent {
595 type Tangent: VectorSpace;
597}
598
599#[derive(#[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for WithDerivative<T> where
T: HasTangent, T::Tangent: ::core::fmt::Debug {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"WithDerivative", "value", &self.value, "derivative",
&&self.derivative)
}
}Debug, #[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for WithDerivative<T> where
T: HasTangent, T::Tangent: ::core::clone::Clone {
#[inline]
fn clone(&self) -> WithDerivative<T> {
WithDerivative {
value: ::core::clone::Clone::clone(&self.value),
derivative: ::core::clone::Clone::clone(&self.derivative),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::marker::Copy> ::core::marker::Copy for WithDerivative<T> where
T: HasTangent, T::Tangent: ::core::marker::Copy {
}Copy)]
601#[cfg_attr(feature = "serialize", derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<T> _serde::Serialize for WithDerivative<T> where T: HasTangent,
T: _serde::Serialize, T::Tangent: _serde::Serialize {
fn serialize<__S>(&self, __serializer: __S)
-> _serde::__private228::Result<__S::Ok, __S::Error> where
__S: _serde::Serializer {
let mut __serde_state =
_serde::Serializer::serialize_struct(__serializer,
"WithDerivative", false as usize + 1 + 1)?;
_serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"value", &self.value)?;
_serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"derivative", &self.derivative)?;
_serde::ser::SerializeStruct::end(__serde_state)
}
}
};serde::Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de, T> _serde::Deserialize<'de> for WithDerivative<T> where
T: HasTangent, T: _serde::Deserialize<'de>,
T::Tangent: _serde::Deserialize<'de> {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __field1, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
1u64 => _serde::__private228::Ok(__Field::__field1),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"value" => _serde::__private228::Ok(__Field::__field0),
"derivative" => _serde::__private228::Ok(__Field::__field1),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"value" => _serde::__private228::Ok(__Field::__field0),
b"derivative" =>
_serde::__private228::Ok(__Field::__field1),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de, T> where T: HasTangent,
T: _serde::Deserialize<'de>,
T::Tangent: _serde::Deserialize<'de> {
marker: _serde::__private228::PhantomData<WithDerivative<T>>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de, T> _serde::de::Visitor<'de> for __Visitor<'de, T>
where T: HasTangent, T: _serde::Deserialize<'de>,
T::Tangent: _serde::Deserialize<'de> {
type Value = WithDerivative<T>;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct WithDerivative")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<T>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct WithDerivative with 2 elements")),
};
let __field1 =
match _serde::de::SeqAccess::next_element::<T::Tangent>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
&"struct WithDerivative with 2 elements")),
};
_serde::__private228::Ok(WithDerivative {
value: __field0,
derivative: __field1,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0: _serde::__private228::Option<T> =
_serde::__private228::None;
let mut __field1: _serde::__private228::Option<T::Tangent> =
_serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("value"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<T>(&mut __map)?);
}
__Field::__field1 => {
if _serde::__private228::Option::is_some(&__field1) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("derivative"));
}
__field1 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<T::Tangent>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("value")?,
};
let __field1 =
match __field1 {
_serde::__private228::Some(__field1) => __field1,
_serde::__private228::None =>
_serde::__private228::de::missing_field("derivative")?,
};
_serde::__private228::Ok(WithDerivative {
value: __field0,
derivative: __field1,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] =
&["value", "derivative"];
_serde::Deserializer::deserialize_struct(__deserializer,
"WithDerivative", FIELDS,
__Visitor {
marker: _serde::__private228::PhantomData::<WithDerivative<T>>,
lifetime: _serde::__private228::PhantomData,
})
}
}
};serde::Deserialize))]
602#[cfg_attr(feature = "bevy_reflect", derive(const _: () =
{
impl<T> bevy_reflect::GetTypeRegistration for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<T as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<T::Tangent as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl<T> bevy_reflect::Typed for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::GenericTypeInfoCell =
bevy_reflect::utility::GenericTypeInfoCell::new();
CELL.get_or_insert::<Self,
_>(||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<T>("value"),
bevy_reflect::NamedField::new::<T::Tangent>("derivative")]).with_generics(bevy_reflect::Generics::from_iter([bevy_reflect::GenericInfo::Type(bevy_reflect::TypeParamInfo::new::<T>(bevy_reflect::__macro_exports::alloc_utils::Cow::Borrowed("T")))])))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl<T> bevy_reflect::TypePath for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath {
fn type_path() -> &'static str {
static CELL: bevy_reflect::utility::GenericTypePathCell =
bevy_reflect::utility::GenericTypePathCell::new();
CELL.get_or_insert::<Self,
_>(||
{
::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string("bevy_math::common_traits::WithDerivative<"),
<T as bevy_reflect::TypePath>::type_path()), ">")
})
}
fn short_type_path() -> &'static str {
static CELL: bevy_reflect::utility::GenericTypePathCell =
bevy_reflect::utility::GenericTypePathCell::new();
CELL.get_or_insert::<Self,
_>(||
{
::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string("WithDerivative<"),
<T as bevy_reflect::TypePath>::short_type_path()), ">")
})
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("WithDerivative")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_math::common_traits".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_math::common_traits")
}
}
impl<T> bevy_reflect::Reflect for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
impl<T> bevy_reflect::structs::Struct for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"value" => ::core::option::Option::Some(&self.value),
"derivative" =>
::core::option::Option::Some(&self.derivative),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"value" => ::core::option::Option::Some(&mut self.value),
"derivative" =>
::core::option::Option::Some(&mut self.derivative),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.value),
1usize => ::core::option::Option::Some(&self.derivative),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.value),
1usize =>
::core::option::Option::Some(&mut self.derivative),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("value"),
1usize => ::core::option::Option::Some("derivative"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"value" => ::core::option::Option::Some(0usize),
"derivative" => ::core::option::Option::Some(1usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 2usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
-> bevy_reflect::structs::DynamicStruct {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("value",
bevy_reflect::PartialReflect::to_dynamic(&self.value));
dynamic.insert_boxed("derivative",
bevy_reflect::PartialReflect::to_dynamic(&self.derivative));
dynamic
}
}
impl<T> bevy_reflect::PartialReflect for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(Self {
value: <T as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.value)?,
derivative: <T::Tangent as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.derivative)?,
}))
}
}
impl<T> bevy_reflect::FromReflect for WithDerivative<T> where
WithDerivative<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let __this =
Self {
value: <T as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"value")?)?,
derivative: <T::Tangent as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"derivative")?)?,
};
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};bevy_reflect::Reflect))]
603pub struct WithDerivative<T>
604where
605 T: HasTangent,
606{
607 pub value: T,
609
610 pub derivative: T::Tangent,
612}
613
614#[derive(#[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for WithTwoDerivatives<T> where
T: HasTangent, T::Tangent: ::core::fmt::Debug,
T::Tangent: ::core::fmt::Debug {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"WithTwoDerivatives", "value", &self.value, "derivative",
&self.derivative, "second_derivative", &&self.second_derivative)
}
}Debug, #[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for WithTwoDerivatives<T>
where T: HasTangent, T::Tangent: ::core::clone::Clone,
T::Tangent: ::core::clone::Clone {
#[inline]
fn clone(&self) -> WithTwoDerivatives<T> {
WithTwoDerivatives {
value: ::core::clone::Clone::clone(&self.value),
derivative: ::core::clone::Clone::clone(&self.derivative),
second_derivative: ::core::clone::Clone::clone(&self.second_derivative),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::marker::Copy> ::core::marker::Copy for WithTwoDerivatives<T>
where T: HasTangent, T::Tangent: ::core::marker::Copy,
T::Tangent: ::core::marker::Copy {
}Copy)]
616#[cfg_attr(feature = "serialize", derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<T> _serde::Serialize for WithTwoDerivatives<T> where
T: HasTangent, T: _serde::Serialize, T::Tangent: _serde::Serialize
{
fn serialize<__S>(&self, __serializer: __S)
-> _serde::__private228::Result<__S::Ok, __S::Error> where
__S: _serde::Serializer {
let mut __serde_state =
_serde::Serializer::serialize_struct(__serializer,
"WithTwoDerivatives", false as usize + 1 + 1 + 1)?;
_serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"value", &self.value)?;
_serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"derivative", &self.derivative)?;
_serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
"second_derivative", &self.second_derivative)?;
_serde::ser::SerializeStruct::end(__serde_state)
}
}
};serde::Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de, T> _serde::Deserialize<'de> for WithTwoDerivatives<T> where
T: HasTangent, T: _serde::Deserialize<'de>,
T::Tangent: _serde::Deserialize<'de> {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __field1, __field2, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
1u64 => _serde::__private228::Ok(__Field::__field1),
2u64 => _serde::__private228::Ok(__Field::__field2),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"value" => _serde::__private228::Ok(__Field::__field0),
"derivative" => _serde::__private228::Ok(__Field::__field1),
"second_derivative" =>
_serde::__private228::Ok(__Field::__field2),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"value" => _serde::__private228::Ok(__Field::__field0),
b"derivative" =>
_serde::__private228::Ok(__Field::__field1),
b"second_derivative" =>
_serde::__private228::Ok(__Field::__field2),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de, T> where T: HasTangent,
T: _serde::Deserialize<'de>,
T::Tangent: _serde::Deserialize<'de> {
marker: _serde::__private228::PhantomData<WithTwoDerivatives<T>>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de, T> _serde::de::Visitor<'de> for __Visitor<'de, T>
where T: HasTangent, T: _serde::Deserialize<'de>,
T::Tangent: _serde::Deserialize<'de> {
type Value = WithTwoDerivatives<T>;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct WithTwoDerivatives")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<T>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct WithTwoDerivatives with 3 elements")),
};
let __field1 =
match _serde::de::SeqAccess::next_element::<T::Tangent>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
&"struct WithTwoDerivatives with 3 elements")),
};
let __field2 =
match _serde::de::SeqAccess::next_element::<<T::Tangent as
HasTangent>::Tangent>(&mut __seq)? {
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
&"struct WithTwoDerivatives with 3 elements")),
};
_serde::__private228::Ok(WithTwoDerivatives {
value: __field0,
derivative: __field1,
second_derivative: __field2,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0: _serde::__private228::Option<T> =
_serde::__private228::None;
let mut __field1: _serde::__private228::Option<T::Tangent> =
_serde::__private228::None;
let mut __field2:
_serde::__private228::Option<<T::Tangent as
HasTangent>::Tangent> = _serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("value"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<T>(&mut __map)?);
}
__Field::__field1 => {
if _serde::__private228::Option::is_some(&__field1) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("derivative"));
}
__field1 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<T::Tangent>(&mut __map)?);
}
__Field::__field2 => {
if _serde::__private228::Option::is_some(&__field2) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("second_derivative"));
}
__field2 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<<T::Tangent
as HasTangent>::Tangent>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("value")?,
};
let __field1 =
match __field1 {
_serde::__private228::Some(__field1) => __field1,
_serde::__private228::None =>
_serde::__private228::de::missing_field("derivative")?,
};
let __field2 =
match __field2 {
_serde::__private228::Some(__field2) => __field2,
_serde::__private228::None =>
_serde::__private228::de::missing_field("second_derivative")?,
};
_serde::__private228::Ok(WithTwoDerivatives {
value: __field0,
derivative: __field1,
second_derivative: __field2,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] =
&["value", "derivative", "second_derivative"];
_serde::Deserializer::deserialize_struct(__deserializer,
"WithTwoDerivatives", FIELDS,
__Visitor {
marker: _serde::__private228::PhantomData::<WithTwoDerivatives<T>>,
lifetime: _serde::__private228::PhantomData,
})
}
}
};serde::Deserialize))]
617#[cfg_attr(feature = "bevy_reflect", derive(const _: () =
{
impl<T> bevy_reflect::GetTypeRegistration for WithTwoDerivatives<T>
where WithTwoDerivatives<T>: ::core::any::Any +
::core::marker::Send + ::core::marker::Sync, T: HasTangent,
T: bevy_reflect::TypePath, T: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
<T::Tangent as HasTangent>::Tangent: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<T as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<T::Tangent as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<<T::Tangent as HasTangent>::Tangent as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl<T> bevy_reflect::Typed for WithTwoDerivatives<T> where
WithTwoDerivatives<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
<T::Tangent as HasTangent>::Tangent: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::GenericTypeInfoCell =
bevy_reflect::utility::GenericTypeInfoCell::new();
CELL.get_or_insert::<Self,
_>(||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<T>("value"),
bevy_reflect::NamedField::new::<T::Tangent>("derivative"),
bevy_reflect::NamedField::new::<<T::Tangent as
HasTangent>::Tangent>("second_derivative")]).with_generics(bevy_reflect::Generics::from_iter([bevy_reflect::GenericInfo::Type(bevy_reflect::TypeParamInfo::new::<T>(bevy_reflect::__macro_exports::alloc_utils::Cow::Borrowed("T")))])))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl<T> bevy_reflect::TypePath for WithTwoDerivatives<T> where
WithTwoDerivatives<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath {
fn type_path() -> &'static str {
static CELL: bevy_reflect::utility::GenericTypePathCell =
bevy_reflect::utility::GenericTypePathCell::new();
CELL.get_or_insert::<Self,
_>(||
{
::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string("bevy_math::common_traits::WithTwoDerivatives<"),
<T as bevy_reflect::TypePath>::type_path()), ">")
})
}
fn short_type_path() -> &'static str {
static CELL: bevy_reflect::utility::GenericTypePathCell =
bevy_reflect::utility::GenericTypePathCell::new();
CELL.get_or_insert::<Self,
_>(||
{
::core::ops::Add::<&str>::add(::core::ops::Add::<&str>::add(bevy_reflect::__macro_exports::alloc_utils::ToString::to_string("WithTwoDerivatives<"),
<T as bevy_reflect::TypePath>::short_type_path()), ">")
})
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("WithTwoDerivatives")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_math::common_traits".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_math::common_traits")
}
}
impl<T> bevy_reflect::Reflect for WithTwoDerivatives<T> where
WithTwoDerivatives<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
<T::Tangent as HasTangent>::Tangent: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
impl<T> bevy_reflect::structs::Struct for WithTwoDerivatives<T> where
WithTwoDerivatives<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
<T::Tangent as HasTangent>::Tangent: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"value" => ::core::option::Option::Some(&self.value),
"derivative" =>
::core::option::Option::Some(&self.derivative),
"second_derivative" =>
::core::option::Option::Some(&self.second_derivative),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"value" => ::core::option::Option::Some(&mut self.value),
"derivative" =>
::core::option::Option::Some(&mut self.derivative),
"second_derivative" =>
::core::option::Option::Some(&mut self.second_derivative),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.value),
1usize => ::core::option::Option::Some(&self.derivative),
2usize =>
::core::option::Option::Some(&self.second_derivative),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.value),
1usize =>
::core::option::Option::Some(&mut self.derivative),
2usize =>
::core::option::Option::Some(&mut self.second_derivative),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("value"),
1usize => ::core::option::Option::Some("derivative"),
2usize => ::core::option::Option::Some("second_derivative"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"value" => ::core::option::Option::Some(0usize),
"derivative" => ::core::option::Option::Some(1usize),
"second_derivative" => ::core::option::Option::Some(2usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 3usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
-> bevy_reflect::structs::DynamicStruct {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("value",
bevy_reflect::PartialReflect::to_dynamic(&self.value));
dynamic.insert_boxed("derivative",
bevy_reflect::PartialReflect::to_dynamic(&self.derivative));
dynamic.insert_boxed("second_derivative",
bevy_reflect::PartialReflect::to_dynamic(&self.second_derivative));
dynamic
}
}
impl<T> bevy_reflect::PartialReflect for WithTwoDerivatives<T> where
WithTwoDerivatives<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
<T::Tangent as HasTangent>::Tangent: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(Self {
value: <T as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.value)?,
derivative: <T::Tangent as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.derivative)?,
second_derivative: <<T::Tangent as HasTangent>::Tangent as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.second_derivative)?,
}))
}
}
impl<T> bevy_reflect::FromReflect for WithTwoDerivatives<T> where
WithTwoDerivatives<T>: ::core::any::Any + ::core::marker::Send +
::core::marker::Sync, T: HasTangent, T: bevy_reflect::TypePath,
T: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
T::Tangent: bevy_reflect::FromReflect + bevy_reflect::TypePath +
bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection,
<T::Tangent as HasTangent>::Tangent: bevy_reflect::FromReflect +
bevy_reflect::TypePath + bevy_reflect::MaybeTyped +
bevy_reflect::__macro_exports::RegisterForReflection {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let __this =
Self {
value: <T as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"value")?)?,
derivative: <T::Tangent as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"derivative")?)?,
second_derivative: <<T::Tangent as HasTangent>::Tangent as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"second_derivative")?)?,
};
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};bevy_reflect::Reflect))]
618pub struct WithTwoDerivatives<T>
619where
620 T: HasTangent,
621{
622 pub value: T,
624
625 pub derivative: T::Tangent,
627
628 pub second_derivative: <T::Tangent as HasTangent>::Tangent,
630}
631
632impl<V: VectorSpace> HasTangent for V {
633 type Tangent = V;
634}
635
636impl<F, U, V, M, N> HasTangent for (M, N)
637where
638 F: ScalarField,
639 U: VectorSpace<Scalar = F>,
640 V: VectorSpace<Scalar = F>,
641 M: HasTangent<Tangent = U>,
642 N: HasTangent<Tangent = V>,
643{
644 type Tangent = Sum<M::Tangent, N::Tangent>;
645}