 dd49dc71d2
			
		
	
	
		dd49dc71d2
		
			
		
	
	
	
	
		
			
			# Objective The `UiBoxShadowSamples` resource should be renamed to `BoxShadowSamples` so it matches the `BoxShadow` component. ## Migration Guide `UiBoxShadowSamples` has been renamed to `BoxShadowSamples`
		
			
				
	
	
		
			268 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! This example shows how to create a node with a shadow
 | |
| 
 | |
| use argh::FromArgs;
 | |
| use bevy::color::palettes::css::BLUE;
 | |
| use bevy::color::palettes::css::DEEP_SKY_BLUE;
 | |
| use bevy::color::palettes::css::GREEN;
 | |
| use bevy::color::palettes::css::LIGHT_SKY_BLUE;
 | |
| use bevy::color::palettes::css::RED;
 | |
| use bevy::color::palettes::css::YELLOW;
 | |
| 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, BoxShadowSamples(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,
 | |
|                 ));
 | |
|             }
 | |
| 
 | |
|             // Demonstrate multiple shadows on one node
 | |
|             commands.spawn((
 | |
|                 Node {
 | |
|                     width: Val::Px(40.),
 | |
|                     height: Val::Px(40.),
 | |
|                     border: UiRect::all(Val::Px(4.)),
 | |
|                     ..default()
 | |
|                 },
 | |
|                 BorderColor(LIGHT_SKY_BLUE.into()),
 | |
|                 BorderRadius::all(Val::Px(20.)),
 | |
|                 BackgroundColor(DEEP_SKY_BLUE.into()),
 | |
|                 BoxShadow(vec![
 | |
|                     ShadowStyle {
 | |
|                         color: RED.with_alpha(0.7).into(),
 | |
|                         x_offset: Val::Px(-20.),
 | |
|                         y_offset: Val::Px(-5.),
 | |
|                         spread_radius: Val::Percent(10.),
 | |
|                         blur_radius: Val::Px(3.),
 | |
|                     },
 | |
|                     ShadowStyle {
 | |
|                         color: BLUE.with_alpha(0.7).into(),
 | |
|                         x_offset: Val::Px(-5.),
 | |
|                         y_offset: Val::Px(-20.),
 | |
|                         spread_radius: Val::Percent(10.),
 | |
|                         blur_radius: Val::Px(3.),
 | |
|                     },
 | |
|                     ShadowStyle {
 | |
|                         color: YELLOW.with_alpha(0.7).into(),
 | |
|                         x_offset: Val::Px(20.),
 | |
|                         y_offset: Val::Px(5.),
 | |
|                         spread_radius: Val::Percent(10.),
 | |
|                         blur_radius: Val::Px(3.),
 | |
|                     },
 | |
|                     ShadowStyle {
 | |
|                         color: GREEN.with_alpha(0.7).into(),
 | |
|                         x_offset: Val::Px(5.),
 | |
|                         y_offset: Val::Px(20.),
 | |
|                         spread_radius: Val::Percent(10.),
 | |
|                         blur_radius: Val::Px(3.),
 | |
|                     },
 | |
|                 ]),
 | |
|             ));
 | |
|         });
 | |
| }
 | |
| 
 | |
| 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::new(
 | |
|             Color::BLACK.with_alpha(0.8),
 | |
|             Val::Percent(offset.x),
 | |
|             Val::Percent(offset.y),
 | |
|             Val::Percent(spread),
 | |
|             Val::Px(blur),
 | |
|         ),
 | |
|     )
 | |
| }
 |