bevy icon indicating copy to clipboard operation
bevy copied to clipboard

Multiple box shadow support

Open ickshonpe opened this issue 1 year ago • 3 comments

Objective

Add support for multiple box shadows on a single Node.

Solution

  • Rename BoxShadow to ShadowStyle and remove its Component derive.
  • Create a new BoxShadow component that newtypes a Vec<ShadowStyle>.
  • Add a new constructor method to BoxShadow for single shadows.
  • Change extract_shadows to iterate through a list of shadows per node.

Render order is determined implicitly from the order of the shadows stored in the BoxShadow component, back-to-front. Might be more efficient to use a SmallVec<[ShadowStyle; 1]> for the list of shadows but not sure if the extra friction is worth it.

Testing

Added a node with four differently coloured shadows to the box_shadow example.


Showcase

cargo run --example box_shadow
four-shadow

Migration Guide

Bevy UI now supports multiple shadows per node. A new struct ShadowStyle is used to set the style for each shadow. And the BoxShadow component is changed to a tuple struct wrapping a vector containing a list of ShadowStyles. To spawn a node with a single shadow you can use the new constructor function:

commands.spawn((
    Node::default(),
    BoxShadow::new(
        Color::BLACK.with_alpha(0.8),
        Val::Percent(offset.x),
        Val::Percent(offset.y),
        Val::Percent(spread),
        Val::Px(blur),
    )
));

ickshonpe avatar Nov 25 '24 12:11 ickshonpe

I like the feature and the API. I'd probably do a smallvec myself, but we should bench that and do it in follow-up.

alice-i-cecile avatar Nov 25 '24 17:11 alice-i-cecile

Wondering if it's more or less confusing to call optional components non-required/unrequired instead 😕

ickshonpe avatar Nov 25 '24 17:11 ickshonpe

I like the feature and the API. I'd probably do a smallvec myself, but we should bench that and do it in follow-up.

Yeah it seems to me in practical terms it's unusual to use a very large number of shadows and if you do it's most likely because you are are using multiple shadows in which case the smallvec would allocate on the heap anyway.

ickshonpe avatar Nov 25 '24 17:11 ickshonpe

Thank you to everyone involved with the authoring or reviewing of this PR! This work is relatively important and needs release notes! Head over to https://github.com/bevyengine/bevy-website/issues/1958 if you'd like to help out.

alice-i-cecile avatar Mar 25 '25 20:03 alice-i-cecile