Back to Blog
    Last Week in Unreal

    Last Week in Unreal: May 25 to 31, 2026

    Abraham K11 min read
    Last Week in Unreal: May 25 to 31, 2026

    Unreal Engine Weekly: What Changed and What Matters

    Week of May 25 to May 31, 2026 | 784 commits analyzed | Branch: ue5-main

    Overview

    This week reads like a system maturing under load. Crash-fix triage clustered in the newly-promoted subsystems (PCG, Dataflow, Mutable, Control Rig, mobile forward shading), the new material translator (MIR) kept grinding down parity deltas with legacy, and MegaLights picked up directional transmittance plus denoiser flexibility. The headline story is animation: ControlRig now has an anim node inside the new UAF runtime, the first time the two systems share an execution path. On the build side, UnrealAndroidFileTool got fully reverted after last week’s promotion, Catch2 went through a six-commit casing rename, and SODB landed in the Lyra and CitySample cook graphs.

    TL;DR

    • ControlRig anim node lands in the UAF runtime. After a backout-and-reland, the bridge between two production-critical animation systems exists. UAF is now absorbing AnimGraph/ControlRig rather than living next to them.
    • MIR (new material translator) hit its grind-down-the-deltas phase. About 40 commits in seven days closing legacy-parity gaps, plus cycle detection, DDC caching of translation output, and two cook-crash fixes. A CVar default change feels close.
    • UnrealAndroidFileTool was reverted. If you integrated last week’s UAFT promotion into an Android build path, you need to pull it back out.

    Highlights

    Rendering & Performance

    What changed. MegaLights gained per-pixel transmittance from directional lights, denoiser-shader thread-group flexibility (16×8 in addition to 8×8) with an FP16 fix, and a small denoiser optimization (~0.01ms at 1080p console). The volume visibility hash also got an out-of-bounds write fix. Separately, Nanite picked up a mesh simplifier failsafe that recovers the single largest triangle if edge collapse removes all triangles, and VulkanRHI now dumps pipeline-creation crash info by default on desktop. Mobile primitive/instance data was split from VF-specific defines.

    Why this is important. Directional transmittance is the missing piece for foliage and thin-medium materials under sun light in MegaLights. The denoiser thread-group flexibility is a platform-tuning change, the sort that lands once the feature itself is settled. MegaLights is moving from “ships and works” to “tunable for ship-quality lighting.”

    Who should care. Graphics engineers, lighting TDs, mobile renderer maintainers.

    Urgency. Track. No action required unless you are actively tuning MegaLights for a shipping title.

    Build & Tooling

    What changed. UnrealAndroidFileTool (UAFT) was fully reverted after the prior week’s promotion did not survive contact with production. Catch2 went through a six-commit rename to fix iOS to IOS casing (a cross-platform-build sharp edge on case-sensitive filesystems). UBA binaries got updated three times in seven days. SODB (Shader Object Database) landed as a post-cook step in BuildAndTestProject.xml and as a standalone cloud artifact, wired into Lyra and CitySample. ZenLaunch now ships pre-built in the installed engine. Version stamping now works for non-p4 repos (Git and SVN). AutoRTFM picked up AEM disable for main/WinMain and TSan support. Cloud Artifacts gained configurable output names and a clone task.

    Why this is important. SODB moving from toolchain-only into the cook path Lyra and CitySample actually use is a credible signal that the shader/object database approach is being validated on real project shapes. The AFS revert is damage control, so if you integrated it last week you need to back it out. The AutoRTFM cadence (AEM disable, TSan support, week-over-week commits) keeps reading like GA-prep.

    Who should care. Build engineers, DevOps, Horde users, anyone running an Android pipeline.

    Urgency. Act now on the AFS revert if you integrated UAFT. Track everything else.

    Animation & Character

    What changed. Nicholas Frechette landed an experimental ControlRig anim node inside the new UAF runtime (a 17-file change in the UAFControlRig plugin, surviving a backout-and-reland). Supporting work: UAF stack allocator for traversal, AnimOp validation specialization on FUAFAnimNode, traversal-allocation lifecycle, UAF Abstract Blend Masks, shared-variable diffing, layering UI. Separately, Nanite Curve skinning index landed at the cluster level with curve-skinning data generation wired into the Nanite Groom builder, plus two groom crash fixes (data fetch crash, mobile binding crash). Max UStruct size was raised from 64K to 12MB.

    Why this is important. The ControlRig-in-UAF landing is the animation headline of the week. UAF has been the long-promised replacement for the AnimGraph/ControlRig dual stack, and this is the first time the two systems share an execution path rather than living parallel. The Nanite Groom work is incremental groundwork for skinned hair on Nanite, which has been static-hair-only. The UStruct size bump from 64K to 12MB is a hard limit that codegen-heavy projects (and Verse VM codegen) bump into.

    Who should care. Animation engineers, character TDs, anyone shipping with ControlRig or watching UAF, groom devs.

    Urgency. Track. UAF is still Experimental, but this is the week to start reading its source.

    Materials (MIR translator)

    What changed. About 40 commits in seven days, all under the same theme: new material translator now matches legacy behavior X. Specific deltas closed this week: LWC truncation in Subtract, SampleGrad-to-SampleLevel(0) in vertex shaders, min/max behavior in Compatibility profile, vertex interpolator budget checks, light function emission in compute shaders (previously returned 0, causing light functions in CS to render black), Lerp/Clamp result-type divergence. On the MIR side: cycle detection in the expression graph, DDC caching of translation output, Juno expression support, Fortnite-materials triage. Two cook-crash fixes also landed (legacy translator broken by an MIR-driven change, intermittent StaticFindObject fatal in the new translator’s cook path).

    Why this is important. Architecture work is done. The translator is into the long tail of “every shipped material must compile the same way.” When 40 commits a week are landing under the same “now matches legacy” theme, the CVar default change is close. Cook crashes from MIR work spilling into the legacy path is the kind of collateral that shows up when one path is being pushed hard.

    Who should care. Materials engineers, anyone running a custom material library.

    Urgency. Track. Act now if you are hitting MIR-related cook crashes.

    Stability & Fixes

    What changed. 15+ crash fixes clustered in newly-promoted or in-promotion systems. PCG: null accessor crash with unit tests, editor perf regression (double update plus inspection stack), landscape cache resolution. Dataflow: stale-handle hotfix, BP recompile during groom playback. Control Rig: direct manipulation, PIE exit. Mobile: unbound UAV in forward shading occlusion feedback, MPC null deref. Mutable: wrong LODBias method, data race when comparing PassthroughObjects. Plus: StateTree invalid memory access, TEDS Dynamic Column generation race condition, Physics Constraint WidenLimits numerical bug (could mistakenly open limits wide instead of widening a little), GameplayCue cleanup after GameplayEffect removal, WorldPartition reference-cluster split rejection.

    Why this is important. Look at where the crashes cluster. PCG, Dataflow, Mutable, Control Rig are all in their first or second year of real production exposure, and the long tail is showing. None of these are individually critical. Collectively they are a reminder that promotion is where stability work starts.

    Who should care. Tech artists on PCG, groom devs on Dataflow, animators on Control Rig, character pipeline devs on Mutable, mobile devs on forward shading, anyone using StateTree or TEDS.

    Urgency. Act now if you are shipping with any of these systems. Track otherwise.

    Editor & Tools

    What changed. Yoan Stamant landed ten commits routing DrawDebug helpers, VisualLogger shapes/labels, and RewindDebugger replay text through a single UE::DebugDraw::IDebugDrawShapeSink interface inside the DebugDraw plugin. CVars are being renamed from vislog.* to UE.DebugDraw.Label.*, and FLabelPool moved out of RewindDebuggerVLogRuntime into the plugin. Separately, a security fix landed for DOM XSS plus auth-cookie hardening, CSRF, and security headers. A CVar to disable archetype prepopulation also landed, with the author warning it could undermine reinstancing of complex object graphs.

    Why this is important. The DebugDraw unification opens the door for studios to plug in their own debug renderer, but it also means the CVar rename and FLabelPool ownership change will catch any studio with custom call sites. The archetype prepopulation CVar is regression-bait: useful to know it exists if you see post-update Blueprint reinstancing weirdness.

    Who should care. Tooling engineers, anyone with custom DebugDraw or VisualLogger sinks, anyone seeing Blueprint reinstancing regressions.

    Urgency. Track. Worth grepping for vislog. in your engine fork.

    Worth Tracking

    • Per-tile navmesh build state on ARecastNavMesh (UE-375350). Three commits add a per-tile build-state grid plus experimental per-tile build priority for navmesh tile generation. Per-tile priority is the foundation for “build near the player first,” which is what Worldbuilder-scale projects need. Worth watching for an exposed API or scheduler hook.
    • AutoRTFM continued GA-prep momentum. AEM disable for main/WinMain plus TSan support, on top of weeks of similar polish. Nothing dramatic, but the cadence is consistent.
    • LLM and agent surface area inside the engine. ModelContextProtocol stdio bridge, a performance MCP toolset exposing CPU cycle stats and GPU profiler, the programmatic script sandbox API getting simplified, and tool descriptions across several plugins being edited for LLM discoverability. None of this is one big landing, but the direction is clear: Epic is making the engine legible to in-engine agent workflows.

    What We Ignored

    14 commits were filtered as noise (boilerplate, version bumps, Commit.gitdeps.xml updates). About 489 commits landed in low-interest: localization passes, formatting cleanups, content and template resaves, internal refactors. A handful got promoted by the analysts when the cluster told a real story: the MIR translator commits, the UAF cluster, the Mutable data race, the StateTree memory fix, the TEDS race condition, the Nanite simplifier failsafe, and the security fix. One caveat: MetaHuman Creator (14 commits) and UAF (6 commits) sat in low-interest only because the categorizer rules do not catch them yet. Both are active arcs and we will pull them up properly once the rules catch up.

    Closing

    We read every commit so you do not have to. If something here changes how you plan your week, good.

    Commit References

    | Claim | SHA |
    |——-|—–|
    | MegaLights directional transmittance | `0c6ec350` |
    | MegaLights denoiser thread group flexibility | `6fc03457` |
    | MegaLights guiding hash clear optimization + OOB fix | `290d00d3` |
    | Nanite Curve skinning index in cluster | `190b917c` |
    | Nanite Groom curve-skinning data generation | `9747173d` |
    | Groom data fetch crash | `334e2c28` |
    | Mobile groom binding crash | `1a9aefab` |
    | PCG null accessor crash + unit tests | `e19db013` |
    | PCG editor perf (double update + inspection stack) | `bb9cf414` |
    | PCG landscape cache resolution | `6a9a2f86` |
    | Dataflow editor stale-handle hotfix | `09649805` |
    | Mutable LODBias method regression | `fca58522` |
    | Mobile forward shading occlusion feedback UAV | `c1be49c1` |
    | SODB cook integration (Lyra, CitySample) | `566e066a` |
    | SODB standalone cloud artifact | `93aa939a` |
    | Android UAFT revert | `2cc42b60` |
    | Catch2 iOS casing rename | `b9a622f9` |
    | ZenLaunch as pre-built in installed engine | `65e07203` |
    | Version stamping for non-p4 repos | `47bec810` |
    | AutoRTFM AEM disable for main/WinMain | `c5dc275b` |
    | AutoRTFM TSan support | `0726fd7e` |
    | UBA binary updates | `16faaeca` |
    | MIR emissive-for-CS fix | `8e12ca26` |
    | MIR legacy translator cook crash | `7063bc72` |
    | MIR new translator cook crash | `0372f904` |
    | MIR cycle detection in expression graph | `e8e6f4e0` |
    | MIR DDC caching of translation output | `c3fea84b` |
    | Shader preprocessor assert hardening | `5cf58b60` |
    | ControlRig anim node in UAF runtime | `628d9d0e8f` |
    | UAF stack allocator for traversal | `c23db101` |
    | Max UStruct size raised to 12MB | `46ec47ac0a` |
    | Archetype prepopulation CVar disable | `b06235e8b5` |
    | Nanite mesh simplifier failsafe | `a1469291` |
    | Security: DOM XSS + CSRF + auth cookie | `70ad1760` |
    | StateTree invalid memory access fix | `7842a1ee` |
    | TEDS Dynamic Column race condition | `69bf1861` |
    | Mutable PassthroughObjects data race | `458634ee` |
    | Physics Constraint WidenLimits numerical bug | `49cac33b` |
    | WorldPartition reference-cluster split rejection | `28ed927a` |
    | GameplayCue cleanup after GameplayEffect removal | `16b7e255` |
    | NetPhysics resim improvements | `0e05e608` |
    | ModelContextProtocol stdio bridge | `d747ad2f` |
    | Performance MCP toolset | `2003c7b1` |
    | DebugDraw shape sink unification | (multiple, see VisualLogger+RewindDebugger plugin) |
    | VulkanRHI pipeline crash dump default | `3ed9b5b2` |
    | Per-tile navmesh build state (UE-375350) | (multiple) |
    | Mobile primitive/instance data split | `7fe47f02` |
    | Cloud Artifacts configurable output names | `f36a81cd` |
    | Horde PerforceMaterializer dirty-loop fix | `6061e8c2` |
    | Horde Redis TTL conflict | `0c0e49cc` |

    All SHAs reference the `ue5-main` branch of EpicGames/UnrealEngine.

    Share this article