
Exofactory, Beet, and Drakkar VFX
2025-07-14
This week we've got a whole host of showcases, including new Steam pages, the release of a Hanabi particle editor, and deterministic replication with Avian and Lightyear.
Upstream Bevy also sees a number of PRs, including some re-organizing of rendering with the new bevy_light crate and a friendlier Entity Debug impl.
We also see a new engine, built for TypeScript and powered by Bevy and deno_core and the open sourcing of some vegetation shaders.
Scenes without bevy_render
As a result of a number of PRs (19997, 19991, 20000, 19949, 19943, 19953), #20051 adds release notes for being able to define Scenes without depending on the bevy_render crate, which enables the use of cameras, lights, and meshes with 3rd party custom renderers.
Material, mesh, and skin extraction optimization
If you're interested in performance work, #17976 is a great example of what traces can look like, with before and after examples.
Friendlier Entity Debug impl
Previously Entity
's Debug
implementation leaked a bit of the internals which isn't necessarily problematic but was unhelpful to people who derived Debug
on Entity
-containing types. #20045 changes this to only use the index and version information, like 42v0
.
bevy_light
#19991 introduces bevy_light
, a crate containing Bevy's lighting implementations. The new crate makes lights usable without bevy_render
.
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.

Deterministic Replication: Avian and Lightyear
showcase
Deterministic replication working with avian and lightyear! Deterministic replication is when you don't replicate state at all, but instead you only send inputs through the network. The game should stay in sync if it's deterministic.
Lightyear was historically only intended for state-replication, so adding deterministic replication is an interesting step forwward.
- No state is replicated, only inputs,
- 100ms latency, 15% jitter, 2% packet loss.,
- no input delay, so there are constant rollbacks which are getting smoothed out

Exofactory on Steam
showcase
Awaken as a forgotten AI on an alien world, your every choice reshapes your technology, environment, and identity. Automate deeply transformative factories in a chill open world, where the story evolves uniquely around you.


Vegetation Shaders
showcase
Some in-progress vegetation shaders, including grass and bushes. The source for the bush shader was released as open source later in the week.

Trajectory Planning
showcase
Progress on a trajectory planner for a space-related game. The game involves lots of flying around 1:1 star systems using a torch drive, and for the travel system to work, these trajectories need to be pre-computable. The trouble is that computing a trajectory that can accurately hit a target that will have moved in the few days it takes you to get there is really hard. There's no analytical solution. The solution is a curve to account for the velocity of the planet you're trying to meet up with.

Deep Field: alpha
showcase
Deep Field is an in-progress multiplayer realistic space combat simulator, now in alpha.


Terrain Compute Shader
showcase
A compute shader simulation of tectonic uplift, erosion, and climate. Runs at 70 fps on a 4096x4096 map in 2d, 12fps with a naive 3d implementation (a single planar heightmap, with vertex positions displaced in vertex shader).
The erosion algorithm is stream power erosion, primarily based on Large-scale terrain authoring through interactive erosion simulation but with sediment deposition and directional artifact elimination similar to methods used in Physically-based analytical erosion for fast terrain generation and Efficient Debris-flow Simulation for Steep Terrain Erosion plus an entirely custom parallel basin-filling algorithm and a way of simulating floodplains without rivers actually meandering across the terrain (it messes with the implementation of convergence detection) once the initial shaping of the terrain is done; the timestep is dynamic ranging from 200,000 years to 1,000 years depending on the state of the terrain

TypeScript + Bevy ft. deno_core
showcase
A TypeScript OOP game engine that runs entirely in Bevy using deno_core. bevy renders the TypeScript world and receives deltas of changed TypeScript components. TypeScript has access to create inspector interfaces via egui APIs and everything is sandboxed. It also works headlessly.

Drakkar VFX
showcase
Jarl's editor for particle 2D effects is now open source!
The editor is based on bevy_hanabi and focuses on 2d particle effects, although 3d can be supported as well. Also notably, the version matches versions that were used in Jarl, which includes depending on a forked version of bevy_hanabi 0.7. This in turn means that the first release supports a relatively old version of Bevy: 0.11.

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

greedytile
crate_release
A tile constrained pattern synthesis algorithm like wave function collapse. It adds in longer range inter pixel statistics, a pixel ratio correction mechanism, and local rollback to prevent unknown tiles. It's 100% safe Rust with both library and CLI interfaces.

bevy_sdf_klown prototype
crate_release
bevy_sdf_klown is a general-purpose signed distance field (SDF) rendering plugin for Bevy. It supports dynamic SDF composition, material shading, and runtime scene manipulation.
This is a prototype release with a runnable example in the repo

Devlogs
vlog style updates from long-term projects

