Skip to main content

bevy_sprite/
sprite_mesh.rs

1use bevy_asset::{Assets, Handle};
2use bevy_camera::visibility::{Visibility, VisibilityClass};
3use bevy_color::Color;
4use bevy_ecs::{component::Component, reflect::ReflectComponent, template::FromTemplate};
5use bevy_image::{Image, TextureAtlas, TextureAtlasLayout};
6use bevy_math::{Rect, UVec2, Vec2};
7use bevy_reflect::{std_traits::ReflectDefault, PartialReflect, Reflect};
8use bevy_transform::components::Transform;
9
10use crate::{Anchor, SpriteImageMode};
11
12/// This is a carbon copy of [`Sprite`](crate::sprite::Sprite) that uses the
13/// Mesh backend instead of the Sprite backend.
14///
15/// The only API difference is the added [`alpha mode`](SpriteMesh::alpha_mode).
16#[derive(#[doc =
"**Required Components**: [`Transform`], [`Visibility`], [`VisibilityClass`], [`Anchor`]. \n\n A component's Required Components are inserted whenever it is inserted. Note that this will also insert the required components _of_ the required components, recursively, in depth-first order."]
impl bevy_ecs::component::Component for SpriteMesh 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) {
        required_components.register_required::<Transform>(<Transform as
                ::core::default::Default>::default);
        required_components.register_required::<Visibility>(<Visibility as
                ::core::default::Default>::default);
        required_components.register_required::<VisibilityClass>(<VisibilityClass
                as ::core::default::Default>::default);
        required_components.register_required::<Anchor>(<Anchor as
                ::core::default::Default>::default);
    }
    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, #[automatically_derived]
