
The next big step for Avian performance, Light Textures, and playtests
2025-07-07
This Week in Bevy a series of improvements were made to the Reflect
derive, such as #19906 and rendering is landing features and refactors including Light Textures.
Interesting new functionality is on the horizon for a Hanabi Particle Editor as well as performance improvements in crates like Avian.
We also highlight some commercial Bevy usage from Nominal and Foresight as well as playtests for To Build A Home and Rare Episteme.
Light Textures
LightTextures (or light cookies, or light functions, or light projectors), introduced in #18031, enable effects like window shadows, faked caustics,
A PointLightTexture
can be added to a PointLight
, a SpotLightTexture
can be added to a SpotLight
, or a DirectionalLightTexture
can be added to a DirectionalLight
to apply a texture mask is applied to the light source to modulate its intensity.
RenderStartup
The RenderStartup
schedule was introduced in #19841 to provide a place to spawn RenderApp
-specific logic and its been used in a number of places including examples like #19886: Use RenderStartup in custom_post_processing example and in rendering-related crates.
Bevy Remote Protocol
Clients using the Bevy Remote Protocol that intend to build World Inspector style functionality would benefit from an endpoint that retrieves all of the relevant information for all entities. #19857 does exactly that, introducing BRP functionality that returns All
component values.
New Ease structs
#18739 adds a new way to use easing functions that fits in with the larger Curve system. Using these structs directly allows sampling each of the curve types.
SmoothStep.sample(t);
Elastic(50.0).sample(t);
Steps(4, JumpAt::Start).sample(t)
Bevy Feathers
The series of Bevy standard widgets continues.
#19928 introduces toggle switches to bevy_feathers while #19900 introduces checkboxes.
CoreScollbar
was also added in #19803.
Crate reorganization
Bevy's UI rendering was moved into bevy_ui_render
in #18703 to make it easier to improve the UI renderer, allow the UI renderer to be used with other UI frameworks (apart from bevy_ui
), and for using alternative renderers like Vello. Work was also done this week to enable a new bevy_light
crate.
Composable Pipeline Specialization
If you've written a custom Material
or used lower level rendering APIs you might be familiar with the specialize function which allows the customization of render pipelines. #17373 changes the underlying functionality to be composable via a new Specializer
trait.
The Specializer
trait now mutates a base descriptor instead of producing one. The new APIs, including GetBaseDescriptor
and Specializer
, can be examined in the shader/custom_phase_item
example.
wgpu adapter selection
As of #19921, applications can specify WGPU_ADAPTER_NAME
or WGPU_FORCE_FALLBACK_ADAPTER
to give priority to rendering adapters.
Alice's Merge Train is a maintainer-level view into active PRs and how the Bevy sausage is made.

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

Rare Episteme
showcase
Rare Episteme | Museum of Dead Card Games is an online multiplayer anti-trading trading card game where you can design cards and bring them to a shared deck to fight an opponent, first one to draw from an empty deck loses!
This game had its first online, in-browser playtesting weekend!
Preview it on YouTube

To Build a Home Playtest
showcase
The To Build a Home playtest is underway. To Build a home is a 2D life simulation game.

Flowing Water
showcase
A first attempt at flowing water. A comment in the Discord thread suggests checking out this site on the wayback machine for those interested.

RoomMD
showcase
Inspired by AACircuit (a program where you can draw electronic schematics with ASCII characters), RoomMD is a tool to create ascii art sketches of a home as 3D models; it is a tool to create 3D building plans.

2048
showcase
A 2048 implementation with various board sizes, implemented as a plugin test case for some in-development plugins.

Bevy Linter + VSCode
showcase
Improvements to the Bevy Linter, in this case the insert_unit_bundle lint specifically. In the process the linter has been hooked up to VSCode's automatic suggestions.
bevy_mod_config preview
showcase
bevy_mod_config is a work-in-progress modular settings management framework.
#[derive(Config)]
struct Foo {
#[config(default = 1.0, min = 0.0, max = 10.0)]
thickness: f32,
#[config(default = Color::WHITE)]
color: Color,
}

