#bevy #macro #growing #set #add #witchcraft #bevy-ui

mevy

A growing set of macros, which add witchcraft into bevy!

3 releases

new 0.1.2 Jan 9, 2025
0.1.1 Jan 3, 2025
0.1.0 Jan 2, 2025

#230 in Game dev

Download history 251/week @ 2024-12-30 169/week @ 2025-01-06

420 downloads per month

MIT/Apache

36KB

A growing set of macros which add some witchcraft into bevy, currently available: 🪄

  • Style Sheet Notation for bevy_ui components (and your own) - ui!(( width: 20px; ))
  • Simplified Notation for Color, Val and UiRect - code!{ let red = #ff0000; //..any code }

[!IMPORTANT] This crate is meant to provide macros only - no additional bevy plugins, resources, components or systems

Simpler Hierarchy Spawning

Spawn children just by stating [] - the 'names' are just variables containing their Entity

spawn!{
    // component/bundle;
    // .method(..);
    SpecificChild(optional_child_name);
    [optional_child_name][
        // component;
        // .method(..);
    ]
}

CSS-like notation for bevy_ui

Using ui!((..)) (inner round braces) will return a tuple of mentioned components only.

c.spawn(ui!((
    size:          100px 100px;
    border:        5px #ff0000;
    box_shadow:    10% 10% 3px 8px #ffaa44;
    background:    #ffffff;
    border_radius: 6px;
    neat_outline;
)?));
//^ optional ? (or any token): hovering shows the returned tuple (if LSP used)

/// function as custom fields or p refabs
fn neat_outline() -> Outline {ui!((
    outline: 3px 1px #00ff00;
))}

Code Replacement Macro

Using the code!{} macro simplifies constructing:

  • Color by writing #rgb/#rgba/#rrggbb/#rrggbbaa
  • Val by writing 0px/0%/0vw/0vh/0vmin/0vmax/@(auto)
  • UiRect by writing [>0px]/[>0px 0px]/[>0px 0px 0px]/[>0px 0px 0px 0px] (css-like)

So you can do fun things like:

let shadow = code!{BoxShadow{
    // use #... is replaced with Color, meaning you can e.g. use methods 
    color: #FF1265.mix(&#F93ECA,0.4).with_alpha(0.2),
    x_offset: 100px,
    y_offset: 50%,
    spread_radius: 3.1vh,
    blur_radius: 40.23vmax,
}}};
let color = code!{#FF0000};
// or multiple things in the macro
code!{
    let color2 = #00FF00;
    let color3 = #6600AA;
}
println!{"{color2:?}"}

Version

Just to mention the obvious:

  • Macros are token-based, meaning they aren't hard-bound to a specific bevy version
  • However: These are mainly designed for bevy 0.15 and onwards
  • The closer your bevy version is to 0.15, the more things will work

Design

Crates are separated into:

  • crate/*/syntax: token handling, meant to be reusable
  • crate/*: actual macros, based on that 'syntax'

[!NOTE] Only relevant if you dig deeper into this crate: The versions of those are not hard linked, since the macros can keep (or gain) features, even if the the syntax api has changed. So if one of those is 0.2.x and the other 0.5.x at some point, don't worry.

Dependencies

~0.8–1.4MB
~25K SLoC