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}