This Week in Bevy

What happened this week in the Bevy Engine ecosystem

Links

Entity Mapping, Cloning, Disabling, and more

2025-02-10

This Week in Bevy rendering takes even more advantage of the retained rendering world that was merged into 0.15. Scene spawning, entity cloning, and entity disabling all saw progress this week which is just more proof that the next release will be a big one yet again.

Out in the community we get a flashback to Advent of Code 2024 with Bevy-based visualizations for the puzzles, procedural audio generation for car engines, and 3d scan data being used.

The This Week in Bevy site also got an update to Leptos 0.7 in preparation for some more changes coming soon 👀

Entity Mapping and Cloning

The recent Relationships functionality put extra stress on the current entity mapping system which #17687 resolved by improving entity mapping and cloning which are both closely related to Scene spawning functionality.

Components now have first-class mapping behavior and new attributes to go along with it and next steps are looking to use the improvements to spawn Scenes.

#[derive(Component, Reflect)]
#[reflect(Component)]
struct Inventory {
    size: usize,
    #[entities]
    items: Vec<Entity>,
}

weak_handle!

Writing a shader module that can be distributed on crates.io and imported by Bevy users typically requires a manually initialized Handle and using load_internal_asset!.

const SHADER: Handle<Shader> = Handle::weak_from_u128(314685653797097581405914117016993910609);

#17384 introduces a weak_handle! macro which now accepts uuids, making it easier to pick a number that doesn't conflict with anything else.

const SHADER: Handle<Shader> = weak_handle!("1347c9b7-c46a-48e7-b7b8-023a354b7cac");

editing materials on gltfs

editing materials

How to change the material on an entity in a scene spawned from a gltf asset is a common question that as of #17677 now has an official example in the Bevy repo.

cargo run --example edit_material_on_gltf

text shadow

text shadow

#17559 adds support for text shadow to bevy_ui. This is a basic text shadow implemented by replicating the text with and offset and color. Future implementations could support a blur radius.

Retained Bins