Font Storage
showcase
A demo (with source code!) of storing and using a variety of fonts.
They're stored as tables with each font having, RegularFont
, BoldFont
, ItalicFont
, BoldItalicFont
, DefaultFontSize
, and DefaultFontColor
. Each font can then be referred to via relationships on entities with text (with a DefaultFont
as a fallback).

Bevy Atmospherics Tests
showcase
A series of experiments with different values for Bevy Atmospherics, resulting in a visual board of the effect of various value changes.

The next big step for Avian performance
showcase
The next big step for Avian's performance: a parallel constraint solver with graph coloring!
Some physics engines such as Rapier use inter-island parallelism, where bodies are grouped into disjoint simulation islands that can be safely solved in parallel, since each body only belongs to a single island. However, it does not help with large islands, such as big piles of objects, because constraints within each island must still be solved serially.
Many state-of-the art physics solvers such as Box2D instead use graph coloring, which assigns "colors" to constraints such that no adjacent edges in the graph share the same color. This ensures that each body appears at most once in each color, and allows constraints within each color to be solved in parallel without race conditions. This works even for large islands, and also opens the door to using wide SIMD for the solver.
The benefit of graph coloring shows. With a large pyramid, Avian now scales to multiple threads very well, even beating Rapier in performance when multi-threaded. Rapier has a very flat profile in comparison, as it needs to solve the whole pyramid serially.

Crates
New releases to crates.io and substantial updates to existing projects
haalka 0.5.1
crate_release
haalka is an ergonomic reactivity library powered by the FRP signals of futures-signals. It is a port of the web UI libraries MoonZoon and Dominator and offers the same signal semantics as a thin layer on top of bevy_ui. While haalka is primarily targeted at UI and provides high level UI abstractions as such, its core abstraction can be used to manage signals-powered reactivity for any entity, not just bevy_ui nodes.
lightyear 0.21
crate_release
Lightyear is a full-featured networking library for bevy.
0.21 has brought a full rewrite of the crate which in turn brings bevy_enhanced_input support and more
bevy_auto_plugin 0.3
crate_release
bevy_auto_plugin is designed to reduce the boilerplate required when creating Bevy plugins.
With new stabilizations in Rust 1.88, the need to use nightly with bevy_auto_plugin has been removed!
bevy_northstar 0.3.0
crate_release
bevy_northstar is an HPA* crate for Bevy.
In 0.3 the API has substantially changed as a result of user feedback. Accordingly the bevy_northstar book has also been updated
bevy_webgate
crate_release
bevy_webgate is a fork of bevy_webserver that adds
- Multi-port support - Run multiple servers on different ports
- IP binding control - Bind servers to specific IP addresses
bevy_vello 0.10.2
crate_release
bevy_vello is a cross-platform, 2D compute-centric vector graphics rendering library for Bevy. There is default support for rendering text and scenes, with additional opt-in features for SVG and Lottie.

