|
1 | 1 | use core::hash::Hash;
|
2 | 2 |
|
3 |
| -use bevy_asset::Asset; |
4 |
| -use bevy_render::render_resource::{AsBindGroup, RenderPipelineDescriptor, ShaderRef}; |
| 3 | +use bevy_asset::{Asset, AssetId, Handle}; |
| 4 | +use bevy_derive::{Deref, DerefMut}; |
| 5 | +use bevy_ecs::{component::Component, reflect::ReflectComponent}; |
| 6 | +use bevy_reflect::{prelude::ReflectDefault, Reflect}; |
| 7 | +use bevy_render::{ |
| 8 | + extract_component::ExtractComponent, |
| 9 | + render_resource::{AsBindGroup, RenderPipelineDescriptor, ShaderRef}, |
| 10 | +}; |
5 | 11 |
|
6 | 12 | /// Materials are used alongside [`UiMaterialPlugin`](crate::UiMaterialPlugin) and [`MaterialNodeBundle`](crate::prelude::MaterialNodeBundle)
|
7 | 13 | /// to spawn entities that are rendered with a specific [`UiMaterial`] type. They serve as an easy to use high level
|
@@ -56,10 +62,10 @@ use bevy_render::render_resource::{AsBindGroup, RenderPipelineDescriptor, Shader
|
56 | 62 | /// width: Val::Percent(100.0),
|
57 | 63 | /// ..Default::default()
|
58 | 64 | /// },
|
59 |
| -/// material: materials.add(CustomMaterial { |
| 65 | +/// material: UiMaterialHandle(materials.add(CustomMaterial { |
60 | 66 | /// color: LinearRgba::RED,
|
61 | 67 | /// color_texture: asset_server.load("some_image.png"),
|
62 |
| -/// }), |
| 68 | +/// })), |
63 | 69 | /// ..Default::default()
|
64 | 70 | /// });
|
65 | 71 | /// }
|
@@ -145,3 +151,31 @@ where
|
145 | 151 | self.bind_group_data.hash(state);
|
146 | 152 | }
|
147 | 153 | }
|
| 154 | + |
| 155 | +#[derive(Component, Clone, Debug, Deref, DerefMut, Reflect, PartialEq, Eq, ExtractComponent)] |
| 156 | +#[reflect(Component, Default)] |
| 157 | +pub struct UiMaterialHandle<M: UiMaterial>(pub Handle<M>); |
| 158 | + |
| 159 | +impl<M: UiMaterial> Default for UiMaterialHandle<M> { |
| 160 | + fn default() -> Self { |
| 161 | + Self(Handle::default()) |
| 162 | + } |
| 163 | +} |
| 164 | + |
| 165 | +impl<M: UiMaterial> From<Handle<M>> for UiMaterialHandle<M> { |
| 166 | + fn from(handle: Handle<M>) -> Self { |
| 167 | + Self(handle) |
| 168 | + } |
| 169 | +} |
| 170 | + |
| 171 | +impl<M: UiMaterial> From<UiMaterialHandle<M>> for AssetId<M> { |
| 172 | + fn from(material: UiMaterialHandle<M>) -> Self { |
| 173 | + material.id() |
| 174 | + } |
| 175 | +} |
| 176 | + |
| 177 | +impl<M: UiMaterial> From<&UiMaterialHandle<M>> for AssetId<M> { |
| 178 | + fn from(material: &UiMaterialHandle<M>) -> Self { |
| 179 | + material.id() |
| 180 | + } |
| 181 | +} |
0 commit comments