
BSN Public Experimentation, Streaming Video, and Compute Shaders
2025-07-21
This week we get what might be the most approved PR in Bevy history; and a sneaky reminder that you can review Bevy PRs. Even though 20190 ended up being a bit of a running joke to approve, running the examples on other PRs, trying to understand them, and asking questions is valuable work that anyone is allowed to do on any PR.
Some ongoing work in first-party tilemaps continues with #19924 bringing color tints and visibility data, while RenderStartup
schedule refactors and various macro improvements are also getting work done; and using Tracy for profiling can be a daunting first-time topic, which #20109 improves.
In the showcases we see some interesting compute shader work for wind patterns in grass, terrain generation, and raymarching. As well as progress and updates on games like To Build a Home, POLDERS, and more.
Bevy Scene Notation
BSN, or Bevy Scene Notation, saw some interesting developments this week with the introduction of a Draft PR put up for discussion. This PR is not meant to be merged but rather is a signifier of BSN moving into a "public experimentation phase".
Since this is an experimental draft PR I am going to make you read the PR for details if you're interested and we'll do an overview of the functionality in the future when the features merge. There is a lot of really great stuff in here though, like Template
, impl Scene
, and the bsn!
macro.
Streaming Textures
An experimental bevy_web_video crate was able to introduce the ability to stream video assets to a texture. This is a particularly exciting development.
There is a web demo playing Big Buck Bunny on a cube, and wgpu seems to be adding more support for GPUExternalTexture
which will increase performance of the approach on the web.
If you're looking for something similar you can use today, check out vleue_kinetoscope.
angle-weighted smooth normals
#18552 makes angle-weighted smooth normals the default implementation. This method weights normals by the angles of the corners of connected triangles, thus eliminating triangle area and count as factors in the final normal.
The difference can be seen in this exaggerated example
The code has some great comments here, and some nice ascii visualizations too.
// 5---------4
// /| /|
// 1-+-------0 |
// | 6-------|-7
// |/ |/
// 2---------3
Rhombus sampling
#20082 introduces sampling implementations for Rhombus. This is specifically an implementation of ShapeSample
which includes boundary and interior sampling.
Partial GPU Buffer Reads
Using the Readback
Component allows reading information from the GPU. You can see how this is currently used in the shader/gpu_readback
example.
Previously this approach only allowed full reads of a buffer, but #20133 enables using an offset to read partial data. This is already being used in the wild to readback terrain generated on the GPU to create colliders
FixedTimestep
Camera movement in the context of FixedTimesteps can be more complicated than it first appear as it includes factors like if the camera affects the direction of the character or the physics simulation. When should the camera rotate or translation relative to FixedTimesteps? #20089 ports an example to 3d to explain the details.
Solari Initial GI
Single-bounce Raytraced Global Illumination was added in #20020. This is an initial implementation of ReSTIR GI (pdf).
Given the nature of this work, the noise and image compression have significant effects on the image displayed in this issue. If you're interested in an accurate representation of what this looks like in practice, run the code yourself.
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.

DJ Software
showcase
DJ software that has all the basics of an FLX4 controller working, analyzing tracks bpm, key, metadata, etc. Multiple audio files can be analyzed in the background.

Grass with wind displacement
showcase
Progress on wind displacement shaders for vegetation/grass using manually gpu instanced grass. The end goal is to have the same wind system affect high end foliage assets with features like complex normals, SSAO and meshlets etc. as well as procedurally generated/predefined geometry while still allowing individual tweaking of assets.

Isometric pathfinding
showcase
Prototype 3d isometric tilemap support for bevy_northstar, a hierarchical pathfinding crate.


Nano-9: Celeste
showcase
Nano-9 running the original stenographically encoded Celeste Pico-8 PNG cart directly from the web


Boids
showcase
Boids simulation + "physics engine" for a uni project. Featuring:
- Normal boids (green)
- Boid testing unit (blue)
- Predator boids (red)
- Uniform grid searching other boids in neighboring cells
- The 3 main rules (cohesion, separation and alignment) + global wind
- Wind currents whose trajectory is described by cubic Bezier splines
- Force fields that repel (red) or attract (blue)
- Customizable settings


