Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_feathers/src/alpha_pattern.rs
6595 views
1
use bevy_app::Plugin;
2
use bevy_asset::{Asset, Assets, Handle};
3
use bevy_ecs::{
4
component::Component,
5
lifecycle::Add,
6
observer::On,
7
reflect::ReflectComponent,
8
resource::Resource,
9
system::{Query, Res},
10
world::FromWorld,
11
};
12
use bevy_reflect::{prelude::ReflectDefault, Reflect, TypePath};
13
use bevy_render::render_resource::AsBindGroup;
14
use bevy_shader::ShaderRef;
15
use bevy_ui_render::ui_material::{MaterialNode, UiMaterial};
16
17
#[derive(AsBindGroup, Asset, TypePath, Default, Debug, Clone)]
18
pub(crate) struct AlphaPatternMaterial {}
19
20
impl UiMaterial for AlphaPatternMaterial {
21
fn fragment_shader() -> ShaderRef {
22
"embedded://bevy_feathers/assets/shaders/alpha_pattern.wgsl".into()
23
}
24
}
25
26
#[derive(Resource)]
27
pub(crate) struct AlphaPatternResource(pub(crate) Handle<AlphaPatternMaterial>);
28
29
impl FromWorld for AlphaPatternResource {
30
fn from_world(world: &mut bevy_ecs::world::World) -> Self {
31
let mut ui_materials = world
32
.get_resource_mut::<Assets<AlphaPatternMaterial>>()
33
.unwrap();
34
Self(ui_materials.add(AlphaPatternMaterial::default()))
35
}
36
}
37
38
/// Marker that tells us we want to fill in the [`MaterialNode`] with the alpha material.
39
#[derive(Component, Default, Clone, Reflect)]
40
#[reflect(Component, Default)]
41
pub(crate) struct AlphaPattern;
42
43
/// Observer to fill in the material handle (since we don't have access to the materials asset
44
/// in the template)
45
fn on_add_alpha_pattern(
46
ev: On<Add, AlphaPattern>,
47
mut q_material_node: Query<&mut MaterialNode<AlphaPatternMaterial>>,
48
r_material: Res<AlphaPatternResource>,
49
) {
50
if let Ok(mut material) = q_material_node.get_mut(ev.entity()) {
51
material.0 = r_material.0.clone();
52
}
53
}
54
55
/// Plugin which registers the systems for updating the button styles.
56
pub struct AlphaPatternPlugin;
57
58
impl Plugin for AlphaPatternPlugin {
59
fn build(&self, app: &mut bevy_app::App) {
60
app.add_observer(on_add_alpha_pattern);
61
}
62
}
63
64