bevyengine/bevy · Weekly · Jul 13, 2026 - Jul 19, 2026

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 -- ellipticalborderradius to 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 — Bump actions/checkout 6.0.3→7.0.0
  • #24937 — Bump zizmorcore/zizmor-action 0.5.6→0.5.7
  • #24814 — Update glam to 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!

Repository updates

Follow future updates

Get generated bevyengine/bevy development summaries by email, or follow the weekly and monthly RSS feeds.

Sign in to subscribe by email. RSS feeds are public.

Sign in to subscribe