
LongStory 2, bevy_feathers, and Type Erased Materials
2025-06-30
LongStory 2, a new visual novel game, was released to Steam and Itch.io this week.
Bevy upgraded to wgpu 25 and Rust 1.88.
We also see the continued development of some jam games, building into compute shaders and more.
Bevy Feathers
#19730 introduces Bevy Feathers, an opinionated widget toolkit and theming system intended for use by the Bevy Editor, World Inspector, and other tools.
The bevy_feathers
crate is incomplete and hidden behind an experimental feature flag. The API is going to change significantly before release.
Type Erased Materials
In order to enable a number of patterns for dynamic materials in the engine, decouples the renderer from the Material trait.
This opens the possibility for:
- Materials that aren't coupled to
AsBindGroup
. - 2d using the underlying 3d bindless infrastructure.
- Dynamic materials that can change their layout at runtime.
- Materials that aren't even backed by a Rust struct at all.
A new example, 3d/manual_material
, demonstrates how to implement a material manually using the mid-level render APIs
TilemapChunk Rendering
#18866 is a first step towards first-party tilemaps, starting with a simple TilemapChunk
rendering abstraction.
Check out the new tilemap_chunk
example.
fn setup(mut commands: Commands, assets: Res<AssetServer>) {
let mut rng = ChaCha8Rng::seed_from_u64(42);
let chunk_size = UVec2::splat(64);
let tile_display_size = UVec2::splat(8);
let indices: Vec<Option<u16>> = (0..chunk_size.element_product())
.map(|_| rng.gen_range(0..5))
.map(|i| if i == 0 { None } else { Some(i - 1) })
.collect();
commands.spawn((
TilemapChunk {
chunk_size,
tile_display_size,
tileset: assets.load("textures/array_texture.png"),
..default()
},
TilemapChunkIndices(indices),
));
commands.spawn(Camera2d);
commands.insert_resource(SeededRng(rng));
}
Core Widgets
#19778 adds Radio Buttons to the core widgets
Serializable Meshes
#19743 brings serializable meshes which means that you can now attempt use cases such as sending a mesh over the Bevy Remote Protocol.
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.

Fluid Simulation
showcase
A simplified (ie: not realistic) using "the pipe method" to move vertices on a plane.


LongStory 2
showcase

DBM Knight's Tour
showcase
The addition of difficulty, tour types, and start position configuration to "DBM Knight's Tour"

First draft: bevy_mod_asset_packs
showcase
bevy_mod_asset_packs
implements a Cargo-like package manager within Bevy, to enable creating modular data packs for your game. It's implemented on top of modified AssetReader trait, together with support for downloading assets packs from Git repositories, Git-LFS and custom registrars.

Crates
New releases to crates.io and substantial updates to existing projects
bevy_urdf
crate_release
Import robots from urdf descriptors and run simulations with Rapier.
Including support for drones.
bevy_config_stack 0.2.0
crate_release
bevy_config_stack
loads .ron files from the assets directory into resources, implementing hot-reloading to keep Resources up to date.
bevy_slow_text_outline v0.1.0
crate_release
bevy_slow_text_outline
adds a TextOutline
component for UI text outlines.
The implementation is naive, so outline widths are capped at 8 by default. Small widths (e.g. 1 or 2) will not have serious perf issues.

