Support Warning
WebGPU is currently only supported on Chrome starting with version 113, and only on desktop. If they don't work on your configuration, you can check the WebGL2 examples here.//! This example shows how to create a node with a shadow
use argh::FromArgs;
use bevy::color::palettes::css::DEEP_SKY_BLUE;
use bevy::color::palettes::css::LIGHT_SKY_BLUE;
use bevy::prelude::*;
use bevy::winit::WinitSettings;
#[derive(FromArgs, Resource)]
/// `box_shadow` example
struct Args {
/// number of samples
#[argh(option, default = "4")]
samples: u32,
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
// Only run the app when there is user input. This will significantly reduce CPU/GPU use.
.insert_resource(WinitSettings::desktop_app())
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands) {
// `from_env` panics on the web
#[cfg(not(target_arch = "wasm32"))]
let args: Args = argh::from_env();
#[cfg(target_arch = "wasm32")]
let args = Args::from_args(&[], &[]).unwrap();
// ui camera
commands.spawn((Camera2d, UiBoxShadowSamples(args.samples)));
commands
.spawn((
Node {
width: Val::Percent(100.0),
height: Val::Percent(100.0),
padding: UiRect::all(Val::Px(30.)),
column_gap: Val::Px(30.),
flex_wrap: FlexWrap::Wrap,
..default()
},
BackgroundColor(DEEP_SKY_BLUE.into()),
))
.with_children(|commands| {
let example_nodes = [
(
Vec2::splat(50.),
Vec2::ZERO,
10.,
0.,
BorderRadius::bottom_right(Val::Px(10.)),
),
(Vec2::new(50., 25.), Vec2::ZERO, 10., 0., BorderRadius::ZERO),
(Vec2::splat(50.), Vec2::ZERO, 10., 0., BorderRadius::MAX),
(Vec2::new(100., 25.), Vec2::ZERO, 10., 0., BorderRadius::MAX),
(
Vec2::splat(50.),
Vec2::ZERO,
10.,
0.,
BorderRadius::bottom_right(Val::Px(10.)),
),
(Vec2::new(50., 25.), Vec2::ZERO, 0., 10., BorderRadius::ZERO),
(
Vec2::splat(50.),
Vec2::ZERO,
0.,
10.,
BorderRadius::bottom_right(Val::Px(10.)),
),
(Vec2::new(100., 25.), Vec2::ZERO, 0., 10., BorderRadius::MAX),
(
Vec2::splat(50.),
Vec2::splat(25.),
0.,
0.,
BorderRadius::ZERO,
),
(
Vec2::new(50., 25.),
Vec2::splat(25.),
0.,
0.,
BorderRadius::ZERO,
),
(
Vec2::splat(50.),
Vec2::splat(10.),
0.,
0.,
BorderRadius::bottom_right(Val::Px(10.)),
),
(
Vec2::splat(50.),
Vec2::splat(25.),
0.,
10.,
BorderRadius::ZERO,
),
(
Vec2::new(50., 25.),
Vec2::splat(25.),
0.,
10.,
BorderRadius::ZERO,
),
(
Vec2::splat(50.),
Vec2::splat(10.),
0.,
10.,
BorderRadius::bottom_right(Val::Px(10.)),
),
(
Vec2::splat(50.),
Vec2::splat(10.),
0.,
3.,
BorderRadius::ZERO,
),
(
Vec2::new(50., 25.),
Vec2::splat(10.),
0.,
3.,
BorderRadius::ZERO,
),
(
Vec2::splat(50.),
Vec2::splat(10.),
0.,
3.,
BorderRadius::bottom_right(Val::Px(10.)),
),
(
Vec2::splat(50.),
Vec2::splat(10.),
0.,
3.,
BorderRadius::all(Val::Px(20.)),
),
(
Vec2::new(50., 25.),
Vec2::splat(10.),
0.,
3.,
BorderRadius::all(Val::Px(20.)),
),
(
Vec2::new(25., 50.),
Vec2::splat(10.),
0.,
3.,
BorderRadius::MAX,
),
(
Vec2::splat(50.),
Vec2::splat(10.),
0.,
10.,
BorderRadius::all(Val::Px(20.)),
),
(
Vec2::new(50., 25.),
Vec2::splat(10.),
0.,
10.,
BorderRadius::all(Val::Px(20.)),
),
(
Vec2::new(25., 50.),
Vec2::splat(10.),
0.,
10.,
BorderRadius::MAX,
),
];
for (size, offset, spread, blur, border_radius) in example_nodes {
commands.spawn(box_shadow_node_bundle(
size,
offset,
spread,
blur,
border_radius,
));
}
});
}
fn box_shadow_node_bundle(
size: Vec2,
offset: Vec2,
spread: f32,
blur: f32,
border_radius: BorderRadius,
) -> impl Bundle {
(
Node {
width: Val::Px(size.x),
height: Val::Px(size.y),
border: UiRect::all(Val::Px(4.)),
..default()
},
BorderColor(LIGHT_SKY_BLUE.into()),
border_radius,
BackgroundColor(DEEP_SKY_BLUE.into()),
BoxShadow {
color: Color::BLACK.with_alpha(0.8),
x_offset: Val::Percent(offset.x),
y_offset: Val::Percent(offset.y),
spread_radius: Val::Percent(spread),
blur_radius: Val::Px(blur),
},
)
}