bevy_pbr/
mesh_material.rs

1use crate::Material;
2use bevy_asset::{AssetId, Handle};
3use bevy_derive::{Deref, DerefMut};
4use bevy_ecs::{component::Component, reflect::ReflectComponent};
5use bevy_reflect::{std_traits::ReflectDefault, Reflect};
6use derive_more::derive::From;
7
8/// A [material](Material) used for rendering a [`Mesh3d`].
9///
10/// See [`Material`] for general information about 3D materials and how to implement your own materials.
11///
12/// [`Mesh3d`]: bevy_render::mesh::Mesh3d
13///
14/// # Example
15///
16/// ```
17/// # use bevy_pbr::{Material, MeshMaterial3d, StandardMaterial};
18/// # use bevy_ecs::prelude::*;
19/// # use bevy_render::mesh::{Mesh, Mesh3d};
20/// # use bevy_color::palettes::basic::RED;
21/// # use bevy_asset::Assets;
22/// # use bevy_math::primitives::Capsule3d;
23/// #
24/// // Spawn an entity with a mesh using `StandardMaterial`.
25/// fn setup(
26///     mut commands: Commands,
27///     mut meshes: ResMut<Assets<Mesh>>,
28///     mut materials: ResMut<Assets<StandardMaterial>>,
29/// ) {
30///     commands.spawn((
31///         Mesh3d(meshes.add(Capsule3d::default())),
32///         MeshMaterial3d(materials.add(StandardMaterial {
33///             base_color: RED.into(),
34///             ..Default::default()
35///         })),
36///     ));
37/// }
38/// ```
39#[derive(Component, Clone, Debug, Deref, DerefMut, Reflect, PartialEq, Eq, From)]
40#[reflect(Component, Default)]
41pub struct MeshMaterial3d<M: Material>(pub Handle<M>);
42
43impl<M: Material> Default for MeshMaterial3d<M> {
44    fn default() -> Self {
45        Self(Handle::default())
46    }
47}
48
49impl<M: Material> From<MeshMaterial3d<M>> for AssetId<M> {
50    fn from(material: MeshMaterial3d<M>) -> Self {
51        material.id()
52    }
53}
54
55impl<M: Material> From<&MeshMaterial3d<M>> for AssetId<M> {
56    fn from(material: &MeshMaterial3d<M>) -> Self {
57        material.id()
58    }
59}