bevyengine/bevy · Weekly · Jul 06, 2026 - Jul 12, 2026

Bevy Engine Weekly #X: Solari Fixes, GPU-Driven MeshUniforms, and Asset Pipeline Revamps (July 6–12, 2026)

Commits summarized
57
Period
Jul 06 - Jul 12, 2026
Published
Jul 13, 2026

Bevy Engine Weekly — Highlights from July 6 to July 12, 2026

Who should read this: Bevy developers tracking rendering performance work, UI/Feathers widget fixes, asset pipeline changes, and the build-up to multi-app extraction. This period saw 57 commits — the update below covers all included commit summaries as a highlight report rather than exhaustive coverage.

🎨 Rendering & GPU-Driven Work

MeshUniform Allocation Moves to the GPU (#23662)

  • Patrick Walton landed a major step toward GPU-driven rendering by porting the per-mesh MeshUniform allocation pass from the CPU to the GPU.
  • Uses a three-step scan and fan prefix sum (Hillis-Steele scan) to lay out MeshUniforms so that instances of the same mesh are adjacent — required for multi-draw indirect.
  • For batch sets with fewer than 256 meshes (common in practice), only the first (local) step runs.
  • This eliminates the last per-mesh CPU loop for static meshes without skins/morphs, bringing zero-overhead static scene rendering closer.

AtomicSparseBufferVec: Per-Element Dirty Tracking (#24078)

  • Patrick Walton replaced page-level dirty tracking with a two-level atomic bit vector (dirty_bits + summary) to track individual element modifications.
  • Fixes a real-world problem where parallel mesh extraction scatters instances across the buffer, dirtying many pages even when only a few elements change. The new approach can skip up to 4096 elements at a time using bit manipulation.
  • Includes proptest-randomized testing of the bit-manipulation helpers.

Solari Bugfixes

  • Normal map decoding and two-channel support (#24880) — Added the missing * 2.0 - 1.0 normalization and reconstructs Z for two-channel normal maps (e.g., from texture compressor plugins).
  • Removed RaytracingMesh3d component (#24764) — Fixes #24042 by properly handling removal of the raytracing component.

Atmosphere Component Cleanup (#24884)

  • Victor El Hajj fixed #24808 by ensuring atmosphere bind groups and related components are cleared from cameras when either AtmosphereSettings or Atmosphere components are removed.

CompressedImageSaver Revamp (#24223)

  • JMS55 delivered a reworked compressed image saver with better normal map handling, improved mipmap generation, web asset support, and fixed documentation.

🖥️ UI & Feathers

Text Measurement Fix — Min-Content Height (#24859)

  • ickshonpe fixed #24858: when a width is supplied but height is unknown, TextMeasure now correctly recomputes the text layout size instead of returning the cached min-content height.
  • A new testbed scenario (testbed_ui -- textmeasurement) is available for verification.

Parley Upgrade to v0.11 (#24781)

  • Parley text layout library updated to version 0.11.

Tab Navigation Skips Non-Visible Entities (#24769)

  • Cyannide changed tab cycling to skip entities with InheritedVisibility::Hidden, making focus behavior more intuitive.

multiple_text_inputs Example Uses Observer (#24758)

  • Replaced a per-frame Changed<EditableText> system with an On<TextEditChange> observer, avoiding unnecessary updates every frame.

Feathers Slider Fixes (#24905)

  • Gagnus resolved several slider inconsistencies:
  • Removed value from FeathersSliderProps (use SliderValue component instead) — breaking change.
  • SliderPrecision is now truly optional (was silently failing when absent).
  • ValueChange<f32> is only emitted when the value actually changes, matching the behavior of other controls like FeathersCheckbox.

Feathers Menu: Avoid Panic After Despawn (#24890)

  • ByteBaker switched to try_insert for popup visibility updates in FeathersMenu to prevent panics when a menu/popup is despawned during deferred command execution. Includes a regression test.

ScrollArea Scroll Speed Fix (#24620)

  • Benno Straub fixed a unit mismatch where scroll delta in lines was incorrectly added to the scroll position (in pixels), making line-based scrolling extremely slow.

FPS Overlay Graph Fix (commit 02f2320)

  • Brian Misiak fixed an off-by-one read in the FPS overlay graph shader.

🔧 Asset Pipeline

Fix HandleTemplate::Value Not Adding Assets Directly (#24885)

  • andriyDev fixed #24681 by using direct insertion into the Assets resource instead of AssetServer::add (which queues assets and only flushes on handle_internal_asset_events).

MP4 Audio Playback Fix (#24879)

  • nyfair fixed #24878 by refactoring the audio decoder method to use the rodio builder pattern, enabling MP4 audio playback.

Expose bevy::pbr::gltf Module (#24863)

  • Ed Swartz made standard_material_from_gltf_material accessible again by exposing bevy::pbr::gltf as public, letting users manually instantiate GltfMaterial from glTF data (a capability that was present in 0.18).

🧩 Architecture & Infrastructure

Extraction Infrastructure Now Explicitly Targets RenderApp (#24420)

  • Daniel Skates (with contributions from atlas and Kevin Chen) updated ExtractComponent, ExtractResource, and SyncComponent traits/derives to accept an AppLabel parameter — defaulting to RenderApp.
  • All 64 files changed are mechanical: adding #[extract_app(RenderApp)] to derives and impl ExtractComponent<RenderApp> for manual implementations.
  • No functional change yet; this paves the way for multi-app extraction (tracked in #24483).

WinitPlugin Docs Cleanup (#24838)

  • Christian Hughes removed stale documentation referencing a removed M generic parameter.

Security Advisory Ignore for ttf-parser (#24819)

  • Kevin Chen temporarily added a new advisory to the ignore list to unblock CI. The root-cause decision is tracked in #24818.

CI: Bump super-linter to v8.7.0 (#24761)

  • Automated dependency bump for the CI linting action.

Next issue covers July 13–19 — see you then!

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