A PhaseItem is rendered as part of a render phase (which you can learn about in the custom_phase_item example. Batchable phase items are stored in bins, which as of #17698 are now retained from frame to frame instead of being reconstructed.

Cold Specialization

Materials (really, pipelines) can be specialized to modify the RenderPipelineDescriptor. As of #17567 pipeline ids are cached and only recomputed when necessary.

Atmosphere LUT parameterization

Atmospheric LUTs

Improvements to procedural atmospheric scattering were implemented in #17555.

Disabled entity marker component

Building on DefaultQueryFilters, #17514 introduces an initial Disabled marker. This component is a first-party marker for entity disabling.


Alice's Merge Train is a maintainer-level view into active PRs, both those that are merging and those that need work.

Showcase

Bevy work from the #showcase channel in Discord and around the internet. Use hashtag #bevyengine.

tree generation

Tree Mesh Generation

showcase

Tree mesh generation in Bevy, which is live on a web deployment to play with.

day/night dekirisu

Standing Around

showcase

A day/night cycle with a character standing around near a fountain of magic.

bevy_defer + axum demo

showcase

This demo forms a webserver you can attach to any of your bevy projects to serve files or whatever else.

fn main() {
    App::new()
        .add_plugins(WevyServerPlugins)
        .insert_resource(RouterWrapper(
            Router::new().route("/owo", get(owo_get)),
        ))
        .add_systems(Startup, setup)
        .run();
    println!("Hello, world!");
}

fn setup(mut commands: Commands) {
    commands.spawn(Transform {
        translation: Vec3::new(69.0, 420.0, 2025.0),
        rotation: Default::default(),
        scale: Default::default(),
    });
}

async fn owo_get() -> String {
    AsyncWorld
        .query_single::<&Transform>()
        .get_mut(|q| -> String {
            serde_json::to_string(q).unwrap()
        })
        .unwrap()
}
path of exile 2 skill tree

Path of Exile 2 Graph Exploration

showcase

An improvement to the Path of Exile 2 graph exploration that takes specific stats to form a desired build.

varg mirrorsvarg doors

Varg: Doors and Mirrors

showcase

Varg, a love letter to the classic MS-DOS “boomer” shooter genre, got doors and (fake) mirrors in this dev update.

leaves and rain

Leaves and Rain

showcase

Leaves shaking on trees in a rainy top-down environment.

live terrain generation

Live Terrain Generation

showcase

Experimentation with the idea of live terrain generation in preparation for an "earth-bending" style ability.

advent of code 2024

Advent of Code 2024 Visualizations

showcase

Visualizations in Bevy for all 25 days of Advent of Code 2024 often built with exclusively ui nodes.

splashratssplashrats water

Splash Rats

showcase

Grokka Games's debut title has been in a pseudo-stealth mode and they've decided to start posting more dev updates. Splash Rats is a physics-based 2d co-op action game with liquid physics. Development is quite early, especially on visuals, but mechanics and physics have had a decent amount of work.

monster

Monster do spin

showcase

60gb of 3d scan data of a Monster can. A cad model of the can was made before making a lower poly version and baking the scanned texture onto the low poly model.

menu bindings

Input rebinding menu

showcase

A bindings menu originally made for a game and extracted into a standalone example for bevy_enhanced_input.

space game

Space Game with Heightmap

showcase

A new space game that progressed during the week to enabled barrel rolls.

flight the power

Flight the Power

showcase

Flight the Power is an entry to Dunkey/BigMode's 2025 GameJam. Currently only a windows download exists, but web and mobile could be on the way after a refactor.

Crates

New releases to crates.io and substantial updates to existing projects

bevy_behave

bevy_behave

crate_release

bevy_behave is a behavior tree crate which does on-demand spawning for task nodes, and uses observers for non-entity tasks

bevy_mod_skinned_aabb

bevy_mod_skinned_aabb 0.1.0

crate_release

bevy_mod_skinned_aabb automatically calculates AABBs for skinned meshes. This is a community-driven fix for disappearing meshes.

bevy_child_window

bevy_child_window 0.1

crate_release

bevy_child_window provides a way to embed a child window within the Bevy parent window. It currently works on Windows and macOS.

bevy_webview_wry v0.2.0

crate_release

bevy_webview_wry added support for embedded HTML, which combined with support for bevy_child_window enables displaying a webview inside of a child window.

bevy_lit

bevy_lit v0.6

crate_release

bevy_lit is a 2D lighting library.

0.6 brings the ability to use any Mesh2d or texture as an occluder, better performance using Jump Flood, and a new tint_occluder to control whether occlusion areas should tint with ambient light.

bevy_replicon

Bevy Replicon 0.30.0

crate_release

bevy_replicon 0.30 introduces remote triggers. The API is similar to networked events.

app.add_client_trigger::<DummyEvent>(
    ChannelKind::Ordered,
)
.add_observer(receive_events)
.add_systems(
    Update,
    send_events.run_if(client_connected),
);

fn send_events(mut commands: Commands) {
    commands.client_trigger(DummyEvent);
}

fn receive_events(
    trigger: Trigger<FromClient<DummyEvent>>,
) {
    info!(
        "received event {:?} from {:?}",
        trigger.event, trigger.client_id
    );
}

Devlogs

vlog style updates from long-term projects

Elevated Arcana

devlog

An ongoing daily devlog for Elevated Arcana

Educational

Tutorials, deep dives, and other information on developing Bevy applications, games, and plugins

leat engine

Making a Car Engine Sound with Leat & Bevy

educational

Leat is a pure-rust visual node-based dataflow language that is capable of designing a patch, exporting it to files, and import into Bevy. The goal is to enable the creation of dynamic sounds and procedural music that reacts to gameplay. This video covers creating and using such a sound to generate car engine audio

Pull Requests Merged This Week
Contributing

Want to contribute to Bevy?

Here you can find two types of potential contribution: Pull Requests that might need review and Issues that might need to be worked on.

How do I contribute?

Pull Requests Opened this week

Issues Opened this week