
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

#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

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

#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

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.


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
showcase
Spacefaring is a mission planning sandbox where you can launch a satellite into geostationary orbit.

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.

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.

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

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

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
Bump tracy-client version authored by Lampan-git
Recompute AABBs authored by aevyrie
system combinators short circuiting with system failure authored by janis-bhm
Retain asset without data for RENDER_WORLD-only assets authored by robtfm
Fix shadow caster/receiver toggle not working authored by momoluna444
Add FullscreenMaterial authored by IceSentry
bug: Fix stackoverflow on asset reload. authored by shanecelis
`spec_v2`: migrate line gizmos authored by ecoskey
Add support for arbitrary/third party glTF Extension processing via GltfExtensionHandler authored by ChristopherBiscardi
Fix non-srgb `RenderTarget::Image` authored by beicause
scrollbar helper functions authored by ickshonpe
make example clustered_decal_maps deterministic authored by mockersf
Add PresentMode fallbacks authored by atlv24
Make it possible to statically construct gizmo buffers authored by atlv24
Solari: Double buffer prepass textures authored by JMS55
Add sprite slicing scene to testbed_2d example authored by snk-git-hub
Support MainPassResolutionOverride for Atmosphere authored by jannik4
Replace path canonicalize with our own version. authored by andriyDev
Use mesh bounds center for transparent/transmissive sorting authored by venhelhardt
Convert RenderTarget to `Component` authored by tychedelia
Global Gizmos authored by atlv24
single query per node in UI picking backend authored by ickshonpe
UI scrollbars clipping fix authored by ickshonpe
`spec_v2`: migrate TAA authored by ecoskey
Easy screenrecording plugin authored by mockersf
`ComputedNode` box model helper functions authored by ickshonpe
reflect rendertarget authored by ChristopherBiscardi
Make BRP builtins utilities `parse` and `parse_some` public authored by Nilirad
Refactor GltfExtensionHandler Hooks authored by ChristopherBiscardi
derive `Clone` and `Copy` for newer `interaction_states` unit structs authored by databasedav
Use slice `last` instead of iter `last. authored by andriyDev
Fix compilation errors and warnings when running bevy_gltf with no features. authored by andriyDev
Doc trivial ecs unsafe authored by hymm
fix migration guides and release note headers authored by atlv24
Optimize BundleInserter::insert compile time authored by atlv24
More missing `Measured2d` impls authored by lynn-lumen
Alternative glTF coordinate conversion authored by greeble-dev
install x264 linux dependency in CI jobs that need it authored by mockersf
Refactor `EntityEvent` to support `ContainsEntity`, unlocking the use of kinded entities with observers authored by Zeenobit
Allow using short type names for asset processors. authored by andriyDev
impl `Measured3d` for `ConicalFrustum` authored by lynn-lumen
Add warning about tracy being enabled authored by laundmo
Refactor window creation logic authored by kristoff3r
Allow `Reader` to implement `AsyncSeek` and provide a way for loaders to "ask" for a compatible reader. authored by andriyDev
Easy demo recording authored by mockersf
Suppress Warnings for unused code in bevy_gizmos_render authored by kfc35
`LayoutContext` doc comment fix authored by ickshonpe
disable scraping examples in doc authored by mockersf
Implement `TryStableInterpolate`. authored by viridia
Deduplicate world_to_view logic authored by Breakdown-Dog
Revert "bug: Fix stackoverflow on asset reload. (#21619)" authored by andriyDev
Implement Reflect for `indexmap::IndexMap`and `indexmap::IndexSet` authored by 2ne1ugly
Adds ViewportCoords Scene to examples/testbed/ui, Removes viewport_debug example authored by kfc35
Simplify UI layout tests authored by ickshonpe
Put input sources for `bevy_input` under features authored by Shatur
Resolve `BorderRect` ambiguity authored by ickshonpe
Font weight support authored by ickshonpe
`spec_v2`: migrate CAS authored by ecoskey
Prevent the transaction log for a bevy_asset test from writing to the file system. authored by andriyDev
Fix atmosphere lighting issue for below ground geo authored by mate-h
Avoid panicking in unapproved path tests. authored by andriyDev
Name the fields of `FontAtlasKey` authored by ickshonpe
Revise release_notes/get_components_mut.md authored by Architector4
`auto_rebuild_ui_navigation_graph` visibility fix authored by ickshonpe
Enable the necessary features for `bevy_input` for `bevy_input_focus` authored by Shatur
fix use-after-free in `AddObserver` authored by grind086
Revert "Fix: Clears directional navigation map between rebuilds authored by alice-i-cecile
register read on DefaultErrorHandler in CombinatorSystem authored by janis-bhm
Fix shader import in manual 2d mesh example authored by NiklasEi
impl Deref for BackgroundColor authored by IWonderWhatThisAPIDoes
Add name to pass span to make the error better authored by atlv24
Fix a crash in late_mesh_preprocessing authored by atlv24
Add PreviousState Resource accessible in OnEnter authored by Br3nnabee
Add missing keybind to gizmos example authored by pablo-lua
bevy_asset fails lint expectation in wasm on ProcessError authored by mockersf
safety lint in bevy_reflect on wasm authored by mockersf
fix unused warnings in bevy_dev_tools on wasm authored by mockersf
add features in bevy_input_focus matching bevy_input authored by mockersf
Fix AABB in Mesh::take_gpu_data authored by oliver-dew
Update the key creation for `cache-restore` is done on `update-cachesyml` authored by WaterWhisperer
Move allow unsafe_op_in_unsafe_fn to module level in bevy_ecs authored by hymm
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.
Pull Requests Opened this week
Only shadow caster authored by rlneumiller
Replace `RenderGraph` with systems authored by tychedelia
GltfExtensionHandler::on_texture: pass Texture references authored by ChristopherBiscardi
disable screenrecording on windows authored by mockersf
Add `ExtractableAsset` trait for accessing extractable data authored by beicause
Fix: Clears directional navigation map between rebuilds authored by kfc35
Fix: Ignores nodes that are hidden via their parents in directional nav authored by kfc35
Minimal Font Families, Font Queries, Collections, System Fonts, Stretch, and Slant support authored by ickshonpe
Add `with_cloned_input` and `WithClonedInputWrapper` to system functionality authored by pantaelaman
Add support for SSR on web authored by mate-h
fixing docs with scraping examples enabled authored by mockersf
Fix 3d gizmo pipeline when atmosphere present authored by mate-h
Enable primitive restart by default authored by beicause
MeshAllocator: Take padding elements into account in the MeshBufferSlice's range authored by beicause
Add `ConditionalSendStream` trait authored by stevehello166
Remove dependency from "bevy_platform/web" to "bevy_platform/std" authored by kpreid
bevy_asset: support upgrading Reader to SeekableReader authored by cart
feat(bevy_ecs): add `Severity` metadata to `BevyError` authored by syszery
Fix separate layers with lines and joints authored by yh1970
Extra `testbed_ui` font cases authored by ickshonpe
`DirectionalNavigationMap` no longer caches `AutoDirectionalNavigation` node connections authored by kfc35
Make `write_default_meta_file_for_path` write the short type path instead of the long type path. authored by andriyDev
Adds ability to pause in gizmo examples authored by kfc35
Bundle nonnull deref safety authored by hymm
impl `VisitAssetDependencies` for `bevy_platform::collections::HashMap` authored by Strikeless
Issues Opened this week
Observers not getting despawned on DespawnOnExit authored by zwazel
Flaky Asset Test breaking CI sporadically: no_error_on_unknown_type_deferred_load_of_self_path authored by kfc35
Screen recording is disabled on Windows authored by alice-i-cecile
Full build is broken on OSX authored by bvssvni
`mesh2d_manual` example doesn't render authored by beicause
Is `Aabb2d::contains` intended to use inclusive bounds? authored by unagii256
Unhelpful error for invalid textures authored by Cr0a3
Clarify the Bevy UI and Taffy boundary authored by ickshonpe
Tilemap chunk update has ambiguous scheduling authored by tbillington
Strange clipping in joints in gizmos example authored by pablo-lua
0.18: Write Solari release notes authored by JMS55
0.18: Write virtual geometry migration guide authored by JMS55
`no_std` regression: is `features = ["web"]` supposed to affect non-web targets? authored by kpreid
Multiple fonts in a single `Text` do not work unless there is a space character authored by rparrett
Bevy won't build on Pop!_OS 24.04 Wayland authored by TheDarkThief
When a font for a text section isn't found it should still render it using a fallback font authored by ickshonpe
MorphViewerPlugin doesn't work properly in `scene_viewer` authored by beicause
Bevy `3d_gizmos` doesn't have closed shapes authored by pablo-lua
Make bevy gizmos examples pausable authored by pablo-lua
Strange flickering in bevy `3d_gizmos` example authored by pablo-lua
Solari: Incorrect usage of non-mainpass viewport size in shaders authored by JMS55
0.18 Regression: Updated images occasionally never displayed on materials authored by DGriffin91
0.18: Potential panic when accessing Meshes due to retained render world only assets authored by beicause





