use bevy::{
asset::embedded_asset, prelude::*, render::render_resource::AsBindGroup, shader::ShaderRef,
ui_render::ui_material::UiMaterial,
};
pub struct TiledBackgroundPlugin;
impl Plugin for TiledBackgroundPlugin {
fn build(&self, app: &mut App) {
embedded_asset!(app, "tiled_background.wgsl");
app.register_type::<TiledBackgroundMaterial>()
.register_asset_reflect::<TiledBackgroundMaterial>()
.add_plugins(UiMaterialPlugin::<TiledBackgroundMaterial>::default());
}
}
#[derive(AsBindGroup, Asset, Debug, Clone, Reflect)]
pub struct TiledBackgroundMaterial {
#[uniform(0)]
pub color: LinearRgba,
#[uniform(0)]
pub scale: f32,
#[uniform(0)]
pub rotation: f32,
#[uniform(0)]
pub stagger: f32,
#[uniform(0)]
pub spacing: f32,
#[uniform(0)]
pub scroll_speed: Vec2,
#[texture(1)]
#[sampler(2)]
pub pattern_texture: Handle<Image>,
}
impl Default for TiledBackgroundMaterial {
fn default() -> Self {
Self {
color: LinearRgba::WHITE,
scale: 1.0,
rotation: 0.0,
stagger: 0.0,
spacing: 0.0,
scroll_speed: Vec2::ZERO,
pattern_texture: Handle::default(),
}
}
}
impl UiMaterial for TiledBackgroundMaterial {
fn fragment_shader() -> ShaderRef {
"embedded://bevy_tiled_background/tiled_background.wgsl".into()
}
}