Bevy Weekly #XX: Solari v7, Elliptical Borders, and Reflection-by-Example (Jul 13–19, 2026)
- Commits summarized
- 69
- Period
- Jul 13 - Jul 19, 2026
- Published
- Jul 20, 2026
Bevy Weekly #XX: Solari v7, Elliptical Borders, and Reflection-by-Example
Week of July 13 – 19, 2026 · bevyengine/bevy · 69 total commits
Who should read this? Bevy game developers, graphics programmers, and UI authors. This week brings a major Solari GI rewrite, elliptical border radius support, a new reflection example, and important fixes for OIT, tab navigation, and command panic handling.
🎨 Graphics & Rendering
Solari v7: unified diffuse / specular GI & DI
#24767 by JMS55 rewrites Solari's global illumination from three separate passes into one unified algorithm. All rays are now resampled with full BRDF-aware MIS weighting.
- Less biased — cross-domain visibility is taken into account.
- Fewer GI light-leaks and improved specular GI quality.
- Reduced memory usage and sometimes faster (combined passes).
- Trade-off: smooth dielectrics may see slightly noisier reflections on the primary lobe.
Elliptical border radius support
#24779 by ickshonpe adds elliptical (non-uniform) corner radii to BorderRadius. The fields are now Val2s, and ResolvedBorderRadius uses Vec2. Picking and shaders were updated accordingly.
- Run
cargo run --example testbed_ui -- ellipticalborderradiusto try it. - Corner-shape support (
#24783) is the planned follow-up.
Handle optional depth and stencil views
#24725 by Luo Zhihao refactors DepthAttachment, ViewDepthTexture, and ViewPrepassTextures::depth to support separate depth / stencil aspect views — a necessary step toward custom depth formats (coming in a follow-up PR).
OIT can now be disabled per-material; forward decals fixed
#24856 adds enable_oit to the Material trait so each material can opt out of order-independent transparency. Forward decals are now exempted from OIT by default (fixing partial culling by opaque objects), and their alpha mode is no longer hardcoded to Blend.
Render phase instance-count fix
#24980 by MostlyMo fixes a bug where RenderBinnedMeshInstanceIndex would increment the instance count even when the entity was not actually added — fixing broken lighting when changing light sources at runtime in the PBR example.
ContactShadows crash at runtime fixed
#24977 by voidreamer keys the CONTACT_SHADOWS specialization bit off the extracted component instead of the uniform offset, preventing a crash when ContactShadows is added to a camera after startup.
🖥️ UI
Elliptical borders (see Graphics section above)
Tab-navigation regression: hidden subtrees now fully skipped
#24968 fixes a regression from #24769 where hidden entities (e.g. menu popups) would still have their children traversed, causing menus to auto-close immediately. The fix moves the children traversal inside the InheritedVisibility check.
UI camera cleanup fix
#24982 by ickshonpe ensures that UI propagation components are properly removed when a node is no longer a root, fixing #24966.
Color conversion mismatch in gradients resolved
#24886 aligns the sRGB↔linear conversion used in the UI shader (pow(color, 2.2)) with the Rust-side conversion, eliminating slight color shifts.
🔧 Scene System (BSN)
bsn! macro docs fixed for re-re-export
#24828 moves the bsn! docs back into the macro crate after a rustdoc limitation prevented them from appearing on bevy::scene. The macro module is renamed _bsn to avoid Rust-Analyzer ambiguity.
Enum variant subexpressions now lifted correctly
#24876 extends the let _exprN = ... hoisting logic to enum variant patches, fixing lifetime errors when using {...} expressions inside Foo::Baz({expr}).
template() doc table entry fixed
#24986 corrects a rendering issue in the bsn! reference documentation.
template_value no longer requires Default
#24981 removes the Default constraint from the blanket Template impl, allowing use of components that only implement Clone in template_value(...).
🔍 Reflection
New example: mutation_by_reflection
#24747 by Alice Cecile adds a standalone example showing how to mutate reflected values using raw bevy_reflect methods — perfect for anyone building inspector-flavored tools.
Run it with:
cargo run --example mutation_by_reflection
🧩 ECS & App
Command panics now forwarded to the fallback error handler
#24911 catches panics in command application and forwards them to the fallback error handler (same pattern as system panics from #24240). A RAII guard ensures cleanup during unwinding even in no_std.
SubApp::add_message now schedules message_update_system
#24866 fixes a memory leak where sub-apps that called add_message would never rotate their message buffers because message_update_system was only scheduled in App::default().
Entity set iterators forward custom trait impls
#24887 forwards custom trait methods (e.g. TrustedLen-based collect, Clone) through UniqueEntityIter and other wrapper types, matching indexmap's approach.
NestedQuery example completes
#24923 adds the two missing method implementations to the NestedQuery example so copy-paste users get correct behavior.
🛠️ Fixes & Polish
| PR | Summary |
|---|---|
#24948 |
#[serde(default)] added to GltfLoaderSettings for partial deserialization |
#24959 |
TerminalCtrlCHandlerPlugin now wakes up the winit event loop for reactive apps |
#24960 |
MeshAllocator warns when a mesh has no vertices instead of crashing |
#24976 |
Regression test added for wgpu backend's SyncComponentPlugin remove-after-sync |
#24987 |
TextLayoutInfo::scale_factor defaults to 1 to prevent NaN in AABB calculation |
#24907 |
Stale components cleared when FullscreenMaterial is removed |
#24972 |
Fix UB in the remote entity allocator (atomic ordering, sequence wrap) |
#24979 |
Memory leaks in tests resolved so Miri can run with leak detection |
📦 Dependencies & Maintenance
#24759— Bumpactions/checkout6.0.3→7.0.0#24937— Bumpzizmorcore/zizmor-action0.5.6→0.5.7#24814— Updateglamto 0.33.2
➕ What's Next
Keep an eye on:
- Custom depth formats — follow-up to #24725
- Corner-shape support — follow-up to #24779
- bsn! dusting — the macro surface is maturing quickly with template_value now usable without Default
As always, a huge thank you to every contributor, reviewer, and issue reporter. See you next week!