Devlogs
vlog style updates from long-term projects
Voxel Hex
devlog
The underlying project here is an exploration of voxel raytracing in Rust that uses Bevy for rendering. The video details a visibility-based data streaming technique that keeps GPU buffers in check.
bevy_ui compilation authored by mockersf
Meshlet BVH Culling authored by atlv24
Make `DebugName` work when building with no default features authored by chescock
Don't create errors for ignored failed commands authored by brianreavis
bevy_ecs: remove use of needless_return authored by mockersf
bevy_platform: clippy without default features authored by mockersf
bevy_utils: clippy without debug feature enabled authored by mockersf
bevy_input: build warnings without bevy_reflect authored by mockersf
Move `TextShadow` to `text` widget module authored by ickshonpe
`core_widgets` example slider fix authored by ickshonpe
Add RenderStartup schedule to the RenderApp authored by IceSentry
Dds transcode channel order fix authored by atlv24
bevy_solari ReSTIR DI authored by JMS55
bevy_reflect: avoid useless `with_{custom_attributes,docs}` calls authored by nnethercote
bevy_reflect: avoid duplicate type bounds in derived methods authored by nnethercote
CoreScrollbar widget. authored by viridia
Split LatePrepassNode query in a few groups authored by IceSentry
bevy_window: fix compilation without default features authored by mockersf
Light Textures authored by robtfm
Spawn batch with relationship authored by gwafotapa
Prevent `AnimationGraph` from serializing `AssetId`s. authored by andriyDev
Restructure the logic in `AssetServer::load_internal` to avoid using weak handles. authored by andriyDev
Fix sprite picking viewport authored by jannik4
Fix ui picking outside the viewport authored by jannik4
Add benchmarks for spawning and inserting bundles authored by SkiFire13
Update log_layers_ecs example for children macro authored by krunchington
Update ui_test requirement from 0.29.1 to 0.30.1 authored by mnmaita
Update bevy website link in newer code authored by maximemulder
Correctly disable prepass/shadows when configured on MaterialPlugin<M> authored by tychedelia
Solari: Merge reservoir file, reformulate confidence weight authored by JMS55
Feathers checkbox authored by viridia
Newtyped `ScrollPosition` authored by ickshonpe
UI z-ordering fix authored by ickshonpe
Flatten `PrepassPipelineInternal` into `PrepassPipeline`. authored by andriyDev
Move `ExtractInstancesPlugin<EnvironmentMapIds>` init to app. authored by andriyDev
Use RenderStartup in MaterialPlugin authored by IceSentry
Use RenderStartup in custom_post_processing example authored by IceSentry
Composable Pipeline Specialization authored by ecoskey
EntityEvent derive: Fix silent error authored by SpecificProtagonist
Change core widgets to use callback enum instead of option authored by viridia
Replace `Handle::Weak` with `Handle::Uuid`. authored by andriyDev
Ecs derive docs authored by SpecificProtagonist
Implement `MapEntities` for arrays, `HashMap`, `BTreeMap`, `IndexMap` authored by Azorlogh
set required-features for example light_textures & clustered_decals authored by mockersf
Add instructions for GPU debugging in Xcode authored by jf908
Allow calling `add_render_graph_node` on `World`. authored by andriyDev
Make render and compute pipeline descriptors defaultable. authored by tychedelia
Add unit structs for each ease function authored by greeble-dev
fix skin uniform buffer size authored by robtfm
Add test that repros #11111 (different loader settings produce same asset) authored by greeble-dev
bevy_reflect: streamline generated `FromReflect::from_reflect` authored by nnethercote
Avoid unnecessary `ReflectMeta` arguments authored by nnethercote
Use `RenderStartup` in `bevy_gizmos`. authored by andriyDev
Use `RenderStartup` in `bevy_anti_aliasing`. authored by andriyDev
spec_v2: minor revisions authored by ecoskey
Feathers toggle switches. authored by viridia
Set checkbox and radio fill color to gray when disabled in core widgets example authored by jordanhalase
Fixing sprite pixel space point computation for sprites with zero custom_size authored by AtheMathmo
Use `SlotMap`s to store systems and system sets in `Schedule`s authored by ItsDoot
Add support for returning all `Component` and values to query method in the Bevy Remote Protocol authored by jbuehler23
Fix docs typo authored by theotherphil
improved the entity_index_map unit test authored by Wuketuke
Remove leftover apply deferred example metadata from Cargo.toml authored by adsick
Have `System::run_unsafe` return `Result`. authored by chescock
Add options for selecting adapter by name and forcing fallback authored by tychedelia
fix panic looking for extension in multibyte unicode paths authored by robtfm
bevy_reflect: Remove unnecessary `allow(unused_mut)`. authored by nnethercote
`bevy_ui_render` crate authored by ickshonpe
Split bevy_camera out of bevy_render authored by atlv24
Observer trigger refactor authored by Zeophlite
add must_use to register_component_hooks authored by atlv24
refactor(mesh): move Mesh3d and Mesh2d into bevy_mesh authored by atlv24
Move CubemapLayout out of decal code authored by atlv24
Minor code readability improvement in enum_utility.access_field authored by theotherphil
move Cubemap stuff alongside CubemapFrusta in bevy_camera::primitives authored by atlv24
move calculate_cluster_factors to cluster assign authored by atlv24
move light stuff out of decal cluster authored by atlv24
move ShadowsEnabled to material authored by atlv24
fix a couple typos in CubemapLayout authored by atlv24
move ClusteredDecal to cluster module authored by atlv24
move spot light function into spot light file authored by atlv24
make cluster assign not depend on RenderAdapter/RenderDevice authored by atlv24
move some Visibility stuff to bevy_camera::visibility authored by atlv24
Move Camera3d/2d to bevy_camera authored by atlv24
Use `RenderStartup` in `bevy_ui`. authored by andriyDev
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
Upgrade to `wgpu` version `26.0` authored by tychedelia
Change most RenderApp accesses to panics instead of silently doing nothing/half the work. authored by andriyDev
Initial DLSS implementation authored by JMS55
Spawn multiple chunks in the tilemap_chunk example authored by kristoff3r
bevy_reflect: remove unnecessary `const _` around `TypePath` impl authored by nnethercote
Use `RenderStartup` for `bevy_solari`. authored by andriyDev
bevy_reflect: Use `active_types` instead of `active_fields` where appropriate authored by nnethercote
TilemapChunk single quad; TileData (color/visibility) authored by ConnerPetzold
Run `RenderStartup` in/before extract instead of after it. authored by andriyDev
Stop using `AssetId` in the `AssetServer` and use `AssetIndex` instead. authored by andriyDev
bevy_reflect: Avoid trait bounds on non-generic types authored by nnethercote
Skip allocation of zero size meshes authored by kerstop
Optimize spawn_batch + relations authored by gwafotapa
Implement display for direction authored by stevehello166
bevy_reflect: Introduce `reflect_clone_and_take`. authored by nnethercote
`spec_v2`: migrate bloom authored by ecoskey
Remove `Bundle::register_required_components` authored by SkiFire13
extract cluster extract to a separate module authored by atlv24
Issues Opened this week
`Disabled` should disable observers / `World` APIs do not respect default query filters authored by CorvusPrudens
`RequiredComponent.inheritance_depth` docs do not match`Component` derive impl authored by urben1680
Optimize spawn_batch + relations authored by alice-i-cecile
Chained observers don't work when with OnRemove when entity is despawned authored by Freyja-moth
Use RenderStartup instead of a FromWorld impl whenever possible authored by IceSentry
`EntityEntryCommands::or_insert_with` should not invoke the closure if the component exists authored by chescock
Expose `RayMeshHit` for `Pointer` events authored by vladbat00
Panic when using an empty list in `trigger_targets` authored by Freyja-moth
`#[derive(Reflect)]` generates excessive amounts of code authored by nnethercote
`RenderStartup` runs after `ExtractSchedule` authored by andriyDev
Add more docs around `type_path` and it's usage authored by jbuehler23
Misaligned buttons in bevy_feathers showcase authored by theotherphil
Document that Cranelift breaks LLDB variable inspection authored by lucidBrot
AppExit event not being received in bevy 0.16 authored by cswinter
Allow evicting shaders from the `PipelineCache` authored by CrushedPixel
`ExtractComponent` creates required components on extract authored by tychedelia
Add tracing to `apply deferred` authored by adsick
FogVolume floats around when the camera moves authored by Phara0h
Bevy should become less of a rust-analyzer stress test authored by workingjubilee
Assets path are already removed on AssetEvents::Unused authored by mirsella
UI layout testbed authored by ickshonpe
`spec_v2` migration tracking issue authored by ecoskey
Segfault during panic unwinding in vulkan validation layers authored by gmorenz
[Bloom](https://github.com/bevyengine/bevy/pull/19966) authored by ecoskey
unwrap() failed in bevy_tasks/src/single_threaded_task_pool.rs:178 authored by kpreid