Exofactory: Terrain, Animation, and Major Work Done
devlog
Exofactory is an automation and factory building game. This devlog covers new terrain systems, animation, 3d assets, and a steam acceptance!
Beet: Full Moon Harvest
devlog
This marks the first release candidate for Beet's web metaframework features, with the website and blog post rendered entirely with bevy

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

Settings UI: A gist
educational
This is the source code for the interactive settings menu (with tabs and sliders!) for the settings menu for the game Healing Spirit that is in development.
It uses bevy_hammer_ui and immediate-mode paradigms ( declarative programming using Boxed Traits and &World ).
fix percentage signs in SMAA authored by atlv24
dont hard code clustering limits on cpu side so they can be informed by Limits later authored by atlv24
fix variable-termination loop gradients by sampling specific lod authored by atlv24
Rename light visibility class authored by atlv24
Remove `Bundle::register_required_components` authored by SkiFire13
extract cluster extract to a separate module authored by atlv24
consistently dont use smallvec default features authored by atlv24
prepare bevy_light for split authored by atlv24
Explanation for the '3d shapes' example authored by fallible-algebra
SpatialListener now requires a Transform authored by Wuketuke
doc improvement for StateTransition authored by Wuketuke
bevy_reflect: Avoid trait bounds on non-generic types authored by nnethercote
bevy_reflect: Introduce `reflect_clone_and_take`. authored by nnethercote
Unify filtering by id in `EntityClonerBuilder` authored by eugineerd
Implement display for direction authored by stevehello166
Document why examples are disabled on the web, pass 1 authored by TimJentzsch
Add parent ID to the `B0004` log message authored by Zeenobit
Avoid early function invocation in `EntityEntryCommands` authored by JaySpruce
HSL and HSV interpolation for UI gradients authored by ickshonpe
remove unused dependencies authored by atlv24
Move IrradianceVolume to bevy_light authored by atlv24
Bump `typos` to 1.34.0 authored by rparrett
Make `Parallel<T>` more `T: !Default` accessible authored by ItsDoot
Extract members of `PickingPlugin` and `PointerInputPlugin` into new types authored by hukasu
Fix the extended_material example on WebGL2 authored by Henauxg
Add test for invalid skinned meshes authored by greeble-dev
Add comment to custom vertex attribute example to make it easier to convert to 2D authored by nickyfahey
make optional crates for mesh, camera, and light authored by atlv24
fix meshlets with charlotte authored by atlv24
Run `RenderStartup` in/before extract instead of after it. authored by andriyDev
Skip allocation of zero size meshes authored by kerstop
remove fast_sqrt in favor of sqrt authored by atlv24
bevy_light authored by atlv24
Rename `send_event` and similar methods to `write_event` authored by AlephCubed
UI gradients long hue paths fix authored by ickshonpe
Simplify self-edge checking in schedule building authored by chescock
bevy_math: don't allow dead code authored by mockersf
enable syn/full in bevy_render_macros authored by mockersf
formatting fix in bevy_remote cargo.toml authored by mockersf
Clean up several miscellaneous uses of `weak_handle`. authored by andriyDev
Split `component.rs` authored by SkiFire13
SliderPrecision component authored by viridia
Friendlier Entity Debug impl authored by cart
Use PluginGroup for SolariPlugins authored by JMS55
Add frame_time graph to fps_overlay v2 authored by Zeophlite
Material, mesh, skin extraction optimization authored by brianreavis
Split out spot_light_world_from_view into a function in shadows.wgsl authored by atlv24
Change CoreWidgets plugin to plugin group. authored by viridia
Add release notes and a migration guide for `RenderStartup`. authored by andriyDev
StandardMaterial docs: Make clear that lighting won't look correct if `is_srgb` is `true` authored by 772
Refactor `3d_viewport_to_world` example with let chains authored by tim-blackbird
Fix adapter forcing breaking wasm builds authored by atlv24
Factor out up-choice in shadow cubemap sampling orthonormalize authored by atlv24
Add a release note for scene types refactor authored by atlv24
`OverrideClip` interaction fix authored by ickshonpe
Fix SSAO specular occlusion roughness bug authored by JMS55
`ColorStop` constructor functions authored by ickshonpe
Fix crash on meshes with morphs + skins + motion blur when not using storage buffers authored by greeble-dev
Adjust specular_multiscatter to not take LightingInput authored by JMS55
Add `max_history_length` to `EntityCountDiagnosticsPlugin` authored by onbjerg
Update `sysinfo` version to `0.36.0` authored by GuillaumeGomez
Thoroughly document `UninitializedId` semantics 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
Feathers color widgets authored by viridia
Core menus and Popover authored by viridia
Fix require components depth authored by SkiFire13
Make `AssetPath::get_full_extension` work for non-UTF-8 file names. authored by yrns
Solari initial GI authored by JMS55
Move renderer initialization from build time to `RenderStartup` authored by janhohenheim
Move Window creation from plugin build time to PreStartup authored by janhohenheim
Initialize `Window` by observer instead of by plugin fields authored by janhohenheim
Prevent TOCTOU bugs in ComponentsQueuedRegistrator authored by SkiFire13
Use `RenderStartup` for all basic cases in `bevy_core_pipeline`. authored by andriyDev
Use `RenderStartup` for `bevy_pbr` for some basic cases. authored by andriyDev
Use bit ops instead of integer modulo and divide in shaders authored by atlv24
Add release note for light textures authored by atlv24
More UI gradients fixes authored by ickshonpe
Owned callbacks. authored by viridia
Allow UnevenSampleCurve to infer interpolation arguments from samples authored by laundmo
Focus rings for feathers widgets and core widget examples. authored by viridia
Change `event` to `event_key` where it refers to an `EventKey` authored by SteveAlexander
Extendable gizmos primitives 3d authored by lynn-lumen
Add zstd release note authored by atlv24
Fix core widgets unconditionally enabling bevy_ui_picking_backend authored by atlv24
Add `ConvexPolygon<N>` gizmos authored by lynn-lumen
Use `ErrorContext::RunCondition` variant when reporting errors from run conditions. authored by chescock
Material bind group shader def authored by tychedelia
allow `EntityCloner` to move components without `Clone` or `Reflect` authored by eugineerd
The max window size resize constraint should be unset if set to infinity authored by msandin
Fix anisotropy not working when material is lit by environment map light authored by marlyx
Preconvert to srgb authored by tylercritchlow
Improved UI scrolling support and bug fixes authored by ickshonpe
Constify `gradients` helper functions authored by ickshonpe
Fix link to `bevy_solari` logo authored by BD103
Add doc examples to `viewport_to_world(_2d)` authored by tim-blackbird
Implement `ShapeSample for CircularSector` authored by lynn-lumen
Scalable primitives authored by lynn-lumen
Refactor `2d_viewport_to_world` example with let chains authored by tim-blackbird
Port the physics in fixed timestep example to 3D authored by janhohenheim
Split `bundle.rs` authored by SkiFire13
Changing the notification protocol for core_widgets. authored by viridia
Fix AmbientLight::affects_lightmapped_meshes not working authored by marlyx
Rhombus sampling authored by lynn-lumen
Remove the need to derive `Event` when deriving `EntityEvent` authored by tim-blackbird
FIX - RelativeCursorPosition Changed<> query filter authored by chamaloriz
Split `BufferedEvent` from `Event` authored by tim-blackbird
Remove `SystemSetNode` authored by ItsDoot
Enable glTF coordinate conversion for our examples authored by janhohenheim
Issues Opened this week
Add README to example-showcase tool authored by alice-i-cecile
Port 3D examples to new glTF coordinates authored by janhohenheim
Light textures are missing a release note authored by alice-i-cecile
RT for older GPUs authored by Bcompartment
Warn on unused system sets to mitigate ordering bugs authored by cBournhonesque
`ComponentsQueuedRegistrator::queue_register_component` does not ensure components are registered only once authored by SkiFire13
RenderLayers performance drop authored by HaHa421
Preconvert colours before sending them to the UI gradients shader authored by ickshonpe
Increasing and decreasing interpolation paths in cylindrical colour spaces for UI gradients authored by ickshonpe
Hooks/observers for require components should be invoked in a predictable order. authored by Aqaao
Constant/Lifetime components authored by Freyja-moth
Curve extrapolation for curves which can be extrapolated authored by laundmo
Nextest for CI authored by Aceeri
Child node with width and height has a blank computed node authored by GalaMana
Overwriting an ExtendedMaterial with another ExtendedMaterial crashes bevy authored by Affinator
bevy_reflect should be an optional feature in bevy_ui authored by alice-i-cecile
Add Reflect derives to bevy_feathers and bevy_core_widgets authored by alice-i-cecile
Misuse of Metal API in rendering preperation authored by Kees-van-Beilen
`dispatch_focused_input` not checking whether the focused entity is alive or not. authored by notmd
required components with constructors like FromWorld authored by tomaspecl
Allow ExtendedMaterials that share a common base material to be queried together authored by hansler
Immutable Resource authored by MushineLament
Slight mistake in relationships examples authored by Sirmadeira
Entities with multiple materials only render a single material authored by NiseVoid
UI Node Decorations authored by viridia
`despawn_related` removes relationship before calling observers and hooks authored by Dampfwalze