bevyengine / bevy

A refreshingly simple data-driven game engine built in Rust
https://bevyengine.org
Apache License 2.0
36.46k stars 3.6k forks source link

Multiple box shadow support #16502

Open ickshonpe opened 3 days ago

ickshonpe commented 3 days ago

Objective

Add support for multiple box shadows on a single Node.

Solution

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),
    )
));
alice-i-cecile commented 3 days ago

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.

ickshonpe commented 3 days ago

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

ickshonpe commented 3 days ago

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.