Skip to main content

bevy_mesh/
morph.rs

1use super::Mesh;
2use bevy_asset::Handle;
3use bevy_ecs::prelude::*;
4use bevy_math::Vec3;
5use bevy_reflect::prelude::*;
6use bytemuck::{Pod, Zeroable};
7use encase::ShaderType;
8use thiserror::Error;
9
10/// The maximum size of the morph target texture, if morph target textures are
11/// in use on the current platform.
12pub const MAX_TEXTURE_WIDTH: u32 = 2048;
13
14/// Max target count available for [morph targets](MorphWeights).
15pub const MAX_MORPH_WEIGHTS: usize = 256;
16
17/// The maximum number of morph target components, if morph target textures are
18/// in use on the current platform.
19///
20/// NOTE: "component" refers to the element count of math objects,
21/// Vec3 has 3 components, Mat2 has 4 components.
22const MAX_COMPONENTS: u32 = MAX_TEXTURE_WIDTH * MAX_TEXTURE_WIDTH;
23
24#[derive(#[allow(unused_qualifications)]
#[automatically_derived]
impl ::core::fmt::Display for MorphBuildError {
    fn fmt(&self, __formatter: &mut ::core::fmt::Formatter)
        -> ::core::fmt::Result {
        use ::thiserror::__private18::AsDisplay as _;

        #[allow(unused_variables, deprecated, clippy ::
        used_underscore_binding)]
        match self {
            MorphBuildError::TooManyAttributes { vertex_count, component_count
                } =>
                match (vertex_count.as_display(),
                        component_count.as_display()) {
                    (__display_vertex_count, __display_component_count) =>
                        __formatter.write_fmt(format_args!("Too many vertex components in morph target, max is {1}, got {2}×{3} = {0}",
                                *vertex_count * *component_count as usize, MAX_COMPONENTS,
                                __display_vertex_count, __display_component_count)),
                },
            MorphBuildError::TooManyTargets { target_count } =>
                match (target_count.as_display(),) {
                    (__display_target_count,) =>
                        __formatter.write_fmt(format_args!("Bevy only supports up to {0} morph targets (individual poses), tried to create a model with {1} morph targets",
                                MAX_MORPH_WEIGHTS, __display_target_count)),
                },
        }
    }
}Error, #[automatically_derived]
impl ::core::clone::Clone for MorphBuildError {
    #[inline]
    fn clone(&self) -> MorphBuildError {
        match self {
            MorphBuildError::TooManyAttributes {
                vertex_count: __self_0, component_count: __self_1 } =>
                MorphBuildError::TooManyAttributes {
                    vertex_count: ::core::clone::Clone::clone(__self_0),
                    component_count: ::core::clone::Clone::clone(__self_1),
                },
            MorphBuildError::TooManyTargets { target_count: __self_0 } =>
                MorphBuildError::TooManyTargets {
                    target_count: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for MorphBuildError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MorphBuildError::TooManyAttributes {
                vertex_count: __self_0, component_count: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "TooManyAttributes", "vertex_count", __self_0,
                    "component_count", &__self_1),
            MorphBuildError::TooManyTargets { target_count: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "TooManyTargets", "target_count", &__self_0),
        }
    }
}Debug)]
25pub enum MorphBuildError {
26    #[error(
27        "Too many vertex components in morph target, max is {MAX_COMPONENTS}, \
28        got {vertex_count}×{component_count} = {}",
29        *vertex_count * *component_count as usize
30    )]
31    TooManyAttributes {
32        vertex_count: usize,
33        component_count: u32,
34    },
35    #[error(
36        "Bevy only supports up to {} morph targets (individual poses), tried to \
37        create a model with {target_count} morph targets",
38        MAX_MORPH_WEIGHTS
39    )]
40    TooManyTargets { target_count: usize },
41}
42
43/// Controls the [morph targets] for all child [`Mesh3d`](crate::Mesh3d)
44/// entities. In most cases, [`MorphWeights`] should be considered the "source
45/// of truth" when writing [morph targets] for meshes. However you can choose to
46/// write child [`MeshMorphWeights`] if your situation requires more
47/// granularity. Just note that if you set [`MorphWeights`], it will overwrite
48/// child [`MeshMorphWeights`] values.
49///
50/// `MorphWeights` works together with the [`MeshMorphWeights`] component. When
51/// a `MeshMorphWeights` is set to `MeshMorphWeights::Reference`, it references
52/// another entity that is expected to contain a `MorphWeights` component. This
53/// allows multiple meshes to share a single `MorphWeights` component.
54///
55/// ```
56/// # use bevy_asset::prelude::*;
57/// # use bevy_ecs::prelude::*;
58/// # use bevy_mesh::Mesh;
59/// # use bevy_mesh::morph::*;
60/// # #[derive(Component)]
61/// # struct Mesh3d(Handle<Mesh>);
62/// fn setup(mut commands: Commands, mesh_handle: Handle<Mesh>) {
63///     // Create the `MorphWeights` component.
64///     let weights_component = MorphWeights::new(vec![0.0, 0.5, 1.0], None).unwrap();
65///
66///     // Spawn an entity that contains the `MorphWeights` component.
67///     let weights_entity = commands.spawn(weights_component).id();
68///
69///     // Spawn another entity with a mesh and a `MeshMorphWeights` component
70///     // that references `weights_entity`.
71///     let mesh_entity = commands.spawn((
72///         Mesh3d(mesh_handle.clone()),
73///         MeshMorphWeights::Reference(weights_entity),
74///     ));
75/// }
76/// ```
77///
78/// [morph targets]: https://en.wikipedia.org/wiki/Morph_target_animation
79#[derive(const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for MorphWeights where  {
            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.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Vec<f32> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Option<Handle<Mesh>> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for MorphWeights where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Vec<f32>>("weights"),
                                                bevy_reflect::NamedField::new::<Option<Handle<Mesh>>>("first_mesh")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for MorphWeights where  {
            fn type_path() -> &'static str {
                "bevy_mesh::morph::MorphWeights"
            }
            fn short_type_path() -> &'static str { "MorphWeights" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("MorphWeights")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_mesh::morph".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_mesh::morph")
            }
        }
        impl bevy_reflect::Reflect for MorphWeights where  {
            #[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(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<MorphWeights
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::structs::Struct for MorphWeights where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "weights" => ::core::option::Option::Some(&self.weights),
                    "first_mesh" =>
                        ::core::option::Option::Some(&self.first_mesh),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "weights" =>
                        ::core::option::Option::Some(&mut self.weights),
                    "first_mesh" =>
                        ::core::option::Option::Some(&mut self.first_mesh),
                    _ => ::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.weights),
                    1usize => ::core::option::Option::Some(&self.first_mesh),
                    _ => ::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.weights),
                    1usize =>
                        ::core::option::Option::Some(&mut self.first_mesh),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("weights"),
                    1usize => ::core::option::Option::Some("first_mesh"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "weights" => ::core::option::Option::Some(0usize),
                    "first_mesh" => ::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("weights",
                    bevy_reflect::PartialReflect::to_dynamic(&self.weights));
                dynamic.insert_boxed("first_mesh",
                    bevy_reflect::PartialReflect::to_dynamic(&self.first_mesh));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for MorphWeights where  {
            #[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)
            }
            fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
                -> ::core::fmt::Result {
                ::core::fmt::Debug::fmt(self, f)
            }
            #[inline]
            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(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for MorphWeights where  {
            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 mut __this =
                        <Self as ::core::default::Default>::default();
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Vec<f32> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "weights")?))() {
                        __this.weights = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Option<Handle<Mesh>> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "first_mesh")?))() {
                        __this.first_mesh = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, #[automatically_derived]
impl ::core::default::Default for MorphWeights {
    #[inline]
    fn default() -> MorphWeights {
        MorphWeights {
            weights: ::core::default::Default::default(),
            first_mesh: ::core::default::Default::default(),
        }
    }
}Default, #[automatically_derived]
impl ::core::fmt::Debug for MorphWeights {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "MorphWeights",
            "weights", &self.weights, "first_mesh", &&self.first_mesh)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for MorphWeights {
    #[inline]
    fn clone(&self) -> MorphWeights {
        MorphWeights {
            weights: ::core::clone::Clone::clone(&self.weights),
            first_mesh: ::core::clone::Clone::clone(&self.first_mesh),
        }
    }
}Clone, impl bevy_ecs::component::Component for MorphWeights where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component)]
80#[reflect(Debug, Component, Default, Clone)]
81pub struct MorphWeights {
82    weights: Vec<f32>,
83    /// The first mesh primitive assigned to these weights
84    first_mesh: Option<Handle<Mesh>>,
85}
86
87impl MorphWeights {
88    pub fn new(
89        weights: Vec<f32>,
90        first_mesh: Option<Handle<Mesh>>,
91    ) -> Result<Self, MorphBuildError> {
92        if weights.len() > MAX_MORPH_WEIGHTS {
93            let target_count = weights.len();
94            return Err(MorphBuildError::TooManyTargets { target_count });
95        }
96        Ok(MorphWeights {
97            weights,
98            first_mesh,
99        })
100    }
101    /// The first child [`Mesh3d`](crate::Mesh3d) primitive controlled by these weights.
102    /// This can be used to look up metadata information such as [`Mesh::morph_target_names`].
103    pub fn first_mesh(&self) -> Option<&Handle<Mesh>> {
104        self.first_mesh.as_ref()
105    }
106    pub fn weights(&self) -> &[f32] {
107        &self.weights
108    }
109    pub fn weights_mut(&mut self) -> &mut [f32] {
110        &mut self.weights
111    }
112}
113
114/// A component that controls the [morph targets] of a mesh. Must be assigned
115/// to an entity with a [`Mesh3d`](crate::Mesh3d) component.
116///
117/// [morph targets]: https://en.wikipedia.org/wiki/Morph_target_animation
118#[derive(const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for MeshMorphWeights where  {
            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.register_type_data::<ReflectComponent, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Vec<f32> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Entity as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for MeshMorphWeights where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Enum(bevy_reflect::enums::EnumInfo::new::<Self>(&[bevy_reflect::enums::VariantInfo::Struct(bevy_reflect::enums::StructVariantInfo::new("Value",
                                                        &[bevy_reflect::NamedField::new::<Vec<f32>>("weights")])),
                                                bevy_reflect::enums::VariantInfo::Tuple(bevy_reflect::enums::TupleVariantInfo::new("Reference",
                                                        &[bevy_reflect::UnnamedField::new::<Entity>(0usize)]))]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for MeshMorphWeights where  {
            fn type_path() -> &'static str {
                "bevy_mesh::morph::MeshMorphWeights"
            }
            fn short_type_path() -> &'static str { "MeshMorphWeights" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("MeshMorphWeights")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_mesh::morph".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_mesh::morph")
            }
        }
        impl bevy_reflect::Reflect for MeshMorphWeights where  {
            #[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(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<MeshMorphWeights
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::enums::Enum for MeshMorphWeights where  {
            fn field(&self, __name_param: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match self {
                    MeshMorphWeights::Value { weights: __value, .. } if
                        __name_param == "weights" =>
                        ::core::option::Option::Some(__value),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_at(&self, __index_param: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match self {
                    MeshMorphWeights::Value { weights: __value, .. } if
                        __index_param == 0usize =>
                        ::core::option::Option::Some(__value),
                    MeshMorphWeights::Reference { 0: __value, .. } if
                        __index_param == 0usize =>
                        ::core::option::Option::Some(__value),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, __name_param: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match self {
                    MeshMorphWeights::Value { weights: __value, .. } if
                        __name_param == "weights" =>
                        ::core::option::Option::Some(__value),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_at_mut(&mut self, __index_param: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match self {
                    MeshMorphWeights::Value { weights: __value, .. } if
                        __index_param == 0usize =>
                        ::core::option::Option::Some(__value),
                    MeshMorphWeights::Reference { 0: __value, .. } if
                        __index_param == 0usize =>
                        ::core::option::Option::Some(__value),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of(&self, __name_param: &str)
                -> ::core::option::Option<usize> {
                match self {
                    MeshMorphWeights::Value { .. } if __name_param == "weights"
                        => ::core::option::Option::Some(0usize),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, __index_param: usize)
                -> ::core::option::Option<&str> {
                match self {
                    MeshMorphWeights::Value { .. } if __index_param == 0usize =>
                        ::core::option::Option::Some("weights"),
                    _ => ::core::option::Option::None,
                }
            }
            fn iter_fields(&self) -> bevy_reflect::enums::VariantFieldIter {
                bevy_reflect::enums::VariantFieldIter::new(self)
            }
            #[inline]
            fn field_len(&self) -> usize {
                match self {
                    MeshMorphWeights::Value { .. } => 1usize,
                    MeshMorphWeights::Reference { .. } => 1usize,
                    _ => 0,
                }
            }
            #[inline]
            fn variant_name(&self) -> &str {
                match self {
                    MeshMorphWeights::Value { .. } => "Value",
                    MeshMorphWeights::Reference { .. } => "Reference",
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            #[inline]
            fn variant_index(&self) -> usize {
                match self {
                    MeshMorphWeights::Value { .. } => 0usize,
                    MeshMorphWeights::Reference { .. } => 1usize,
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            #[inline]
            fn variant_type(&self) -> bevy_reflect::enums::VariantType {
                match self {
                    MeshMorphWeights::Value { .. } =>
                        bevy_reflect::enums::VariantType::Struct,
                    MeshMorphWeights::Reference { .. } =>
                        bevy_reflect::enums::VariantType::Tuple,
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            fn to_dynamic_enum(&self) -> bevy_reflect::enums::DynamicEnum {
                bevy_reflect::enums::DynamicEnum::from_ref::<Self>(self)
            }
        }
        impl bevy_reflect::PartialReflect for MeshMorphWeights where  {
            #[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_param: &dyn bevy_reflect::PartialReflect)
                -> ::core::result::Result<(), bevy_reflect::ApplyError> {
                if let bevy_reflect::ReflectRef::Enum(__value_param) =
                        bevy_reflect::PartialReflect::reflect_ref(__value_param) {
                    if bevy_reflect::enums::Enum::variant_name(self) ==
                            bevy_reflect::enums::Enum::variant_name(__value_param) {
                        match bevy_reflect::enums::Enum::variant_type(__value_param)
                            {
                            bevy_reflect::enums::VariantType::Struct => {
                                for field in
                                    bevy_reflect::enums::Enum::iter_fields(__value_param) {
                                    let name = field.name().unwrap();
                                    if let ::core::option::Option::Some(v) =
                                            bevy_reflect::enums::Enum::field_mut(self, name) {
                                        bevy_reflect::PartialReflect::try_apply(v, field.value())?;
                                    }
                                }
                            }
                            bevy_reflect::enums::VariantType::Tuple => {
                                for (index, field) in
                                    ::core::iter::Iterator::enumerate(bevy_reflect::enums::Enum::iter_fields(__value_param))
                                    {
                                    if let ::core::option::Option::Some(v) =
                                            bevy_reflect::enums::Enum::field_at_mut(self, index) {
                                        bevy_reflect::PartialReflect::try_apply(v, field.value())?;
                                    }
                                }
                            }
                            _ => {}
                        }
                    } else {
                        match bevy_reflect::enums::Enum::variant_name(__value_param)
                            {
                            "Value" => {
                                *self =
                                    MeshMorphWeights::Value {
                                        weights: {
                                            let __weights = __value_param.field("weights");
                                            let __weights =
                                                __weights.ok_or(bevy_reflect::ApplyError::MissingEnumField {
                                                            variant_name: ::core::convert::Into::into("Value"),
                                                            field_name: ::core::convert::Into::into("weights"),
                                                        })?;
                                            <Vec<f32> as
                                                            bevy_reflect::FromReflect>::from_reflect(__weights).ok_or(bevy_reflect::ApplyError::MismatchedTypes {
                                                        from_type: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(__weights)),
                                                        to_type: ::core::convert::Into::into(<Vec<f32> as
                                                                    bevy_reflect::TypePath>::type_path()),
                                                    })?
                                        },
                                    }
                            }
                            "Reference" => {
                                *self =
                                    MeshMorphWeights::Reference {
                                        0: {
                                            let __0 = __value_param.field_at(0usize);
                                            let __0 =
                                                __0.ok_or(bevy_reflect::ApplyError::MissingEnumField {
                                                            variant_name: ::core::convert::Into::into("Reference"),
                                                            field_name: ::core::convert::Into::into(".0"),
                                                        })?;
                                            <Entity as
                                                            bevy_reflect::FromReflect>::from_reflect(__0).ok_or(bevy_reflect::ApplyError::MismatchedTypes {
                                                        from_type: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(__0)),
                                                        to_type: ::core::convert::Into::into(<Entity as
                                                                    bevy_reflect::TypePath>::type_path()),
                                                    })?
                                        },
                                    }
                            }
                            name => {
                                return ::core::result::Result::Err(bevy_reflect::ApplyError::UnknownVariant {
                                            enum_name: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(self)),
                                            variant_name: ::core::convert::Into::into(name),
                                        });
                            }
                        }
                    }
                } else {
                    return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
                                from_kind: bevy_reflect::PartialReflect::reflect_kind(__value_param),
                                to_kind: bevy_reflect::ReflectKind::Enum,
                            });
                }
                ::core::result::Result::Ok(())
            }
            fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
                bevy_reflect::ReflectKind::Enum
            }
            fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
                bevy_reflect::ReflectRef::Enum(self)
            }
            fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
                bevy_reflect::ReflectMut::Enum(self)
            }
            fn reflect_owned(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                -> bevy_reflect::ReflectOwned {
                bevy_reflect::ReflectOwned::Enum(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_hash(&self) -> ::core::option::Option<u64> {
                (bevy_reflect::enums::enum_hash)(self)
            }
            fn reflect_partial_eq(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<bool> {
                (bevy_reflect::enums::enum_partial_eq)(self, value)
            }
            fn reflect_partial_cmp(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<::core::cmp::Ordering> {
                (bevy_reflect::enums::enum_partial_cmp)(self, value)
            }
            fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
                -> ::core::fmt::Result {
                ::core::fmt::Debug::fmt(self, f)
            }
            #[inline]
            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(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for MeshMorphWeights where  {
            fn from_reflect(__param0: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<Self> {
                if let bevy_reflect::ReflectRef::Enum(__param0) =
                        bevy_reflect::PartialReflect::reflect_ref(__param0) {
                    match bevy_reflect::enums::Enum::variant_name(__param0) {
                        "Value" =>
                            ::core::option::Option::Some(MeshMorphWeights::Value {
                                    weights: {
                                        let __weights = __param0.field("weights");
                                        let __weights = __weights?;
                                        <Vec<f32> as
                                                    bevy_reflect::FromReflect>::from_reflect(__weights)?
                                    },
                                }),
                        "Reference" =>
                            ::core::option::Option::Some(MeshMorphWeights::Reference {
                                    0: {
                                        let __0 = __param0.field_at(0usize);
                                        let __0 = __0?;
                                        <Entity as bevy_reflect::FromReflect>::from_reflect(__0)?
                                    },
                                }),
                        name => ::core::option::Option::None,
                    }
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, #[automatically_derived]
impl ::core::fmt::Debug for MeshMorphWeights {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MeshMorphWeights::Value { weights: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Value",
                    "weights", &__self_0),
            MeshMorphWeights::Reference(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Reference", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for MeshMorphWeights {
    #[inline]
    fn clone(&self) -> MeshMorphWeights {
        match self {
            MeshMorphWeights::Value { weights: __self_0 } =>
                MeshMorphWeights::Value {
                    weights: ::core::clone::Clone::clone(__self_0),
                },
            MeshMorphWeights::Reference(__self_0) =>
                MeshMorphWeights::Reference(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, impl bevy_ecs::component::Component for MeshMorphWeights where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn map_entities<M: bevy_ecs::entity::EntityMapper>(this: &mut Self,
        mapper: &mut M) {
        use bevy_ecs::entity::MapEntities;
        match this {
            Self::Value { .. } => {}
            Self::Reference { 0: __self0, .. } => {
                __self0.map_entities(mapper);
            }
            _ => {}
        }
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component)]
119#[reflect(Debug, Component, Clone)]
120pub enum MeshMorphWeights {
121    Value {
122        weights: Vec<f32>,
123    },
124    /// A reference to an entity containing a [`MorphWeights`] component. This
125    /// allows a single `MorphWeights` component to control the morph targets
126    /// of multiple meshes.
127    ///
128    /// See [`MorphWeights`] for an example.
129    Reference(#[entities] Entity),
130}
131
132/// Attributes **differences** used for morph targets.
133#[derive(#[automatically_derived]
impl ::core::marker::Copy for MorphAttributes { }Copy, #[automatically_derived]
impl ::core::clone::Clone for MorphAttributes {
    #[inline]
    fn clone(&self) -> MorphAttributes {
        let _: ::core::clone::AssertParamIsClone<Vec3>;
        let _: ::core::clone::AssertParamIsClone<f32>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for MorphAttributes {
    #[inline]
    fn eq(&self, other: &MorphAttributes) -> bool {
        self.pad_a == other.pad_a && self.pad_b == other.pad_b &&
                        self.pad_c == other.pad_c && self.position == other.position
                && self.normal == other.normal &&
            self.tangent == other.tangent
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for MorphAttributes {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["position", "pad_a", "normal", "pad_b", "tangent", "pad_c"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.position, &self.pad_a, &self.normal, &self.pad_b,
                        &self.tangent, &&self.pad_c];
        ::core::fmt::Formatter::debug_struct_fields_finish(f,
            "MorphAttributes", names, values)
    }
}Debug, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for MorphAttributes where  {
            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.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Vec3 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for MorphAttributes where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Vec3>("position"),
                                                bevy_reflect::NamedField::new::<f32>("pad_a"),
                                                bevy_reflect::NamedField::new::<Vec3>("normal"),
                                                bevy_reflect::NamedField::new::<f32>("pad_b"),
                                                bevy_reflect::NamedField::new::<Vec3>("tangent"),
                                                bevy_reflect::NamedField::new::<f32>("pad_c")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for MorphAttributes where  {
            fn type_path() -> &'static str {
                "bevy_mesh::morph::MorphAttributes"
            }
            fn short_type_path() -> &'static str { "MorphAttributes" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("MorphAttributes")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_mesh::morph".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_mesh::morph")
            }
        }
        impl bevy_reflect::Reflect for MorphAttributes where  {
            #[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(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<MorphAttributes
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::structs::Struct for MorphAttributes where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "position" => ::core::option::Option::Some(&self.position),
                    "pad_a" => ::core::option::Option::Some(&self.pad_a),
                    "normal" => ::core::option::Option::Some(&self.normal),
                    "pad_b" => ::core::option::Option::Some(&self.pad_b),
                    "tangent" => ::core::option::Option::Some(&self.tangent),
                    "pad_c" => ::core::option::Option::Some(&self.pad_c),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "position" =>
                        ::core::option::Option::Some(&mut self.position),
                    "pad_a" => ::core::option::Option::Some(&mut self.pad_a),
                    "normal" => ::core::option::Option::Some(&mut self.normal),
                    "pad_b" => ::core::option::Option::Some(&mut self.pad_b),
                    "tangent" =>
                        ::core::option::Option::Some(&mut self.tangent),
                    "pad_c" => ::core::option::Option::Some(&mut self.pad_c),
                    _ => ::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.position),
                    1usize => ::core::option::Option::Some(&self.pad_a),
                    2usize => ::core::option::Option::Some(&self.normal),
                    3usize => ::core::option::Option::Some(&self.pad_b),
                    4usize => ::core::option::Option::Some(&self.tangent),
                    5usize => ::core::option::Option::Some(&self.pad_c),
                    _ => ::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.position),
                    1usize => ::core::option::Option::Some(&mut self.pad_a),
                    2usize => ::core::option::Option::Some(&mut self.normal),
                    3usize => ::core::option::Option::Some(&mut self.pad_b),
                    4usize => ::core::option::Option::Some(&mut self.tangent),
                    5usize => ::core::option::Option::Some(&mut self.pad_c),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("position"),
                    1usize => ::core::option::Option::Some("pad_a"),
                    2usize => ::core::option::Option::Some("normal"),
                    3usize => ::core::option::Option::Some("pad_b"),
                    4usize => ::core::option::Option::Some("tangent"),
                    5usize => ::core::option::Option::Some("pad_c"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "position" => ::core::option::Option::Some(0usize),
                    "pad_a" => ::core::option::Option::Some(1usize),
                    "normal" => ::core::option::Option::Some(2usize),
                    "pad_b" => ::core::option::Option::Some(3usize),
                    "tangent" => ::core::option::Option::Some(4usize),
                    "pad_c" => ::core::option::Option::Some(5usize),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_len(&self) -> usize { 6usize }
            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("position",
                    bevy_reflect::PartialReflect::to_dynamic(&self.position));
                dynamic.insert_boxed("pad_a",
                    bevy_reflect::PartialReflect::to_dynamic(&self.pad_a));
                dynamic.insert_boxed("normal",
                    bevy_reflect::PartialReflect::to_dynamic(&self.normal));
                dynamic.insert_boxed("pad_b",
                    bevy_reflect::PartialReflect::to_dynamic(&self.pad_b));
                dynamic.insert_boxed("tangent",
                    bevy_reflect::PartialReflect::to_dynamic(&self.tangent));
                dynamic.insert_boxed("pad_c",
                    bevy_reflect::PartialReflect::to_dynamic(&self.pad_c));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for MorphAttributes where  {
            #[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]
            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(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for MorphAttributes where  {
            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 mut __this =
                        <Self as ::core::default::Default>::default();
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Vec3 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "position")?))() {
                        __this.position = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "pad_a")?))() {
                        __this.pad_a = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Vec3 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "normal")?))() {
                        __this.normal = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "pad_b")?))() {
                        __this.pad_b = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Vec3 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "tangent")?))() {
                        __this.tangent = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "pad_c")?))() {
                        __this.pad_c = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, impl ::encase::private::ShaderSize for MorphAttributes where
    Vec3: ::encase::private::ShaderSize, f32: ::encase::private::ShaderSize,
    Vec3: ::encase::private::ShaderSize, f32: ::encase::private::ShaderSize,
    Vec3: ::encase::private::ShaderSize, f32: ::encase::private::ShaderSize {}ShaderType, unsafe impl ::bytemuck::Pod for MorphAttributes {}Pod, unsafe impl ::bytemuck::Zeroable for MorphAttributes {}Zeroable, #[automatically_derived]
impl ::core::default::Default for MorphAttributes {
    #[inline]
    fn default() -> MorphAttributes {
        MorphAttributes {
            position: ::core::default::Default::default(),
            pad_a: ::core::default::Default::default(),
            normal: ::core::default::Default::default(),
            pad_b: ::core::default::Default::default(),
            tangent: ::core::default::Default::default(),
            pad_c: ::core::default::Default::default(),
        }
    }
}Default)]
134#[reflect(Clone, Default)]
135#[repr(C)]
136pub struct MorphAttributes {
137    /// The vertex position difference between base mesh and this target.
138    pub position: Vec3,
139    /// Padding to ensure that vectors start on 16-byte boundaries.
140    pub pad_a: f32,
141    /// The vertex normal difference between base mesh and this target.
142    pub normal: Vec3,
143    /// Padding to ensure that vectors start on 16-byte boundaries.
144    pub pad_b: f32,
145    /// The vertex tangent difference between base mesh and this target.
146    ///
147    /// Note that tangents are a `Vec4`, but only the `xyz` components are
148    /// animated, as the `w` component is the sign and cannot be animated.
149    pub tangent: Vec3,
150    /// Padding to ensure that vectors start on 16-byte boundaries.
151    pub pad_c: f32,
152}
153
154impl From<[Vec3; 3]> for MorphAttributes {
155    fn from([position, normal, tangent]: [Vec3; 3]) -> Self {
156        MorphAttributes {
157            position,
158            normal,
159            tangent,
160            pad_a: 0.0,
161            pad_b: 0.0,
162            pad_c: 0.0,
163        }
164    }
165}
166
167impl MorphAttributes {
168    /// How many components `MorphAttributes` has.
169    ///
170    /// Each `Vec3` has 3 components, we have 3 `Vec3`, for a total of 9.
171    pub const COMPONENT_COUNT: usize = 9;
172
173    pub fn new(position: Vec3, normal: Vec3, tangent: Vec3) -> Self {
174        MorphAttributes {
175            position,
176            normal,
177            tangent,
178            pad_a: 0.0,
179            pad_b: 0.0,
180            pad_c: 0.0,
181        }
182    }
183}