impl ::core::fmt::Debug for SpriteMesh {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["image", "texture_atlas", "color", "flip_x", "flip_y",
                        "custom_size", "rect", "image_mode", "alpha_mode"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.image, &self.texture_atlas, &self.color, &self.flip_x,
                        &self.flip_y, &self.custom_size, &self.rect,
                        &self.image_mode, &&self.alpha_mode];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "SpriteMesh",
            names, values)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for SpriteMesh {
    #[inline]
    fn default() -> SpriteMesh {
        SpriteMesh {
            image: ::core::default::Default::default(),
            texture_atlas: ::core::default::Default::default(),
            color: ::core::default::Default::default(),
            flip_x: ::core::default::Default::default(),
            flip_y: ::core::default::Default::default(),
            custom_size: ::core::default::Default::default(),
            rect: ::core::default::Default::default(),
            image_mode: ::core::default::Default::default(),
            alpha_mode: ::core::default::Default::default(),
        }
    }
}Default, #[automatically_derived]
impl ::core::clone::Clone for SpriteMesh {
    #[inline]
    fn clone(&self) -> SpriteMesh {
        SpriteMesh {
            image: ::core::clone::Clone::clone(&self.image),
            texture_atlas: ::core::clone::Clone::clone(&self.texture_atlas),
            color: ::core::clone::Clone::clone(&self.color),
            flip_x: ::core::clone::Clone::clone(&self.flip_x),
            flip_y: ::core::clone::Clone::clone(&self.flip_y),
            custom_size: ::core::clone::Clone::clone(&self.custom_size),
            rect: ::core::clone::Clone::clone(&self.rect),
            image_mode: ::core::clone::Clone::clone(&self.image_mode),
            alpha_mode: ::core::clone::Clone::clone(&self.alpha_mode),
        }
    }
}Clone, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for SpriteMesh 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) {
                <Handle<Image> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Option<TextureAtlas> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Color as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <bool as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Option<Vec2> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Option<Rect> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <SpriteImageMode as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <SpriteAlphaMode as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for SpriteMesh 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::<Handle<Image>>("image"),
                                                bevy_reflect::NamedField::new::<Option<TextureAtlas>>("texture_atlas"),
                                                bevy_reflect::NamedField::new::<Color>("color"),
                                                bevy_reflect::NamedField::new::<bool>("flip_x"),
                                                bevy_reflect::NamedField::new::<bool>("flip_y"),
                                                bevy_reflect::NamedField::new::<Option<Vec2>>("custom_size"),
                                                bevy_reflect::NamedField::new::<Option<Rect>>("rect"),
                                                bevy_reflect::NamedField::new::<SpriteImageMode>("image_mode"),
                                                bevy_reflect::NamedField::new::<SpriteAlphaMode>("alpha_mode")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for SpriteMesh where  {
            fn type_path() -> &'static str {
                "bevy_sprite::sprite_mesh::SpriteMesh"
            }
            fn short_type_path() -> &'static str { "SpriteMesh" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("SpriteMesh")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_sprite::sprite_mesh".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_sprite::sprite_mesh")
            }
        }
        impl bevy_reflect::Reflect for SpriteMesh 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(<SpriteMesh
                                        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 SpriteMesh where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "image" => ::core::option::Option::Some(&self.image),
                    "texture_atlas" =>
                        ::core::option::Option::Some(&self.texture_atlas),
                    "color" => ::core::option::Option::Some(&self.color),
                    "flip_x" => ::core::option::Option::Some(&self.flip_x),
                    "flip_y" => ::core::option::Option::Some(&self.flip_y),
                    "custom_size" =>
                        ::core::option::Option::Some(&self.custom_size),
                    "rect" => ::core::option::Option::Some(&self.rect),
                    "image_mode" =>
                        ::core::option::Option::Some(&self.image_mode),
                    "alpha_mode" =>
                        ::core::option::Option::Some(&self.alpha_mode),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "image" => ::core::option::Option::Some(&mut self.image),
                    "texture_atlas" =>
                        ::core::option::Option::Some(&mut self.texture_atlas),
                    "color" => ::core::option::Option::Some(&mut self.color),
                    "flip_x" => ::core::option::Option::Some(&mut self.flip_x),
                    "flip_y" => ::core::option::Option::Some(&mut self.flip_y),
                    "custom_size" =>
                        ::core::option::Option::Some(&mut self.custom_size),
                    "rect" => ::core::option::Option::Some(&mut self.rect),
                    "image_mode" =>
                        ::core::option::Option::Some(&mut self.image_mode),
                    "alpha_mode" =>
                        ::core::option::Option::Some(&mut self.alpha_mode),
                    _ => ::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.image),
                    1usize => ::core::option::Option::Some(&self.texture_atlas),
                    2usize => ::core::option::Option::Some(&self.color),
                    3usize => ::core::option::Option::Some(&self.flip_x),
                    4usize => ::core::option::Option::Some(&self.flip_y),
                    5usize => ::core::option::Option::Some(&self.custom_size),
                    6usize => ::core::option::Option::Some(&self.rect),
                    7usize => ::core::option::Option::Some(&self.image_mode),
                    8usize => ::core::option::Option::Some(&self.alpha_mode),
                    _ => ::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.image),
                    1usize =>
                        ::core::option::Option::Some(&mut self.texture_atlas),
                    2usize => ::core::option::Option::Some(&mut self.color),
                    3usize => ::core::option::Option::Some(&mut self.flip_x),
                    4usize => ::core::option::Option::Some(&mut self.flip_y),
                    5usize =>
                        ::core::option::Option::Some(&mut self.custom_size),
                    6usize => ::core::option::Option::Some(&mut self.rect),
                    7usize =>
                        ::core::option::Option::Some(&mut self.image_mode),
                    8usize =>
                        ::core::option::Option::Some(&mut self.alpha_mode),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("image"),
                    1usize => ::core::option::Option::Some("texture_atlas"),
                    2usize => ::core::option::Option::Some("color"),
                    3usize => ::core::option::Option::Some("flip_x"),
                    4usize => ::core::option::Option::Some("flip_y"),
                    5usize => ::core::option::Option::Some("custom_size"),
                    6usize => ::core::option::Option::Some("rect"),
                    7usize => ::core::option::Option::Some("image_mode"),
                    8usize => ::core::option::Option::Some("alpha_mode"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "image" => ::core::option::Option::Some(0usize),
                    "texture_atlas" => ::core::option::Option::Some(1usize),
                    "color" => ::core::option::Option::Some(2usize),
                    "flip_x" => ::core::option::Option::Some(3usize),
                    "flip_y" => ::core::option::Option::Some(4usize),
                    "custom_size" => ::core::option::Option::Some(5usize),
                    "rect" => ::core::option::Option::Some(6usize),
                    "image_mode" => ::core::option::Option::Some(7usize),
                    "alpha_mode" => ::core::option::Option::Some(8usize),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_len(&self) -> usize { 9usize }
            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("image",
                    bevy_reflect::PartialReflect::to_dynamic(&self.image));
                dynamic.insert_boxed("texture_atlas",
                    bevy_reflect::PartialReflect::to_dynamic(&self.texture_atlas));
                dynamic.insert_boxed("color",
                    bevy_reflect::PartialReflect::to_dynamic(&self.color));
                dynamic.insert_boxed("flip_x",
                    bevy_reflect::PartialReflect::to_dynamic(&self.flip_x));
                dynamic.insert_boxed("flip_y",
                    bevy_reflect::PartialReflect::to_dynamic(&self.flip_y));
                dynamic.insert_boxed("custom_size",
                    bevy_reflect::PartialReflect::to_dynamic(&self.custom_size));
                dynamic.insert_boxed("rect",
                    bevy_reflect::PartialReflect::to_dynamic(&self.rect));
                dynamic.insert_boxed("image_mode",
                    bevy_reflect::PartialReflect::to_dynamic(&self.image_mode));
                dynamic.insert_boxed("alpha_mode",
                    bevy_reflect::PartialReflect::to_dynamic(&self.alpha_mode));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for SpriteMesh 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 SpriteMesh 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) =
                            (||
                                        <Handle<Image> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "image")?))() {
                        __this.image = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Option<TextureAtlas> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "texture_atlas")?))() {
                        __this.texture_atlas = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Color as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "color")?))() {
                        __this.color = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <bool as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "flip_x")?))() {
                        __this.flip_x = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <bool as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "flip_y")?))() {
                        __this.flip_y = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Option<Vec2> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "custom_size")?))() {
                        __this.custom_size = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Option<Rect> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "rect")?))() {
                        __this.rect = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <SpriteImageMode as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "image_mode")?))() {
                        __this.image_mode = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <SpriteAlphaMode as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "alpha_mode")?))() {
                        __this.alpha_mode = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, #[automatically_derived]
impl ::core::cmp::PartialEq for SpriteMesh {
    #[inline]
    fn eq(&self, other: &SpriteMesh) -> bool {
        self.flip_x == other.flip_x && self.flip_y == other.flip_y &&
                                    self.image == other.image &&
                                self.texture_atlas == other.texture_atlas &&
                            self.color == other.color &&
                        self.custom_size == other.custom_size &&
                    self.rect == other.rect &&
                self.image_mode == other.image_mode &&
            self.alpha_mode == other.alpha_mode
    }
}PartialEq, impl ::core::default::Default for SpriteMeshTemplate {
    fn default() -> Self {
        Self {
            image: ::core::default::Default::default(),
            texture_atlas: ::core::default::Default::default(),
            color: ::core::default::Default::default(),
            flip_x: ::core::default::Default::default(),
            flip_y: ::core::default::Default::default(),
            custom_size: ::core::default::Default::default(),
            rect: ::core::default::Default::default(),
            image_mode: ::core::default::Default::default(),
            alpha_mode: ::core::default::Default::default(),
        }
    }
}FromTemplate)]
17#[require(Transform, Visibility, VisibilityClass, Anchor)]
18#[reflect(Component, Default, Debug, Clone)]
19pub struct SpriteMesh {
20    /// The image used to render the sprite
21    pub image: Handle<Image>,
22    /// The (optional) texture atlas used to render the sprite
23    #[template(built_in)]
24    pub texture_atlas: Option<TextureAtlas>,
25    /// The sprite's color tint
26    pub color: Color,
27    /// Flip the sprite along the `X` axis
28    pub flip_x: bool,
29    /// Flip the sprite along the `Y` axis
30    pub flip_y: bool,
31    /// An optional custom size for the sprite that will be used when rendering, instead of the size
32    /// of the sprite's image
33    pub custom_size: Option<Vec2>,
34    /// An optional rectangle representing the region of the sprite's image to render, instead of rendering
35    /// the full image. This is an easy one-off alternative to using a [`TextureAtlas`].
36    ///
37    /// When used with a [`TextureAtlas`], the rect
38    /// is offset by the atlas's minimal (top-left) corner position.
39    pub rect: Option<Rect>,
40    /// How the sprite's image will be scaled.
41    pub image_mode: SpriteImageMode,
42    /// The sprite's alpha mode, defaulting to `Mask(0.5)`.
43    /// If you wish to render a sprite with translucent pixels,
44    /// set it to `Blend` instead (significantly worse for performance).
45    pub alpha_mode: SpriteAlphaMode,
46}
47
48impl core::hash::Hash for SpriteMesh {
49    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
50        self.image.hash(state);
51        self.texture_atlas.hash(state);
52        self.color.reflect_hash().hash(state);
53        self.custom_size.reflect_hash().hash(state);
54        self.flip_x.hash(state);
55        self.flip_y.hash(state);
56    }
57}
58
59impl Eq for SpriteMesh {}
60
61// NOTE: The SpriteImageMode, SpriteScalingMode and Anchor are imported from the sprite module.
62
63impl SpriteMesh {
64    /// Create a Sprite with a custom size
65    pub fn sized(custom_size: Vec2) -> Self {
66        SpriteMesh {
67            custom_size: Some(custom_size),
68            ..Default::default()
69        }
70    }
71
72    /// Create a sprite from an image
73    pub fn from_image(image: Handle<Image>) -> Self {
74        Self {
75            image,
76            ..Default::default()
77        }
78    }
79
80    /// Create a sprite from an image, with an associated texture atlas
81    pub fn from_atlas_image(image: Handle<Image>, atlas: TextureAtlas) -> Self {
82        Self {
83            image,
84            texture_atlas: Some(atlas),
85            ..Default::default()
86        }
87    }
88
89    /// Create a sprite from a solid color
90    pub fn from_color(color: impl Into<Color>, size: Vec2) -> Self {
91        Self {
92            color: color.into(),
93            custom_size: Some(size),
94            ..Default::default()
95        }
96    }
97
98    /// Computes the pixel point where `point_relative_to_sprite` is sampled
99    /// from in this sprite. `point_relative_to_sprite` must be in the sprite's
100    /// local frame. Returns an Ok if the point is inside the bounds of the
101    /// sprite (not just the image), and returns an Err otherwise.
102    pub fn compute_pixel_space_point(
103        &self,
104        point_relative_to_sprite: Vec2,
105        anchor: Anchor,
106        images: &Assets<Image>,
107        texture_atlases: &Assets<TextureAtlasLayout>,
108    ) -> Result<Vec2, Vec2> {
109        let image_size = images
110            .get(&self.image)
111            .map(Image::size)
112            .unwrap_or(UVec2::ONE);
113
114        let atlas_rect = self
115            .texture_atlas
116            .as_ref()
117            .and_then(|s| s.texture_rect(texture_atlases))
118            .map(|r| r.as_rect());
119        let texture_rect = match (atlas_rect, self.rect) {
120            (None, None) => Rect::new(0.0, 0.0, image_size.x as f32, image_size.y as f32),
121            (None, Some(sprite_rect)) => sprite_rect,
122            (Some(atlas_rect), None) => atlas_rect,
123            (Some(atlas_rect), Some(mut sprite_rect)) => {
124                // Make the sprite rect relative to the atlas rect.
125                sprite_rect.min += atlas_rect.min;
126                sprite_rect.max += atlas_rect.min;
127                sprite_rect
128            }
129        };
130
131        let sprite_size = self.custom_size.unwrap_or_else(|| texture_rect.size());
132        let sprite_center = -anchor.as_vec() * sprite_size;
133
134        let mut point_relative_to_sprite_center = point_relative_to_sprite - sprite_center;
135
136        if self.flip_x {
137            point_relative_to_sprite_center.x *= -1.0;
138        }
139        // Texture coordinates start at the top left, whereas world coordinates start at the bottom
140        // left. So flip by default, and then don't flip if `flip_y` is set.
141        if !self.flip_y {
142            point_relative_to_sprite_center.y *= -1.0;
143        }
144
145        if sprite_size.x == 0.0 || sprite_size.y == 0.0 {
146            return Err(point_relative_to_sprite_center);
147        }
148
149        let sprite_to_texture_ratio = {
150            let texture_size = texture_rect.size();
151            Vec2::new(
152                texture_size.x / sprite_size.x,
153                texture_size.y / sprite_size.y,
154            )
155        };
156
157        let point_relative_to_texture =
158            point_relative_to_sprite_center * sprite_to_texture_ratio + texture_rect.center();
159
160        // TODO: Support `SpriteImageMode`.
161
162        if texture_rect.contains(point_relative_to_texture) {
163            Ok(point_relative_to_texture)
164        } else {
165            Err(point_relative_to_texture)
166        }
167    }
168}
169
170// This is different from AlphaMode2d in bevy_sprite_render because that crate depends on this one,
171// so using it would've been caused a circular dependency. An option would be to move the Enum here
172// but it uses a bevy_render dependency in its documentation, and I wanted to avoid bringing that
173// dependency to this crate.
174
175// NOTE: If this is ever replaced by AlphaMode2d, make a custom Default impl for Sprite,
176// because AlphaMode2d defaults to Opaque, but the sprite's alpha mode is most commonly Mask(0.5)
177
178#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SpriteAlphaMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SpriteAlphaMode::Opaque =>
                ::core::fmt::Formatter::write_str(f, "Opaque"),
            SpriteAlphaMode::Mask(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Mask",
                    &__self_0),
            SpriteAlphaMode::Blend =>
                ::core::fmt::Formatter::write_str(f, "Blend"),
        }
    }
}Debug, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for SpriteAlphaMode 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) {
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for SpriteAlphaMode 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::Unit(bevy_reflect::enums::UnitVariantInfo::new("Opaque")),
                                                bevy_reflect::enums::VariantInfo::Tuple(bevy_reflect::enums::TupleVariantInfo::new("Mask",
                                                        &[bevy_reflect::UnnamedField::new::<f32>(0usize)])),
                                                bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Blend"))]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for SpriteAlphaMode where  {
            fn type_path() -> &'static str {
                "bevy_sprite::sprite_mesh::SpriteAlphaMode"
            }
            fn short_type_path() -> &'static str { "SpriteAlphaMode" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("SpriteAlphaMode")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_sprite::sprite_mesh".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_sprite::sprite_mesh")
            }
        }
        impl bevy_reflect::Reflect for SpriteAlphaMode 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(<SpriteAlphaMode
                                        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 SpriteAlphaMode where  {
            fn field(&self, __name_param: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match self { _ => ::core::option::Option::None, }
            }
            fn field_at(&self, __index_param: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match self {
                    SpriteAlphaMode::Mask { 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 { _ => ::core::option::Option::None, }
            }
            fn field_at_mut(&mut self, __index_param: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match self {
                    SpriteAlphaMode::Mask { 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 { _ => ::core::option::Option::None, }
            }
            fn name_at(&self, __index_param: usize)
                -> ::core::option::Option<&str> {
                match self { _ => ::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 {
                    SpriteAlphaMode::Opaque { .. } => 0usize,
                    SpriteAlphaMode::Mask { .. } => 1usize,
                    SpriteAlphaMode::Blend { .. } => 0usize,
                    _ => 0,
                }
            }
            #[inline]
            fn variant_name(&self) -> &str {
                match self {
                    SpriteAlphaMode::Opaque { .. } => "Opaque",
                    SpriteAlphaMode::Mask { .. } => "Mask",
                    SpriteAlphaMode::Blend { .. } => "Blend",
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            #[inline]
            fn variant_index(&self) -> usize {
                match self {
                    SpriteAlphaMode::Opaque { .. } => 0usize,
                    SpriteAlphaMode::Mask { .. } => 1usize,
                    SpriteAlphaMode::Blend { .. } => 2usize,
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            #[inline]
            fn variant_type(&self) -> bevy_reflect::enums::VariantType {
                match self {
                    SpriteAlphaMode::Opaque { .. } =>
                        bevy_reflect::enums::VariantType::Unit,
                    SpriteAlphaMode::Mask { .. } =>
                        bevy_reflect::enums::VariantType::Tuple,
                    SpriteAlphaMode::Blend { .. } =>
                        bevy_reflect::enums::VariantType::Unit,
                    _ =>
                        ::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 SpriteAlphaMode 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)
                            {
                            "Opaque" => { *self = SpriteAlphaMode::Opaque {} }
                            "Mask" => {
                                *self =
                                    SpriteAlphaMode::Mask {
                                        0: {
                                            let __0 = __value_param.field_at(0usize);
                                            let __0 =
                                                __0.ok_or(bevy_reflect::ApplyError::MissingEnumField {
                                                            variant_name: ::core::convert::Into::into("Mask"),
                                                            field_name: ::core::convert::Into::into(".0"),
                                                        })?;
                                            <f32 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(<f32 as
                                                                    bevy_reflect::TypePath>::type_path()),
                                                    })?
                                        },
                                    }
                            }
                            "Blend" => { *self = SpriteAlphaMode::Blend {} }
                            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 SpriteAlphaMode 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) {
                        "Opaque" =>
                            ::core::option::Option::Some(SpriteAlphaMode::Opaque {}),
                        "Mask" =>
                            ::core::option::Option::Some(SpriteAlphaMode::Mask {
                                    0: {
                                        let __0 = __param0.field_at(0usize);
                                        let __0 = __0?;
                                        <f32 as bevy_reflect::FromReflect>::from_reflect(__0)?
                                    },
                                }),
                        "Blend" =>
                            ::core::option::Option::Some(SpriteAlphaMode::Blend {}),
                        name => ::core::option::Option::None,
                    }
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, #[automatically_derived]
impl ::core::marker::Copy for SpriteAlphaMode { }Copy, #[automatically_derived]
impl ::core::clone::Clone for SpriteAlphaMode {
    #[inline]
    fn clone(&self) -> SpriteAlphaMode {
        let _: ::core::clone::AssertParamIsClone<f32>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for SpriteAlphaMode {
    #[inline]
    fn eq(&self, other: &SpriteAlphaMode) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (SpriteAlphaMode::Mask(__self_0),
                    SpriteAlphaMode::Mask(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
179#[reflect(Default, Debug, Clone)]
180pub enum SpriteAlphaMode {
181    /// Base color alpha values are overridden to be fully opaque (1.0).
182    Opaque,
183    /// Reduce transparency to fully opaque or fully transparent
184    /// based on a threshold.
185    ///
186    /// Compares the base color alpha value to the specified threshold.
187    /// If the value is below the threshold,
188    /// considers the color to be fully transparent (alpha is set to 0.0).
189    /// If it is equal to or above the threshold,
190    /// considers the color to be fully opaque (alpha is set to 1.0).
191    Mask(f32),
192    /// The base color alpha value defines the opacity of the color.
193    /// Standard alpha-blending is used to blend the fragment's color
194    /// with the color behind it.
195    Blend,
196}
197
198impl Default for SpriteAlphaMode {
199    fn default() -> Self {
200        Self::Mask(0.5)
201    }
202}