Crates
New releases to crates.io and substantial updates to existing projects
lightyear 0.22
crate_release
Lightyear is a full-featured networking library for bevy
0.22 brings a huge upgrade to the rollback logic.
Check out the tutorial
q_service
crate_release
q_service aims to bring a service model to Bevy. The crate is loosely modeled after systemd. It doesn't manage PID1, but it does manage user services, including those necessary for startup.
Services are resources which have built-in state, associated data, and managed dependencies. This crate extends the Bevy ECS to include this functionality. Because it is an engine extension, there is no associated plugin. Simply import the prelude and you're good to go.
bevy_light_2d
crate_release
A general purpose 2d lighting plugin.
0.7 brings a new Light2d
marker component that serves to allow enabling/disabling lighting, which is exemplified by a new "minimap" example.
Moonshine Framework v0.4
crate_release
Moonshine Framework is a self-described unconventional cocktail of libraries that do a number of different things including provide state machines, save/load logic, and more.
bevy_reflect: remove unnecessary `const _` around `TypePath` impl authored by nnethercote
FIX - RelativeCursorPosition Changed<> query filter authored by chamaloriz
Fix visibility (re)use in Solari DI authored by JMS55
Remove `SystemSetNode` authored by ItsDoot
Changing the notification protocol for core_widgets. authored by viridia
Solari initial GI authored by JMS55
Fix core widgets unconditionally enabling bevy_ui_picking_backend authored by atlv24
Mitigate Tracy dep version woes authored by liamaharon
`GpuReadbackPlugin`: Allow reading only a part of a buffer authored by EmbersArc
Rhombus sampling authored by lynn-lumen
Fix link to `bevy_solari` logo authored by BD103
Fix anisotropy not working when material is lit by environment map light authored by marlyx
Fix AmbientLight::affects_lightmapped_meshes not working authored by marlyx
Port the physics in fixed timestep example to 3D authored by janhohenheim
Refactor `2d_viewport_to_world` example with let chains authored by tim-blackbird
Add doc examples to `viewport_to_world(_2d)` authored by tim-blackbird
Constify `gradients` helper functions authored by ickshonpe
Split `BufferedEvent` from `Event` authored by tim-blackbird
feat: implement clone for IntoPipeSystem authored by mrchantey
Mini Blit refactor authored by ecoskey
Allow NotShadowCaster to be used with HierarchyPropagatePlugin. authored by coolcatcoder
Add zstd release note authored by atlv24
Add release note for light textures authored by atlv24
Prevent TOCTOU bugs in ComponentsQueuedRegistrator authored by SkiFire13
Use `RenderStartup` for `bevy_pbr` for some basic cases. authored by andriyDev
Robust Scrolling Example authored by tim-blackbird
Fix a `NestedLoader` code path that failed to use its meta transform authored by greeble-dev
Fixing a crash when minimizing a window with custom viewport. (#16704) authored by RuelYasa
Split `bundle.rs` authored by SkiFire13
Fix glTF light orientation authored by janhohenheim
Streamline `GetOwnership`/`FromArg`/`IntoReturn` authored by nnethercote
bevy_reflect: Use `active_types` instead of `active_fields` where appropriate authored by nnethercote
Switch most examples to use `RenderStartup` instead of `finish` and `FromWorld`. authored by andriyDev
Link `ComponentIdFor` in the `ComponentId` related docs authored by Sieluna
Rename the `InterpolationColorSpace` variants to match `Color`. authored by ickshonpe
Document repeating timer tick behavior authored by onbjerg
allow `EntityCloner` to move components without `Clone` or `Reflect` authored by eugineerd
Added finish method for timer authored by Lenchog
ReadOnlySystem diagnostics and type alias authored by ItsDoot
Use `RenderStartup` in `bevy_sprite`. authored by andriyDev
Use `RenderStartup` for all basic cases in `bevy_core_pipeline`. authored by andriyDev
Remove the need to derive `Event` when deriving `EntityEvent` authored by tim-blackbird
Text2d bounding box fix authored by ickshonpe
Improved UI scrolling support and bug fixes authored by ickshonpe
Improve node encapsulation in `ScheduleGraph` authored by ItsDoot
Expand MergeMeshError to include IncompatiblePrimitiveTopology variant authored by Pnoenix
Change `event` to `event_key` where it refers to an `EventKey` authored by SteveAlexander
Documentation improvement system_param.rs authored by tomaspecl
Add `EntityWorldMut::(try_)resource_scope` authored by BigWingBeat
fix crash in light textures example authored by robtfm
Preconvert colors before sending to shader authored by tylercritchlow
Remove unnecessary + `use<>` authored by cart
TilemapChunk single quad; TileData (color/visibility) authored by ConnerPetzold
Add angle-weighted smooth normals implementation (#18383) authored by Waridley
Don't ignore default query filters for `EntityRef` or `EntityMut` authored by chescock
Remove extraneous h parameter for D_GGX authored by JMS55
Improve the naming of a couple systems in `RenderStartup`. authored by andriyDev
dont normalize twice for no reason in octahedral_decode authored by atlv24
Change flattened dependency graph from `DiGraph<NodeId>` to `DiGraph<SystemKey>` authored by ItsDoot
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
Rework required components authored by SkiFire13
`spec_v2`: Blit authored by ecoskey
Improve `spec_v2` patterns authored by ecoskey
Handle unallocated GPU memory for mesh extraction authored by mate-h
Faster `FilteredEntity(Ref|Mut)` and `Entity(Ref|Mut)Except` by borrowing `Access` authored by chescock
Clean up specialized_mesh_pipeline authored by IceSentry
WIP: Fix glTF model forward direction authored by superdump
Workaround a crash in macOS tahoe 26 / xcode 16.4+ authored by ArthurBrussee
Refactor actions cache to be build on main authored by mockersf
Rebrand glTF coordinate conversion to an alternative strategy that is biased towards glTF models authored by janhohenheim
Implement closest_point for Segment[23]d. authored by IQuick143
`spec_v2`: Auto Exposure authored by ecoskey
Improve glTF coordinate migration guide authored by janhohenheim
Add a timer-powered `DelayedCommand` for delayed ECS actions authored by alice-i-cecile
enable codeql analysis authored by mockersf
Split observer events authored by tim-blackbird
pub GraphInfo authored by mrchantey
Add optional backface/frontface culling to Ray3d::intersect_plane authored by Mati18505
Next Generation Bevy Scenes authored by cart
Optimize solari initial and temporal DI authored by SparkyPotato
Use `RenderStartup` for order independent transparency authored by andriyDev
Changed the way cursors are defined in bevy_feathers. authored by viridia
stop exposing minimp3 authored by mockersf
Remove task in handle_tasks in async_compute example authored by IceSentry
Type-erased Specializers authored by ecoskey
feat: Add comprehensive read-only Bevy Inspector with remote inspection capabilities authored by jbuehler23
Fix `ComponentsRegistrator` unsoundness authored by SkiFire13
Use `RenderStartup` for atmosphere rendering. authored by andriyDev
Use `RenderStartup` for `occlusion_culling` example. authored by andriyDev
Use `RenderStartup` for SSAO systems. authored by andriyDev
Tile entities; TilemapLayer; TileStorage authored by ConnerPetzold
Internal Entities authored by Trashtalk217
Refresh hotpatches using change ticks instead of checking for a event authored by laundmo
propagate add reflect authored by rendaoer
Clean up `NodeId` kind fetching authored by ItsDoot
Use `RenderStartup` for screen space reflections. authored by andriyDev
Use `RenderStartup` for `CopyDeferredLightingIdPipeline`. authored by andriyDev
Issues Opened this week
Add nuance to the glTF coordinate migration guide authored by janhohenheim
Extensible Schedule Graphs authored by ItsDoot
Add generic component propagation / HierarchyPropagatePlugin to 0.17 release notes authored by alice-i-cecile
Crash when resizing the window on Windows authored by zachbateman
AmbientLight::affects_lightmapped_meshes doesn't work with deferred rendering authored by alice-i-cecile
`error_handler` example terminal output is too noisy on Windows authored by SkiFire13
Point light stops working when viewed from long distance authored by jnhyatt
StandardMaterial Support for Texture2dArray (Texture Arrays) authored by Vricken
Plugin infrastructure relies on type_name, despite non-uniqueness guarantees authored by GhostMinerPlus
`Ray3d::intersect_plane`'s behavior with respect to backface hits is unclear authored by alice-i-cecile
Bevy ignores explicit canvas size on web/webgpu platform authored by rectalogic
ExtendedMaterials no longer applied after visibility change authored by secretlyagoblin
`DespawnOnExitState` ignores disabled entities. authored by AlephCubed
Abstract out CursorIcon from bevy_winit authored by viridia
check-advisories CI is complaining about slice-ring-buffer 0.3.4 authored by alice-i-cecile
Observer tests contain unnecessary calls to `world.flush()` authored by tim-blackbird
`ComponentsRegistrator` exposes access to `&mut Components` authored by SkiFire13
`Component::register_required_components` can be implemented in an unsound way authored by SkiFire13
Add events that can be consumed, or can only be read once authored by Zeenobit
MouseMotion and AccumulatedMouseMotion deltas are doubled when cursor grab mode is not None authored by Sykotes
Relationship::on_replace docs are confusing authored by SteveAlexander
Solari tracking issue authored by JMS55
Explicitly state coordinate space in Aabb docs authored by jakey1947