Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_pbr/src/mesh_material.rs
6598 views
1
use crate::Material;
2
use bevy_asset::{AsAssetId, AssetId, Handle};
3
use bevy_derive::{Deref, DerefMut};
4
use bevy_ecs::{component::Component, reflect::ReflectComponent};
5
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
6
use 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_mesh::Mesh3d
13
///
14
/// # Example
15
///
16
/// ```
17
/// # use bevy_pbr::{Material, MeshMaterial3d, StandardMaterial};
18
/// # use bevy_ecs::prelude::*;
19
/// # use bevy_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, From)]
40
#[reflect(Component, Default, Clone, PartialEq)]
41
pub struct MeshMaterial3d<M: Material>(pub Handle<M>);
42
43
impl<M: Material> Default for MeshMaterial3d<M> {
44
fn default() -> Self {
45
Self(Handle::default())
46
}
47
}
48
49
impl<M: Material> PartialEq for MeshMaterial3d<M> {
50
fn eq(&self, other: &Self) -> bool {
51
self.0 == other.0
52
}
53
}
54
55
impl<M: Material> Eq for MeshMaterial3d<M> {}
56
57
impl<M: Material> From<MeshMaterial3d<M>> for AssetId<M> {
58
fn from(material: MeshMaterial3d<M>) -> Self {
59
material.id()
60
}
61
}
62
63
impl<M: Material> From<&MeshMaterial3d<M>> for AssetId<M> {
64
fn from(material: &MeshMaterial3d<M>) -> Self {
65
material.id()
66
}
67
}
68
69
impl<M: Material> AsAssetId for MeshMaterial3d<M> {
70
type Asset = M;
71
72
fn as_asset_id(&self) -> AssetId<Self::Asset> {
73
self.id()
74
}
75
}
76
77