Path: blob/main/crates/bevy_feathers/src/alpha_pattern.rs
6595 views
use bevy_app::Plugin;1use bevy_asset::{Asset, Assets, Handle};2use bevy_ecs::{3component::Component,4lifecycle::Add,5observer::On,6reflect::ReflectComponent,7resource::Resource,8system::{Query, Res},9world::FromWorld,10};11use bevy_reflect::{prelude::ReflectDefault, Reflect, TypePath};12use bevy_render::render_resource::AsBindGroup;13use bevy_shader::ShaderRef;14use bevy_ui_render::ui_material::{MaterialNode, UiMaterial};1516#[derive(AsBindGroup, Asset, TypePath, Default, Debug, Clone)]17pub(crate) struct AlphaPatternMaterial {}1819impl UiMaterial for AlphaPatternMaterial {20fn fragment_shader() -> ShaderRef {21"embedded://bevy_feathers/assets/shaders/alpha_pattern.wgsl".into()22}23}2425#[derive(Resource)]26pub(crate) struct AlphaPatternResource(pub(crate) Handle<AlphaPatternMaterial>);2728impl FromWorld for AlphaPatternResource {29fn from_world(world: &mut bevy_ecs::world::World) -> Self {30let mut ui_materials = world31.get_resource_mut::<Assets<AlphaPatternMaterial>>()32.unwrap();33Self(ui_materials.add(AlphaPatternMaterial::default()))34}35}3637/// Marker that tells us we want to fill in the [`MaterialNode`] with the alpha material.38#[derive(Component, Default, Clone, Reflect)]39#[reflect(Component, Default)]40pub(crate) struct AlphaPattern;4142/// Observer to fill in the material handle (since we don't have access to the materials asset43/// in the template)44fn on_add_alpha_pattern(45ev: On<Add, AlphaPattern>,46mut q_material_node: Query<&mut MaterialNode<AlphaPatternMaterial>>,47r_material: Res<AlphaPatternResource>,48) {49if let Ok(mut material) = q_material_node.get_mut(ev.entity()) {50material.0 = r_material.0.clone();51}52}5354/// Plugin which registers the systems for updating the button styles.55pub struct AlphaPatternPlugin;5657impl Plugin for AlphaPatternPlugin {58fn build(&self, app: &mut bevy_app::App) {59app.add_observer(on_add_alpha_pattern);60}61}626364