use crate::Material;1use bevy_asset::{AsAssetId, AssetId, Handle};2use bevy_derive::{Deref, DerefMut};3use bevy_ecs::{component::Component, reflect::ReflectComponent};4use bevy_reflect::{std_traits::ReflectDefault, Reflect};5use derive_more::derive::From;67/// A [material](Material) used for rendering a [`Mesh3d`].8///9/// See [`Material`] for general information about 3D materials and how to implement your own materials.10///11/// [`Mesh3d`]: bevy_mesh::Mesh3d12///13/// # Example14///15/// ```16/// # use bevy_pbr::{Material, MeshMaterial3d, StandardMaterial};17/// # use bevy_ecs::prelude::*;18/// # use bevy_mesh::{Mesh, Mesh3d};19/// # use bevy_color::palettes::basic::RED;20/// # use bevy_asset::Assets;21/// # use bevy_math::primitives::Capsule3d;22/// #23/// // Spawn an entity with a mesh using `StandardMaterial`.24/// fn setup(25/// mut commands: Commands,26/// mut meshes: ResMut<Assets<Mesh>>,27/// mut materials: ResMut<Assets<StandardMaterial>>,28/// ) {29/// commands.spawn((30/// Mesh3d(meshes.add(Capsule3d::default())),31/// MeshMaterial3d(materials.add(StandardMaterial {32/// base_color: RED.into(),33/// ..Default::default()34/// })),35/// ));36/// }37/// ```38#[derive(Component, Clone, Debug, Deref, DerefMut, Reflect, From)]39#[reflect(Component, Default, Clone, PartialEq)]40pub struct MeshMaterial3d<M: Material>(pub Handle<M>);4142impl<M: Material> Default for MeshMaterial3d<M> {43fn default() -> Self {44Self(Handle::default())45}46}4748impl<M: Material> PartialEq for MeshMaterial3d<M> {49fn eq(&self, other: &Self) -> bool {50self.0 == other.051}52}5354impl<M: Material> Eq for MeshMaterial3d<M> {}5556impl<M: Material> From<MeshMaterial3d<M>> for AssetId<M> {57fn from(material: MeshMaterial3d<M>) -> Self {58material.id()59}60}6162impl<M: Material> From<&MeshMaterial3d<M>> for AssetId<M> {63fn from(material: &MeshMaterial3d<M>) -> Self {64material.id()65}66}6768impl<M: Material> AsAssetId for MeshMaterial3d<M> {69type Asset = M;7071fn as_asset_id(&self) -> AssetId<Self::Asset> {72self.id()73}74}757677