Educational
Tutorials, deep dives, and other information on developing Bevy applications, games, and plugins
Coding Active Ragdolls with Bevy & Rust
educational
Creating a physics based character controller with procedural animations
Add `num_entities()` to World authored by Trashtalk217
Improve module structure of observers code authored by alice-i-cecile
Bump Version after Release authored by github-actions[bot]
`EntityWorldMut` methods do not automatically overwrite `Relationship` components authored by urben1680
Add newlines before impl blocks authored by theotherphil
bevy_solari: RIS for Direct Lighting authored by JMS55
Fix some typos authored by rparrett
Let Component::map_entities defer to MapEntities authored by Testare
Explanation for the 'classic' fog example authored by fallible-algebra
Rename num_entities to entity_count authored by mgi388
Core radio button and radio group authored by viridia
CI tests can exit directly after taking a screenshot authored by mockersf
TilemapChunk cleanup authored by ConnerPetzold
Upstream raycasting UVs authored by aevyrie
add forgotten migration guide authored by atlv24
remove unneeded dependency from bevy_render authored by atlv24
Allow images to be resized on the GPU without losing data authored by tychedelia
Add TilemapChunk rendering authored by ConnerPetzold
`Projection` Improvements authored by aevyrie
Split overloaded basis-universal feature into compressed_image_saver authored by atlv24
Add write_buffer_range to RawBufferVec and BufferVec authored by IceSentry
Implement serializable mesh authored by janhohenheim
Allow setting correct glTF coordinate conversions globally authored by janhohenheim
Split `EntityClonerBuilder` in `OptOut` and `OptIn` variants authored by urben1680
Replace `FULLSCREEN_SHADER_HANDLE` with a `FullscreenShader` resource. authored by andriyDev
Update doc about Windows CursorGrabMode support authored by jf908
Reuse seeded rng in tilemap_chunk for more determinism authored by rparrett
Fix `PartialReflect::apply` for maps, remove `get_at/_mut` from `Map` trait authored by Azorlogh
updating: very very minorly authored by atlv24
add native zstd support authored by atlv24
Add UVec to_extents helper method authored by atlv24
Ugrade to `wgpu` version `25.0` authored by tychedelia
Upgrade to Rust 1.88 authored by tychedelia
Type erased materials authored by tychedelia
CoreRadio should require Checkable, not Checked. authored by viridia
Opt-out for UI clipping authored by ickshonpe
Resolution override authored by tychedelia
cleanup constants authored by atlv24
use sequential bindings in bevy_sprite authored by atlv24
use wgpu TextureDataOrder authored by atlv24
Bevy Feathers: an opinionated widget toolkit for building Bevy tooling authored by viridia
Doc for X11 CursorGrabMode support authored by jf908
Use SmallVec instead of HashMap in MaterialProperties authored by IceSentry
Nudge users into migrating to new default glTF coordinate conversion authored by janhohenheim
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
force unclipped depth emu on webgpu authored by robtfm
BRP improve json schema support authored by Leinnan
Combine `Query` and `QueryLens` using a type parameter for state, but don't introduce owned iterators authored by chescock
bevy_solari ReSTIR DI authored by JMS55
Set checkbox and radio fill color to gray when disabled in core widgets example authored by jordanhalase
Move bevy_mikktspace out of tree authored by atlv24
Update ui_test requirement from 0.29.1 to 0.30.1 authored by mnmaita
Add `is_finished` method to wasm tasks authored by NthTensor
CoreScrollbar widget. authored by viridia
Add support for `wgpu::PipelineCache` authored by tychedelia
Add PipelineCompilationOptions to descriptors authored by IceSentry
Create `OnDeferred` to allow hooking into every `ApplyDeferred` action. authored by andriyDev
Split LatePrepassNode query in a few groups authored by IceSentry
Registering required component to Bundle-contributing component fails authored by urben1680
optimize ktx2 level data concatenation authored by atlv24
`World::register_required_components` updates bundles authored by urben1680
Change core widgets to use callback enum instead of option authored by viridia
Issues Opened this week
"Entity does not exist" warning triggered by `DespawnOnExitState` for all child components authored by will-hart
VisibilityRange dithering feature is broken authored by Greatness7
Transparent windows on wayland must be pre-multiplied after transfer-function encoding authored by mahkoh
Removing Mesh3d but keeping MeshMaterial3d stops material from rendering for all entities using it. authored by uben0
SSR not reflecting scene when ROUGHNESS>0 authored by seabassjh
Wayland `Locked` `CursorMode` causes error with `window.set_cursor_position` claiming the position mode is not `Locked` authored by piedoom
Describe plugin dependencies explicitly in plugin documentation authored by i-sinister
Explain relationship between UiGlobalTransform, entity-local coordinates, and window coordinates authored by viridia
Hooks and observers that run on spawn and immediately despawn their entity are unsound authored by grind086
Sprite slicing rendering issue using nearest scaling and changing window size authored by Bluspur
Infinite couldn't get swap chain texture authored by michalmoc
Layout System for Popovers authored by viridia
iOS example not working on some devices authored by rizerco
Mesh2d primitive normals feel reversed when using `Camera3d` authored by dsgallups
Better Normal Map Mipping? authored by Bcompartment
Picking: Unintuitive `Pointer<Click>` event generated after drag authored by Algorhythm-sxv
Anchor Ui Nodes to In-World Entities authored by TotalKrill
Replacing MeshMaterial3d to that of a custom material (MaterialPlugin) has no effect authored by tville
Scaling Monitor Causing Jittering authored by edualb
Static-ness is not conserved for asset paths in AssetServer::load() authored by cart
Better callbacks: Allow type-erased cached one-shot systems authored by viridia
Unify linear interpolation traits authored by Architector4
Shadows in `decals` example are missing authored by rparrett
Swap to a variable font in bevy_feathers authored by alice-i-cecile