This Week in Bevy

What happened this week in the Bevy Engine ecosystem

Links

Shift-O, SoupRune, and Volumetric Clouds

2025-12-22

This week we have a combination of features that made it into the 0.18 release candidate, as well as the first PRs merged for the 0.19 cycle.

Merges this week include global gizmos, glTF extension handling, a FullscreenMaterial, and more.

Shift-O is a Bevy Jam 6 game with updates this week, while SoupRune is an in-progress framework for Undertale/Deltarune fan games.

Easy Demo Recording

Creating game screenshots and videos for social media, trailers, etc is now easier with EasyScreenshotPlugin and as of #21237, EasyScreenRecordPlugin. It comes with some caveats, like not being available on Windows, but enables recording video in CI, as shown in #21243.

So now there is built-in screenshotting and video recording, and you can script functionality like camera movement using the tools you already know.

Global Gizmos

global gizmos

#22107 brings a global version of gizmos, which can be useful outside of Bevy systems. This PR is a partial upstream of glizmo

use bevy_gizmos::prelude::*;
use bevy_math::prelude::*;
use bevy_color::palettes::basic::WHITE;

fn draw() {
    gizmo().sphere(Isometry3d::IDENTITY, 0.5, WHITE);
}

glTF Extension Handling

Bevy supports a selection of hard-coded glTF extensions, including KHR_lights_punctual (which powering glTF directional, point, and spot lights), and it supports glTF extras which are application-specific "extra" glTF data.

#22106 added the ability to process glTF extension data in userspace by defining a trait-based handler with a set of hooks for nodes, materials, textures, and more. This was originally implemented to power Skein's component insertion and can be used for a variety of use cases such as building animation graphs or switching meshes from 3d to 2d when loading.

cargo run --example gltf_extension_animation_graph
cargo run --example gltf_extension_mesh_2d

FullscreenMaterial

fullscreen shader

Running a fullscreen shader often brings users to the post_processing example, which is a fairly large example that exposes wgpu more directly than higher-level Material apis.

#20414 introduces a first version of a FullscreenMaterial which will run a fullscreen triangle with the specified shader. There's more to be done here, so consider this a first step towards higher level fullscreen material apis.

cargo run --example fullscreen_material

PreviousState

Before #21995, we had State and NextState resources. Now we also have PreviousState which can be accessed from systems like those that run OnEnter to know which state the application is transitioning from.

Font Weight

font weights

#22038 brings support for font weights!

cargo run --example font_weights

RenderTarget as Component

A first step towards something like a RendersTo relationship, #20917 makes RenderTarget a component.

Transparent Sorting improvements

transparent sorting

There are cases where meshes take on "globally positioned vertices" and use the same Transform. This can be a useful approach in procedural, CAD, or architectural style workflows.

#22041 makes these sorts of cases behave better with transparency by sorting meshes by AABB center instead of Transform translation.

Showcase

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

recursive portals

Recursive Portals

showcase

A demo using bevy_easy_portals to make recursively infinite portals

shift-o

Shift-O

showcase

An update to the Bevy Jam #6 entry: Shift-O.

The update includes new UI, difficulty progression changes, additional mechanics, and level ratings.

souprune

SoupRune

showcase

SoupRune is a framework for creating Undertale/Deltarune-style RPG / STGs. This showcase includes:

  • Custom SDF UI Rendering: A mesh-based UI system using SDF for infinite scaling and crisp borders (like the dialogue boxes).
  • Data-Driven Architecture: Everything (UI layouts, Character stats) is loaded from .ron files.
spacefaring.is

Spacefaring.is

showcase

Spacefaring is a mission planning sandbox where you can launch a satellite into geostationary orbit.

volumetric clouds

Volumetric Clouds

showcase

This volumetric clouds demo brought the volumetric clouds enthusiasts out and resulted in an updated (wip) in-engine PR for potential future upstreaming.

The author details how the clouds are placed:

The planets each have a shader module that overrides virtual functions to output data for a position on the sphere. There are functions that produce terrain elevation and color, and there is one that outputs cloud density. That data is then written to a texture with six layers for the cube sphere. The clouds are static right now but I think that can be made dynamic in the future.

kinect

Kinect 360 Particles

showcase

A demo using an old Kinect to power particle effects.

geometry clipmaps

Geometry Clipmaps

showcase

A work-in-progress implementation of geometry clipmaps. The video demonstrates rendering a 8,192 x 8,192 km map, using ~50k triangles.

cuboid wars

Cuboid Wars

showcase

Cuboid Wars is a fast-paced multiplayer arena shooter built with Rust, Bevy, and QUIC networking. Players navigate a procedurally-generated maze, collect cookies for points, gather power-ups, and avoid ghosts. The game features a client-server architecture with authoritative server logic and client-side prediction.

pixel black hole

Pixel Art Black Hole

showcase

A blackhole visualization shader for Gravastar, a new roguelike. First semi-closed playtest around Christmas incoming.

rogue.subroutine

rogue.subroutine

showcase

This game got a name and a title screen.

Crates

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

bevy_tiled_background

bevy_tiled_background

crate_release

A Bevy plugin/demo for creating tiled, animated UI backgrounds with support for rotation, staggering, spacing, and scrolling animation.

Actuate v0.21

crate_release

A declarative, lifetime-friendly UI framework and scene builder for Bevy

use actuate::prelude::*;

#[derive(Data)]
struct Counter {
    start: i32,
}

impl Compose for Counter {
    fn compose(cx: Scope<Self>) -> impl Compose {
        let count = use_mut(&cx, || cx.me().start);

        material_ui((
            text::headline(format!("High five count: {}", count)),
            button(text::label("Up high"))
                .on_click(move || SignalMut::update(count, |x| *x += 1)),
            button(text::label("Down low"))
                .on_click(move || SignalMut::update(count, |x| *x -= 1)),
            if *count == 0 {
                Some(text::label("Gimme five!"))
            } else {
                None
            },
        ))
        .align_items(AlignItems::Center)
        .justify_content(JustifyContent::Center)
    }
}

Devlogs

vlog style updates from long-term projects

maiu online

Making Things Look Better - Maiu Online MMO Devlog #8

devlog

Maiu Online gets ground texture blending, player and monster models with animations and monster sounds.

Educational

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

How I made AAA Sky Rendering from scratch

educational

An open source sky shader with gradient background+stars+northern lights (aurora).

The crate is bevy_sky_gradient

Unifying the Fuller Stack with Entity Component System

educational

A talk at DevOps Days Wollongong that describes the frictions faced by developers when traversing the stack both horizontally and vertically, and the characteristics of ECS that make it an excellent contender to unify the stack.

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