Multiple box shadow support
Objective
Add support for multiple box shadows on a single Node.
Solution
- Rename
BoxShadowtoShadowStyleand remove itsComponentderive. - Create a new
BoxShadowcomponent that newtypes aVec<ShadowStyle>. - Add a
newconstructor method toBoxShadowfor single shadows. - Change
extract_shadowsto 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
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),
)
));
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.
Wondering if it's more or less confusing to call optional components non-required/unrequired instead 😕
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.
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.