Which of the following is the strongest opening for an external-informational message?

Choose your operating system:

Show

What's New?

Unreal Engine 5.0 was a groundbreaking release, bringing a whole slate of new tools to users. 5.1 is building upon the framework of 5.0, delivering updates and improvements to facilitate the creation of next-generation, real-time 3D content and experiences even further. Our focus was on making our feature set robust, workflow-friendly, and versatile, with the needs of different sectors in mind.

Visual Integrity and Performance

We have delivered improvements to support you in creating 60 fps games for next-generation consoles and capable PCs. Those include:

  • Improvements in Lumen, Nanite, and Virtual Shadow Maps.

Building Bigger Worlds and Collaboration

  • You can create larger worlds using World Partition.

  • Improvements were made to make teamwork more efficient, facilitating the game development process.

Virtual Production and In-Camera VFX

We continue to rapidly develop new tools for virtual production and In-Camera VFX (ICVFX). Working with footage is now easier than ever.

  • Use the In-Camera VFX Editor to do color correction, apply light cards, and perform general stage operations.

  • DMX configurations are now improved by means of MVR support.

  • Lumen has an initial implementation for nDisplay.

  • GPULM workflows have been improved.

Keep reading to find out more information about these tools, and the full list of all improvements in Unreal Engine 5.1.

This release includes improvements submitted by our community of Unreal Engine developers on GitHub. Thank you to each of these contributors to Unreal Engine 5.1:

ABoy (lvhuming), AchimTuran, Adrian-Marian Popoviciu (ArmainAP), Aidin Abedi (aidinabedi), aknauermaxon, Albin Odervall (albinodervall), aldenc98, Alex Garcia Ruiz de Oteiza (AlexOteiza), Alexander (DecoyRS), Amit Kumar Mehar (amuTBKT), andersonbisconsin, Andreas Andersson (derwiath), Antoine Vugliano (avudnez), AntsyBoi, az6667, Ben Raziel (benraziel), Ben Rog-Wilhelm (zorbathut), Ben Sutherland (BlenderSleuth), Ben Sweeney (BenSweeneySG), BenAD83, Benito Alessandrino (BennyExtreme), Benjamin Thomas Blodgett (BenVlodgi), bestofact, bhickmanl, bitdewy (bitdewy), bmiwcy, Brang Pakdring (brangpd), Brent G (Punlord), Brent Goodacre (WGBrent), Brent Scriver (FineRedMist), Bromfitsen, Cameron Rapp (MalikuMane), cbrandtieng, Cecco (ceccocecco), Charles Alexander (muchcharles), Chris Anderson (CasperTheCat), Chris Haddon, Christian Kendall (ckendal3), Chris Wallis (The Coalition), cmsinflexion, CodingBot (ameaninglessname), Colden Cullen (ColdenCullen), daktor, Damien Kochanek (DamienKochanek), Dan Hertzka (HertzDonut), David Bollo, David Gilbert (davidyrgilbert), David Nadaski (GlassBeaver), dbsigurd, dening (loening), Denis Blank (Naios), Dezső Zoltán (zaki), Diyou, Dmitry Korshunov (originomeg), Dmitry Vinnik (vinnik-dmitry07), Doğa Can Yanıkoğlu (dyanikoglu), dorgon chang (dorgonman), Dorian (Hisamera), Dorian Gardes (d-gardes), Doug Richardson (drichardson), Douglas Jose (douglasjose), Douglas Lassance (douglaslassance), drcxd, Dzmitry Malyshau (dm-tesla), Eddie Stubbington (Edstub207), Edin Suta (edinsuta), Elhoussine Mehnik (HoussineMehnik), Elliot Colp (ecolp-improbable), Emil Rosenquist (EmilRosenquist), Enno Rehling (ennorehling), Eric Thiffeault (ethiffeault), Ethan Thornburg (erebel55), etheranger, Evan Hart (ehartNV) (NVidia), Filippo Tarpini (Filoppi), Fluffy Kalashnikov (FluffyKalashnikov), Fredrik (Temaran), furby™ (furby-tm), fury22pl, Gabriel T. Nardy (gtnardy), Gamergenic (gamergenic), Gaurang Ingale (gaurang-ingale), Geordie Hall (geordiemhall), Georgy Treshchev (gtreshchev), Giovanni Paolo Viganò (gpvigano), Hannah Gamiel (hgamiel), Hirofumi Seo (HSeo), IgnacioFDM, Igor Karatayev (yatagarasu25), igor-kondratiev, Ilddor, Ilya (ill), Incredible (ameaninglessname), Isaac Ashdown (Eyesiah), Isaac Ribeiro (i-ribeiro), Jack Andersen (jackoalan), Jack Isaacs (JackIsaacs), Jackson Fields (fieldsJacksonG), Jacob Kostenick (kostenickj), James Baxter (TheJamsh), Jared Taylor (Vaei), Jay Lu (JayLu2000), Jeremy Abel (jeremyabel), Jessica Chen (Intel), jm00517, John (GoldNotch), John Dickinson (jdckmz), Jonas Kjellström (JonasKjellstrom), Jørgen P. Tjernø (jorgenpt), JSaueressig88, Juan M Gómez (jmgomez), June Rhodes (hach-que), Justin Bostian (jb5n), JustinTime (JustinTether), Kacper Kowalczuk (Ogniok), kaffeewolf, Kai Klyden (RoboMage), Kenn Zhang (breakstring), Kenshin Azuma (aziogroup), Kevin Østerkilde (Kosai106), Kevin Xiao (KXOC), Koji Kawasaki (kedamazigoku), KonstantinKohl, KrisRedbeard, Kristján Valur Jónsson (kristjanvalur), Krunoslav Zaher (kzaher), Krzysiek Justyński (MothDoctor), leobenaducci, Levil0229, lijenicol, lijinlong, LindyHopperGT, LizardThief, losemymind (losemymind), Lukasz "iniside" Baran (iniside), MagForceSeven, Måns Isaksson (mansisaksson), Marat Radchenko (slonopotamus), Marcel Egle (EgleM2022), Marco Antonio Alvarez (surakin), Marijn Suijten (MarijnS95), Mario Arsenov (Xertor), Marius Petcu (dapetcu21), Marnix Kuijs (MarnixKuijs), Matias N. Goldberg (darksylinc), Matthias Hölzl (hoelzl), Maxim Ivanov (redbaron), melchior-haven, Meta Immersive Synthetics (metakgs), Michael McCartney (mccartnm), Mike Bell (MichaelBell), Mike Seese (seesemichaelj), Mike Slegeir (tehpola), mikoto-studio, Milan Šťastný (aknarts), Minseok Lee (codeonwort), Mohammad Mossa (WizardCell), Morva Kristóf (KristofMorva), muyang.zhang (87770906), nathandh23, Neema Teymory (nteymory), Nicholas Frechette (nfrechette), Nicholas Nathan Colotouros (NicholasColotouros), Nick Edwards (NEdwards-Sharkmob), Nick Edwards (NEdwards-SumoDigital), Nick Lamprecht (freezernick), NickScriv, Nico Ell (nicoell), nuntax, nutti, Paolo Galeone (galeone), Paul Greveson (moppius), Paweł (PoetaKodu), Peter Kovář (1div0), phisko, Phyronnaz, pl-dsk, Pratik Chavan (ppchavan001), ProgC, projectgheist, pwoytiuk, Qinja, QRare, Quentin Dietz (quentin-dietz), RangeMachine, Rareden, Remi Palandri, Rem (rveilleux), René Ferdinand Rivera Morell (grafikrobot), Rick G (rtrick), Rob Cowsill (rcowsill), Robert.Kawiak (Intel), Robert Kihl (kihl), RumbleballTheReal, rveilleuxBHVR, Ryan DowlingSoka (Ryan-DowlingSoka), Ryan Van Vliet (RyanVHumanoid), ryugibo, S_MC (slimsons), Scott Ramsay (foobit), Sean Saleh (seansaleh), Sébastien Rombauts (SRombauts), Setepenre (Delaunay), SkyXMoon, splatxman, sqexmuelas, Stas Korotaev (Stals), steelixb, Stefan Zimecki (stefan-zimecki) (Improbable.io), sunduk, SungJinKang (SungJJinKang), takaokato, Teodor Chishiki Jakobsson (Maigo), Tobi W (TWAtGH), Tom van Dijck (tvandijck), Travis Hopkins (djethernet1), Urszula Kustra (ukustra), Valery Komarov (ValeryKomarov), Ves (VesCodes), WinsonS (WinsonSS), Wouter Weynants (WouterWeynants), xiexbmu, yang xiangyun (pdlogingithub), Yashas Gujjar (yashasg), yashverma, Yohann MARTEL (ymartel06), YoshikazuAzechi (y-azechi), yumnuska, Yuri Belleri (ZioYuri78), Yuriy (SmelJey), Zsófia Balogh (zosiu), 丛越 (congyue1977), 华清飞扬-小木子 (hui211314dd), 徐晨 (kimixuchen)

Rendering

Lumen Improvements

Lumen now supports the Two-Sided Foliage shading model, by gathering lighting from the backface and scattering it through the leaf, attenuated by the material's Subsurface Color.

Lumen Two-Sided Foliage Example 1

Lumen Two-Sided Foliage Example 2

Lumen's Software Ray Tracing also has a new, much more accurate representation for foliage through stochastic semi-transparent distance field ray traces, which fixes over-occlusion on foliage.

Lumen uses Spatiotemporal Blue Noise for cleaner image quality, especially when the camera is not moving. The biggest quality improvements can be seen when Lumen is using the High Global Illumination scalability level, which is targeted at 60fps on next generation consoles.

Cleaner global illumination with Spatiotemporal Blue Noise.

Lumen's Software Ray Tracing now samples the Surface Cache directly instead of a low resolution and leaky voxel representation. This improves secondary bounces, reflections, and global illumination from small emissive surface elements.

Lumen sampling from Surface Cache instead of voxel representation for improved results from small surfaces.

When the project has High Quality Translucency Reflections enabled, Lumen Reflections provide mirror reflections on the frontmost layer of Translucent Surface materials.

Lumen high quality translucency reflections from translucent surface materials

Lumen Reflections now support Single Layer Water, with reflections forced to mirror.

Lumen Reflections on SingleLayerWater shading model.

Other Lumen features and improvements for this release include:

  • In Hardware Ray Tracing mode, reflections now support fast alpha masking by evaluating alpha from the Surface Cache.

  • The Surface Cache generation algorithm is now more robust and able to cover a higher variety of meshes, including having Surface Cache for tiny scene elements.

  • Additional internal settings were added to High, Epic, and Cinematic scalability levels to support greater control over performance vs. quality tradeoffs.

  • The Skylight Leaking feature is available in Post Process Volume settings to use as a non-physically-based art direction knob to keep indoor areas from going fully black.

  • The Diffuse Color Boost feature is available in Post Process Volume Settings to increase the amount of bounced light in scenes.

  • Lumen is now optionally supported in Scene Captures by forcing Lumen GI and Reflections to be enabled in the capture component's Post Process Volume settings. By default the Surface Cache resolution is reduced to 50% of its default size when run in a scene capture, but you can override this in the component's settings.

  • Lumen now supports multiple viewports in nDisplay. Each viewport will use an independent Lumen Scene.

  • Added experimental Hardware Ray Tracing support in Vulkan.

    • Includes Surface Cache reflection lighting only, with no support yet for Hit Lighting.

  • Many stability and bug fixes.

For more information, see Lumen Technical Details.

Nanite Improvements

Nanite includes the following features and improvements for this release:

  • Now supports materials using the following options:

    • Two Sided

    • Masked Blend Mode

    • World Position Offset (beta)

      • Bounds for culling are not yet being updated so triangles may disappear depending on usage.

    • Pixel Depth Offset

    • More information about the expected performance characteristics of these features can be found in the Nanite documentation.

  • Improved support for Nanite foliage geometry:

    • A new Preserve Area option for Nanite static meshes prevents thinning out of geometry at far distances when enabled for foliage.

    • Landscape Grass meshes can now have Nanite enabled.

    • Nanite foliage performance is a complex topic, with many influencing factors that are highly content-dependent. More information can be found in the Nanite documentation.

  • Improved support for hybrid Nanite / non-Nanite workflows for the purpose of authoring for platforms both with and without Nanite support:

    • You can add a Nanite representation to existing non-Nanite meshes from the Content Browser using the right-click menu item Level of Detail > High Res > Import High Res…. With this workflow, the pre-existing mesh and LOD chain become the Fallback Mesh, rather than the import process automatically generating a Fallback Mesh from the Nanite geometry.

    • Added a Nanite Switch expression in Materials to enable you to define specialized behavior when being rendered with Nanite.

    • Added a Nanite Override Material slot to Materials and Material Instances. If you set this slot, the assigned meshes rendering as Nanite will instead use the referenced material. The slot is forcibly defaulted to None in Material Instances, so that setting the override in a parent material will not cause it to be automatically inherited in any children.

    • Static Mesh components now have a Disallow Nanite parameter, making it possible to use a mix of Nanite and non-Nanite actors from the same mesh asset.

  • Nanite-enabled meshes now support the Hidden Shadow flag. This allows custom shadow proxy meshes to be Nanite, improving the performance of Virtual Shadow Maps.

  • Instanced Static Mesh components drawing as Nanite now respect distance-based culling settings.

  • (Experimental) You can now convert Landscapes to be rendered using Nanite.

  • (Experimental) You can enable initial support for native ray tracing and path tracing of Nanite meshes by setting r.RayTracing.Nanite.Mode=1. This approach preserves all detail while using significantly less GPU memory than zero-error fallback meshes. Early tests show a 5-20% performance cost over ray tracing a low-quality fallback mesh, but results may vary based on content.

  • Many other quality and performance improvements.

Starting in Unreal 5.1, Nanite requires Shader Model 6 to be enabled with DirectX 12. No settings changes are required for Vulkan.

For more information, refer to Nanite Virtualized Geometry.

Temporal Super Resolution Improvements

Temporal super-resolution is now improved in this release in multiple areas:

  • Better support for anti-aliasing of animated materials.

  • Improved quality and reduced ghosting on translucent geometry or geometry with incorrect motion vectors.

  • Better detection of pixel flickering and moire with improved anti-aliasing quality and less ghosting.

  • Performance optimizations for 60fps targets.

For more information, refer to Anti-Aliasing and Upscaling.

Path Tracer Improvements

Path Tracer includes the following features and improvements for this release:

  • Added support for a variety of engine features:

    • Exponential Height Fog and Sky Atmosphere

      • The Exponential Height Fog component requires you to enable Volumetric Fog. Local lights default to not casting volumetric shadows and must be enabled in their settings, which matches their default workflow with real-time lighting.

      • The Sky Atmosphere is supported with the Reference Atmosphere Post Processing Volume setting. Volumetric Clouds are not yet supported when this setting is enabled.

    • Planar Decals

    • Water Geometry and Single Layer Water Shading Model

    • Per-Instance Custom Data and Per-Instance Random material expressions

    • Added support for Light Functions. Colored light functions are also possible, in the Path Tracer only, by enabling r.PathTracing.LightFunctionsColor.

  • Added the Reference Motion Blur option to the Movie Render Queue for more accurate motion blur, with a higher performance cost to get smooth results. In this mode, no post-process vector blur is applied, and denoising is applied after all spatial and temporal sample accumulation. Higher temporal samples should be applied to increase quality.

  • Added support for multi-GPU rendering (mGPU). SLI is required. To enable it, pass -MaxGPUCount=2 on the Unreal Editor command line and set r.PathTracing.MultiGPU=1, which can be toggled at runtime. (r.AllowMultiGPUInEditor=1 is no longer required in .ini files to enable mGPU in the editor.)

  • Added experimental support for the Optix denoiser. This denoiser runs on the GPU, offering faster denoising times. It also includes an experimental temporal component which tries to reduce flickering in denoised animations. When both the OpenImageDenoise and Optix plugins are loaded, use r.PathTracing.SpatialDenoiser.Type 0 (default - OpenImageDenoise) or 1 (Optix) to select the currently active denoiser. Please note that the Optix denoiser is only supported on Nvidia hardware and you must manually enable the plugin.

  • Added experimental support for temporal denoising which can be enabled with r.PathTracing.TemporalDenoiser 1 Temporal denoising is intended to be used with Movie Render Queue with Reference Motion Blur enabled. The Optix denoiser uses the Optical Flow SDK from NVIDIA to estimate motion vectors, while the OpenImageDenoise denoiser uses an Engine built-in algorithm. Please note that this feature does not guarantee perfect temporal stability in all cases, so high sampling rates may still be required.

For more information, refer to Path Tracer.

GPU Lightmass Improvements

GPU Lightmass includes the following features and improvements for this release:

  • Added support for the following engine features:

    • Sky Atmosphere

    • Stationary Sky Lights (with Bent Normals)

    • Volumetric Shadows for Stationary Lights

    • Colored translucent shadows from Static Lights

    • IES Profiles for Static Lights

    • Per-light shadow casting flags

  • Improved behavior of Irradiance Cache and First Bounce Ray Guiding to have higher quality using the same settings.

  • Improved denoiser results at low light levels by applying tonemapping and inverse tonemapping before and after the Intel denoiser to mitigate discoloration issues under extreme dynamic ranges.

  • Improved the quality, performance, and GPU memory usage with the Volumetric Lightmap renderer.

    • Instead of rendering the entire scene's volumetric lightmap probes all at once, the renderer progresses through probes in batches. However, this breaks the interactive preview for volumetric lightmaps.

    • With these changes, only a quarter of the original GPU memory is needed to bake volumetric lightmaps and probe placement has been improved so that approximately 25% fewer probes are needed.

For more information, see GPU Lightmass.

Translucent Overlay Material

You can now assign Static and Skeletal Meshes a secondary Overlay Material. You can use this to achieve certain visual effects without requiring a duplicate mesh. The mesh will be rendered twice – once with a base material and once with the translucent overlay material. There is only one overlay material per mesh regardless of the number of material slots, allowing for shading effects that span across the entire mesh in one pass.

Translucent Overlay Material Slot in Material Details panel.

On-Demand Shader Compilation

On-Demand Shader Compilation (ODSC) compiles only the shaders needed to render what is seen on screen in the editor, and during iterative platform development using cook-on-the-fly. ODSC can significantly reduce the number of shaders to be compiled for those who routinely sync their builds and have a large number of shaders to compile, those who iterate on materials and shaders often, and for anyone without access to a remote DDC for cached shaders.

ODSC is enabled by default and can be controlled with the cvar r.ShaderCompiler.JobCacheDDC.

While ODSC can reduce shader compilation for most working on large projects that regularly compile large numbers of shaders, it does not currently reduce the number of "global shaders" that are compiled during the initial startup of the editor.

DX12 PSO Compilation Improvements

UE 5.1 aims to reduce stalls caused by shader compilation by starting to compile PSOs earlier, when components are loaded, rather than at the point where the object is rendered. This reduces or eliminates the need to manually gather PSO caches, which is a time-consuming process and cannot guarantee perfect coverage.

It is still possible to experience stalls if an object has to be rendered immediately after it's loaded. For the case of background streaming of distant objects, we've added the option to skip rendering the mesh until the PSO is ready, which trades stalls for delays in drawing these objects. Similarly, if a title needs to teleport the camera to a completely new location, or otherwise needs to display many new materials at once, there won't be enough time to compile all the PSOs. In this case, the game code needs to load the materials and meshes earlier, and hint the renderer ahead of time that it will need to draw them.

The existing PSO cache system can still work alongside the new system. It's possible to devise hybrid approaches, where there's a small, manually generated PSO cache containing materials which are known to be needed all the time, or are going to be used after a teleport event, and let the automatic system take care of most of the other materials.

This system is still under development and its performance will improve in future engine releases. It will also be expanded to support other RHIs, such as Vulkan.

Strata Materials (Experimental)

Strata is a new way of authoring materials that replaces the fixed suite of shading models, such as Default Lit and ClearCoat, with a more expressive and modular framework that provides a greater range of surface appearances and a wider parameter space from which to work. Performance for Strata Materials scales according to complexity and desired budget of a project, with legacy materials having a similar cost as before.

Strata material sphere example.

You can enable Strata from the Project Settings under Engine > Rendering >Strata.

To learn more about Strata in its experimental state, visit the Epic Developer Community forums.

Texture and Texture Asset Editor Improvements

Textures and The Texture Asset Editor includes the following improvements for this release:

  • You can now import Textures as 32-bit float single-channel and four-channel formats R32F and RGBA32F. For backwards compatibility, these options are opt-in and must manually be switched on, even if the source file on disk uses a 32-bit float format. (Skylights currently clamp the Specified Cubemap to 16-bit float, limiting the maximum pixel value to 65,504. This will be addressed in a future engine version.)

Texture Compression Settings options.

  • Textures with non-power-of-two dimensions can now have mipmaps. Each dimension should still be a multiple of 4 in order for the texture to be compressible. This can be useful to store content in its native aspect ratio and improve some features such as anisotropic filtering, however depending on the platform it might not always save memory relative to the next power-of-two size up.

  • Added Toolbar options for Texture2D Arrays to be displayed as Slices with a checkbox.

  • Added Toolbar options for Cubemap HDR textures to display as Faces and 3D View with checkboxes.

  • When viewing a Render Target used in a Scene Capture component, the Details panel now displays the total GPU memory usage of the Scene Capture and all textures affiliated with it, including the Lumen Scene if Lumen is enabled in the capture.

Lumen off:

Texture Asset Editor stats for Scene Capture without Lumen enabled in the capture.

Lumen on:

Texture Asset Editor stats for Scene Capture with Lumen enabled in the capture.

DirectX 12 with Shader Model 6 is Default on PC for New Projects

All newly-created projects for Unreal Engine 5 now use DirectX 12 with Shader Model 6 (SM6) enabled by default on PC. DX12 enables us to be more efficient on all fronts regarding CPU time, GPU time, and memory usage, and it unlocks new features (ray tracing being the most prominent one).

Nanite and Virtual Shadow Maps require DX12 with SM6 going forward.

For projects already using DirectX 12, you can enable SM6 from the Project Settings under Platforms > Windows > D3D12 Targeted Shader Formats with the SM6 checkbox.

When DX12 is used on PC, the engine will try each enabled shader model in descending order, so if both SM5 and SM6 are enabled, it will first try SM6, and if it is not supported by the machine, fall back to SM5. If none of the enabled shader models is usable, it will fall back to DX11 SM5, unless that's disabled in the project settings. This logic does not apply if the RHI or shader model is forced via the command line, using the -dx12, -dx11, -sm5, -sm6 (and so on) flags; in that case, the engine will quit if the forced configuration is not supported.

Please note that shader instruction counts in the Platform Stats section of the Material Editor will not be directly comparable between SM6 and SM5 because of the differences in the SM6 intermediate language. The SM6 instruction count will appear higher for equivalent levels of complexity. SM6 instruction counts should only be compared to other SM6-compiled materials.

Anamorphic Depth of Field and Camera Crop (Experimental)

Depth of field adds support for anamorphic lenses that have a vertically stretched bokeh shape. Anamorphic bokeh provides a performant option without having to provide fully custom texture support to your project. Additionally, you can now crop the camera view to a commonly-used or custom aspect ratio.

Anamorphic Depth of Field example in scene and its camera settings.

You can find the anamorphic bokeh settings in the Cine Camera and Post Process Volume settings under Lens Settings using the Squeeze Factor setting.

You can find the settings to crop your camera's aspect ratio in the Cine Camera under Crop Settings. Choose a common aspect ratio or use Cropped Aspect Ratio to specify one.

For more information, refer to Cinematic Depth of Field.

Material Editor In-line Editing

We redesigned over eighty Material Expressions to include in-line editing of constant values and properties directly on the node in the Material Graph. This is a powerful quality-of-life improvement for the Material editing workflow, as users no longer need to select a node and edit values in the Details panel in many cases.

Light Mixer (Beta)

The Light Mixer is a new editor window that displays all lights in the scene in a compact tabular format for rapid inspection and editing, similar to how the Environment Light Mixer includes scene environment lighting components.

Light Mixer

Features of the Light Mixer:

  • Create and re-parent lights directly from the Light Mixer.

  • Display lights with hierarchical context inside of folders, or as a flat list with no folders.

  • Edit the same field at once on all selected lights.

  • Open multiple tabs called collections with user-selected subsets of lights.

  • Isolate a single light with a Solo button, turning off editor visibility on all other lights.

  • Enable / disable Sync Selection to automatically select the same light in the Viewport and World Outliner.

  • Customize which lighting properties are displayed for editing.

  • Show multiple Light components contained within Blueprints.

Virtual Shadow Maps: Distant Light Mode

Virtual Shadow Maps improve the efficiency of scenes with many local lights rendered at a distance. Enable it using the console command r.Shadow.Virtual.DistantLightMode.

Virtual Shadow Maps now require DirectX 12 with Shader Model 6 (SM6) be enabled in the Project Settings. SM6 is enabled from the Platforms > Windows > D3D12 Targeted Shader Formats.

Hardware Ray Tracing Windows 10 Version Requirements

Hardware Ray Tracing now requires the same minimum Windows 10 version as Nanite and Virtual Shadow Maps. For more details, refer to Hardware and Software Specifications. Ray Tracing shaders are compiled when targeting either SM5 or SM6 D3D12 shader formats, as before.

Worldbuilding

World Partition Data Layer Improvements

Data Layers is a system designed to conditionally load and unload your world data by toggling data layers in the editor and at runtime. Data Layers are an excellent way to organize your world in the editor to handle different scenarios in your game, and create variations of the same world.

The new Data Layers panel

This release, the Data Layers system received the following improvements:

  • Data Layers functionality is now split into two constructs:

    • Data Layer Assets for storing data useful across multiple worlds.

    • Data Layer Instances that reference a Data Layer Asset and are world specific.

  • Quality of life improvements to the Data Layer Outliner.

  • Level Instance support: Actors inside a Level Instance can now reference Data Layers in the world.

For more, see the World Partition - Data Layers documentation.

HLOD Support for Water Body Actors

Unreal Engine's full suite of Water System rendering and meshing tools provide the ability to add a variety of Water Body Actor types to your levels to represent water.

Water HLOD Settings

In this release, Unreal Engine's Hierarchical Level of Detail system (HLODs) now fully supports Water Body Actors. You can assign each Actor to an HLOD Layer, and each Actor has a variety of HLOD settings that can be customized to fit your project's needs.

For more information on the Water system, refer to the Water System documentation.

For more information on the Hierarchical Level of Detail system, refer to the Hierarchical Level of Detail and World Partition - Hierarchical Level of Detail documentation.

Actor Editor Context

With the release of Unreal Engine 5.1, the editor now displays the Actor Editor Context in the lower right corner of the 3D viewport.

Actor Editor Context window shown in the bottom right of the viewport

This small box displays the currently-selected sub-level, World Partition Data Layer, Level Instance, or the currently-active Outliner Actor Folder. Any Actors placed in the world are automatically added to the current Actor Editor Context.

Uncontrolled Changelist Support in Source Control

Unreal Engine's Source Control system supports collaboration within development teams by facilitating the sharing of asset and code files through version control, as well as by providing file backups and a history of changes for your project.

Uncontrolled changelist support in source control

Source Control works closely with One File Per Actor making it an important part of World Partition workflows.

In Unreal Engine 5.1, Source Control has received several quality-of-life improvements and can now make use of Uncontrolled Changelists. This feature tracks all the writable files within your project, providing a running list of all your local changes.

  • Track changes in multiple uncontrolled changelists.

  • Move files individually to controlled changelists or revert them at any time.

  • Prevent exclusive checkout lock for testing and debugging, reducing file contention.

Uncontrolled Changelists are enabled by default in Unreal Engine 5.1.

For more information on in-engine Source Control, refer to Source Control Inside Unreal Editor documentation.

Large World Coordinate Support for World Partition (Beta)

Large World Coordinates (LWC) introduces support for double-precision data variant types in Unreal Engine 5. With the 5.1 release, we expanded the system to support for World Partition.

Large World Coordinates World Max Increase

New for this release, we raised the default world extents from 22 km to 88,000,000 km, allowing for much larger worlds to be created.

For more information on Large World Coordinates, refer to the Large World Coordinates documentation.

Virtual Production

In-Camera VFX Editor

We added a dedicated stage operator panel to collect the most commonly-used controls for ICVFX stage operations in one curated UI. Color corrections, nDisplay adjustments, and light cards are now presented in one place allowing for efficient stage operations.

VP In-Vamera VFX Editor

Improved Light Card system

We enhanced Light Cards to use a UV projection logic that keeps them in the designed shape when represented on an LED wall. We also slimmed down the UI for the creation, editing, and placement of Light Cards to present only the controls that are relevant to this creative lighting task.

Improved Color Correction controls for ICVFX

We expanded the workflows for color correction for ICVFX productions. Color correction regions work in 3D, and you can combine them with or use them in conjunction with 2D shapes as power windows. This is in addition to the per-viewport color corrections. You can now optionally restrict color grading effects of any given Color Correction Region / Window to the pixels that belong to an array of actors.

Media Plate

VP Media Plate Actor

Previously, streaming media in your scene required manually mapping together elements using Blueprints. You can now add the Media Plate actor element directly to your Scene instead, which takes care of all the underlying connections. Media Plate uses the EXR tiling and mips for image sequences at the highest-quality maximum resolution and color depths. When you use the premade Sphere and Rectangle shapes in Media Plate, Unreal Engine only streams the pixels currently viewed by the Camera, lowering the budget cost for streaming. This lets you balance the load on render notes and improves per-PC bandwidth limitations.

The new video architecture brings:

  • A greatly simplified video import process.

  • Support for Media Playlists.

  • Drag and drop support for the suggested assets and Actors.

  • Updated Info and Preview windows.

  • Sequencer integration.

  • View frustum culling for improved performance.

  • A Media Player and Texture Manager.

EXR Plate Performance

VP EXR plate performance

Uncompressed EXRs provide the best quality for video footage and have the fastest path for processing using adequately fast storage devices. We added a new system to pre-process uncompressed EXRs and break them down into a set of tiles and mipmap levels. Using the workflow of the Media Plate Actor then allows these properly optimized EXRs to playback through the system with the best possible efficiency by streaming and rendering only the visible tiles according to the Viewport alongside with the right mip level, whether being rendered through the nDisplay system or standalone.

Lumen for In-Camera VFX (Experimental)

Lumen now has support for multiple viewports in nDisplay and can be used for ICVFX. Each viewport will use an independent Lumen Scene to eliminate artifacts in LED volumes. In addition to Lumen, Virtual Shadow Maps also support multiple viewports for nDisplay and ICVFX through the same mechanism.

Cine Camera near clipping

The Cine Camera now has a per-camera Custom Near Clipping Plane.

Virtual Camera

Output from Virtual Camera now includes support for WebRTC Pixel Streaming, offering a more reliable and performant streaming option that can be viewed both in the Live Link VCam app as well as in any web browser. Virtual Camera also now includes support for Enhanced Input in Editor, to allow for remappable control of the VCam with any supported hardware device. These changes are enabled by default on the new VCamActor, which replaces VirtualCamera2Actor, alongside a redesigned default operator HUD focused on a Live Action Camera-Like feel and a clean frame image.

Furthermore, there are Virtual Camera UI and UX improvements.

Virtual Camera UI improvements

Virtual Scouting Improvements

Virtual Scouting now works with OpenXR and Enhanced Input system.

If you use the Live Link face iOS app to record facial capture on the device only (not connected to Unreal Engine and recorded in Take Recorder), you can now import the (backup) recording once extracted. The device stores a .csv file with the raw timecode and blendshape data. Once imported, the result is a level sequence with a Live Link track, equivalent to what you would have achieved by recording the live stream in Take Recorder.

Multi-user Server UI

We added a UI to the multi-user server to inspect the running status of the server live. This allows operators and ICVFX stage managers to inspect, monitor, and diagnose problems during multi-user server operation. This has benefits over the console server which only provided a stream of connection information over a console command and did not provide contextual information about the running server operation.

The console server is still available for operation on headless computers or computers where running a UI is not possible. For example, a Linux server or containerized operation.

Movie Render Queue

Improved Texture Behavior

We made several improvements to how Movie Render Queue (MRQ) handles texture streaming. Improved handling for incorrect mipmaps being loaded when Texture Streaming is enabled. Texture streaming is still disabled by default in MRQ, but can be enabled to save memory in large projects.

Cinematic Prestreaming

You can now create Virtual Texture and Nanite cinematic caches using the Prestreaming Recorder. This plugin is used as a render pass to build a cache for the Cinematic Prestreaming system to interpret. Once built, you can reference the cache in your sequence to ensure that Nanite and Virtual Texture data streams in more reliably during your cinematic.

cinematic prestreaming track

Camera Improvements

We added new camera-related features to Movie Render Queue. You can now render from multiple camera angles in the same shot by enabling Render all Cameras before running your MRQ job.

Orthographic cameras are now also supported, making it possible to render sequences using non-perspective cameras. Currently Path Tracer is the only supported render pass for this option.

Runtime API Improvements

We simplified the Movie Render Queue API in a way that greatly reduces the complexity of using MRQ in shipping projects. Now you can simply request a new job from the subsystem, set the configuration for it, and then ask the subsystem to render the job. You no longer need to use queues, manually configure the executor, or set up basic settings on the job such as the world to render and the level sequence as a soft path.

nDisplay

nDisplay SMPTE
2110 support

nDisplay Media I/O Mapping System (Experimental)

We improved the workflow to provide users the ability to specify arbitrary time-synchronous pixel sources and destinations to ICVFX cameras, nDisplay viewports, and the application window backbuffer. This means, in addition to the native UE 3D scene render, users can now also register IP video sources such as SMPTE 2110, media textures, or live-generated data from hardware capture devices to nDisplay viewports.

SMPTE 2110 support (Experimental)

We added support for SMPTE-2110 I/O (using Rivermax) to Unreal Engine. Using the new Media I/O Mapping System, nDisplay render nodes can directly stream to LED wall processors that support SMPTE-2110. This also allows a different hardware configuration for nDisplay systems where each inner frustum can be rendered by a dedicated machine. Each inner frustum can then be shared to each machine that renders part of the total image for compositing over the outer frustum. This will allow for improved performance, and linear scalability of cameras as well as more predictable content performance.

Movie Render Queue Support for nDisplay

Users can now render nDisplay viewports to disk using MRQ. New settings allow users to pick a configuration file and the desired viewports to render at their native and specified resolutions.

nDisplay Quick Local Launcher

You can now quickly launch an nDisplay-enabled project locally, to use for debugging and locally trying out your project on your PC without needing a cluster.

Default Visual Studio Version

Unreal Build Tool (UBT) now generates the Visual Studio solution file for the latest version of Visual Studio installed, unless you have a Platform SDK installed that does not support the latest version. In this case, UBT generates the Visual Studio solution file for the latest version of Visual Studio that supports the Platform SDK in question. The preferred compiler is Visual Studio 2019.

Clang 13 Support

Clang 13 is now the required version when compiling for Clang-based platforms such as Linux.

Static Code Analysis

Unreal Build Toolnow supports running several different Static Code Analyzers. Static code analyzers use a variety of algorithms and techniques to analyze source code and find bugs without executing the code.

Supported Analyzers:

  • Default: Uses the default static analyzer for the selected compiler.

  • VisualCpp: Uses the built-in Visual C++ static analyzer. Only supported for Microsoft Visual C++ (MSVC) based platforms.

  • PVSStudio: Uses the PVS-Studio static analyzer. Only supported for MSVC-based platforms. This analyzer requires a license, for more information, refer to the PVS-Studio site.

  • Clang: Uses the Clang static analyzer. This forces the compiler to use Clang for MSVC-based platforms. This analyzer is in Beta.

The syntax for using Unreal Build Tool to run a static code analyzer is:

Engine\Build\BatchFiles\RunUBT.bat TARGET PLATFORM Development -StaticAnalyzer=ANALYZER

For example, you can enter the following into the command-line to run the default static code analyzer for the selected compiler with Unreal Editor as the target on a Windows 64-bit system:

Engine\Build\BatchFiles\RunUBT.bat UnrealEditor Win64 Development -StaticAnalyzer=Default

For more information, refer to the Static Code Analysis documentation, which includes details about the supported analyzers and additional command line options.

Unreal Header Tool (UHT) has been rewritten using C# and integrates directly with the Unreal Build Tool. The purpose of this rewrite is to:

  • Improve maintainability.

  • Decrease build times.

  • Reduce build farm times.

  • Remove engine hooks.

The C++ Unreal Header Tool is now deprecated and will be removed as soon as possible, but no earlier than UE 5.2.

There are two reasons to continue using C++ UHT prior to its removal from Unreal Engine along with information about how to continue using C++ UHT:

  • You use UHT script generator plugins that currently have no C# version.

    • If UBT detects a script generator plugin being used on a project and a C# version does not exist in the plugin, then UBT will automatically revert to using C++ UHT.

  • You have local changes to UHT.

    • In this case, set bUseBuiltInUnrealHeaderTool = false in the UEBuildConfiguration category to disable C# UHT.

In either case, it is important to port C++ UHT changes and script generator plugins to C# prior to C++ UHT being removed from UE. If you need to make changes to C# UHT, you can find the source code in Engine/Source/Programs/Shared/EpicGames.UHT.

C# Script Generator Plugins

We provided a sample C# script generator plugin in Engine/Plugins/ScriptPlugin/Source/ScriptGeneratorUbtPlugin. Furthermore, all existing UHT exporters are written using the same mechanism and are found in Engine/Source/Programs/Shared/EpicGames.UHT/Exporters. Here is a short guide to help:

  1. Create a C# project in the same directory tree as the plugin with the existing C++ script generator plugin. The extension of the plugin must be .ubtplugin.csproj.

  2. In Visual Studio, generate the project files. Your plugin will now be listed in Programs/UnrealBuildTool.Plugins.

  3. Add EpicGames.UHT as an assembly dependency and not a project dependency.

  4. Using ScriptGenerator.cs as a reference, create a class that will contain the entry point for exporting scripts. This class must have the UnrealHeaderTool attribute and the static method must have the UhtExporter attribute.

  5. Lastly, C# generator plugins must support the same defined constants available to build C# sources such as UE_5_1_OR_LATER.

The supplied factory object contains the context needed to export the UE data types. The factory object contains a UhtSession. This UhtSession includes a list of UhtPackages. You can find the data types defined in the headers in the UhtHeaderFiles, which are located within the UhtPackages.

Best Practices for C# UHT

  • Export files in asynchronous tasks to improve performance.

  • Export files using the IUhtExportFactory.MakePath and IUhtExportFactory.CommitOutput methods to take advantage of built-in change detection, reference, and verification output.

  • Use BorrowStringBuilder to use cached string builders.

  • Avoid temporary objects and strings as much as possible.

  • Use the IUhtSession.GoWide property for debugging to see if -nogowide was specified on the command line. When present, do not use asynchronous tasks to generate output, but rather call your export code directly as this will simplify debugging.

Audio

MetaSounds (Beta)

MetaSounds Demo

MetaSounds, our high-performance graph-based audio system, has several new improvements in 5.1.

We've expanded our library of nodes to provide new functionality, such as pitch shift, grain delay, rerouting, and more. Additionally, we added multichannel audio output support, making it easier for you to create immersive surround sound experiences.

To learn more about MetaSounds, refer to the MetaSounds documentation.

Audio Modulation

The Audio Modulation plugin is no longer a Beta feature and is now fully integrated with MetaSound. This feature provides a generic method for modulating audio parameters. Now, anything can be a modulation source or destination. You can define your own groups of parameters and control them how you want.

Audio Gameplay Volumes (Beta)

Audio Gameplay Volumes are the next iteration in geometry-based audio management and control. Designed as a replacement for the legacy Audio Volumes system, the Audio Gameplay Volumes system provides component-based options for Unreal Audio Engine feature integrations, extensibility, and tighter gameplay integration, including movability and dynamic transformations.

To learn more about Audio Gameplay Volumes, refer to the Audio Gameplay Volumes documentation.

Soundscape (Beta)

Soundscape procedurally generates ambient sounds, such as rustling foliage, chirping birds, and bustling traffic, which are streamed as the player moves around the world. Once set up, the plugin manages and composes these sound systems autonomously and removes the need to manually create them.

Waveform Editor (Beta)

Waveform Editor Demo

The Waveform Editor is a new tool for viewing and editing sound waves within Unreal Editor. It can trim, fade, normalize, and make other waveform adjustments. Sound wave metadata can even be altered to support loop regions, cue points, and more. These modifications can be saved to a new asset to preserve the original.

UMG / Slate Improvements

UMG Viewmodel (Beta)

The Viewmodel plugin provides a framework that makes it simpler for designers to work independently from programmers when making structural changes to widgets.

Previously, there were two main methods for forwarding data to a widget in UMG:

  • Attribute binding: The widget defers the value of one of its fields (such as a text field) to a Property or a Blueprint function that returns a value. This implementation was flexible and easy to use, but had performance issues, as it would continually update a widget regardless of whether the property itself actually changed.

  • Event-driven updates:** Gameplay calls functions that manually update the UI, or the UI updates based on Event Dispatchers or Delegates. This provides superior performance, but requires manual code changes to reflect any changes in the UI.

The Viewmodel plugin provides the best of both methods. After enabling this plugin, you can create a Viewmodel to hold the variables used in your UI, then bind widgets to the properties in your Viewmodel.

The View Binding and Viewmodels windows

A Viewmodel is a separate object that holds copies of a set of variables needed in your UI. Whenever you need to make a change to one of these variables, you update it within the Viewmodel rather than directly in your UI. The Viewmodel then notifies the bound widget in your UI that its value has changed, and pushes an update. This streamlines the process of creating a data-driven UI by eliminating the busywork of creating callbacks and update functions, and provides exposure to programmers separate from the UI itself.

For more information on how to use ViewModel in your projects, refer to the Viewmodel documentation.

Named Slot Widgets

Example of a Named Slot Widget

UE 5.1 introduces Named Slot Widgets in UMG. These widgets act as placeholders for other widgets when creating templates. Normally, when you create a child class of a UMG widget, the widgets in its hierarchy are hidden.

Named Slots appear in the hierarchy and can be populated in the PreConstruct event safely, making it easier to preview your template widget with test use cases. Additionally, when you insert a child into a Named Slot, its place within the hierarchy and render order is preserved based on the parent class.

UMG Tool Palette Plugin (Experimental)

UMG Tool Palette

We added a new Tool Palette plugin to UMG in UE 5.1. This tool palette provides quick access to commonly used tools, widgets, and interactions. You can enable this plugin in the plugins menu to try it out.

Editor

Better Asset Searching and Filtering

The Outliner and Reference Viewer now support Asset filtering. These filters behave the same as Content Browser filters, and they support advanced search syntax operators.

You can now save an Asset search as a custom filter in the Outliner, Content Browser, and Reference Viewer. Once saved, custom filters, as well as individual filter settings, are available across all streams and projects for the user who created them.

We made the following improvements to searching and filtering Assets in the Content Browser:

  • The search bar shows a history of your most recent searches.

  • Filters are displayed in a vertical column by default. You can toggle between the new (vertical) and legacy (horizontal) filter layout from the Content Browser's Settings menu.

  • The Filter dropdown menu shows a badge when at least one filter is active.

Outliner Improvements

To improve Outliner navigability, headers now stack when you scroll up and down.

Stacking headers in the Outliner

We made it easier to find Actors in the Outliner by adding the following features:

  • You can configure the Outliner to always scroll to an Actor when you select that Actor in the Level Viewport. Enable this option from the Outliner's Settings menu by toggling Always Frame Selection.

  • When an Actor is selected in the Level Viewport, press F to highlight that Actor in the Outliner.

  • Parent items of the currently selected Actor are now highlighted even when the current selection is collapsed.

You can now have up to four instances of the Outliner and customize each instance separately.

You can choose which columns display in the Outliner by right-clicking a column header, then clicking a column name to toggle whether to show or hide it.

Reference Viewer Tool Redesign

We redesigned the Reference Viewer tool to support a greater number of Asset references and a greater depth of the reference graph. Reference search now supports a search depth of 50 and search breadth of 1000 Asset levels.

Finding Asset references now leverages Unreal Engine's improved searching and filtering capabilities to give you better control over which types of Assets are displayed in the reference graph.

Asset nodes in the reference graph are color-coded by Asset type and can be customized to display additional information, such as the Asset's thumbnail and its file path.

For a rundown of all the Reference Viewer improvements in Unreal Engine 5.1, refer to the Reference Viewer documentation.

Python Type Hinting

The Python plugin can now generate the stub file with type hinting. Type hints will appear in your Python IDE auto-completion menu. To enable type hinting, from the Unreal Editor menu bar, go to Edit > Editor Preferences…. From here, navigate to Plugins > Python. Enable Developer Mode and choose your desired Type Hinting Mode. This generates a Python stub file you can add to the IDE of your choice. For more information on how to enable type hinting and the various type hinting modes available, refer to the documentation for Setting Up Autocomplete for Unreal Editor Python Scripting.

Editor preferences
for python type hinting

Localization Pipeline Automation Improvements

The Localization Commandlet has the following improvements in UE 5.1:

Preview Gathering

In previous versions of UE, the localization pipeline needed the build system to run through each step of the build process before handling localization. This meant, to see errors and warnings for localization, users needed to rebuild their entire project. In UE 5.1, the localization commandlet will run a preflight that gathers localization files, then checks them for errors and warnings. This eliminates the need to wait for a full build to find localization errors, greatly improving the expediency of debugging localization. This improvement is available through the UAT localization commandlet.

CSV Format Support for Error Reports

Whereas previous versions of UE used only .txt files for word count and namespace conflict reports, UE 5.1 now supports using .csv files, providing improved clarity and organization of information. This format is enabled by default in UE 5.1, but you can change this by going to your engine's install directory, navigating to Engine/Config/Localization/Engine.ini, and setting the ConflictReportName and WordCountReportName fields to use the .txt file extension instead of .csv.

Improved Parsing Code

UE 5.1 adds several quality-of-life changes to handling localized text in code. Use #define LOCTEXT_NAMESPACE and #undef LOCTEXT_NAMESPACE to mark sections of code as belonging to a specific localization namespace. Then, you can use the LOCTEXT macro in between those macros to define a localized text entry with a key and a string of default text.

#define LOCTEXT_NAMESPACE "Paper2D"
//…

DefaultRule.Description = LOCTEXT("TerrainDefaultRuleDesc", "Top");

//…

#undef LOCTEXT_NAMESPACE

In the above example, the key TerrainDefaultRuleDesc with the default text Top would be added to the Paper2D namespace. Additionally, localized text now supports using escape characters.

Curve Table Editor

You can now edit Simple Curves and Rich Curves in the Curve Data Table Editor. When creating a Curve Table, you can open the editor to edit curves in the table or curve view without needing to go back to the external program you created them with.

  • You can create Curve Tables in the Content Browser by navigating to the Miscellaneous section. You can select Rich Curves or Simple Curves by selecting the type of interpolation.

Curve Table Creations

  • Creating a new cubic Curve Table creates a Rich Curve table.

RichCurve Table

  • Creating a constant or linear Curve Table or importing a spreadsheet creates a set of Simple Curves you can then edit inside Unreal Engine.

Simple Curves Table

  • When editing Simple Curves, we maintain the constraints that all curves must have identical key times, so keys can't be moved horizontally, and adding a key adds a key to all curves.

Editing Simple Curves

  • The editor now supports renaming and removing curves along with improved rendering of constant curve tables.

Renaming Curves

  • Along with editing curve key values, new toolbar enhancements include the ability to retime, add or delete key columns, and reimport.

Virtual Assets (Beta)

Virtual Assets provide you with faster and more efficient methods for syncing data among all members of your team as your project begins to grow in size.

When working with Assets, users only need a minimal amount of information about their assets to display them in the editor. For example, a Texture may need a thumbnail image and editor properties (such as coordinates and scale), however the bulk of the .UAsset file for textures is pixel data, which may not be needed and would be wasteful to have your team sync to your project.

These assets have been split into core asset metadata portions that exist where the assets are in your source control and split the bulk data into a separate location. If a user requires the bulk data, they will be able to sync on demand, in source control.

The features include:

  • The functionality to virtualize your entire project at the same time, by package path, by specific asset types, or by specific assets.

  • Support for Texture and Audio Assets.

New Import Framework

Unreal Engine 5.1 features a new Import Framework designed to provide users with a high performance, customizable asset pipeline. The framework works in the editor and at runtime, as well as provides scripting support using Blueprint and Python.

Interchange framework options

This new framework is format agnostic and works using the following steps:

  • Translator: Converts the file format to an intermediary graph structure in Unreal Engine.

  • Factory: Generates actors and assets from the pipeline output.

  • Pipeline: Processes the graph structure into a description of Unreal Engine Actors and Assets.

The framework currently supports the following formats:

  • Image formats: BMP, DDS, EXR, HDR, JPG, PCX, PNG, PSD, TGA, TIFF

  • Light format: IES

  • 3D models: GLTF, OBJ

  • Material: MTLX

    • In this initial release, MaterialX is import-only, and only supports translation of materials using the standard_surface shading model.

File formats previously supported by Unreal Engine are still supported using the Legacy framework.

For more information, refer to the Import/Export Interchange documentation. (Link TBD)

UV Editor (Beta)

Introduced as Experimental in 5.0, the UV Editor has moved to Beta in 5.1. Previously, the UV Editor was accessible through a plugin. Now, you can quickly access the editor in three ways:

  • Use the UV panel in Modeling Mode.

  • Right-click your mesh within your Level.

  • Right-click your mesh in the Content Browser.

UV creation and editing continue to improve, not only with the UV Editor enabled by default but with the following:

  • We added the Transform tool to support more complex transform behaviors than the gizmo can provide. This control includes chained scale, rotate, translate, and a variety of pivot options to adjust the relative motion of the transforming UVs.

  • UDIM support is now active for the Layout and Unwrap tools.

    • You can pin existing UV islands to the UDIM they currently occupy while undergoing layout or unwrapping operations.

  • The Distribute tool creates automatic spacing between UV islands based on bounding box edge rules.

    • Manual distance adjustments are now supported, giving users precise control over the spacing between UV selections when performing the various distributions.

    • A new mode for minimally removing overlap is active. This attempts to move selected regions apart, if needed, to prevent their bounding boxes from intersecting. The mode also works with the new manual distance controls, allowing separation distance customization.

  • The Split tool now supports whole triangle regions, vertices, and edges. We are providing quick selection and segmentation of existing UV islands.

  • The Align tool includes additional grouping logic, where individually selected islands can be aligned independently of each other and for the selection to be aligned as a group, preserving relative positioning.

    • The Alignment and Distribute tools now support vertex and edge selections for more precise positioning along boundaries and internal lines. Accordingly, the tools support treating individual vertices as independent entities, creating the finest scale per vertex alignment and distribution.

  • The UV Editor's 3D Viewport supports camera snapping to selection.

    • The new camera focus button can initiate this in the Viewport's toolbar or using the default camera snap keybind (Alt+F).

  • Use the AutoUV tool to create UVs based on existing mesh polygroups.

    • An option exists to automatically arrange the resulting islands into UDIM tiles according to their origin PolyGroup.

Many of these improvements mimic traditional artists and drawing applications. To learn more, refer to the UV Editor documentation.

Pattern Tool

We expanded the artists' modeling toolkit with the addition of the Pattern tool. Tile one or more selected meshes along a Line, Grid, or Circle oriented on a movable 3D plane. Various parameters are available for each tiling pattern, including interpolating translation, rotation, and scale. Output the resulting pattern as a merged Dynamic Mesh, per-element Actors (static or dynamic), or an instanced Static Mesh component.

Animation

Animation Synthesis

Machine Learning (ML) Deformers (Beta)

Using the Machine Learning (ML) Deformer system, users can now create their own ML Deformer models to approximate high-quality mesh deformations in Unreal Engine.

Packaged as a plugin, the ML Deformer Framework uses the existing Neural Network Inference (NNI) framework as well as a reusable asset type and editor, that you can use to train, inspect, and debug ML Deformer models that deform meshes by evaluating the neural networks at runtime.

The ML Deformer system also provides integration with the Deformer Graph system that you can use to edit and fine-tune generated mesh deformations.

Additionally, you can enable the new Neural Morph Model plugin to use a prefabricated high-performance deformer model to train high-quality deformations on your characters with a low memory footprint.

  • The Neural Morph Model is a replacement for the Vertex Delta Model. Requiring only a few megabytes of additional data per character and fast hardware performance, the Neural Morph Model enables the use of high quality ML-based mesh deformation models on modern platforms.

In addition to the introduction of the ML Deformer framework and the Neural Morph Model, the ML Deformer asset editor has received several performance and quality-of-life improvements.

For more information, refer to the ML Deformers documentation.

Deformer Graph (Beta)

The Deformer Graph plugin features an Editor that allows users to create and edit Deformer Graph assets to customize complex mesh vertex deformation behaviors for any skinned mesh.

With the Deformer Graph Editor you can use a combination of custom Blueprint logic and HLSL (High-Level Shader Language) scripting to create and customize mesh deformer systems that modify mesh vertex data using dynamic inputs at runtime. The Deformer Graph is a powerful alternative to traditional linear skinned meshes using Morph Targets or Cloth simulation to create intricate mesh deformations at runtime.

For more information, refer to the Deformer Graph documentation.

Physics Control Component (Experimental)

The Physics Control Component is a plugin that provides a means for you to add simple, intuitive, and powerful physically-based controls to a Blueprint. With these physics controls, you can take advantage of the emergent physical motion of static and skeletal meshes, while still retaining artistic and gameplay control.

With the Physics Control Component you can easily create controls that affect all or only part of a Skeletal Mesh. For example, you can create physics controls to operate in world space, for situations where you want to see some emergent motion and still retain a lot of control. You can set physics controls to operate in parent space to create reactive muscle-like limb behaviors. Physics controls can even operate between any local or external physical bodies.

Additionally, you can direct the physics controls to use animations, procedural targets, or a combination of both.

To see example applications of the Physics Control Component, such as full body effects, secondary motion, and hit reactions, refer to the Physics Control level in the Content Examples project.

Animation Gameplay

Motion Matching (Experimental)

The Pose Search plugin now features the new Motion Matching Animation Blueprint node, a dynamic alternative to State Machines, you can use to build character locomotion animation systems.

Using a Database asset containing the character's locomotion animations, the Motion Matching node makes informed animation pose selections from the set of stored animations, to match the character's Movement Model at runtime. Using the Motion Matching node, a high-quality, responsive character locomotion animation system can be set up quickly and efficiently, without the need for complex State Machine logic.

To increase a character's Motion Matching animation fidelity and quality, you can simply add more animations to the characters Motion Database or Database Set asset. With each additional animation, the Motion Matching node is able to draw from more data to more accurately and effectively select quality output poses to match the player's movement model.

The Pose Search plugin also comes packaged with a custom integration of the Rewind Debugger you can use to record and analyze the Motion Matching pose selection process, to see which poses were selected, which poses were not selected, and why. You can then use this information to adjust and fine-tune the selection process to fit any project's needs.

custom rewind debugger implementation for motion matching

Animation Runtime

Rewind Debugger

With a refreshed user interface, the Rewind Debugger now features a timeline of animation data tracks that display visual graphs of information, that you can use to see vital updates and changes in animation data while debugging a character's animation system.

The Rewind Debugger timeline features a track of animation data for each of the debug subject's components or child objects. You can use the Rewind Debugger to analyze and debug Animation Sequence playback, Notifies, Curves, Blend Weights, and more. Each track of animation data can also be selected within the timeline to populate the new Rewind Debugger details panel with more precise readouts of the selected animation data for debugging.

Additionally, the Rewind Debugger now features Pose Watch integration, that you can enable in the characters Animation Blueprint to observe the output pose of any blueprint node within the recorded segment of gameplay.

For more information, refer to the Rewind Debugger documentation.

Sequencer

Layer Bars

To assist with the simultaneous movement and scaling of multiple keyframes, you can now use Layer Bars to move keyframes and sections in Sequencer. Layer Bars are hierarchical and appear on Actor, Component, and Folder Tracks. Manipulating them at any of these points will appropriately manipulate other Layer Bars within, making it easier to retime keyframes on your Actors without needing to expand each track.

sequencer layer bars

Key Bars

Key Bars have been added to Sequencer as an easier way to retime neighboring pairs of keyframes. Selecting and dragging the line drawn between two keyframes will move both keys relative to each other, which can save time from multi-selecting each key individually, and preserving custom curves between these keys.

sequencer key bars

Animation Constraints

You can now dynamically constrain your Sequencer objects in a variety of ways using Unreal Engine's new Constraint feature. Similar to constraining methods in other animation tools, you can constrain entire transforms with the Parent Constraint, or along individual channels with Translation, Rotation, Look-At, or Scale Constraints.

Constraints make it easier to dynamically and non-destructively attach your Objects, Actors, and Control Rig Controls to each other in your Sequencer animation.

Control Rig

Construction Event

To improve consistency with other similar Blueprint tools, we renamed Setup Event to Construction Event. We also added new Spawn nodes to make procedural rig creation in the Construction Event faster and easier.

construction event and spawn control

UX and Feature Improvements

We made several quality of life improvements and UX changes to Control Rig to improve your workflow.

  • The Control Rig Editor now supports multiple graphs, which provide a means for you to organize and partition rig logic into separate graphs.

  • You can now add Custom Events to your Rig Graph (called User Defined Events), which provide a means for you to create and execute your own rig events.

  • You can now show Controls overlaid on top of geometry, similar to "X-Ray" settings in other software, by enabling Show Controls as Overlay in the Animation Mode panel.

  • We added Proxy Controls, which are a new type of Control that can be linked to other Controls in a Driver / Driven relationship.

  • You can now attach Python commands to pins in the Control Rig Editor, enabling automated setup of nodes.

control rig user interface

IK Rig and Retargeter

Adjustable Stride

We added new properties available when you are using the IK Retargeter to control the length, width, and splay of IK Goals. In most cases, you can use this to adjust the stride and overall stance of a retargeted character.

Speed Planting

We provided new tools and workflows to improve retargeting results from vastly different characters. You can now reduce foot sliding and other similar problems by using Speed Planting workflows. To learn more about this workflow, refer to the Speed Planting documentation.

UX and Feature Improvements

We made several user interface and user experience changes to the IK Rig and IK Rig Retargeting editors to improve workflows, layout, and tool behavior. Notable changes include:

  • Both the source and target skeletons can now be seen in the Viewport, along with the skeleton hierarchy in the Retarget Editor. Additional filters, search bars, and hierarchical sorting can now be used to improve your ability to isolate and edit chain properties.

  • Certain properties, such as the IK properties, are now disabled if the retarget chain does not require them. We also added a simpler UI for properties, including property reset indicators for properties with non-default values.

  • Retargeting poses can now be saved and imported, making it possible to share custom poses on your project.

  • We improved retarget pose editing by allowing numerical entry of bone rotations for easier, more precise control.

ik retargeting interface

DMX

Vectorworks for DMX

Vectorworks and MVR Importer (Experimental)

MVR is a key format for the transport of DMX fixtures and patching information in the live events and film/TV industries. This support allows for collaboration with teams using CAD applications such as Vectorworks, and lighting consoles such as the Grand MA3.

In order to import Vectorworks files into UE for Live Events or VP stage previs, we added support for GDTF and MVR to the Datasmith workflow.

MVR provides DMX fixture transforms, patching information and GDTF signature files, while Datasmith imports common mesh and texture data.

DMX for Virtual Production (Experimental)

We are improving bi-directional workflows between Unreal Engine and DMX, where Unreal Engine triggers DMX events and DMX consoles are able to control Unreal Engine Actors. This supports the growing collaboration between users of Unreal Engine and members of production teams using DMX-based lighting consoles.

In-Editor Real-Time Support (Experimental)

Previously, DMX support was enabled by means of the DMX plugin, and the send / receive functionalities were only enabled in Play / Preview / Game or Packaged modes. We added support for being live while in editor, enabling users to drive in-editor elements using DMX.

Pixel Mapper Improvements (Experimental)

We added numerous UI tweaks and workflow improvements to the DMX Pixel Mapper, in particular the ability to set the 2D fixture mapping grid using a previously-imported MVR dataset layout.

Unreal Cloud Services

Pixel Streaming

Virtual Production Support for Pixel Streaming

We introduced support to pilot virtual cameras (VCams) using remote Pixel Streaming sessions. This is achieved using the new Pixel Streaming Output Provider, which is selected as an output provider for a VCam actor.

Virtual Production LiveLink Improvements (Experimental)

We also added experimental support to the Virtual Production LiveLink iOS app to stream and control the virtual camera on iOS devices using Pixel Streaming. In the past, controlling virtual cameras using the LiveLink app induced a noticeable level of latency, but Pixel Streaming allows us to provide much lower latencies when driving virtual cameras. Support for this workflow is experimental and not yet ready for production.

Pixel Streaming Frontend Improvements

The Pixel Streaming frontend, signaling server, SFU, and relevant scripts have all been moved into their own top level Github repository decoupled from the Unreal Engine release cadence. This makes it possible for us to update these components more frequently without being locked to the Unreal Engine release cycle. The repository can be found here:

https://github.com/EpicGames/PixelStreamingInfrastructure

For Pixel Streaming users going forward, there should be nearly no change in your workflow. When you package your application, there will be a small script bundled with your application that, when run, will download the correct version of the Github release based on your engine version. If there are browser-breaking changes or issues between releases this repository will provide a mechanism for us to address these outside of the release windows. Additionally, we hope to encourage Pixel Streaming users to report frontend / server issues to this repository where we can collaborate with our users more easily.

Pixel Stream Decoding in UE Editor/Game

In 5.1, we introduced support to decode Pixel Streaming video streams in-engine. This makes it possible to provide streaming between multiple applications and potentially between editors. This feature is accompanied by new blueprint nodes to set up stream playback in the engine without writing any C++ code. Currently, you can play back streams using a special material.

Example of Pixel Streaming ingame

New Blueprint nodes for in-engine Pixel Streaming

Editor Viewport Window Streaming (Experimental)

In the past, Unreal Engine users could stream packaged Unreal Engine applications and games. Due to the increase in remote working and remote collaboration, we introduced experimental support to Pixel Streaming to stream the entire Unreal Editor itself. Streaming the editor can be tested out using the new Pixel Streaming toolbar now visible when Pixel Streaming is enabled. Or, if you are launching in an unattended setup, you can launch with -EditorPixelStreamingStartOnLaunch. Running editor streaming works the same way as normal Pixel Streaming, and the signaling server is still required.

There are some limitations around the editor experience. For example, currently multi-monitor streaming is not yet supported. In general this feature is an experimental preview, we intend to expand the feature set and user experience in subsequent releases; however, users should be advised to take caution if building against this feature as it will likely change.

Platform

Unreal Editor on Apple Silicon (Experimental)

Previous versions of Unreal Engine supported building projects for Apple's ARM-64 architecture, but Unreal Editor itself was not natively built for it and depended on the Rosetta instruction translator when running on Apple Silicon devices. UE 5.1 rolls out an experimental version of native support for Apple Silicon in Unreal Editor, meaning that M1 devices and later should see improved performance when running the editor.

This support is not available in builds distributed through the Epic Games launcher. Instead, you need to build Unreal Engine from source on your Apple Silicon-based Mac with Xcode. Building UE with Xcode on Apple Silicon platforms will default to building the experimental native version, with the target device listed as My Mac. To build the Rosetta version you need to change the target device to My Mac (Rosetta).

Xcode Rosetta Option

Note that Marketplace plugins are unlikely to work with this configuration, as they are not arm64-compatible yet.

Linux IDE Workflow Improvements

In UE 5.1, we improved support for VS Code as a default option for IDEs in Linux. Error handling and messaging is also present when you have multiple IDEs and the code accessor fails to find the correct one.

Google Stadia Support

In UE 5.1, we have deprecated support for the Google Stadia platform. We will remove Stadia support in UE 5.2.

XR

Improved OpenXR Support

We added support for the ResetOrientationAndPosition interface function and Pixel Density, experimental support for Screen Percentage with Temporal Upscale, along with stability improvements and bug fixes.

Enhanced Input (Beta)

In 5.1, you can use Enhanced Input to create complex input handling for OpenXR projects. Enhanced Input now supports OpenXR-compatible controllers and head mounted displays.

We updated the VR Template to include examples of how to use Enhanced input for your XR projects.

The OpenXR Input Mapping Context Details tab

Rendering Feature Parity (Experimental)

We added initial stereo support for Nanite, Lumen and Temporal Super Resolution. Currently this is only supported on PC while using the Deferred renderer.

OpenXR Support for HoloLens

We removed the Windows Mixed Reality Plugin for Unreal Engine and moved to OpenXR for the HoloLens. To develop projects for HoloLens in 5.1, install the Windows Mixed Reality OpenXR Runtime and the Microsoft OpenXR Plugin.

Refer to the OpenXR Prerequisites documentation for more information about setting up your HoloLens project with OpenXR.

Deprecated Oculus VR and SteamVR Plugins

We deprecated the Oculus VR and SteamVR Plugins in 5.1. Use the OpenXR plugin and the appropriate OpenXR runtime for your Oculus or SteamVR projects.

Refer to the OpenXR Prerequisites documentation for more information about installing the OpenXR plugin and runtimes.

Mobile

Development Requirements and Compatible Hardware For Mobile

The following are the supported OS versions and minimum hardware for mobile devices supported by Unreal Engine 5.1. For additional information about required SDKs and IDEs, refer to the Platform SDK Upgrades section.

iOS, iPad OS, and tvOS

UE 5.1 supports iOS, iPadOS, and tvOS devices running OS version 15 or later. The following are the minimum compatible device models:

  • iOS 15

    • iPhone 6S or later

    • iPod Touch 7th generation

  • iPadOS 15

    • iPad 5th generation or later

    • iPad Air 2* or later

    • iPad Mini 4* or later

    • iPad Pro (all models)

  • tvOS 15

    • Apple TV HD*

    • Apple TV 4K (first generation)

    • Apple TV 4K (second generation)

*Apple A8/A8X-based devices (iPad Air 2, iPad Mini 4 and Apple TV HD) require a project setting to enable support.

For information about the required SDKs and MacOS versions, refer to the SDK Upgrade Notes below.

Android

UE 5.1 supports Android devices meeting the following specifications:

  • Android 8 or higher running 64-bit Android

  • 64-bit Arm-based CPU

  • Compatible GPUs

    • Mali T8xx, G71, G72, G76, G77, G78, and G710 series

    • Adreno 5xx, 6xx, or 7xx series

    • PowerVR GM9xxx series

    • Xclipse 920

  • Compatible Graphics APIs

    • OpenGL ES 3.2

    • Vulkan supported on Android 10 or later devices with compatible drivers

For information about the required SDK versions, refer to the SDK Upgrade Notes below.

The Deferred Shading Mode for the Mobile Renderer is now Production-Ready

The Mobile Renderer Deferred Shading Mode, introduced in UE 4.26 as an Experimental feature, is now production-ready in UE 5.1. This mode is optimized for tiled GPUs common in mobile devices, and enables several high-quality lighting features not supported in the mobile forward rendering path, such as light functions, IES profiles, and lit decals. All devices supported by UE for mobile can run the deferred mode, including both Vulkan and OpenGL ES modes on Android.

Additionally, the Mobile Deferred path now supports the following rendering features previously only operational on mobile using the forward rendering path:

  • Distance Field Shadowing

  • Spotlight Shadows

  • Screen-Space Ambient Occlusion

The following features are supported when not using pre-computed lightning:

  • Skin shading model

  • Hair shading model

  • Thin translucent model

DirectX Shader Compiler Used for All Mobile Paths

UE 5.0 set DirectX Shader Compiler (DXC) as the default shader compiler for Vulkan and GLES. In UE 5.1, all mobile feature levels now use DXC, including Metal. This improves consistency and feature parity between each rendering path and opens up the resources of the DXC community to all mobile projects in Unreal Engine.

Mobile Rendering Improvements

We added the following features and improvements to the mobile rendering pipeline in UE 5.1. These features are focused on improving rendering optimization.

Arm ASTC Encoder

UE now supports ARM's Adaptive Scalable Texture Compression (ASTC) compression standard as an option.

Re-Factored Per-Material and Per-Project Half / Full Precision Settings

In UE 5.1, we added the option to specify the precision mode of materials and material expressions for mobile devices. The three available modes are:

  • Full-precision for every float

  • Full-precision for material expressions only

  • Half-precision for every float

The main new addition is the ability to use full-precision for material expressions while engine shaders use half precision. This is generally more reliable than globally setting half-precision, as we have internally determined which engine shader variables are safe to use as half-precision.

You can find the Mobile Float Precision Mode setting under Project Settings > Engine – Rendering > Mobile.

Mobile Float Precision Mode in Project Settings

You can also configure it on a per-material basis.

Clustered Local Lights and Reflections Support on Mobile Renderers

UE 5.1 adds support for clustered local lights and reflections to the Mobile Forward and Mobile Deferred rendering modes.

Clustered Lights and Reflections in Mobile

PSO Cache Improvements

Previously, UE would build PSO caches as single, monolithic caches for entire applications. This consumes a great deal of memory, as applications would load PSO caches for assets the user may not even see during gameplay, and the compilation process was also time-consuming.

In UE 5.1, PSOs are broken into caches on a per-asset basis during the cooking phase, and then the PSOs are loaded only for assets used. This reduces the need to recompile PSOs for assets that have not changed, and reduces the memory footprint for loading them.

Parallel PSO Compilation

Both Android OpenGL and Vulkan RHIs now have separate PSO precompiling processes (Android services). Running the PSO precompile operations on separate processes solves many concurrency issues with graphics drivers, and delivers more stability and typical performance gains of between 3-5x precompile time savings.

Editor Mobile Preview Improvements

Platforms with different rendering settings can now have their settings better represented in the in-editor platform preview. Previously, a single shader platform was used for all mobile previewing, meaning features such as Distance Field Shadows could not be accurately previewed if they were enabled on one platform but not another. Each preview platform now uses an independent shader platform to remove this limitation.

Scalability and device profile console variables are now applied in the editor when previewing mobile platforms.

Android NDK 25 Support

UE 5.1 adds support for Android NDK 25, a new long-term support release. This includes a new LLVM 14 toolchain with optimizations for faster code, a roughly 15% reduction in compilation times, and smaller binary sizes.

Gameplay Framework

Blueprints

Similar to the Blueprint Nativization tool, the Blueprint Header View is a new method you can use to quickly convert Unreal Engine Blueprint Classes and Blueprint Structs to C++ code.

C++ Header Preview

During the conversion process the Blueprint Header View creates C++-style declarations for all of your Blueprint's variables, functions, actor components and event dispatchers.

To start using the Blueprint Header View in your project, you can right-click a Blueprint Class or Struct in the Content Browser and select Preview Equivalent C++ Header from the context menu.

Blueprint Class Action Preview Header

Blueprint Namespace

Using the new Blueprint Namespace feature you can selectively organize a project's Blueprints to only load relevant assets and content when opened in the editor. By delegating content using Namespaces, complex Blueprints can be loaded and presented faster when opening a new instance of the Unreal Engine editor, and large amounts of content can be organized to increase user workflow efficiency.

Blueprint Namespace Example

Additionally, when using Namespaces, you can filter Blueprint content using type pickers and the right-click context menu to reduce item list load times, keeping workspaces organized and functional.

Within a Blueprint's Class Settings, you can set and reference a Blueprint's assigned Namespace using the Blueprint Namespace property in the Details panel.

Characters Blueprint Namespace

For more information, refer to the Blueprint Namespace documentation.

Enhanced Input

The Enhanced Input plugin provides you with a new feature-rich method of creating and managing player inputs and controls.

Using Input Action assets, you can set and define player input methods for individual inputs or axis controls. Input Action assets are collected and managed within Input Mapping Context assets, that provide you with more comprehensive control over your project's player inputs and behaviors, creating dynamic systems that can adjust contextually at runtime.

Additionally, the Enhanced Input systems help you organize and manage your player inputs as projects grow and scale, with robust features that assist with the creation and management of online, local, and split-screen multiplayer input systems.

For an example of the Enhanced Input system in action, refer to the Lyra sample project.

For more information, refer to the Enhanced Input documentation.

Mass

Mass Entity (Beta)

The Mass Entity system received significant improvements for UE 5.1 and is now considered a Beta feature. We expect further major changes to Mass's API and we are committed to continuous development of the entire Mass framework.

System Restructuring

We moved Mass Entity's shared fragments from the Archetype-level down to the Chunk-level, to limit archetype fragmentation.

In addition, we separated the entity-managing parts of the Mass Entity Subsystem into a new type: Mass Entity Manager. This promotes the creation of isolated entity pools in custom use-cases, for testing purposes, and others.

Safe Multi-threading

We turned on multi-threaded execution of Processors hosted by the Mass Processing Phase Manager by default for all targets, other than dedicated servers.

MassEntityQuery can now express subsystem requirements, which is a crucial element of the multi-threading safety of Mass processing. In addition, queries owned by Processors are now used to determine additional inter-processor dependencies critical to ensuring threading safety.

Improved Debugging

Mass Entity introduces the Mass Debugger UI Tool in UE 5.1. This tool provides visibility into selected Mass Entity Manager archetypes by showing their composition and Entity counts.

The tool also shows which archetypes are being processed by specific Processors, and it visualizes the Mass processing graphs owned by the Mass Processing Phase Manager.

Artificial Intelligence

Smart Objects

General Improvements

In UE 5.1, Smart Objects received general stability and workflow improvements that make it more convenient to set up Smart Object Definitions.

The API is consistent compared to UE 5.0, which allows for backwards compatibility when migrating projects.

Gameplay Interactions Plugin (Experimental)

One of the main use cases for Smart Objects is the ability to create meaningful gameplay interactions during gameplay. For this reason, Smart Objects received initial experimental support for the Gameplay Interactions plugin. We plan to continue improving support in future versions, with the goal of embedding Gameplay Interactions into Smart Objects that will combine State Trees and Contextual Animations with replication support.

Environment Query System (EQS) support

With the UE 5.1 release, you can now use the Environment Query System to select the best matching Smart Object for an AI Agent or player in the Level.

State Tree

State Tree

State Tree is Unreal Engine's general-purpose hierarchical state machine introduced in UE 5.0. For UE 5.1, State Tree received significant improvements and is now considered production ready. As part of this process, State Tree received significant API changes compared to 5.0.

General Improvements

This update includes improved Actor-centric and Blueprint-centric workflows. You can now use State Trees with a Blueprint-only workflow.

Increased Flexibility

You can now parameterize State Trees, which allows you to use the same State Tree with different data. The update also includes added support for more complex condition-based expressions.

Improvements to State Tree Events provide a simpler way of triggering State changes based on external logic.

In addition, this update simplifies the usage of Tasks and Conditions within the State Tree. It is now easier to connect Conditions to Tasks, without using Evaluators. This creates a simpler, more streamlined State Tree. For example, you can now access Actor data directly, without having to use Evaluators.

Added Modularity

In UE 5.1, State Trees added the concept of Sub-Trees. With Sub-Trees, you can reuse common parts of a State Tree. This improves reusability and provides an intuitive way of building complex State Trees.

Sub-Trees are similar to Blueprint Macros, where you can create a Sub-Tree with a given name and define its inputs. You can call Sub-Trees directly inside the State Tree by name.

Memory Optimizations

The State Tree internal storage received several optimizations, which resulted in a significant reduction of memory usage per active State Tree. At runtime, only active Tasks are stored in State Tree memory. In addition, large properties in the State Tree can be bound as references, instead of full copies compared to UE 5.0.

These improvements resulted in memory usage reduction of about 75% in the City Sample when approximately 35,000 State Trees are running during gameplay.

Dynamic Navigation Mesh (Experimental)

Unreal Engine 5.1 includes initial experimental support for dynamic Navigation Meshes (Navmesh) when using World Partition.

It is now possible to use the Dynamic mode as the Runtime Generation for the Navigation Mesh to build a world partitioned dynamic NavMesh in a world partitioned map.

In this case, changes to the Navigation Mesh are ignored for objects that are loaded and unloaded which are part of the base Navigation Mesh. In addition, dynamic tile building is limited to the loaded space when using a World Partition dynamic Navmesh.

General Improvements

This update includes improved support when using Fixed Tile Pool Size with World Partition. You will now receive a warning when adding Navmesh tiles if they cannot be added because the tile limit has been reached. In addition, the Fixed Tile Pool Size limit is ignored when building navigation with the UWorldPartitionNavigationDataBuilder commandlet, allowing for faster builds.

The navigation data is now externally packaged, which means building a world-partitioned Navmesh does not dirty the main map anymore.

In addition, when building a normal Navmesh in a World Partition map, the entire map is now loaded automatically before building the Navigation Mesh.

Physics

Scene Queries and Rigid Body Simulation Performance

Unreal Engine 5.1 includes a number of performance improvements to both the rigid body and scene query functionality. Below we show comparisons between test builds of UE 5.0 and the UE 5.1 release.

We tested many different examples with the updates to UE 5.1 and focused on the worst performing examples from UE 5.0. The first example is a tumbler test where we placed 512 dynamically simulated convex objects into a spinning convex object. Below shows this result where the UE 5.1 test is now 50% faster.

Tumbler test results

The second example is a test with complex terrain, 100k static objects placed in the world, and 512 dynamic convex objects dropped onto the heightfield terrain. Below shows the result of raycasts against this map where the performance of Unreal Engine 5.1 is now twice as fast as Unreal Engine 5.0.

Raycast test results

Fluid Simulation

Turbulence Model and Small Scale Forces

Unreal Engine 5.1 includes improvements to its turbulence model and small scale forces. These improvements make it easier to add additional detail to the leading edges of the simulation. This can make the simulation look more natural as the shapes will be displayed more prominently.

No Small Scale forces compared to with Small Scale forces.

No Small Scale forces With Small Scale forces

Tricubic Interpolation

We added a new Tricubic Interpolation mode which you can use to add extra details without increasing the overall resolution of the simulation. This results in a more detailed simulation at a similar cost to simulations in a previous version of Unreal Engine.

Memory Consumption Improvements

Unreal Engine 5.1 includes several improvements to the memory consumption of fluid simulations. This results in the ability to fit higher resolution simulations in the same memory budget compared to UE 5.0.

Destruction

Chaos Destruction has received significant improvements in Unreal Engine 5.1.

Improved Fracture Hierarchy

The Fracture Hierarchy received the following updates:

  • Parent clusters now stack automatically when scrolling through the bone list.

  • You can color the hierarchy by level to improve readability.

  • We introduced a new Column Mode, which displays contextual information based on the following options:

    • State and size: Displays the relative size, initial state, and anchoring information per bone.

    • Damage: Displays the runtime damage information per bone. This helps artists tune damage thresholds for the asset.

    • Removal: Displays the remove on break settings per bone.

    • Collision: Displays information about the imported collision from the original Static Mesh.

Damage Watcher

We added a new run-time Damage Watcher to the Fracture Mode in 5.1. You can enable the Enable Runtime Data Collection option under the General Settings and click Simulate to record the damage results.

The damage taken per bone is displayed under the Damage Column Mode. The damage threshold and which bones broke (if any) is also displayed.

Improved Tools

The Unreal Engine 5.1 update includes improvements to several Fracture Mode tools. You can learn more about these tools by reading the Destruction documentation and following the available Destruction Learning Path.

GeoMerge Tool

We added a new GeoMerge tool to merge selected pieces of geometry in a Geometry Collection. The tool formerly known as GeoMerge is now TinyGeo, to indicate its main intended use of cleaning up tiny pieces of extra geometry.

Convex tool

New convex hull generation settings enable you to balance between the accuracy of the generated hulls and their overlap with neighboring hulls.

Default convex generation settings (applied to all new or reset geometry collections) can now be set in the Fracture Mode project settings.

Validate tool

The Validate utility is now a modal tool with checkboxes to control exactly what it will validate and fix. It can now optionally fix single-child clusters, which are not desirable in simulation.

Selection tools

The Selection tools now include buttons to select all leaves or all clusters at the current view level.

Auto Cluster tool

The Auto Cluster tool now includes clustering by Fraction of Input, greatly improving iteration speed when reducing hierarchies.

The new Avoid Isolated option ensures that clusters always contain more than a single transform.

Mesh Paint

The Mesh Paint mode now supports Geometry Collections. Users can now paint vertex colors and textures on fractured geometry.

In addition, vertex colors now propagate on new vertices generated by fractures, providing more consistent behavior of Materials using them.

Imported Collisions

It is now possible to use collision from the original Static Mesh used to build a Geometry Collection. This provides fine customization of collisions, especially for non-convex shapes.

Removal

We improved the existing removal on sleep feature and introduced a new remove on break feature. Here are the differences between the features:

  • Remove on sleep:

    • We added new parameters to provide a means to remove slow moving pieces as well.

    • Partially broken clusters will now crumble to release smaller pieces to be eventually removed.

  • Remove on Break:

    • It is now possible to remove pieces after they break off. You can set these parameters on a per-bone basis, and you can set the cluster to crumble instead of being removed.

Connection Graph

A new Connection Graph method is now available providing more precise connections and reducing issues where pieces would remain floating in mid-air.

Previous method (minimal spanning)

New method (Bounds checking)

Propagation system

A new damage propagation system is available, providing for more predictable and controlled breaking behavior. You can parameterize this at the instance level, and it offers controls for break-induced and shock-induced damage propagation.

Blueprint Nodes

We added a new set of blueprint functions that can act on specific pieces of a Geometry Collection. Events and trace queries can now return an Item Index that can be used in functions to query the level of a fractured piece, apply internal and external strain, apply forces, or even request a cluster to crumble.

This allows the user to be very precise in targeting parts of the Geometry Collection without the need of a Field.

Geometry Collection Blueprint nodes

Performance

UE 5.1 includes several performance improvements, both at runtime and during the authoring process.

Runtime: We made several optimizations to provide a means for a larger number of Geometry Collections to be placed in a Level.

Authoring: We optimized a number of tools in the Fracture Mode for a large number of Geometry Collections. In addition, fracture tools now display a progress bar with the option to cancel the operation during lengthy computations.

Cloth Simulation

Cloth simulation received several improvements in UE 5.1.

Cloth Caching

You can now record and play back cloth simulation within Sequencer.

Cloth caching in Sequencer

Cloth Pressure

We added a new Pressure control to the cloth configuration, as well as a new Set Pressure function in the Blueprint Chaos Cloth Interactor. These controls can add constant pressure force to each triangle of a simulated cloth.

You can modulate the effect across the mesh using the Pressure paintable mask. The pressure force is always applied in the triangle's normal direction, so using a negative value will push the triangle in the opposite direction.

Cloth pressure example

Buckling

We added a new buckling feature to the Bending Element constraint. This feature allows the Bending Element constraint to weaken, or strengthen, depending on the Buckling Ratio and Buckling Stiffness parameters. These parameters provide users with better control over the cloth material's creases during simulation.

Buckling Ratio

Once the element has bent, such that it has folded more than this ratio from its rest angle ("buckled"), it switches to using the Buckling Stiffness, instead of the Bending Stiffness. When the Buckling Ratio = 0, the Buckling Stiffness is never used. When the Buckling Ratio = 1, the Buckling Stiffness will be used as soon as it is bent past its rest configuration.

Buckling Stiffness

Bending will use the Buckling Stiffness instead of Bending Stiffness once the cloth has buckled, that is, bent beyond a certain angle. Typically, Buckling Stiffness is set to be less than Bending Stiffness. The Buckling Ratio determines the switch point between using Bending Stiffness and Buckling Stiffness.

Buckling stiffness example

You can activate this feature by enabling the UseBendingElements checkbox in the configuration.

Self-Collision Improvements

In UE 5.1, cloth simulation received several overall improvements to self-collision.

Additional Resolution Steps

There is now an additional self-collision resolution step available through the Use Self Intersections parameters. In addition, self-collision friction now has its own Self Collision Friction parameter.

Self Intersections

You can adjust the self intersection resolution to correct any cloth intersections not handled by collision repulsions.

Self Collision Friction

We added a new Self Collision Friction parameter to the cloth simulation. This parameter refers to the friction coefficient for cloth-to-cloth interactions.

A small value results in cloth sliding smoothly over itself. The bigger the value, the more friction will be applied to the interaction, and the less the cloth will move around its points of contact with itself.

Self collision settings

Machine Learning Cloth (Experimental)

In UE 5.1, a new Nearest Neighbor Model plugin is available. This plugin provides tools to create in-game cloth with rich folds and wrinkles, with a relatively small runtime overhead and memory footprint.

In the plugin editor, you can train a neural network that finds the nearest neighbor in a small pre-simulated data set (usually between 50 to 100 frames) for any given pose. The nearest neighbor is then used to transfer geometry details onto the cloth of the given pose, resulting in a high-fidelity runtime simulation.

Niagara

GPU Ribbons

Ribbons are now supported on the GPU. In previous versions, the Ribbon Renderer could only be added to a CPU emitter. Depending on the needs of your game, and the features you want to use, you can now choose whether to render on the GPU or the CPU.

Scalability Mode

Turn on Scalability Mode in the Niagara Editor to preview different scalability settings. By doing so, you can fine-tune your effects to play on different platforms. Scalability settings have been removed from the default view, and added to Scalability Mode for better clarity.

Niagara Scalability Mode

Emitter Versioning

Starting in 4.27, for those creating custom modules, you could use versioning to push out new modules to a team without breaking any existing effects.

5.1 now adds the same functionality to emitters, so you can version an entire emitter to deploy it to a team. Versioning lets you update or modify your templates without creating new assets or losing existing behaviors.

Emitter Versioning in Niagara

Flipbook Baker (Beta)

UE 5.0 introduced the first version of the Flipbook Baker, the tool used to bake out a rasterized flipbook of an effect. UE 5.1 introduces a more refined user experience, as well as additional options. You can now bake out these types:

  • 2D Texture

  • Volume Texture

  • Simulation Cache (Experimental)

Render Dependency Graph

Niagara is now supported in the Render Dependency Graph. For more information, refer to the Render Dependency Graph documentation.

Heterogeneous Volumetric Rendering (Experimental)

Niagara Fluids rendering was introduced in UE 5.0. The initial implementation was limited, only allowing you to add 2 directional lights to the fluid simulation. It was also not possible to cast shadows on the fluid.

Heterogeneous Volumetric Rendering is designed to take the lighting you have already set up in your scene and apply it to your fluid simulation rendering. This type of rendering works with all types of lights, not only directional lights. While there is no limitation on the number of lights you can use, currently the implementation is linearly more expensive as each light is added.

If you have other objects in your level, they can also cast shadows on the fluids volume. This creates a more realistic look, making the fluid effect more integrated in the scene.

To enable this experimental feature, select the checkbox Enable Heterogeneous Volumes in the Project Settings. Then apply the material MI_HeterogeneousVolumes_GasExplosionCine to the Mesh Renderer on a fluid simulation.

Fluid Quality Improvements (Beta)

Niagara Fluids have several improvements to quality and performance in this version:

  • We improved the turbulence model.

  • We also improved small-scale force, helping with the detail on the leading edge of simulations.

  • We implemented tricubic interpolation, adding extra detail without increasing the resolution, though there is a tradeoff in performance.

  • We made improvements to performance of fluids overall.

UX / UI Improvements

New Layout for Niagara Editor

The Niagara Editor has a new, streamlined layout. The Parameters panel has been moved to the lower left, giving more room to the System Overview in the center. The Curve Editor and the Log are now docked on the bottom, next to the Timeline.

Niagara Editor New Layout

Panels like the Parameters panel or the Selection panel are now contextual, so they update depending on what you select.

User Parameters in Level Editor

Previously, when you selected a Niagara Actor in the Level Editor, there was a section called Override Parameters. This section has been renamed to User Parameters.

Scratch Script Manager

We replaced the previous Scratch Pad interface with a new workflow to create Scratch Modules directly in the Niagara Editor. Add as many scratch modules as you need, and you can display each as their own tab in the Niagara Editor.

Scratch Pad Tab in Niagara Editor

Hierarchy Editor for Parameters

When you create many custom user parameters, keeping them organized in the Parameters panel can be a challenge. The Hierarchy Editor gives you the ability to not only categorize and organize your variables, but also to set up their default values.

Niagara Hierarchy Editor

Effects Section in the Level Editor

When you select a Niagara system in the Level Editor, you will now see a section in the Details panel called Effects. This can help you quickly isolate the parameters you need to edit for Niagara systems.

Effects Section in Details Panel

Debugging a System or Parameter

There are new ways of opening the Niagara Debugger and tracking the elements you want to analyze.

To quickly turn on the Debugger on a particular system, click the Niagara component in the Level Editor, and from the Details panel select Debug. This opens the Niagara Debugger with the system information already set.

Niagara Debug HUD

You can also debug a specific parameter, such as the age of a particle. From the Parameters panel in the Niagara Editor, right-click the parameter you want to track, then select Watch Parameter in Niagara Debugger.

Watch Parameter in Niagara Debugger

This automatically turns on all the relevant options you need in the Debugger to see that parameter's information.

For more information, refer to the Niagara Debugger documentation.

Accessibility Improvements

We made the following improvements to the accessibility tools in UE 5.1:

Multi-User Screen Reader Support

The Screen Reader plugin can now support more than one user at a time, providing a means for more than one visually-impaired user to play at once. If users' input devices have specialized audio ports available, such as the ones located on game console controllers, each user can connect a set of headphones to output their screen readers' voices separately. Alternatively, for PC users and users without headphones, the screen reader will output voices with different pitches for each user. Screen reader users are represented with the FScreenReaderUser class, which can request voice announcements, retain information about the accessible widget it is currently focused on, and use the new Navigation Policy to define how users navigate.

You can now define a Navigation Policy to provide fine control over how visually-impaired users navigate the screen, similar to how commercial screen readers work. To make a Navigation Policy, create a class that implements IScreenReaderNavigationPolicy. After that, you can set the navigation policy for a screen reader user by using FScreenReaderUser::SetNavigationPolicy and providing a shared reference to the one you want to use.

Unreal Insights

Unreal Insights is a companion application for Unreal Engine that lets you analyze and profile the CPU and memory performance of your game. For general information, refer to the Unreal Insights documentation.

There are new top menu commands available:

  • Import Table: From Timing Insights, you can now import any .csv or .tsv table to analyze. You can apply grouping and hierarchical path breakdown features on any table.

  • Session Browser: If you have closed the Session Browser, you can reopen it from an open trace file.

  • Open Trace File: If you have a trace open in Timing Insights already, you can open a different trace file and it will replace your current session or open a second session.

  • Auto Open Live Trace: When enabled, the current session will change automatically to the live trace.

Session Browser

You can now filter and sort the trace sessions list in Unreal Insights to better analyze the specific data you are looking for.

You can search traces by name or by command line.

Searching Trace Filter

There is now a method to rename and delete trace sessions directly from the Session Browser by right-clicking on the trace. When deleting or renaming through the context menu, it will delete or rename the trace file and any associated cache files.

Memory Insights

To capture a memory trace, you must start the session from the command line. To start recording, run the editor or the game from the command line with the additional argument trace=default,memory. The reason you need to start with these arguments from the command line is that trace information needs to be tracked as soon as the engine initializes.

Asset Names and Class Names

You can now start memory insights from the command line using extra trace channels metadata and assetmetadata. This provides asset names and class names to the Memory Insights session for additional filtering options. For example, you can calculate the cost of memory allocation per asset, or per class name.

Improved Tree View

There is now a Path Breakdown option for grouping string columns, which when selected will create a collapsible hierarchy view. You can group low-level memory (LLM) tags, assets, and top source files this way.

Grouping this way not only helps visual organization, but also lets you view the cost for the parent groups.

Open in Visual Studio

In previous versions of Unreal Insights, you could right-click on items grouped by callstack then select Open in Visual Studio from the context menu. In this version, this option is available even when not grouped by callstack. For example, if you have grouped items by tags, you can right-click on the allocation and select Open in Visual Studio.

Modules View

The Modules View in Memory Insights shows a list of all .dll files. In this version, we split Statistics information into separate columns for easy sorting. You will now find columns for the number of symbols that are: Discovered, Cached, Resolved, and Failed.

Modules View

List items that failed are highlighted in red, and list items that resolved properly are highlighted in green. Yellow indicates that some of the symbols have resolved and some have failed.

Networking Insights

Packet View

You can now highlight an event in the Packet View, to help you see how many bits that specific event is using in the packet. This makes it possible to quickly see how much bandwidth an event is using relative to other data.

You can choose to highlight either:

  • The aggregated bitcount for all instances of the event; or

  • The maximum bitcount used by a single event.

NetStatsCounters

There is a new tab called NetStatsCounters where you can view stats counters related to the replication system for the selected packet or range of packets. There are two different categories of stats:

  • FrameStats: Stats counters for the entire frame. This is typically used for reporting stat counters related to networking, for work that is shared between all connections. For example, how many objects are currently being updated on this frame.

  • PacketStats: Stats counters related to each specific packet. For example, how many objects were scheduled to be serialized, and how many actually did fit into the packet.

NetTrace

You can now trace simple stats associated with network trace data using the macros UE_NET_TRACE_PACKET_STATSCOUNTER and UE_NET_TRACE_FRAME_STATSCOUNTER. Data traced with either of these macros will be displayed in the NetStatsCounters tab in Network Insights.

Timing Insights

Task Insights

We added support for ParallelFor tasks.

Cooking Insights

Cooking Insights provides a profiling method to gather and display information about the way packages are cooked. To record a cook session, start from the command line using the argument -trace=default,cook.

When you enable the cook channels, this adds a panel to Timing Insights called Packages. This displays a list of all the packages associated with that cooking event. For each package, there are statistics available, including: LoadTime, SaveTime, BeginCache, IsCacheCooked, and Asset Class. Each of these is displayed in a column that can be grouped and sorted.

Packages View

Use the option Grouping > Path Breakdown - Package Name to generate a collapsible hierarchy view of the data. You can also group by Asset Class.

Coroutines

If your game uses coroutines, you can now view coroutines in Timing Insights. Coroutines are when something begins its execution on one thread, and finishes on a different thread. We now display timing events that are specific to coroutines.

Screenshot Tracing

You can now enable screenshots within Timing Insights. When you enable Screenshot Tracing, you can take a screenshot and a red vertical line will display in the Timing Insights timeline. You will also see a thumbnail of the screenshot. This can help you to debug visually in Timing Insights.

To enable screenshot tracing, start from the command line using the argument -trace=default,screenshot.

Once screenshot tracing is enabled, from the console command type in trace.screenshot to take a screenshot at that frame.

Asset Load Time

There's a new channel you can add when starting Timing Insights from the command line called Asset Load Time. This channel does two things:

  1. Enables named CPU timers for UObject::Serialize.

  2. Toggles on the tracing of Blueprint names.

In the past, tracking Blueprint names was enabled by default, but this would add a lot of cost to the trace runtime event. Now, if you want to enable Blueprint name tracing, you must turn on this argument in the command line.

To enable asset load time tracking from the command line, use the argument -trace=default,AssetLoadTime

Because there are many timers added when Blueprint names are toggled on, they are hidden in Trace Insights by default. After enabling Asset Load Time tracking, you can display Blueprint names by adding the argument -statnamedevents.

Copy and Paste

In UE 5.0, when you copied a timing event, it would copy only the name. Now, when you copy a timing event using Ctrl+C it copies the name, the duration, and the associated metadata, as it is displayed in the Timing Insights panel.

Executing Commands Without Opening the UI

Timing Insights can be run directly from the command line without opening the UI. You can either specify a single command directly in the command line, or you can execute a series of commands by using a response file. In each case, a set of data is exported to a .csv or .tsv file.

  • TimingInsights.ExportThreads: This command exports a list of GPU and CPU threads.

  • TimingInsights.ExporTimers: This command exports a list of GPU and CPU timers.

  • TimingInsights.ExportTimingEvents: This command exports a list of GPU and CPU timing events. The list of events that is exported can be filtered by thread, timer, or by time range.

  • TimingInsights.ExportTimerStatistics: This command exports the list of GPU and CPU timers and their aggregated statistics.

These commands can be useful for running automated tests.

For more information on executing commands from the command line directly, refer to the Timing Insights documentation.

Trace

Console Commands

There are some existing console commands you can use from UE while Unreal Insights is running such as trace.start and trace.stop to start and stop a trace file. There are two new console commands we added in 5.1:

  • Trace.SnapshotFile <filename>: This writes a snapshot of the current in-memory trace buffer to a file. If you are already tracing actively, it does not interrupt the active trace, but instead records a second trace file in parallel just for this snapshot.

  • Trace.Bookmark <name>: This emits a Bookmark event with the given string name. Bookmarks appear in Timing Insights as a vertical line at the time the Bookmark was recorded. Previously this was available through the API only as TRACE_BOOKMARK().

  • Trace.Screenshot <Name> <bIncludeUI>: As mentioned above, you can run this console command to generate a vertical line and optionally include the UI by specifying true or false for a screenshot in Timing Insights.

Command Line Parameters

Trace Auto Start

You can choose to either start tracing automatically at the start of your project, or wait to initiate a trace command from the console command. The default behavior of the UnrealInsights.exe is to have autostart enabled.

If autostart is enabled, the runtime automatically tries to connect with the local trace server if the Unreal Insights Session Browser is detected as running.

No Trace Threading

You can perform tracing at runtime using a worker thread, a dedicated thread to capture all the tracing information. Alternatively, you can do the tracing directly on the game thread at the end of a regular frame. Using the game thread has an impact on game performance.

By default, we use the worker thread, the recommended setup. However, for servers it is not always possible to have a worker thread. You can disable the worker thread and use the game thread instead by using the command line parameter -notracethreading.

Datasmith

New 3ds Max Plugin

We completely rewrote the Datasmith 3ds Max plugin, and consolidated all Datasmith features in a new ribbon toolbar in 3ds Max. The new plugin improves performance, and provides several new features and improvements.

The Datasmith 3ds Max Ribbon

Direct Link Support

The new Datasmith plugin for 3ds Max supports Direct Link. You can now connect a 3ds Max project to an Unreal Engine project, and sync them manually, or automatically using the Direct Link Auto Sync feature.

New and Improved Plugin Compatibility

The new Datasmith plugin for 3ds Max improves support for:

  • VRay: more supported material parameters, and proxy meshes

  • Corona: Support for PBR materials and proxy meshes

  • Railclone: export improvements, and support for Railclone5

  • Forest Pack: export improvements, and support for Forest Pack 7

Control over Baked Texture Resolution

Baked 3ds Max textures are no longer automatically exported at a resolution of 4096. You can now cap the maximum resolution to values between 64 to 4096. This improves import / export performance for large scenes with complex materials.

XRef Scene Export Toggle

XRef scenes are scenes loaded from an external 3ds Max file into your current file. When you export a 3ds Max project with Datasmith, you can now decide whether or not to export XRef scenes as well. The XRef scene export toggle is in the new ribbon toolbar.

Improved Light Exports

Datasmith now supports more parameters for supported light types, including:

  • ArnoldLight

  • CoronaSun

  • PhotometricLight and TPhotometricLight

  • VRaySun

Texmap Conversion

The new Datasmith plugin for 3ds Max automatically converts bitmap, baked, normal, bump, and procedural texmaps.

Revit Plugin Improvements

In this release, we added Direct Link Auto Sync to the Revit Datasmith Exporter. If Auto Sync is enabled, your Unreal project syncs automatically when you make changes to the linked Revit project.

Datasmith settings are now stored as custom data in Revit project files.

This release also adds support for exporting the following information from Revit:

  • Views: you can specify which view to export from your Revit project, no matter which view you're currently working in.

  • Custom origin point: You can define the Base Point or the Survey Point in Revit as a custom origin point to use as the insertion point in Unreal.

  • Decals: Datasmith now exports Revit decals as Unreal Engine decals.

Sketchup Plugin Improvements

For this release, we focused on optimizing the Datasmith plugin for Sketchup.

We improved how Datasmith exports complex hierarchies. Instead of exporting one Actor per group head or component head, and one Actor for every mesh in a group or component, Datasmith merges meshes in groups and components automatically. The result is a simpler hierarchy in Unreal Engine that is closer to what you see in the Sketchup outliner.

If you use the Color by Tag feature to set the colors of objects in Sketchup, Datasmith now exports those colors.

We also added image support. The Datasmith plugin for Sketchup now exports images as Mesh Actors with textures.

Solidworks Plugin Improvements

The Datasmith plugin for Sketchup now supports more Solidworks features. You can now export Solidworks configuration display states as variants of a Level Variant Set. You can also export user-created directional, spot, and point lights with data for position, cone angle, brightness, and color.

Improved Metadata Handling for Visual Dataprep

Visual Dataprep is a system for creating reusable import "recipes" that reorganize, clean, merge, and modify scene elements before creating final Assets and Actors in an Unreal Engine Project.

For UE 5.1, we made some usability improvements for working with metadata in Visual Dataprep.

Metadata keys and values are now more readable, and are selectable, so you can copy and paste them into filter fields instead of copying them manually.

We also added new string matching options for keys. When you filter by metadata, you can now use a contains expression that can handle all keys with, for example, similar prefixes or suffixes. This saves time when you are writing import processes for models from applications that use slightly different names for the same keys.

Universal Scene Description (USD) File Workflows

Unreal Engine 5.1 features several new features and workflow improvements for working with USD files.

LiveLink Integration

You can now use Live Link to synchronize an external source with content in a USD file in Unreal Engine. Use the new Set up Live Link option in the USD Stage window to connect a DCC application such as Autodesk Maya with a USD scene in Unreal Engine that has a character in it, and you can use the DCC to drive the character. Link / USD integration is also useful for working with motion capture. Use USD to load a scene with characters into Unreal Engine, and have the motion capture drive the characters in the USD scene.

Control Rig Integration

The new Set up Control Rig option in the USD Stage window lets you connect a control rig to a character in a USD file in Unreal Engine. You can use the control rig to create and edit skeletal animations, and save the animation data back to the USD file. You can set up a Control Rig Asset or generate an FK control rig.

Prim Editing Options

We added several options for editing prims in the USD Stage window. These include:

  • Commands to cut, copy, and paste prims.

  • Options to duplicate prims in a variety of ways. For example, you can create a flattened duplicate of a composed prim, or duplicate a single layer.

  • Isolation mode. You can isolate, and work on specific layers, which is useful when you want to review or modify the edit history. Changes that you make in isolation mode are applied to the isolated layer.

  • When you add a reference in the USD Stage you can now specify a target prim in the referenced file.

  • You can now add payloads to the USD Stage the same way you add references.

Groom Support

We added support for Groom in USD files. You can now import Groom caches and static Groom files as assets, and use them the same way you use Groom assets imported with Alembic. You can also load them on the USD stage.

The USD importer uses a custom Groom APIschema to import Grooms from USD BasisCurves. The importer also supports Alembic Grooms that follow the Alembic groom specification, so you can import an Alembic Groom referenced in a USD file.

We also added a new Groom binding API schema that you can use to bind a Groom to a skeletal mesh or geometry cache. You can set up a Groom on a character, load the result into the USD stage, and play back the simulation and character animation together in Unreal Editor.

Other Data Formats

glTF

Khronos Group's GL Transmission Format (glTF™) is an extensible, open-standard file format designed for compact file size, fast loading, and complete scene representation. It's used to import and export models out of Twinmotion and it is the preferred exchange format for Sketchfab tools and libraries.

In this release, we improved glTF support and integrated it more tightly in Unreal Engine.

  • We integrated the glTF importer in the new Interchange framework. The existing glTF Importer and Datasmith glTF Importer plugins are scheduled to be removed in a future release.

  • The glTF importer now supports:

    • Unlit materials.

    • The khr_texture_transform extension.

    • Importing rigged models with Skeletal Meshes, Skeletons, and Animation Sequence assets.

  • The glTF exporter, formerly available as an external plugin, is now part of Unreal Engine. It currently must be enabled separately.

  • We improved character encoding, so non-English language names and labels of actors and assets are now exported correctly.

CADKernel

CADKernel is an alternative algorithm for tessellating CAD models you import into Unreal Engine. It uses the same tessellation parameters as the default algorithm, but produces better results in some cases, particularly for models with radial features. CADKernel also does a better job at limiting the number of open edges after tessellation.

Left: CAD model tessellated with the default Unreal engine algorithm. Right: The same model tessellated with CADKernel

Left: CAD model tessellated with the default Unreal engine algorithm. Right: The same model tessellated with CADKernel

To activate CADKernel, set the ds.CADTranslator.DisableCADKernelTessellation console variable to False or 0. You can change the variable from the Console Variables Editor.

After you activate CADKernel, Unreal Engine uses it by default when you import a CAD model. If you have already imported a CAD model, perform a full reimport to have Unreal Engine re-tessellate it with CADKernel.

MaterialX

MaterialX is an open standard used to represent rich materials and looks, and transfer them easily between platforms and applications. The new MaterialX importer in UE 5.1 supports the following MaterialX nodes:

  • All inputs of the Autodesk Standard Surface material.

  • Point, spot, and directional lights.

  • A subset of the MaterialX standard data types and nodes.

LiDAR Point Cloud Improvements

For this release, we migrated the LiDAR Point Cloud Asset editing tools to the Unreal Engine 5 framework. You can now access all of the point cloud editing tools from a new LiDAR mode, available from the Select Mode dropdown in the main toolbar.

This update aligns the point cloud editing workflow with other Unreal Editor workflows such as mesh editing. You can select, merge, edit, and build collisions on your point cloud assets, and preview the results in the Level.

Workflow Improvements

You can now use point cloud selection tools (for example, the lasso tool or the polygon selection tool) to add and subtract points from a selection. In addition to extracting points from a cloud, you can now create static meshes from selected points.

New Options for Point Normals

Point cloud Actors now have a Point Orientation setting that allows you to align point cards along calculated normals, rather than always facing the camera. Normal-facing cards produce more pleasing visual results, and better lighting interaction.

The LiDAR point cloud plugin can now import normals from ASCII files and E57 files that contain normal data.

New Point Color Option

The new Color Source > Data with Classification Alpha property for point cloud Actors lets you mix the RGB color of points with custom alpha values, based on point classification. This is useful when you want to show, hide, or fade whole groups of points based on their classification.

Variant Manager

For this release, we migrated the Variant Manager tools to the Unreal Engine 5 framework. The look and feel are now consistent with other tools in UE 5.1. We also overhauled the user interface, based on design feedback, to make it more visually appealing and easier to use.

The previous variant manager in Unreal Engine 5.0

The new variant manager in Unreal Engine 5.1

Top: the previous variant manager in Unreal Engine 5.0. Bottom: the new variant manager in Unreal Engine 5.1

Oodle Texture 2.9.7

  • Identical bit output on all platforms

  • Faster arm64 encoders.

Shared Texture Encoding

  • For all platforms

Bink

  • Support for standard SRT subtitle files

Online

Online Services Plugins

The new Online Services plugins for Unreal Engine now have a fully defined interface, and have moved out of Experimental status and into Beta. These plugins will work alongside the existing Online Subsystem plugins, and both are available for use.

Users of the new Online Services plugins will find:

  • More consistent and robust APIs.

  • Enforced safe calling patterns.

  • Improved type safety.

  • Simplified delegate binding.

  • The ability to easily extend an existing implementation.

Developing your own plugin for use with your own online backend is easier now with a shared common framework. The framework in the Online Services plugins provides:

  • Async operation result caching

  • Sequencing async operations

  • Per-backend configuration

  • Exec command handler

  • Minimal boilerplate

  • Logging

Included in this version are the following implementations:

  • EOS Online Services plugin implementation for using the EOSSDK.

  • NULL Online Services plugin implementation for development purposes.

  • OSSAdapter Online Services plugin implementation for using any existing OnlineSubsystem by means of the new APIs.

The following interfaces are available in the new Online Services plugins:

  • Achievements

  • Auth

  • Commerce

  • Connectivity

  • Leaderboards

  • Lobbies

  • Presence

  • Sessions

  • Social

  • Stats

  • Title File

  • User File

  • User Info

For more information, refer to the Online Services documentation.

Lyra

  • Players can now invite and join friends to their matchmaking sessions by using the Epic Online Services (EOS) overlay.

Networking and Multiplayer

Iris (Experimental)

Iris is an experimental implementation of a new replication system for Unreal Engine. The goal of Iris is to enable richer multiplayer experiences with larger, more interactive worlds, higher player counts, and reduced server costs. Iris achieves replication performance improvements over the current replication system by:

  • Unlocking scalability by removing antipatterns that constrain it

  • Enabling concurrency through separation of replication and game thread data

  • Improving efficiency by sharing as much work as possible for multiple objects and connections

Iris is an opt-in system and will exist alongside the current replication system for the foreseeable future. Existing game code will continue to work as before. Opting into Iris requires game code to use new engine APIs, however, existing replicated properties and Remote Procedure Call (RPC) definitions in C++ and Blueprints remain compatible.

Subobject Replication Improvements

Replicated Subobjects in Unreal Engine provide a way to replicate any UObject-derived class and the replicated properties they contain. The previous system for replicating components and subobjects employs the virtual function AActor::ReplicateSubobjects.

Using the new system, actors now have methods that register subobjects to a list on the owning Actor or Actor Component, with the replication of these registered subobjects handled automatically by the actor channel. This process offers greater control over when and where subobjects are replicated.

The Registered Subobjects List is an opt-in feature. To enable the Registered Subobjects List, set the property bReplicateUsingRegisteredSubObjectList = true in your Actor or Actor Component class. Then call AddReplicatedSubObject in ReadyForReplication, BeginPlay, or when creating a new subobject. Finally, be sure to call RemoveReplicatedSubObject whenever you modify or delete a subobject.

The old system will continue to work alongside the new system for the foreseeable future. For more information about enabling the Registered Subobjects list and working with the new system, refer to the Replicated Subobjects documentation.

Templates and Sample Content

Simulation Templates

Screenshot of an Unreal Engine project made with a Simulation template

Unreal Engine 5.1 adds a new Simulation templates category. Simulation templates offer a broad range of starting points for various enterprise simulation applications and are preconfigured with:

  • Specific settings for outdoor environments.

  • Realistic sky and lighting.

  • Georeferencing tools.

For more information, refer to the Unreal Engine Templates Reference page.

Platform SDK Upgrades

A grid of logos showing supported platforms in Unreal Engine 5.1

  • Windows

    • Visual Studio 2019 v16.11.5, Visual Studio 2022

    • Windows SDK 10.0.18362

    • LLVM clang 13.0.1

    • .NET 4.6.2 Targeting Pack

    • .NET 6.0

  • IDE Version the Build farm compiles against

    • Visual Studio - Visual Studio 2019 14.29.30146 toolchain and Windows 10 SDK (10.0.18362.0)

    • Xcode - Xcode 13

  • GDK

    • Windows SDK: 10.0.19041.0

    • GDK: June 2022 Update 2

    • Firmware Version: Recovery September 2022 10.0.22621.2216

    • Supported IDE: Visual Studio 2019

  • Android

    • Android Studio 4.0

    • Android NDK r25b

    • Android SDK

      • Recommended: SDK 32

      • Minimum for compiling UE: SDK 30

      • Minimum target SDK for running on device: SDK 26

      • AGDE v22.2.69+ required if you are using AGDE debugging.

  • ARCore

    • 1.22

  • ARKit

    • 4.0

  • Linux

    • Native Linux Development

      • Recommended OS: Ubuntu 22.04 or CentOS 7

      • Compiler: clang 13.0.1

    • Cross-Platform Development

      • Cross-Compile Toolchain: v20 clang-13.0.1-based (CentOS 7)

  • Oculus

    • 33.0

  • OpenXR

    • 1.0.22

  • Google Stadia (Deprecated)

    • 1.82.0.102432

  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 14.3.0 + optional NEX 4.6.7

    • Minimum Firmware Version: 14.1.2-1.1

    • Nintendo Dev Interface 2.5.5

    • Supported IDE: Visual Studio 2019, 2022

  • PS4

    • Orbis SDK 9.508.001

    • System software:

      • 10.008.001

    • Supported IDE: Visual Studio 2019, 2022

  • PS5

    • Prospero SDK 5.00.00.33

    • System Software:

      • 6.00.00.42

    • Supported IDE: Visual Studio 2019, 2022

  • macOS

    • Recommended

      • Latest macOS 13 Ventura, Latest Xcode 14

    • Minimum

      • macOS 12 Monterey, Xcode 13.4.1

    • Machine Architecture Note

      • Native Apple Silicon support is available for macOS targets for both editor and project builds. Editor support for Apple Silicon is experimental.

      • Some third-party SDKs and plugins do not yet contain ARM64 slices and may have compatibility issues.

  • iOS / tvOS / iPadOS

    • Recommended

      • Latest Xcode 14

    • Minimum

      • Xcode 13.4.1

    • Supported Target SDK versions: iOS 15 or later

    • Graphics API: Metal 2.4 and Metal 3.0

Release Notes

Animation

New:

  • Control Rig now has additional properties exposed to Blueprints and scripting.

  • Added support for in-between Morph Targets when importing FBX files.

    • The in-betweenMorph Targets are now imported as standalone Blend Shapes with their animation curves baked accordingly to preserve the original animation.

  • You can now select things below the ground in preview scene viewports.

    • The floor shown in the preview scene within each persona editor no longer blocks selection of items below ground.

  • You can now set custom bone colors using the Bone Color property in the Editor Preference.

  • Added a new UE_ANIM_REMOVE_DEPRECATED_ANCESTOR_TRACKER definition to remove large deprecated members from FAnimationUpdateSharedContext.

  • Added a new asset information section for Animation Montages when working with blueprints.

  • Added a looping flag property to Animation Sequences and Blend Spaces. This is used to set the default loop value when creating asset player nodes.

  • Blend Masks and Blend Profiles can now be organized in different categories under the Skeleton Tree view.

  • The City Sample's AnimToTexture plugin is now available as an experimental Engine plugin.

  • Fixed a bug that caused an Animation Sequence's cache stats and debug name to not register.

  • Added the new experimental Curve Expressions plugin, that you can use to copy to Skeletal Meshes' animation curves. You can also make adjustments to the copied animation curves using simple text expressions.

  • Added a Copy Context Menu option to copy Curve names from the Timeline editor to the clipboard.

  • The Pose Driver node is now production ready.

  • Added a GetMeshDNA function to SkelMeshDNAUtils in RigLogic.

Improvement:

  • Bone rendering has been consolidated across all Animation Editor viewports.

  • Animation Sequence compression is now asynchronous during cooking.

Crash Fix:

  • Fixed a crash that could occur when playing Animation Montages when the owning Actor is destroyed while executing one of its Animation Notifies.

  • Fixed a crash that could occur by debugging while live coding.

Bug Fix:

  • Fixed a bug that could cause wrong values being set when pasting a bone transform in the Skeleton Editor.

  • Added missing implementation to UMovieScene3DConstraintTrack::RemoveAllAnimationData().

  • Fixed a bug that could cause root motion modes to not be selectable in the animation viewport.

Deprecated:

  • The USkeletalMesh pointer of the USkinnedMeshComponent has been replaced with the new USkinnedAsset base type pointer enabling Unreal Engine to utilize new types of skinned asset components.

Gameplay

New:

  • Motion Warping: Added support when using the animation warping plugin for injecting translations when there is no translation to warp in the animation.

  • Added an animation modifier within the AnimationModifierLibrary to reorient the root bone in an animation while maintaining mesh position and rotation.

  • Added an animation modifier to the AnimationModifierLibrary to copy transforms from one bone to another.

  • Added a new simplified framework within the Motion Warping plugin by removing the node's bInLocalSpace option.

    • Root motion is now always warped in mesh space.

  • The Motion Warping plugin has transitioned from the Experimental stage and is now in the Beta production phase.

  • Added support for Blend Spaces within the Pose Search plugin.

  • Added a new experimental Foot Placement locomotion node within the Pose Warping plugin.

  • You can now disable the Pose Warping plugin's Orientation Warping node when sufficient Root Motion data isn't available to calculate good warping results.

  • Montages played from Linked Animation Blueprint Graphs and Layers will now behave correctly when using Inertial Blending after enabling the debug command: bUseMainInstanceMontageEvaluationData.

  • Montages using Inertial Blends now support Blend Profiles.

  • Added experimental root bone offset property to the Animation warping plugin's Orientation Warping node, that can be used to follow Root Motion rotation more closely during forward-facing turns.

  • The Animation Warping plugin is now production ready.

  • Added a new State Machine Function Library that allows you to query the active state, as well as dynamically transition between states.

  • Added a new experimental Offset Root Bone node within the Animation Warping plugin

Improvement:

  • Animation Notify States can now check if they have reached the end or were canceled before completing, using the new UAnimNotifyLibrary NotifyStateReachedEnd function in the Event Reference data.

  • Improved the behavior of the Stride Warping node at low character movement speeds.

  • Improved the Stride Warping behavior on manual mode when stride scale is 1 and interpolation is also enabled.

  • Improved the Stride Warping behavior for 3x interpolation speed while using manual mode.

Bug Fix:

  • Fixed a bug that could cause the animation graph to avoid updating the entire graph from the game thread when only using root motion from an animation montage asset.

  • Fixed bug that could occur within the Motion Warping plugin that could cause root motion occurring outside the warp window to be stomped during the last tick.

  • Fixed a bug that could occur when using the Motion Warping plugin that would abort warping if the user jumps to a different point in the animation sequence while the warping window is active.

  • Fixed a bug that could cause erratic behavior in Montages during section loops under very specific timing and frame rate conditions.

  • Fixed a bug that could occur with Montage Notifies that would not show the assigned name on the notify tracks.

  • Fixed a bug that can cause sudden flips to existing Orientation Warping angles, when adding Root Motion data to nodes that did not contain any previously.

  • Fixed an issue where the Apply Root Motion Ability Task could restore a movement mode without also restoring the custom movement mode.

  • Fixed a bug that could cause Transition Events to not fire from Conduits.

  • Fixed a bug that could disrupt the prediction behavior of the Motion Trajectory Component when the character is turning on the spot.

Rigging

New:

  • Added an aggregate node type in Control Rig, which will concatenate multiple unit nodes of the same type to allow for a dynamic number of input pins.

  • Added Parameter At Length Percentage Control Rig node, which can be used to return the U parameter of a spline at a given length percentage.

  • New Control Rig Template nodes offer a new way to organize sets of nodes in manageable groups. After grouping a set of nodes with a Template node you can take advantage of wildcard pins which can pass an input into each of the supported nodes' respective compatible input.

  • Setup Events are now called as Construction Event.

  • You can use new Construction events to spawn Bones, Nulls, Controls and more.

  • You can now create and invoke your own Control Rig Events custom triggered logic.

    • You can also invoke Control Rig Events using Python commands or within Unreal Engine Blueprints.

  • Control Rig nodes can now be updated to their latest version with the Upgrade Node(s) context menu option in the graph.

  • Added a new type of execution callback called the Dispatch Factory.

    • A Dispatch Factory can rely on lambdas to generate a callback based on the types passed to it.

  • The Control Rig hierarchy now supports Metadata storage directly within the elements of the hierarchy. The metadata is then readable and writable in the graph using the metadata nodes, Blueprints, or Python using the hierarchy's API.

  • You can now use Profiles when working within the IK Retargeter to store, edit, and apply retarget settings at runtime using Blueprints.

  • You can now invoke events from the top toolbar and context menu in Control Rig.

  • You can now manage Control Rig events in Action Palette.

  • You can now enable Debug Drawing during Control Rig interaction.

  • You can now use the new IK Retargeter hierarchy view to quickly manage and edit bone transforms with a clear visualization of the full skeleton chain.

  • Using the new Control Rig Overlay mode, controls can now be drawn on top of a Skeletal Mesh in the level viewport.

  • Control Rig now supports creating and managing Aim Bones and Two Bone IKs using Python.

  • The IK Retargeter's source and target IK Rigs and meshes are now fully swappable with no need to create separate retarget assets for different source IK rigs.

  • You can use new Control Rig Proxy Controls to interact with animatable, keyable controls, through helper controls. Proxy Controls can not be keyed and are invisible to Sequencer, but offer you the flexibility of using the Interaction even in Control Rig.

  • You can now set a Control Rig component's class in Blueprints.

  • You can now create Control Rig and Rig VM workflows using Python. These workflows can then be registered to operate a specific node or a set of nodes. You can see example workflows in the Control Rig plugin.

  • You can now convert any data type to and from a string using the ToString and FromString nodes.

  • The Control Rig's Spherical Pose Reader node has been optimizatized and now operates with a 5-15% increase in performance.

  • You can now store Metadata within the Control Rig Hierarchy using the new Dispatch Factory system. Metadata can be read and written to and from elements in the Control Rig's hierarchy.

    • By storing Metadata in the Control Rig Hierarchy you can use that data during construction or with blueprints to drive the Control Rig during runtime.

  • You can now index an array in Rig VM using negative values.

    • When indexing with negative values, -1 represents the last element, -2 represents the second to last element, ext.

  • You can now get and set a control shape transform when working with Control Rigs.

  • You can now use new Stride Warping Settings when working with the IK Retargeter. You can use the Stride Warping properties to adjust a character's stride length across retargeted animations.

  • You can now enable a debug visualization of the Rigid Body Animation Blueprint node, that will display the node's physics bodies and constraints.

    • The RigidBody node's physics bodies will be drawn in the Animation Blueprint Editor's viewport when the node is selected. You can enable a visualization of the node's constraints using settings in the node's Details panel.

  • You can now toggle the visualization of individual physics bodies in the Physics Asset Editor's hierarchy tree panel.

    • To toggle the visualization, first enable the option in the Skeleton Tree's Settings menu.

    • After enabling the visualization toggle, you can enable or disable the visualization for each physics body using its associated checkbox.

  • You can now view a synchronized debug visualization of a character's physics bodies and constraints between the Physics Asset Editor and the Animation Blueprint Editor.

    • This unified view also means any debug visualization options are universally set across both editor environments.

  • You can now upgrade Rig VM from struct to dispatch.

  • You can now assign per-element tags within the Control Rig hierarchy.

    • A useful application of tags in the Control Rig hierarchy could be to delineate if an element is on the Left or Right side of a character. These tags can then be used to quickly search for elements later during the Control Rig's execution.

  • You can now use the new Set Default Parent Control Rig node to change an element's parent or identify it as the new default node in a chain.

  • Rig VM now uses a new low-level mechanism for a node's upgrade path, enabling the API to allow nodes to describe their own upgrade path.

    • You can implement FRigVMStruct::GetUpgradeInfo to enable RIG VM nodes to be upgraded automatically.

  • You can now use new Boolean Toggle nodes with Control Rigs.

  • Control Rig now provides you with feedback when changing initial transforms during a forward solve.

    • If you then change the initial transform of a hierarchy element during the forward solve a note will now be issued on the node in question.

  • The first execution index of each node can now be displayed on nodes using the Show Node Instruction Index on any node in the Control Rig graph editor.

    • By enabling the Show Node Instruction Index, it can assist you when debugging a Control Rig graph, by revealing which nodes are being executed by the graph.

  • Added introspection on function arguments to Rig VM.

    • You can now use the FRigVMRegistry's access to FRigVMFunction to list the function arguments for each registered callback function or dispatch.

  • When selecting objects in the Control Rig hierarchy, the hierarchy relationship of the elements is retained if copied or moved.

  • IK Rig and Retargeter assets now have custom icons.

  • You can now use Python getters for shape transform in Control Rig.

  • You can use new Root Settings in the IK Retargeter to control the motion of the retargeted root bone, with the added ability to adjustments to the retargeted root bone independently of the character's feet.

  • You can manually change the pin types on the new wildcard pins in Control Rig.

  • The IK Retargeter now features the new Speed Planting property, that you can useto create retargeted animations without foot sliding, regardless of the size difference between the source and target character.

  • You can now enable debugging watches within Control Rig functions.

  • You can now import poses from pose assets or animation sequences to the IK Retargeter.

    • Additionally you can export retargeted poses as pose assets.

  • Control Rig now supports preferred Euler angles.

    • Euler angles set on Controls or Bones are now preferred over potential quaternion representations during the solve.

  • Using the Advanced Tab on the Control Rig Animation Blueprint Node you can now choose which Events to run during execution.

  • You can now set up multiple connections to the same source variable node in Rig VM.

  • Using the IK Retargeter you can now control any Pole Vector twisting on any retarget chain without needing to set up an IK.

  • Unreal Engine will now issue warnings for unconnected execute pins in Control Rig.

  • The Retarget Pose From Mesh animation node now also copies curve values from the source mesh component.

  • You can now mirror IK Rig retargeted chains.

  • Added the ability to see when an IK Rig retargeted chain's settings have been modified.

  • Deformer Graph node Pins can now specify data sizing that is a multiple of a given execution context. You can also use expressions to fully customize the pin's data sizing.

  • Deformer Graphs can now receive input, bind to, and receive data from, multiple Actor components as inputs.

  • Deformer Graphs now support the execution of multiple graphs. Each Deformer Graph can contain and execute a Setup Graph to perform initialization functions, an Update Graph to perform functions every rendered frame, and Trigger Graphs that can be queued to perform specialized functions and can be called using Blueprints.

  • The Skeletal Modeling tool has been relocated to the new Skeletal Modeling Tools plugin.

  • Exposed the ActorToTrack and ControlRigClass properties to Cinematics.

Improvement:

  • Variable nodes in Control Rig can now reference an input parameter inside a function.

  • Rig element names now support spaces in Control Rig.

  • Improved the performance of Control Rig's Hermite spline.

  • Updated the MLDeformer readme file to clarify install instructions for other non-windows platforms.

  • Control Rig's TypeIndex now operates in typedef for easier debugging.

  • When using the IK Retargeter you can now edit the retargeted pose on both the source and the target skeleton.

  • The IK Retagreter now provides precise numerical input for bone editing and a reworked interface for pose management.

  • Convert debug breakpoints from TSharedPtr to guid based struct.

  • The Control Rig outliner for FKControlRig has been improved.

  • Control Rig and RigVM asset loading performance has been Improved.

  • The Control Rig's performance for cycle checking transforms has been improved.

  • The Print String node can be used to print any data type value to the screen at runtime, for debugging purposes.

  • The Rig VM's Refactor template data-type system now operates using Integers rather than string comparisons.

  • Rig VM has received an API performance increase due to a more efficient registry lookup mechanism.

  • When editing retargeted poses, you can no longer make direct horizontal translations on the retargeted skeleton's root bone.

    • You can instead use the new Horizontal Scaling property to achieve more reliable results.

  • The performance of Control Rig's Constraint nodes has been improved.

  • Rig VM nodes that used to be represented as many different instances and supporting different data types can now be represented as a FRigVMDispatchFactory.

    • See the Print node's improvements for an example of this implementation.

  • Increased the default number of Control Rig nodes that can run concurrently from 64 to 256.

  • The Control Rig Editor hotkey shortcut, used to perform a duplication, has been changed, and is now Ctrl+D.

  • The default Control Rig naming convention has been changed to TemplateName.

    • Additionally, the PrototypeName metadata tag used for FRigVMStruct specializations has been renamed to TemplateName to match the API feature.

  • The visibility of Proxy Controls affects the visibility of other proxies sharing the same driven controls.

  • The Retarget Pose from Mesh node now outputs the character's reference pose when no source component is found.

  • IK Retargeter now auto-populates the Skeletal Mesh property when applying an IK Rig.

Bug Fix:

  • The Category field of Control Rig functions can now be cleared after it is given a value.

  • Fixed Control Rig Blueprint compilations causing the right-click context menu to get slower over time.

  • Fixed the Control Rig AnimGraph Node not being able to accept array pin connections.

  • Fixed Aim nodes causing flipping when the primary and the secondary targets are at a certain angle.

  • Control Rig's template collision message has been changed to a display rather than as a warning.

    • If two collision templates are defined with the same arguments, the second collision will fail during registration, and issue a warning to the log.

  • Fixed a bug that could cause IK Rig retargeted chain to unexpectedly rest to default values.

  • Fixed a bug that could cause bone and name filters within the IK Rig and IK Retargeter hierarchy panels to not function properly.

  • Fixed a bug that could cause the IK Retargeter viewport to not properly frame selections when pressing "F" key.

  • Fixed a bug that could cause vectors in a Control Rig to not export correctly when used on Animation Blueprints.

  • Fixed a bug that could cause a delay in the seamless editing of IK Rig and Retarget assets.

    • Changes to the IK Rig are now immediately reflected in any open Retarget asset.

  • Fixed bug that could cause an IK Rig retarget chain name to add an unwanted suffix when trying to rename the asset.

  • Fixed bug that could occur in the IK Retargeter when editing the translation of a target skeleton's root bone, that would push the character too far if the character was scaled up.

  • Fixed a bug that could cause the IK Retargeter to not properly register Vicon skeletons and other skeletons where the root bone is the pelvis.

  • Fixed a bug that could prevent the renaming of a single item with a case change.

    • It's important to note that both FString and FName operator are case insensitive resulting in misunderstanding when renaming items with altered cases.

  • Fixed a bug that could cause IK Retargeter chains using Globally Scaled translation mode to incorrectly apply scaled root motion when retargeting root motion between characters of different sizes.

  • Fixed a bug that could occur with exported retargeted animation sequences that would not update the Retarget Source Asset without manually updating the asset using the context menu.

  • Fixed a bug that could cause a case-change when renaming goals in an IK Rig.

  • Fixed a bug that could cause curves contained within a Control Rig to not retain the validity flag, and target curves to be declared as invalid if it writes a zero-value.

  • Fixed a bug that could cause Control Rig Display actors to behave unstable.

  • Fixed a crash that could occur when working with spawnables in a sequencer project that contains a Control Rig.

Deprecated:

  • Deprecated bezier nodes in Control Rig.

  • Deprecated Static Mesh Control node in Control Rig. Instead, you should use the Rig Hierarchy panel to create new controls manually or use the new Spawn nodes.

  • Deprecated Transform Constraint node in Control Rig. Instead, you should use the new Constraint nodes.

  • Deprecated the forced tick order dependency between Control Rig component and its mapped Skeletal Mesh components. Instead, you should use tick prerequisite related Blueprint APIs to ensure the mapped Skeletal Mesh components tick after the Control Rig Component.

  • The Deformer Graph Compute Kernel's Parameter array has been deprecated, and its functionality has been implemented into the Input bindings.

Runtime

New:

  • Added the new bUpdateMeshWhenKinematic parameter to Skeletal Mesh Components, that updates Skeletal Meshes using physics bodies when they are set to kinematic simulation, rather than only when set to dynamic or simulated.

  • Added a set of preload dependencies on sparse class data and its archetype for blueprint CDOs.

  • Added track filtering to the Animation Sequence timeline.

  • Added the ability to blend regular animation sequences in mesh space as an option in the Blend Space properties, under Sample Smoothing.

  • Improved the Skeleton Tree children default ordering behavior.

    • The new behavior now lists sockets, preview meshes, and virtual bones ahead of a bone's children.

  • A Skinned Mesh Component's Predicted Level of Detail Level is now accessible from Blueprints.

  • The right-click context menu for Animation assets now has an option to Replace Skeleton, that you can use when a Skeleton asset has become orphaned.

  • The Compatible Skeletons feature is now accessible from the Skeleton Editor's Retarget Sources tool.

  • Added the ability to enable Pose Watching with Aim Offsets and Blend Masks.

  • Skeletal Meshes with a configured Leader Pose Component now will not tick the Animation Pose by default.

    • This default can be changed when calling SetLeaderPoseComponent with the new FollowerShouldTickPose parameter.

  • Added a new orbit camera mode to the Animation Editors camera widget.

    • Additionally you can now set a 'Lock Camera Rotation' and 'Pause On Orbit' options in the Editor Preferences.

  • When creating a new asset in the Content Browser, Level Sequence, Template Sequence, and Camera Animation Sequence asset types are now accessible in a new Cinematics top-level asset category.

  • The Pose Watch icon, that appears on animation blueprint nodes in the blueprint graph, that have been pose watch enabled, has been updated.

  • You can now create event-based transitions within State Machines.

  • The Rewind Debugger, packaged in the Animation Insights plugin, now has Pose Watch support.

  • You can now assign a Skeleton to an Animation Blueprint using the new context menu option Assign Skeleton in the Content Browser.

  • Added the option to strip Additive Base-Poses during cooking to save memory, This function is disabled by default and can be enabled using the console command a.StripAdditiveRefPose.

  • Relocated the Pose Asset editor's Update Source button below the asset field, as it was often hidden, depending on the width of the details panel.

  • Fixed a bug that could cause Notify states to re-trigger erratically when a montage is re-played.

  • Added a new tooltip for the Rewind Debugger curve tracks to preview curve value at cursor position.

  • Added a new TraceFiltering trace channel.

    • Note, the TraceFiltering trance channel will not be enabled by default on builds with the Trace Source Filtering plugin installed.

  • You can now save animation curves from the animation timeline editor in the clipboard.

  • Added new keyboard shortcuts for Rewind Debugger playback controls.

  • Added a new Project Settings section for Rewind Debugger.

  • Double-clicking a Linked Anim Layer node, now also attaches the newly opened Animation Blueprint editor to the corresponding AnimInstance for seamless debugging.

  • Added new Teleport flags to the Rewind Debugger that will return a skeletal mesh component to its original location when resuming the project.

Improvement:

  • Add support for LWC promotion when copying TMap properties via their property access, this change fixes issues experienced when supplying curve values via a node pin on Modify Bone animation blueprint nodes.

  • Improved animation blueprint re-instancing by removing the special case instance in the Blueprint re-instancing pipeline for animation blueprints. This allows linked animation graphs to persist across live-recompilations.

    • The new compiling behavior is opt-out using a console variable, in case your project relies on the old compiling behavior.

  • Improved Blueprint variable permissions filtering.

  • Added a critical section to the Property Access Library to prevent race conditions.

  • The HideBoneByName command now does not stop BoneAnim when TickOption is AlwaysTickPoseAndRefreshBones.

  • ShouldTriggerAnimNotifyState is now public.

  • Template Animation Blueprints can now be used with Skeletal Meshes as a standalone asset.

  • The Animation Budget Allocator can now be used in Blueprint-only projects.

  • Refined the animation asset's Create Asset submenu in the Content Browser, for increased organization and user efficiency.

  • Added expanded filtering options within the Animation Blueprint interfaces.

  • Added the adoption to prevent physics asset creation on import, this functionality is enabled by default.

  • The process of copying the final output pose for animation playback has been optimized by removing any redundant copies of the reference pose.

    • If incorrect pose results persist, you can traverse the bone index array in increasing order and fill in any gaps with the reference pose.

  • Enabled drag and drop functionality to support dragging pure functions from the MyBlueprint panel to AnimGraphs in Animation Blueprints.

    • Blocked all drag and drop functionality of dragging impure functions into AnimGraphs to prevent incompatibility errors.

    • Additionally blocked drag and drop functionality for all functions into State Machines to prevent incompatibility errors.

  • Replaced the message log readout, Compressing Animations with Preparing Animations.

  • Replaced the Animation Blueprint RigidBody node's MasterAlpha property with the new WorldAlpha property.

  • The Morph Target implementation workflow has been significantly optimized. The improvement can be most notably felt when setting up a Skeletal Mesh with many Morph Targets, where there are multiple active simultaneously.

Crash Fix:

  • Fixed a crash that could occur while deleting a blendspace node.

  • Fixed a crash that could occur by canceling an in progress animation sequence export.

  • Fixed a crash that could occur in EDL (Edit Decision Lists) builds caused by accessing sparse class data in Link() before it is serialized.

  • Fixed a crash that could occur when re-instancing UAnimInstance.

  • Fixed a crash that could occur when customizing an Animation Blueprint node that is no longer associated with a valid Blueprint.

  • Fixed a crash that could occur when compiling an animation blueprint that contains an empty state machine.

  • Fixed a crash that could occur when compiling linked Animation Blueprint graphs.

  • Fixed a crash that could occur while working in Asset Editor Mode Manager, by closing Unreal Editor with an open Animation Blueprint editor on screen.

  • Fixed a crash that could occur when opening Animation Sequence in the editor, when the Sequence relies on a compatible skeleton.

  • Fixed a crash that could occur while packaging a project containing a character using a remapped skeleton.

  • Fixed a crash that could occur when using the Rewind Debugger to trace object properties and the object contained a property of type Map.

  • Fixed crash that could occur when loading a Layered blend per bone node that has empty blend mask entries.

  • Fixed a crash that could occur by re-instancing clobbering the size of 1EditFixedSize1 arrays in Animation Blueprint nodes.

  • Fixed crash that could occur when trying to re-instance post-process Animation Blueprint instances on components with no mesh.

Bug Fix:

  • Fixed an issue that could cause property access nodes to report an erroneous error when using split pins in functions.

  • Fixed a bug that failed to allow you to apply permissions to Physics Assets and Control Rigs in the Skeletal Mesh context menu.

  • Fixed a bug that prevented users from enabling smoothing for BlendSpaces.

  • Fixed a bug that could occur while compiling an animation blueprint that contains a Control Rig node that caused a memory stomp.

  • Fixed a bug that could cause users to be unable to set defaults on interface pins.

  • Fixed a bug that caused a blueprint function's thread safe property to not update after a user performed undo and subsequent redo commands.

  • Fixed a bug that could occur causing asset overrides to not work correctly for blendspace and sequence playback nodes that use identical defaults.

  • Fixed a bug that caused the display of the animation compression progress to not occur.

  • Fixed a bug that caused leaking linked animation instances when reinitializing animation.

  • Fixed an issue that could cause LOD issues when baking an animation in Sequencer, including stretched and deformed geometry.

  • Fixed an issue that could cause compiling irregularities with child animation Blueprints.

  • Fixed a bug that could prevent editing of input parameters on input pose nodes in the main animation blueprint graph.

  • Fixed a bug that could cause nested structs that are bound to animation node pins to not display their child values.

  • Fixed a bug that could cause non-editor-ticking skeletal meshes to produce unexpected animation LOD results after compiling.

  • Fixed a crash that could occur in cooked builds where references to editor-only properties were left in the animation blueprint bytecode.

  • Fixed an issue that could occur to a characters reference pose when linking in a new linked anim graph and compiling.

  • Fixed a bug that could cause animation compression settings to preload before any load of game content in editor builds.

    • Additionally Fixes have been made to prevent warnings about calling LoadObject in PostLoad of animation sequences.

  • Fixed a crash that could occur from Layered Animation that are linked from initialization and added runtime warnings for situations when this could cause issues.

  • Fixed a bug that could cause erroneous warnings to occur regarding child animation blueprints.

  • Fixed a bug that could cause a display of animation layer interfaces on content browser tiles.

  • Fixed a bug that could cause renaming issues with linked animation layers where some layer nodes would not correctly pick up the rename.

  • Fixed a bug that could cause a duplication of animation blueprints with custom property bindings producing internal compiler errors.

  • Fixed a bug that prevented ticking of animation instances during reinstancing.

  • Fixed a bug that could cause per-bone sample smoothing to not affect the correct bones.

  • Fixed a bug that could occur when adding or removing an animation layer graph's input pose, the instance will now refresh instances without requiring a manual refresh.

  • Fixed a bug that could occur with the animation blueprint interface falsely displaying in the asset creation menu.

  • Fixed a bug that could produce incorrect collisions when using the URO / budget allocator interpolation combined with the SkipKinematicUpdateWhenInterpolating flag.

  • Fixed a bug that could cause the Layered blend per bone node's Blend Masks to fall out of sync with any present Blend Poses.

  • Fixed a bug that could cause Animation Blueprints that contain Pose Handlers to behave improperly by expanding the asset override tree.

  • Fixed a bug that could cause the blend profiles submenu to not appear on a subsequent opening of a skeleton asset.

  • Fixed a bug that could occur when using mesh-space blending in Blend Spaces, in particular additive or offset Blend Spaces.

  • Fixed a bug that could cause animation node functions to be bound in Layered Animation interfaces.

  • Fixed a crash that could occur when reverting an added bone socket or virtual bone to a Skeleton asset.

  • Fixed a bug that could cause deleted Skeleton assets to still be listed in the Compatible Skeletons list of other Skeletons.

  • Fixed a bug that could cause an Undo/Redo command to not function when performed on a BlendSpaces' "BlendSpaceDetails Axis" properties.

  • Fixed a bug that could cause a tracepoint break from triggering when frame-stepping in the editor with an active Animation Blueprint preview.

  • Fixed a bug that could cause erratic behaviors when attempting to create comments in any Animation Blueprint graph.

  • Fixed a bug that could cause irregular behavior with the Blend Profile slider when making minor adjustments.

  • Fixed a bug that could cause the Pose pin attribute connections to not display properly when routing through a reroute node in Animation Blueprints.

  • Fixed a bug that could occur when copy-pasting nodes dependent upon a source State Machine state to carry over their existing dependencies.

  • Fixed a bug that could cause tags to not display on State Machine nodes.

  • Fixed a bug that could open the 'Create Animation Blueprint' window off-screen when using Windows scale window.

  • Fixed a bug that could cause the Retarget Pose from Mesh node to display an error when compiling, stating the exposed IK Retargeter Asset input binding has not been defined when an asset is assigned using the node properties or graph interface.

  • Fixed a bug that could cause incorrect asset menu actions to appear for Animation Blueprints.

  • Fixed a bug that could cause pin type colors to only appear white in state machines.

  • Fixed a bug that could cause blend profile entries to persist after their parented bones have been removed from a skeleton.

  • Fixed a bug that could cause blend profile names to be reset if you clicked off of the field, rather than committing the name using Enter.

  • Fixed a bug that caused the AnimationStreaming library to use incorrect Low-Level Memory Tracker tags, designated for audio tracking.

  • Fixed a bug that could cause incorrect behavior in Spline IK node.

  • Fixed a bug that could cause the Sequence Player node's start position description to not match its functionality.

  • Fixed a visual bug that could cause Animation State Machine UX to display trailing dots at each option.

    • Additionally, the Add New State Machine option has been renamed to State Machine.

  • Fixed a bug that could cause errors with the auto-wire functionality for non-pose pins on nodes in Animation Blueprints.

  • Fixed a bug that could cause a Skeleton's defined preview mesh to be reset if it comes from a compatible skeleton.

  • Fixed a bug that could cause the Animation Notify Panel to not display the notify selection correctly when working with custom window display scaling.

  • Fixed a bug that could cause Sync Groups to not work correctly during zero-duration/inertial blends.

  • Fixed a crash that could occur if an Animation Sequence is deleted while in use in a Blend Space preview editor.

  • Fixed crash that could occur when Pose Watch has been enabled on a Skeletal Mesh Component.

  • Fixed a bug that could cause the Inspector Panel to not update a node's properties if not explicitly selected.

  • Fixed a bug that could cause a mesh's details text overlay to block mouse selections in the Animation Editors.

  • Fixed crash that could occur when changing an Composite Animation segment's start time, end time, or play rate.

  • Fixed a bug that could cause the Animation Blueprint's Random Sequence Player node to not transition out when an automatic transition rule is active.

  • The FAnimNotifyEvent::IsBlueprintNotify() now supports metadata filtering using the AnimNotifyList.

  • Fixed a crash that could occur after duplicating a State Machine in the MyBlueprint panel, within the Animation Blueprint editor.

  • Fixed a bug that could cause issues when remapping a character's skeleton including incorrectly adding or removing virtual bones.

  • Fixed a bug that could cause Blend Space Evaluators to not generate Animation Notifies during playback.

  • Fixed a bug that could cause proportionally-linked Animation Notifies to not move when the length of the Animation Sequence is edited.

  • Fixed a bug that could cause incorrect clipping behavior of Animation Notifies when the length of an Animation Sequence is edited.

  • Fixed a bug that could cause sync groups to not function properly when using a Transition Leader group across non-zero-length transitions.

  • Fixed a bug that could cause a Skeleton's associated assets to not load properly.

  • Fixed a bug that could cause Sequence Evaluator nodes to not be displayed in the Rewind Debugger's Blend Weights view.

  • Fixed a bug that could cause weapons and other attached objects to not stay attached to the character when scrubbing in Rewind Debugger.

  • Fixed a bug that could occur in Rewind Debugger and Animation insight where, Inertialization node properties were not shown under the correct node in the Anim Graph Debug view.

  • Fixed a bug that could cause the Make Dynamic Additive node to incorrectly respect the ExpectsAdditive flag.

  • Fixed a bug that could cause bone transforms stored on the clipboard to not correctly paste.

  • Fixed a bug that could cause the UI in the animation timeline editor from adding float and metadata curves.

  • Fixed a bug that could cause single frame discrepancy between the information shown by the Rewind Debugger and the previewed Skeletal Mesh on the editor viewport.

  • Fixed a bug that could cause some untagged memory allocations in GameplayInsights and SourceFiltering to include a proper LLM tag.

  • Fixed a bug that could cause a camera Feild of View (FOV) to not replay correctly when scrubbing in Rewind Debugger.

Deprecated:

  • Deprecated the unused bRaiseMaxErrorToExisting with the UAnimationSettings.

  • Deprecated all master and slave terminology, to indicate dependent relationships in the codebase, the new terminology is now Leader and Follower respectively.

Sequencer

New:

  • Added blueprint functions to get and set Control Rig parameter section masks.

  • Animation Sequence sections now contain the Swap Root Bone property, where you can choose to apply root motion animation to the Actor or Component in Sequencer.

  • You can now include or exclude Bones or Curves from being recorded in Take Recorder by using Include Animation Names and Exclude Animation Names.

  • Added several Blueprint functions to LevelSequenceEditorSubsystem:

    • ConvertToPossessable

    • ConvertToSpawnable

    • Copy/Paste Tracks

    • Copy/Paste Sections

    • CopyPaste Bindings

    • Copy/Paste Folders

    • AddActors

    • CreateCamera

  • Added Start at Current Timecode to Take Recorder. If enabled, this makes Take Recorder start recording at the current sequence time as opposed to restarting at the playback start time.

  • Added Swap Buffered Curves which stores the current curve to the buffer and restores the buffer to the current curve. The Store/Swap/Apply options can be accessed when right-clicking on keys or curves in the Curve Editor.

  • Added a new toggle to show or hide Buffered curves in the Curve Editor if the curve is selected.

  • You can now specify a specific bone in a skeletal mesh to record timecodes onto using Animation Attributes. If the bone name doesn't exist, it will fall back to the root.

  • Added functions for evaluating the root bone timecode and subframe attributes in Editor Utility Widget Blueprints.

  • Curves will now automatically frame when pasted in the Curve Editor if Auto Frame is enabled from the Curve Options menu.

  • FMovieSceneGeometryCacheParams is now exposed as a BlueprintType.

  • Mass Scale can now be animated in Sequencer.

  • Added a recording speed field in Take Recorder, where you can set the Time Dilation of the engine when recording.

  • Added SetMaterialIndex and GetMaterialIndex Blueprint Functions for PrimitiveMaterialTrack and ComponentMaterialTrack.

  • Added new commands that can be bound to keyboard shortcuts for Control Rig Controls filter, Control Rig Selected Controls filter and Reset filters.

  • Subsequence and Shot Tracks can now be filtered in Sequencer.

  • Added SetDefaultParameters Blueprint function for Take Recorder.

  • Timecode Subframe values will now display on Animation Sequence sections in Sequencer as a suffix when present in animations.

  • Added an option to Snap Time to Selection in the Curve Editor.

  • Added a tooltip to the Object Binding Track in Sequencer to show the object class that it is bound to.

  • Added the ability to toggle jobs in Movie Render Queue.

  • Added Sequencer GetByteTrackEnum and SetByteTrackEnum Blueprint Functions.

  • Added new marker hotkeys to Curve Editor:

    • Step to Next Mark: Ctrl + Shift + Period (.)

    • Step to Previous Mark: Ctrl + Shift + Comma (,)

    • Create / Delete Mark at current time: M

  • Added an option to TakeRecorderActorSource to show or hide the progress dialog.

  • Added functionality into TakeRecorderSourceHelpers to add or remove Actor sources.

  • Enhanced the Frames Per Second tooltip with the names of the Level Sequences that are not matching when there is a frame rate mismatch between Subsequences and their parent.

  • Added support for the new property setter functions, for example, UPROPERTY(Setter = MyPropertySetter). When evaluating a property keyframe, Sequencer will call this function if it exists.

  • Added an option to show or hide the status bar in Sequencer's View Options menu.

  • Added an option in the View Options menu to automatically expand nodes in the Sequencer Outliner upon the child being selected.

  • Added an option to gather child bindings on FBX export from Sequencer when using Python.

  • You can now render multiple cameras in a scene at the same time. When the experimental feature is enabled, the main camera used for the sequence, in addition to all other camera components rendered in the scene, will be rendered simultaneously as additional passes.

  • Added a new experimental Cinematic Prestreaming plugin that you can use to record certain types of asynchronous streaming requests, such as Nanite and Virtual Textures. You can then playback these streaming requests in a Level Sequence after the initial scene render, but in advance of when the scene is visible to the player.

    • The experimental Cinematic Prestreaming plugin is designed to improve cinematic quality offline rendered cinematics.

    • Offline rendered cinematics are able to avoid Texture resolutions from being visible in the final frames, but requires rendering two passes. The first pass to generate the request list and the second to use the generated data.

  • Added a new experimental flushing mechanism to the sequencer texture streaming system to remove any blurry textures that would be visible when using texture streaming.

    • Using texture streaming significantly reduces VRAM usage when rendering large scenes. This will automatically be enabled if you use the Game Overrides setting to set Texture Streaming to Don't Override. This feature can be disabled by setting bFlushStreamingManagers to false.

  • Added a new lookup table to channel proxies for finding channels by name.

  • Added new Sequencer commands to clear selections in Sequencer and Curve Editor using the Escape key.

  • Added a new Lazy-create for the camera's animation sub-system linker. This simplifies debugging by creating less linkers in simple test levels.

  • When rendering a shot, you can now specify the render to only include the shot in the context of the root sequence.

  • You can now specify Data Layers instead of Editor Layers in the Stencil Layer feature.

  • Sequencer Channels can now be overridden with other types of channels.

    • For instance, you can now change the Rotation.X channel of a transform section, which is normally a keyframed curve channel, to make use of a perlin noise generator channel.

  • Added more system information categories to EXR metadata such as total memory available, total memory used by all processes, cpu vendor/name, and more.

    • It is important to note, not all metadata is supported on all hardware.

  • Added a simplified API for creating renders using Movie Render Queue in game at runtime.

  • Added a new role to sequencer's Entity Component System (ECS) linkers to make it easier to set debug breakpoints in linker code.

  • Added more descriptive statistics for each property type, instead of using Apply Properties for all property types.

  • Added finer control over which systems are included or and which are excluded in a given linker.

  • With the Debug Options property, you can now automatically capture an Unreal Insights trace for the duration of the render.

    • This makes it easy for artists to capture a trace file to send to programmers for further analysis when they see unexpectedly slow performance.

  • The example Python Runtime executor has been updated with a corrected command line argument, and printed warnings about how the script is meant to function as an example and will need editing to be usable in a project.

  • Added a root sequence's name to sequence instance classes for easier debugging.

  • Added a menu extender to sequencer, and to sequencer context menus, so that multiple channels can extend their menus.

  • You can now copy and paste related controls between multiple Control Rigs in the Curve Editor.

  • You can now toggle the IsEnabled state of sequencer properties using Python scripting.

  • The version token can now come after shot_name in the format list and will be treated as a local version of the per-shot folder, instead of a global version, which is shared by all shots.

  • The Exposed UMovieSceneSection::GetAutoSizeRange() property is now exposed to scripting using the UMovieSceneSectionExtensions.

    • For tracks that support auto-sizing, such as animation and audio, you can now query if the auto-size data has a start and end frame, as well as if it receives the data. This simplifies adding assets using Python as you can use a unified function, for all tracks that support GetAutoSizeRange, regardless of underlying asset type. This addition simplifies the need to use a unique way of determining how long an asset is for each type.

  • Added a system to check for valid players in camera cut tracks to fix edge-case crashes when saving a level sequence.

  • You can now add Sequences to Sub-Sequences with the InsertSequence command, similar to the InsertShot command for adding Cinematic Shot tracks.

  • You can now save the UI width percentage between the Sequencer Timeline and the Outliner in Sequencer settings.

  • You can now drag-and-drop Data Layer assets from the Data Layer window or the Content Browser into existing Data Layer sections.

  • Added the new console variable Sequencer.DuplicateLinkedAnimSequence, that you can use to toggle an animation sequence's duplication behavior when the level sequence is duplicated.

  • Added new Tween Tool modes:

    • Push / Pull

    • Blend to Neighbor

  • Added Linked Anim Sequence functions to Blueprints and Python:

    • Create Linked Anim Sequence

    • Get Linked Anim Sequences

    • Get Source Level Sequence

  • Sequencer playback hotkeys now will always function in Animation Mode regardless of panel focus.

  • Game View will now hide Control Rig Controls in that viewport.

  • Added an editor preference to enable drag selection on left mouse click instead of moving the camera: Left Mouse Drag Does Marquee.

  • Created a new Project Setting category for Cinematic Camera where you can set defaults for Lens, Filmback, and Aspect Ratio Crop.

  • Indirect manipulation using Ctrl now works with Control Rig objects.

  • The Orbit camera around selection editor preference now correctly works for Control Rig Controls.

  • Marked up LevelSequenceEditorSubsystem with _API macro to allow for usage outside of the module.

  • Added an option to disable reacting to playback replication changes on the sequence player.

  • Added a native interface for controlling whether the effects of a UMovieSceneSequencePlayer can be observed.

  • Added IgnoreFitlersWhenCollapsed setting so if a section is collapsed and there is a filter, it will only show filtered key areas when that flag is false. Defaults to true to keep existing behavior.

  • Changed template sequence actors to use asynchronous updates.

  • Added a scripting method for deleting root folders from a sequence.

  • Exposed LinkAnimSequence function to scripting.

  • ALevelSequenceActor::LevelSequenceAsset is now a replicated property and initializes the player if it changes.

  • Exposed movie scene sub section / focused sequence navigation to scripting:

    • Focus section

    • Focus parent

    • Get hierarchy

  • Added a GetDescendantSubSections function to MovieSceneCommonHelpers.

Improvement:

  • Moving a keyframe to the same time as another keyframe in the Curve Editor will now remove and replace the old keyframe.

  • The Look at Tracking Interp Speed property on Cine Camera Actors is now animatable in Sequencer.

  • Buffered Curves are now consistently called Buffered Curves in the Curve Editor instead of Stored Curves.

  • Buffered curves now can only apply and swap to the curve it was made on.

  • You can now cancel a Take Recorder recording that is in progress.

  • The Cinematic Viewport timeline range is now synchronized to Sequencer's timeline. This change helps prevent cases where the timeline padding could appear very large and unusable, due to a large working range.

  • You can now add an animation track to the top level Actor binding if the root is a Skeletal Mesh component. This loosens previous restrictions to make it more convenient to add animation without also needing to add Component Tracks first.

  • Added Play/Pause/Stop functions to the Actor Sequence Component.

  • The Track filter button now has a red dot to indicate if any filters are active.

  • Camera Cut tracks are now included in the Cameras track filter.

  • Sequencers main toolbar has been converted to use the Tool Menus framework.

  • Several color changes have been made to curves and keyframes in the Curve Editor.

    • Keyframes are now the same color as the curve.

    • Selected keyframes are white, which can be changed in Editor Preferences.

    • The default color for non-axis curves is now a darker gray.

    • The blue channel for Z and B channels is now brighter to contrast better against the dark background.

  • Locking and unlocking camera cuts can now be performed with Shift-C.

  • Added MOVIESCENETRACKS_API to some MovieScene3DTransformSection Functions so they can be used by other Plugins.

  • MovieScene::SetComponentTransformAndVelocity can now be used by other Plugins.

  • Actors referenced in Sequencer now no longer forcibly show in the Outliner, unless it is a Spawnable.

  • The ExportLevelSequenceFBX Python command is now able to export a Subsequence within a Master Sequence.

  • Added hotkey support for selecting all keyframes forward and backward in the Curve Editor. Ctrl + ] and Ctrl + [.

  • Dragging and dropping Movie Render Queue assets now appends the jobs in the queue to the active queue.

  • The Sequencer tab will now display with an asterix if the asset has unsaved changes.

  • Sequencer Bezier interpolation now occurs on doubles instead of floats.

  • Sequencer can now handle cases in which multiple ECS entities are driving a single transform section. This is a new situation that arises from overridden channels.

  • Sequencer now passes its owning section when evaluating a channel. Some new channel types, such as perlin noise, need the section pointer to look up contextual data, like tick resolution.

  • The Use Camera Cut for Warm Up range detection behavior is now the difference between the Camera Cut Section start, and the first evaluated frame of the Camera Cut section itself. This improvement was made to better handle sub-sequences being clipped by parent ranges.

  • Reduced the amount of concurrent memory required for panoramic blending, by blending it into the final output texture as soon as each sample is done in order to free up more memory.

  • Cloth behavior, when using temporal sub-sampling, has been improved by automatically increasing the sub-step count when needed.

    • It is important to note that Cloth will still present a different result than in viewport due to the increased number of chances to resolve collisions and have physics forces applied.

  • You can now have multiple Control Rig's active at the same time. Using the Outliner, you can now observe and manage all Control Rigs in the active level sequence.

  • Linked Anim Sequences will now save when the Level Sequence is saved.

  • Parent and Child definitions in the Snapper tool will now reset when switching Shots or Subsequences.

  • You should now only be able to snap to a single parent when using the Snapper Tool.

  • Added Evaluate All Skeletal Mesh Components option to AnimSequenceLink.

  • Linked Animation Sequences will now be dirtied at the same time you dirty your Level Sequence.

Crash Fix:

  • Fixed crash with ReplayTracks plugin.

  • Fixed a crash that would occur when modifying a parent asset while recording with Take Recorder.

  • Fixed a crash that could occur when using the Command Line Encoder option if the output directory tree did not fully exist before encoding started.

  • Fixed a crash that would occur when keying onto additive sections with different number of controls due to the hidden track editor variable.

  • Fixed a crash when unresolved bound objects in Sequencer were being deleted.

  • Fixed a crash when calling FindOrGetDefaultSettingForShot when InMasterConfig was null.

Bug Fix:

  • Set Curve Color For Selected now only changes the color for selected and not all curves.

  • Fixed an issue where repeatedly setting custom curve colors would result in broken keyframe coloring in the Curve Editor.

  • Changing curve colors in the Editor Preferences menu now correctly applies the color change immediately.

  • Fixed still being able to add and move Marks if Sequencer was locked.

  • Fixed subtitles appearing even when Suppress Subtitles is enabled in the Audio track section.

  • Fixed a bad cast error when trying to cast to a MovieScenePropertyTrack.

  • Fixed a bug where all Control Rig controls would be selected if you selected the Folder Track that contained them.

  • Fixed an issue where the Sequencer editor menu extensions were shown for sequence types other than Level Sequences.

  • Fixed synchronization issues where curves would not appear in the Curve Editor if you had Selected Control Rig Controls enabled.

  • Fixed an issue where dragging a Control Rig into Sequencer would create a duplicate Control Rig track for the actor and all of its skeletal mesh components.

  • Sequencer: Clamp to playback range before snapping to frames, otherwise the scrubbed to frame could be a subframe when snapping is on.

  • Fixed a bug where all Animation Notifies would fire at once at the loop point when looping animations in Sequencer.

  • Fixed an issue with adding keyframes in the Curve Editor using Ctrl + MMB would still cause slight disturbances to the curve shape if snapping was enabled.

  • Fixed Curve Editor snapping to occur in all view modes: Absolute, Stacked, and Normalized.

  • Fixed an issue with Camera Rig Rail where the mount visual would rotate if Lock Orientation to Rail was disabled.

  • Fixed an issue where muted tracks could be muted forever when deleting tracks.

  • Fixed smoothed replicated playback causing desyncs during looped playback.

  • Fixed an issue when copy and pasting attached spawned objects not correctly binding to the newly pasted bindings.

  • Fixed an issue with Curve Editor bindings for Zoom To Fit All, Zoom To Fit Horizontal, and Zoom To Fit Vertical not working.

  • Fixed an issue where if you select a control in the Anim Outliner or in Sequencer, the transform gizmo wouldn't appear because the Control was not considered selected.

  • Convert to Spawnable now creates a transform track that takes the transform origin into account.

  • Fixed an issue when recording Spawnable Actors in Take Recorder that are children of other Actors not being recorded resulting in the recorded Actor appearing at an incorrect transform.

  • Fixed a crash in Sequencer when dragging "Animation Mode" keyframes.

  • Fixed an issue that caused the playhead to not follow the cursor consistently when dragging it at low speeds.

  • Fixed an issue where deleting a recorded Actor after a Take Recorder recording would cause all Actors to be removed from the source list.

  • Removed interp from RelativeScale3D, which fixes an issue where meshes would flicker between their initial Transform Scale Values and the Relative Scale 3D values on playback.

  • Fixed an issue where not all keyframes would be selected when clicking on a curve in the Curve Editor.

  • Fixed an issue for the Control Rig Snap Tool not taking full world transform into account.

  • Fixed a bug with Control Rig selection where if you select a keyframe on a Control Rig element, the corresponding element would get deselected.

  • Fixed a bug where changing a color on a keyframe using the Color Picker would also reset the keyframe tangent.

  • Fixed an issue where if you select a Control in the Anim Outliner, the transform gizmo won't be updated so you can't click on a gizmo to move it immediately.

  • Fixed an issue where sometimes the clicking and dragging would drag the playback ranges instead of the playhead.

  • Fixed an issue where OnStop would not always fire.

  • Fixed an issue where Spawnable objects can't be retrieved immediately after opening Sequence.

  • Fixed a case where Take Recorder would get confused over which Camera to bind to the Camera Cuts track if another Camera was a Component of an Actor.

  • Fixed an issue with Camera frustum visualizations not updating when lens values update in Sequencer.

  • Fixed an issue where undoing in the Curve Editor would change the current time.

  • Fixed an issue where the Snapper Tool would not correctly work when snapping backwards from your current time.

  • Fixed an issue where deleting the last keyframe would not reset the property to the previously unkeyed value.

  • Fixed an issue where pasting keyframes in the Curve Editor would paste to all curves in view and not the selected one.

  • Fixed an issue where Muted track sections could still have their data changed.

  • Fixed ExponentialHeightFog.SecondFogData properties not dirtying render state when set from Sequencer evaluation.

  • Fixed an issue that prevented saving a Control Rig animation to an Animation Sequence that was currently being referenced in Sequencer.

  • Fixed an issue when copy and pasting tracks with multiple bindings on it.

  • Fixed a bug that could use name-lookups for channels, instead of assuming their type and index.

    • name-lookups is now a potentially invalid assumption when channels can be overridden.

  • Fixed a bug that could cause cloth simulation to not occur if a render was started long after the level was first loaded.

  • Fixed a bug that could cause Control Rig to mark a section as changed when the channel proxy changes.

  • Fixed a bug that could create an arbitrary section range when a new section is created past the playback end.

  • Fixed a bug that could cause high temporal sample counts to have their delta times clamped during Level Tick which created mismatches between calculated component velocities and render thread delta times.

  • Fixed a bug that could cause clamping of looping subsequences.

    • Previously, a compilation's range was clamped by the containing section's range, so some of the sub-sequence's animation would not be taken into account after the last loop and still play.

  • Fixed a bug that could incorrectly initialize a camera's animation sequences upon creation.

    • Previously, sequences were only initialized when the asset was opened in Sequencer for the first time. This could lead to problems if the asset was added to something else, like a camera shake or a level sequence, before edits were made..

  • Fixed a bug that could cause a regression in jpeg or png file's writing times that significantly slowed down large resolution renders.

  • Fixed a bug that could cause a widening of old, single-precision floating point properties on Blueprints.

  • Fixed a bug that could cause an issue with setting default values when the binding ID changed for actor reference sections.

  • Fixed a bug that could cause a visible seam on the right edge of the editor.

  • Fixed a bug that could cause png alpha channels to only register as partially transparent.

  • Fixed a bug that could cause erratic behavior with alpha-in-tonemapper warnings.

  • Fixed a bug that could cause a Trigger Cameras to cut changes between camera cut sections even if the camera actor is the same.

    • This restores a previous edge-case behavior that users relied on for their projects.

  • Fixed a bug that would register the same tick client multiple times.

  • Fixed a bug that could cause default-construct components created by a mutation to prevent corrupted memory from making it into the sequencer evaluation.

  • Fixed a bug that could cause code from getting a component writer to a single entity.

  • Fixed a bug that could cause non-layered EXRs from using the wrong Alpha Allowed property which prevented the property from writing out to alpha channels.

  • Fixed a bug that could cause a project's aspect ratio constraints to not correctly restore.

  • Fixed a bug that could prevent selected infinite sections from being moved or dragged.

  • Fixed a bug that could cause an issue when trying to use png files in combination with the Command Line Encoder failed with some third party encoding software.

  • Fixed a bug that could fail to try and resolve bound actors with component possessables.

  • Fixed a bug that could cause the Command Line Encoder to not use version tokens in the filename.

  • Fixes a bug that could clear delegates tied to destroyed objects that should not be left in the latent actions list.

  • Fixed a bug that could causethe additive-from-base blend type to not perform when recomposing values for keying.

  • Fixed a bug that could cause the project settings class for Render (Local)/Render (Remote) to not properly store references to late-loaded class types such as those defined in Python or in a game's Plugins.

  • Fixed a bug that could cause the 'Write all Samples' to not respect the project_dir format string.

  • Fixed a bug that could cause separately composited Burn In/Widget Renderers to not actually write an alpha channel when the main output was as JPEG or BMP file.

  • Fix bug that could cause a section-preroll to be ignored for camera cut tracks.

  • Fixed a bug that could cause the DetailLighting render pass not apply the correct view modes causing reflections to not display.

  • Fixed a bug that caused the float and double channel context menus to not merge into a single "curve channels" context menu.

    • Previously, the float channels, specifically the channel for transform sections, was not affected by any context menus.

  • Fixed a bug that could cause multiple custom movie renderers to be displayed at once, instead of just the current one.

  • Fixed a bug that could cause the template sequence property multipliers to not always be reliably being taken into account.

  • Fixed a bug that could cause high temporal sample counts being artificially clamped by overriding the minimum timestep for Chaos Physics to zero during renders.

  • Fixed a bug that could cause Tick Resolution migration code to not successfully migrate locked sections and not migrating Marked Frames.

    • This fix also adds the ability to recursively apply the time migration to all child sequences.

  • Fixed a bug that could occur when trying to add a job through the Sequencer UI, then disabling a setting, and then adding the job again, which could result in the disabled settings to duplicate and become active again.

  • Fixed a bug that could cause formatted strings that come from shots to provide the incorrect values, from the Master Configuration, when used in filenames.

  • Fixed a bug that could prevent the use of the job initialization timer when using the year, month and day tags, which would cause files to go into separate folders when a job rolled over midnight in UTC time.

  • Fixed a bug that could cause Video Codecs to function when the Overwrite Existing property was disabled.

  • Fixed a bug that could prevent a saved Queue from showing the correct names for jobs that used Presets for their settings.

    • Fixed jobs with modified presets having the wrong name after being duplicated in the queue.

  • Fixed a bug that could cause the MoviePipelineInProcessExecutor to crash if provided with a bad Sequence path.

  • Fixed a bug that could cause the date and time tags to not resolve in output paths when clicked on in the UI.

  • Fixed a bug that could cause the full path name of template sequences' bound actor classes to not register if only its short name was saved.

  • Fixed a bug that could cause the Animation Custom Mode and Swap Root Bone properties to not be exposed to Blueprints.

  • Fixed a crash that could occur by calling DeleteAllJobs immediately after calling RenderWithExecutor.

  • Fixed a bug that could fail to include a sequence's play rate when computing sequence shake pattern duration.

  • Fixed a bug that could generate duplicates from bindings when first resolved.

  • Fixed a bug that could cause motion blur to get stuck when the Camera Cut track stopped evaluating.

    • This was only an issue if the Motion Vector Simulation system was enabled and the camera being returned to was not a Cine Camera Component.

  • Fixed a bug that could cause an incorrect upkeep of property stats when upgrading floats to doubles.

  • Fixed a bug that could assert on exit if the runner's linker is pending kill.

    • This could happen if the linker is flagged for destruction before whatever owns the runner.

  • Fixed a bug that could cause alpha channels to be speckled due to dithering when using png and jpeg file outputs.

  • Fixed a crash that could occur in the Animation Sequencer animation selection filter, by adding Montages to animation tracks.

    • At this time, only animation sequences are currently supported.

  • Fixed a crash that could occur with Video Codecs when they failed to initialize due to an invalid output file path, such as writing to a hard drive that did not exist.

  • Fixed a bug that could cause mapped Skeletal Mesh to not update the Skeletal Mesh accordingly to the controls.

  • Fixed a bug that could cause all linker evaluations to start with an un-clean capture source, even in cases when there are nested linkers running.

    • This fixes asserts caused by mismatched pre-animated states.

  • Fixed a bug that could cause a custom range for Move Render Queue renders in shipping builds to be incorrectly set.

  • Fixed a bug that could cause a baked Control Rig to include all of the rig's Compatible Skeletons.

  • Fixed a bug that could cause only select Control Rig Controls to deselect when a control isn't clicked.

  • Fixed a bug that could cause Network Level Authentication (NLA) issues with root motion not blending correctly when there are multiple skeletons blending.

  • Fixed a bug that could cause drag-and-drop functionality, when adding animation sequences to the Sequencer timeline, to create a new dedicated track rather than adding the sequence to an existing track.

  • Fixed an issue where copy and pasting Control Rig data would not paste correctly if the Selected Control Rig Controls track filter was enabled.

  • Fixed an issue where orbiting (Alt + LMB) the camera around a selected Control Rig would sometimes duplicate it.

  • Fixed an issue where orbiting (Alt + LMB) the camera around a selected Control would sometimes move the Control instead of the camera.

  • Fixed an issue where duplicating Linked Anim Sequences would point to both the original and the duplicate.

  • Fixed a case where sequencer bindings could be resolved using the wrong PIE instance ID.

  • Fixed replicated sequences that begin at a non-zero start time causing a jump on the first frame.

  • Fixed an issue where Motion Trail keyframes would appear at the level origin, instead of hiding.

  • Fixed derived Cine Camera data not updating when modifying properties from Blueprints.

  • Fixed an issue where very small marquee selections would sometimes select all Control Rig Controls.

  • Fixed an issue with Motion Trail ticks not drawing correctly in multi-viewport scenarios.

  • Curve Editor selection no longer changes which Controls are selected in the Viewport.

  • Fixed bound object pointers not being available to child entity instantiators.

  • Fixed an issue that would cause an Actor with a Control Rig to continuously pop back to its default position in Sequencer when moving the Actor.

  • Ensured that the current Level Sequence closes before opening the next one when switching Level Sequences.

  • Fixed an issue that would cause recorded animations from the Take Recorder to be invalid if spaces were in the name.

  • Fixed an issue where if Selected Control Rig Controls was enabled, Curves would not show up in the Curve Editor.

  • Fixed an issue where undoing keyframe changes on multiple Control Rig Control would have to be done by undoing each keyframe operation per Control.

  • Fixed Actor properties controlled by Actor Reference Tracks not being restored correctly if they were null.

  • Fixed an issue where compression would reset to default compression in Sequence Recorder.

  • Fixed an issue where scrubbing in the Viewport by pressing B and dragging would not cause audio to play from Audio Tracks.

  • Fixed an issue where if you called Job->SetConfiguration(Job->GetConfiguration()) it would remove all of the settings from the MRQ job.

  • Fixed an issue where Sequencer Attach tracks would dirty actors in levels.

  • Fixed an issue where recording into Subsequences using the Take Recorder wouldn't save them if Save Recorded Assets was enabled.

  • Fixed looping point indicators not being correctly positioned on Media Track sections that don't start at 0.

  • Fixed an issue where creating Takes would not respect number padding in your Shot name.

Deprecated:

  • Sequence Recorder is now hidden in favor of Take Recorder. If necessary, it can be re-enabled with the SequenceRecorder console command.

  • Deprecated GetSelectedObjects()/SelectObjects in favor of GetSelectedBindings/SelectBindings which operates on FMovieSceneBindingProxy for consistency with all other Blueprint and Python functions.

  • Deprecated SequencerBindingProxy and typedef it to MovieSceneBindingProxy.

  • Removed the Export to Camera Anim... feature as it is unable to perform any actions without the deleted Matinee Asset Factory.

Removed:

  • Completely removed Matinee from the codebase including the data types and runtime evaluation code.

  • The "InterpEdit" editor mode, asset factories, and other editor support for Matinee.

  • CameraAnims and their sequencer tracks.

  • FBX import/export for Matinee assets is removed. Sequencer is now used for all cinematics and camera animation needs.

Synthesis

New:

  • The new experimental Physics Control Component plugin allows you to add simple, intuitive, and powerful physically-based controls to a Blueprint. With these physics controls, you can take advantage of the emergent physical motion of Static and Skeletal Meshes, while retaining artistic and gameplay control.

  • Added a new frame based animation timeline setting for the ML Deformer editor.

  • Use the new command TSoftObjectPtr for training related properties, and only load them when needed.

  • By defining what parts of the character's mesh will be deformed using a Geometry Cache file, you can now use Skeletal Meshes with more meshes than geometry tracks when generating models using the ML Deformer framework. For example, a Skeletal Mesh character could contain teeth, eyes, etc, while the geometry cache file does not contain those meshes.

Improvement:

  • Added function libraries missing for Mac builds and NumPy to PythonFoundationPackages. This fixes training errors in the ML Deformer on Mac.

  • The Machine Learning (ML) Deformer system has been redesigned as a framework that can handle different models using a new unique editor, assets and components. You can explore this new framework by installing the ML Deformer framework plugin.

  • Improved and simplified the model training process for the MLDeformer VertexDeltaModel.

  • Improved the Neural Network model by switching rotations from Quaternions to 2 columns of the 3x3 rotation matrices.

  • You can now store extra per-individual mesh information from FBX scenes when importing FBX files to Unreal Engine.

Bug Fix:

  • Fixed a bug that could occur if a site packages directory on Mac was not named correctly in PythonFoundationPackages.

  • Fixed a crash that could occur due to a ML Deformer Model that failed to locate and identify a GPU device.

  • Fixed a bug that could cause pose generation to fail when using Python code to generate poses for the ML Deformer poses in AutoDesk Maya 2022.

Editor

API Change:

  • The UAssetToolsImpl::ImportAssetTasks function now properly sets the imported Assets in the FAssetImportTask::Result member of the passed ImportTasks parameter.

  • Any code that was checking for EPropertyChangeType::Unspecified for movement of array items in the property details panel should now use EPropertyChangeType::ArrayMove instead.

New:

  • Adding a UI wrapper around the CSV to SVG Tool command line tool.

    • The arguments are stored as a UObject with reflected properties so you can get a "free" UI by using the property window. Also, this lets you use serialized arguments so you can potentially re-use the settings. You can also programmatically generate the arugment list to pass to CSVtoSVG by iterating the relfected properties.

    • Added SCSVtoSVG widget which contains/owns the arugment UObject, a property window to edit it, and a SStatList.

    • When the CSV file property on the arugment changes we infer an output directory and output file name from the input csv file. These can be overriden.

    • The tool also parses the CSV file to find all the available stats in it to populate a SListView.

    • When you click generate to make the SVG graph we automatically open the graph in a web browser.

    • Save the current arugments to config when you close the editor.

  • FEditConditionContext::GetIntegerValue can now fall back on the underlying property if it is an enum. This allows for bitwise comparison in UProperty EditConditions with enums.

  • Added support for multiple Level templates using the same map package.

  • Added a new DDS loader with better support for D3D10-format DDS files.

  • Added support for loading RGBA8-format DDS files.

  • Added a CanEditChange signature that takes a full property chain to the property in question.

  • You can now use multiple console commands in the editor by using FParse::Line to allow commands to be split with newlines or pipe characters ( | ).

  • You can now add a newline in the console command entry box by using Shift + Enter.

  • Many Anim Dynamics Animation node parameters can now be edited with a widget in the viewport.

  • Parameters for physics bodies in a chain can be edited independently.

  • You can no longer copy/paste bone names in the chain bone array.

  • Added per-level coloring option for the fracture editor outliner and stats details.

  • Allowed colliding body settings are now copied and mirrored when physics bodies are mirrored in the Physics Asset Editor. This means that a mirrored body can now collide with the mirror equivalents of its source's allowed colliding bodies.

  • Bone mirroring in the Physics Asset Editor now recognizes bones that have an "l" or "r" pattern anywhere in their names as 'left' or 'right' bones and will mirror them correctly.

  • The Asset summary text displayed in the Physics Asset Editor viewport now includes the number of potential colliding pairs of bodies, the number and type of each primitive shape, and the number of cross constraints in the current Asset.

  • Added additional editor scripting APIs to modify Blueprint variable flags and metadata in BlueprintEditorLibrary.

  • Added an option to disable collisions with the floor when simulating in the Physics Asset Editor. This option is located in the overflow menu of the Simulate toolbar button.

  • Added a new column mode parameter to the Fracture Editor outliner that displays various information per bone depending on the the selected mode.

  • UBlueprintAsyncActionBase - Made WorldContextObject parameter const in RegisterWithGameInstance.

  • UEditorUtilityBlueprintAsyncActionBase - Made WorldContextObject parameter const in overridden RegisterWithGameInstance.

  • Add an option to use the P4Config in the Unreal Editor.

  • Exposed Asset Migration command to scripting.

  • Added a new GetSelectedFolderPaths function to get the currently selected folder(s) path in utility widgets and Python.

  • Added a new GC section to the Details panel UI which displays properties specific to the geometry collection component.

  • Sounds are now loaded and compressed asynchronously in the Unreal Editor whenever possible.

  • Ctrl + Console Key (` by default) now iterates through active Console Command Executors so you can switch between Cmd and Python using the Ctrl + ` shortcut.

  • Added a new Texture property, ForceRecompressDDCUID, that you can use to manually change the DDC key to force a rebuild.

  • Implemented Python Type Hinting when generating the Python stub.

  • Exposed to Python the option to set a minimum width/height dialog when calling the unreal.EditorDialog.show_object_details_view function.

  • DDS texture import now supports most pixel formats, and all variants of 2D, cube, cube array, and volume textures, with mips.

  • Added access to debug color texture encoding for Oodle from the command line.

  • Added log information for enabling and disabling debug color texture encoding for Oodle.

  • Mip maps are now supported on non-power-of-two textures.

  • Added Conv_StringToInt64 to Kismet string library.

  • VT and UDIM can now export to all supported output image formats.

  • UAssets that store their imported image data as JPEG can export those JPEG bits directly to JPEG output format without decompression.

  • More image formats import floating point data as F32 and store losslessly in UAssets. Floating point data is no longer converted to F16 at import time.

  • Added changelists support to PlasticSCM source control plugin (v1.6.2).

  • Added TRACE_CPUPROFILER_EVENT_SCOPE to Perforce integration plugin to be able to capture some performance metrics.

  • Exposed UStaticMesh::GetNumTriangles as a Blueprint function.

  • Exposed UEnum display name to Python through method get_display_name. For example: print(unreal.TextureCompressionSettings.TC_GRAYSCALE.get_display_name()).

  • Unreal Engine now supports reading the enum entry display name set in C++ as well as the one injected from Python with the @uenum annotation.

  • Added Shared Linear Texture Encoding. When enabled (r.SharedLinearTextureEncoding), an encoded texture for a console that would tile a base texture will detect if it can use the same base texture as windows, avoiding re-encoding the base texture. This greatly speeds up multi-platform encoding.

  • Created a new enum entry, EPropertyChangeType::ArrayMove, to signify movement of items within an array by the property Details panel and other callers to UObject::PostEditChangeProperty.

  • Added a new Texture property, Editor Show Final Encode. Use this property to see the Final-mode encoding of the texture (for example, with Oodle RDO) in the current Editor session, rather than the Fast-mode encoding without RDO.

  • Exposed IAssetsTools::DiffAgainstDepot and IAssetTools::DiffAssets functions to Python.

  • Added a warning dialog when performing a blocking operation.

  • Constraint position and orientation in the Physics Asset Tool (PhAT) can now be viewed and edited in the Details panel.

  • Parent and child transform values in the PhAT can now also be displayed relative to the default (snapped) transforms (set when the Physics Asset was created).

  • The position and orientation components of the parent or child transforms can be independently snapped to defaults using right-click menu options or the reset buttons in the Details panel.

  • You can now manipulate only the child frame transform via a viewport widget by holding down Shift + Alt.

  • Fixed the warning and error message boxes using all the spaces of the source control submit confirmation dialog if too many errors or warnings were present.

  • Added a Keep Checked Out button to the source control window.

  • Added an array of delegates called ShouldDisableCPUThrottlingDelegates in UEditorEngine that can be used to disable CPU throttling for the editor when it doesn't have focus.

  • The Pose Watch Manager in the AnimBP editor has been extended to allow control of other areas of debug visualization. Each pose watch now contains one or more elements which represent different aspects of an anim node's debug visualization, including the output pose, physics bodies, etc. where relevant. Those aspects can be hidden or shown individually, even when a node is not selected, by creating a Pose Watch for a node and toggling visibility of the elements in the Pose Watch Manager window. At present, the Rigid Body Animation Node (RBAN) is the only one to take advantage of this new feature.

  • Added new Texture bool bDoScaleMipsForAlphaCoverage to clarify the feature AlphaCoverageThresholds for older textures.

  • Added a new memory.WindowsPlatformMemoryGetStatsLimitTotalVirtualGB cvar that simulates a lower memory system to lower the chances of out of memory crashes during cooking.

  • Exporting a Level to FBX will now use Actor labels instead of Actor names for improved clarity.

  • The Base Shape Material's Base Color was changed from 1 to 0.9. This change affects all base shapes (sphere, box, cylinder, cone, etc.).

  • Added ASSETSEARCH_API to Asset Indexer classes.

  • Changed default arcball behavior to act more like other DCCs.

  • Added a limit cvar to extend the size of the arcball.

  • Added a Disable Preview Menu option.

  • Added FriendlyNames to all ShaderPlatforms in DDSPI.

  • MenuText now comes from FriendlyNames in DDSPI.

  • Added Units and ForceUnits to ObjectMacros.h for discoverability.

Improvement:

  • The Material Editor now only compiles a fixed number of shaders (fewer than 10 per platform) with WorldGridMaterial.

  • Drastically improved editor performance when selecting a very large number of Static Meshes using the marquee selection tool.

  • Improved job scheduling for parallel texture compression.

  • Increased cut-offs for number of pixels per Oodle Texture encode job to reduce number of tiny worker-thread tasks generated.

  • Restoring expanded items in very large Detail panel hierarchies is now faster.

  • Typing a character while an Asset picker menu is open will now focus the search box if it is not already focused.

  • Added support for calculating chain bones immediately without waiting for the Anim Dynamics Animation node to be compiled.

  • Changing bound bone names no longer resets physics body parameters.

  • PaintedVertices are no longer serialized when collecting object references to avoid needless operations when launching PIE.

  • The Check Out Files dialog now displays the type of Actor and no longer displays just "Actor".

  • The Unreal Editor now supports textures up to 32768x32768.

  • Texture UDIM import now allows mismatched formats.

  • Texture UDIM export preserves naming convention and allows choice of export format.

  • Implemented an 'Unsaved' Editor status bar button that displays the number of unsaved Assets (dirty packages) in the project. Click this button to open the Save Content dialog.

  • Unreal Engine now warns about potential source control issues when saving unsaved Assets.

  • Instrumented Python plugin loading time and saved about 500ms to the total module startup time.

  • Source control changelist window now works better with large changelists (One File Per Actor).

  • Changelist window now supports text search, filtering, and 2-column sorting.

  • You can use two new keyboard shortcuts in the changelist window: Enter to submit the currently selected changelist, and Delete to delete it.

  • P4 changelists are now sorted in ascending order.

  • Operations that don't directly affect Assets, such as creating and deleting a changelist, are now asynchronous.

  • When submitting a changelist to source control, you can now edit and save the changelist.

  • If you add a description to the default P4 changelist while files are checked out, the description and all files attached to that changelist are moved to a new changelist.

Crash Fix:

  • Duplicating array entries in the Details panel containing a null UObject* / TObjectPtr will no longer cause a crash.

  • Fixed an editor crash when removing the last texture source in a texture array.

  • Limited sparse data properties to the common base class when multiple objects with potentially unrelated types are selected into the property editor to avoid a potential editor crash.

  • Improved the memory estimate for building textures, making out of memory crashes during cooking less likely.

Bug Fix:

  • Fix property display in the Details panel for Levels with the ReadOnlyKeys metadata.

  • Editor notifications now only start fading out once the editor starts ticking and no longer disappear when loading takes longer than the expiration time given.

  • Improved FInstancedStruct property editing stability.

  • Fixed a bug where PIE didn't respect editor FeatureLevel Settings when having PIE MapOverride set up.

  • Fixed an issue where modules tab wouldn't reliably be available.

  • FDirectoryPath properties now correctly update the Enabled state of the "..." button.

  • Fixed an issue that caused the Blueprint diff tool to potentially call IsChildOf on nullptr for newly added classes.

  • Components panels now show correctly in the Blueprint diff tool for newly added Blueprints.

  • Scene Outliner selection no longer resets when changing the Level.

  • Fixed an issue where, under certain circumstances, multiple child entries representing the same object could be added to a Scene Outliner tree item.

  • Fixed a visual gap in the header of nested categories in the Details panel, notably in a Blueprint's Class Defaults.

  • Fixed an issue where certain old texture versions had the incorrect compression format set in their internal UAsset data structure.

  • Fixed an issue where the editor would sometimes not create or update the thumbnail of an Asset when requested.

  • Fixed rendering issues with geometry collection for Materials using vertex color when the ShowBoneColors option is disabled.

  • Fixed a bug that caused text boxes created by property row generators to fail to accept multi-line input.

  • Editing a vector using the spinboxes in its vector no longer causes stuttering due to Blueprint reinstantiation.

  • Fixed an editor bug where Actors attached to a static mesh socket inside a blueprint actor weren't updating when the mesh was moved.

  • Fixed ActorFactory overriding custom names given with PostSpawnActor.

  • Fixed initial dynamic state not being properly serialized when set via the outliner context menu in the Fracture Editor.

  • Fixed a bug that caused failures for automated processes (cooking) when the connection to the SCM failed even if the actual process did not need the connection.

  • Focus now correctly returns to the Unreal Editor if the Zip Project command is canceled.

  • Texture stats memory is no longer reported after async texture compilation has finished.

  • Fixed a warning regarding usage of banned words.

  • Upgrade ISPC ASTC encoder to fix a bug where solid-color blocks with very low alpha values would sometimes revert to all black.

  • Fixed a missing FActorInstanceHandle::InstanceUID initialization in Actor.

  • Fixed an issue where CreateNewStreamingLevel scripting function would ignore the NewLevelPath argument.

  • WhitelistConfigFile is now enough to allow for staging individual configuration files from Restricted folders, without having to also specify WhitelistDirectories for that folder as well.

  • WhitelistDirectories now works properly for restricted directories in distributed builds.

  • Fixed FSlowTask automatically canceling when dialogs were created with a delay and ShouldCancel was called before the dialog spawned.

  • UAssetToolsImpl::ImportAssetTasks function now properly adds imported Assets to the FAssetImportTask results.

  • Fixed the source control history window not properly displaying multi-line submit descriptions.

  • Fixed a bug that caused some operations made in the Editor to not be reflected in the changelist window.

  • Fixed a bug that caused validation warning and error messages to show a scroll bar for long messages rather than wrap around.

  • Fixed Python calling the wrong delegate if the same delegate name or type was declared in two different UObjects.

  • Duplicating Assets will no longer keep a Perforce relationship to the original file.

  • Fixed JSON warnings with reference container values in the project launcher.

  • Fixed the Delete operation not getting called for source control other than Perforce.

  • Changed the source control changelist widget tab spawner to a nomad spawner to allow restoring the widget dock position on next Editor restart.

  • Fixed a bug that caused content cooking to hang when TextureFormatOodle was disabled for DXT format.

  • Implemented a workaround to declare valid Python methods when the corresponding UFUNCTION has default parameter values declared in the metadata, but also has further parameters that don't have default values, which is illegal in C++ and Python.

  • The Change Source Control Settings dialog accessed from the Unreal Editor top menu bar now behaves consistently when saving the new settings or canceling.

  • Fixed argument parsing for the HighResShot command.

  • Fixed the RemoteSession message handler proxy calling the wrong function.

  • Fixed AlphaCoverageThresholds that were accidentally enabled for all textures with thresholds = {0,0,0,1}.

  • Added https:// conditions to links in the Plugin Browser.

  • Fixed nested submenus closing unexpectedly, when opening one by clicking it (instead of just hovering it) and then navigating in submenus.

  • Redirected Python stdout/stderr to a buffered text wrapper.

  • The PYTHONUNBUFFERED environment variable now correctly prevents stdout/stderr from buffering when set.

  • Fixed deadlock in the splash screen happening when the main thread goes faster than the splash screen and tries to hide the splash before the splash screen thread even created the window.

  • Fixed Python files being filtered out by the Content Browser.

  • Fixed a Python GIL (Global Interpreter Lock) deadlock that could occur while loading an Asset.

  • Fixed variables named X64 to avoid collision with preprocessor definition X64.

  • Fixed FUpdatePendingChangelistsStatus operation that did nothing if a specific set of changelist was requested.

  • Fixed an issue when serializing an incoming concert transaction in FConcertSyncObjectReader where object pointer properties would get set to null incorrectly if Skip Assets was true.

  • Marked the FAssetData::AssetClass, FARFilter::ClassNames and FARFilter::RecursiveClassesExeclusionSet as 'Deprecated Property'.

  • Changed a Python glue generation error into a warning when a make or a break function signature doesn't comply with Python requirements. Downgrading from an error to a warning, with a message saying that the default make/break will be used instead to make/break the Python object, will prevent licensees from hitting a UE_DEBUG_BREAK every time the debugger is attached.

  • Fixed a memory leak when a long source control operation blocks the main thread while the rendering thread renders to animate the source control feedback popup.

  • Exposed TFieldPath<T> as 'FieldPath' to Python.

  • Removed outdated #define SourceCodeNavigation preventing proper source code navigation if the editor was compiled with clang.

  • Fixed Analytics asserting and crashing the editor when the analytics property store files contained empty key names.

  • UActorEditorContextSubsystem is now validated when unbinding in the SActorEditorContext Destructor due to a race condition where the subsystem may not exist by the time the destructor is called.

  • When importing a FBX file through Import Into Level, the Static Meshes will now have DistanceFieldScale set to 1 instead of 0.

  • Several bugs in the HDR image loader have been fixed.

  • The HDR image loader now uses much stricter validation.

  • When importing a glTF file, the tangent space handedness (w component of the glTF tangent vector) will now be taken into account for meshes.

  • Fixed Asset Search indexing for FSoftObjectPtr representing references to non-Assets (that is, AActor instances).

Removed:

  • Access to the built-in editor VR Mode has been removed. Virtual Scouting is the recommended alternative for all users going forward.

  • Removed GetFriendlyShaderPlatformName.

  • Deleted RHIShaderPlatformDefinitions.inl.

Datasmith

New:

  • Enabled Nanite support on Opaque Std Datasmith Materials.

  • 3ds Max Exporter: sorted material slots to make them appear in the same order in Unreal as in the source Multi/Sub-Object material.

  • Removed the "Reuse identical assets" import option from the USD Stage.

  • Added some example Python scripts that describe some of the new features implemented in Unreal Engine 5.1, and how to interact with USD, for example to import or export. We will continue to add new scripts. You can find all available sample scripts in the "Engine/Plugins/Importers/USDImporter/Resources/PythonExamples" directory.

  • The Level Sequence generated by AUsdStageActors now binds not only the components that the Actor generates directly, but also the Actors that own those components.

  • Exposed the USD.GeneratePhysicsAssets console variable, which controls whether to generate physics Meshes for Static and Skeletal Meshes by default.

  • Added options to the File menu for exporting the open USD Stage to a new set of files. This is analogous to a "Save As" command.

  • When the open USD Stage's framesPerSecond attribute is updated, the generated Level Sequence now automatically updates its Display Rate to match.

  • Alias Import: Added the ds.CADTranslator.Alias.LayersAsActors console variable to convert Alias Layers to Actors on import. When you use the console variable, each Layer is added as an Actor, directly under the Datasmith Scene Actor in the hierarchy. Previously the importer only converted group nodes.

  • Hidden layers are no longer included in the import.

  • [SketchUp] Starting from SketchUp 2020.2, exported Static Mesh names are now persistent, meaning they do not change between exports of the same Component.

  • USD: The import options menu that Unreal Engine displays when you import a USD Stage now contains a tree view, which displays the prim hierarchy of the stage to import. Use the tree view to select and import only a selection or subset of the prims in the stage.

  • USD: Added support for the usdMtlx plugin on Windows and Linux The usdMtlx plugin included with USD adds a file format plugin for reading MaterialX documents and translating them into UsdShade shading networks.

  • [glTF] The Vertex data ByteStride attribute is now supported. This fixes issues that occurred when importing glTF files exported from Autodesk 3ds Max 2023.

  • USD: added support for the usdAbc plugin on Windows, Mac, and Linux.

    • The usdAbc plugin that is included with USD adds a file format plugin for reading Alembic files.

  • USD: added basic support for importing Materials with diffuse driven by displayColor.

  • Added the "USD.MaxInstancesPerPointInstancer" console variable to limit the maximum number of instances parsed from each PointInstancer USD prim.

  • The USD Stage editor now emits a warning when muting USD layers with unsaved changes. Unsaved changes are lost when layers are muted.

  • Disabled Skeletal Mesh sections are now ignored when exporting Skeletal Meshes to USD.

  • Added support for collapsing PointInstancer USD prims into Static Meshes when importing or opening a USD Stage.

  • Improved parsing of USD Materials to better extract the intended textures, especially if there is indirection or additional shader connections.

  • Added partial support for handling the "!resetXformStack!" xformOp when it is specified on the transforms of USD prims.

  • Fixed an issue where Materials baking to USD emitted the "ambientOcclusion" Material input instead of the standard "occlusion" input. The Unreal UsdPreviewSurface base Materials are now used when parsing the "occlusion" material input from USD materials, and support Ambient Occlusion.

  • Attributes parsed from USD prims are now be considered animated even if they contain only a single time sample. This means these prims are bound to the generated Level Sequences, instead of being ignored.

  • All Mesh prims exported to USD now specify no that subdivision scheme should be used to parse them. This ensures that DCCs that can subdivide meshes still display normals as they were exported from Unreal.

  • Enlarged the Actor picker menu in the top right of the USD Stage editor window.

  • PhysicsAssets are now generated automatically when parsing Skeletal Meshes from USD. You can disable this behavior with the "USD.GeneratePhysicsAssets" console variable.

  • The USD Stage editor now prompts you to save any modified USD layers to disk when you close a USD Stage with unsaved changes.

  • Improved handling of Skeleton poses parsed from USD. We now use the restTransforms attribute for the reference USkeleton pose, but account for the USD bindTransforms attribute on the USkeletalMesh itself.

  • Added an option for picking which USD Material purpose is used to parse Material bindings. The option is available from Options menu in the USD Stage editor, as a property on the AUsdStageActor, and as USD Stage import option.

  • [SketchUp] Classification Types are now exported to metadata.

  • [SketchUp] Reduced Actor counts in exported scenes.

  • Adjusted the export options used to export Levels and Level Sequence Assets, and reordered them for clarity. They should now have better defaults.

  • [SketchUp] Component geometry is now merged into single Mesh instead of spawning separate Meshes for every disconnected group of faces.

  • [SketchUp] Image Entity is now supported.

  • When an Asset, Level or Level Sequence is exported to USD, new additional metadata identifies the export and source Asset. The exporters check the metadata when re-exporting the same file to prevent re-exporting identical, unchanged assets unnecessarily. New export options for all Asset types allow you to disable this behavior.

  • The USD Stage editor now emits a warning whenever an opinion is authored and it is not the strongest opinion for that property in that stage.

  • You can now specify which USD layer is the current edit target by clicking the checkmark icons in the "Edit" column in the bottom panel of the USD Stage editor.

  • Right-clicking a layer in the bottom panel of the USD Stage editor now allows you to clear, save or export the layer.

  • MaterialX: upgraded MaterialX to version 1.38.5

  • Implemented drag and drop support to allow reordering or reparenting the layers displayed in the bottom panel of the USD Stage editor.

  • Added an option called "RootMotionHandling" for using transform animations on Skeleton and SkelRoot prims as additional skeletal animation root bone motion when opening or importing an USD Stage. The option is available from the Options menu in the USD Stage editor window, as a property on the AUsdStageActor; and as a USD Stage import option.

  • Added support for new file formats to Datasmith import:

    • CATIA version 5: .CATSHAPE

    • CATIA version 4: .exp, .session, . dlv

    • .sab (ACIS)

  • IFC format is now managed by Datasmith CAD import.

    • The ds.IFC.EnableNativeTranslator console variable enables the deprecated native IFC translator.

  • To prevent the import of CAD files with tessellation parameters that can generate huge meshes, we defined the following limits:

    • Chord error: - 0.03

    • Max angle: - 5 degrees

    • We could not limit edge length because 0 equals no Edge length. If the edge length value is not equal to 0, edge length is limited to 0.5, and a warning message is logged.

    • To set smaller values for metric parameters, use the ds.CADTranslator.MeshingParameterFactor console variable.

  • CAD faces are sometimes duplicated. The sew option sews the duplicated faces together. Because their meshes are identical, all triangles are sewn and then disconnected.

    • To prevent that, you can add a process with the option RemoveDuplicatedTriangle.

    • The ds.CADTranslator.RemoveDuplicatedTriangle console variable, which is set to "false" by default, enables the process.

    • Because duplicate CAD faces are rare, removing duplicate triangles is resource intensive, the option is disabled by default. To fix a StaticMesh with duplicated triangles, you can re-import it with this option.

  • Enabled the glTF exporter plugin by default.

  • Added support for CastShadow property in Actor Elements.

  • The Microstation .dgn file format is no longer available for Datasmith import.

  • Alias import with the Stitching option set to Sew allows the merged boundary representation (BRep) to have more than one material assigned (for multi-material surfaces).

    • The ds.CADTranslator.Alias.SewByMatrial console variable allows you to choose to sew BReps by material (only one material per staticMesh) or not (multi-materials on the staticMesh).

  • Added fallback behavior for UGLTFExporter::ExportToGLTF to export current playing UWorld if no specific object is passed.

  • [3ds Max] The Datasmith 3ds Max Exporter plugin keeps the aspect ratio of baked procedural textures.

  • [3ds Max] The Datasmith 3ds Max Exporter plugin version is now displayed in the Datasmith Messages window.

  • [3ds Max] You can now toggle XRef Scenes on and off when you export or Direct-link sync 3ds Max content.

  • With USD, it is now possible to import basis curves or referenced Alembic grooms as groom Assets or caches by applying the GroomAPI schema. Furthermore, the GroomBindingAPI schema can be applied to a mesh prim to bind a groom prim to it in Unreal.

  • [SketchUp] Parent non-uniform scaling of a rotated sub-component is now enabled in some cases.

  • [3ds Max] There is now a Limit Texture Resolution option for export of baked procedural texmaps.

  • [MDL Importer] Updated the MDL SDK.

  • [3ds Max] Max UV channel ids are now remapped to Unreal UV indexes.

  • [3ds Max] Corona Light Material is now exported as UEPbr Material.

  • [3ds Max] Approximated export for ForestColor texmap.

  • [3ds Max] More stable Static Mesh ID by using the smallest handle value among instance nodes. Reduces needless reimports of Static Meshes.

  • [3ds Max] MentalRay Arch & Design and VRay Light Materials are now exported as UEPbr Materials.

  • [3ds Max] Datasmith 3ds Max exporter plugin provides export diagnostic information. For example, statistics about exported/synced scenes, nodes, Materials, and textures.

  • [3ds Max] Support for CoronaPhysicalMtl with ClearCoat.

  • [3ds Max] XRefMat and VRayBlendMtl are now exported as UEPbr Materials.

  • [3ds Max] Max's Physical Material is now converted to a UEPbr Material.

  • Added a post process to the CAD import process to sew cracks in the mesh.

    • This process can be disabled with the ds.CADTranslator.SewMeshIfNeeded console variable.

    • The sew tolerance is the same as the one use in the stitching step of the CAD import (the StitchingTechnique is Heal /Sew). It can be set with the ds.CADTranslator.StitchingTolerance console variable.

  • [Solidworks] Improved Parts configurations export.

Bug Fix:

  • Fixed a crash that occurred when trying to parse some types of USD scenes with nested SkelRoot prims.

  • The USDImporter plugin now displays a warning and cleans invalid normals found when parsing Mesh prims. Previously, it would silently discard all normals and recompute them. The console variable "USD.MeshNormalRepairThreshold" has been introduced to configure this behavior.

  • Fixed an issue where Level Sequence exports to USD were missing animation tracks when Actors and root Components were bound separately.

  • [SketchUp] The Datasmith Messages window is now localized.

  • [SketchUp] Direct Link: Added layer folder (group) visibility synchronization of individual faces.

  • Fixed an issue where the "Selection Only" Level export option had no effect when exporting Level Sequences to USD. Also added an option to the Level Sequence export options that allows exporting animations of only the selected Actors and Components.

  • Datasmith: Initialized custom node values in the MFAttr_FrostedGlass in the M_StdTranslucentFrostedGlass.

  • [SketchUp] Camera changes are now updated via Direct Link.

  • Fixed an issue where the right panel of the USD Stage editor window wouldn't refresh on some operations, such as clearing the prim selection on the left panel, or switching to another Unreal level.

  • Fixed a color styling issue on the lower pane of the USD Stage editor window that made it difficult to see whether the currently selected Layer was the edit target or not.

  • Fixed missing or incorrect Material assignments when exporting some types of Skeletal Meshes to USD.

  • Fixed an issue where it was not possible to duplicate an AUsdStageActor with a loaded stage.

  • [SketchUp] Transparent Materials that use textures with no alpha are no longer translated as opaque.

  • [SketchUp] Opacity scalar and texture alpha are now properly combined to calculate Material opacity.

  • [SketchUp] The proper texture channel is now used as opacity source.

  • Added support for PointInstancer USD prims that have other PointInstancer prims within their prototypes. We now collapse the prototypes into Static Meshes.

  • Fixed an issue where it was not possible to animate the Preview Actor on the Blueprint editor for a Blueprint class that derives the AUsdStageActor, after an instance of said Blueprint was placed in the Level.

  • Fixed an issue where skeletal animations baked into a Control Rig were not exported when you exported their Level Sequences to USD.

  • Fixed a crash that occurred when opening the Level Sequence generated by a Blueprint that derives the AUsdStageActor class, while the Blueprint editor for that class is open in the editor.

  • Fix build errors that occurred when building monolithic editor targets with the USDImporter plugin enabled, but no global ANSI allocator specified.

  • [SketchUp] Fixed normals when baking transforms into a mesh.

  • [SketchUp] The Datasmith Export Plugin for Sketchup now displays a warning message when the version of SketchUp 2020 is unsupported. The plugin for SketchUp 2020 requires at least version 2020.2.

  • [SketchUp] Fixed Component/instance name change synchronization.

  • [MDLImporter] Fixed crash with baked textures.

  • [SketchUp] Modified the title, tooltip, and status text for toolbar commands to conform to SketchUp guidelines.

  • Fixed an issue where foliage instances marked as "invalid" in Unreal were not exported to USD when the Level was exported.

  • Fixed a crash that could potentially occur when importing using the Actions > Import command in the USD Stage editor windowmenu, and having the corresponding AUsdStageActor's Level Sequence open in the Sequencer.

  • Fixed an issue where toggling visibility on the USD Stage editor for prims with animated visibility opinions did not show/hide child prims.

  • Fix an issue where the AUsdStageActor overwrote its Time with its stage's StartTimeCode whenever its Level was loaded.

  • Fixed an issue where skeletal mesh components generated when you open a USD Stage via an AUsdStageActor didn't animate when going into Play In Editor mode.

  • Fixed an issue where skeletal animations failed to import from USD when the skel:animationSource relationship was specified inside of the Skeleton prim itself.

  • [SketchUp] Removed global variables, and fixed use of chdir.

  • Fixed an issue where glTF variants were not loaded in some scenarios due to name collisions.

  • [3ds Max] Fixed a crash that occurred when exporting RailClone while using a renderer other than the default 3ds Max renderer, for example, Corona.

  • Fixed a crash that occurred when importing a USD Stage with SkelRoot prims, and using the ExistingActorPolicy and ExistingAssetPolicy import options to append Actors but replace Assets.

  • Fixed support for UTF-8 character encoding in the glTF exporter.

  • Fix an issue where right-clicking and deleting a prim with a reference in the left pane of the USD Stage editor could cause the referenced prim to be deleted with it.

  • Fixed an issue with the glTF exporter determining texture coordinates for certain combined material properties (Metallic/Roughness and Clear Coat Intensity/Roughness).

  • Fixed a crash that occurred in some scenarios when exporting skeletal meshes to USD.

  • Fixed a crash that could occur when logging multiple import errors or warnings during a multi-threaded step.

  • Fix an issue where values for Light elements were skipped when they were very high or very low.

  • DatasmithContent: Updated triplanar mapping, normal fixup, and parallax occlusion mapping.

  • DatasmithContent - Changed the default Opacity Mask Clip Value from 0.333 to 0.5 to support path tracing.

  • Fix an issue that occurred when importing or opening a USD stage, where no animation tracks would be generated for animated cameras if the Camera prim had both animated transforms as well as animated camera attributes.

  • Fixed issue that prevented cameras with infinite projection from exporting correctly in glTF exporter.

  • Fix an issue where materials generated when importing or opening USD Stages used non-virtual texture samplers, even when the textures used were imported as virtual because they had high resolutions.

    • [Solidworks] Assembly configuration export fixes.

    • [Solidworks] Lights export fixes for light names and spotlight direction.

  • [3ds Max] Various fixes for CoronaLight Cylinder orientation, Photometric light attenuation, Arnold light intensity, CoronaSun color/temperature, and VRaySun color/temperature.

  • [3ds Max] Updated the Forest Pack API to the latest version, and fixed some stability issues.

  • Groom and groom cache import settings specified in Python scripts are now applied properly. If you want to import a groom Asset and groom cache from the same file, and you need to specify their respective import settings, you must import them in separate import tasks..

  • [Solidworks] Display state change now correctly updates Materials via Direct Link.

  • [3ds Max] RailClone object transform math fix.

  • [3ds Max] Fixed export of animated transforms when the parent of an animated node is hidden.

  • Fixed a loading issue with groom caches that were imported in UE4.

  • Fixed a quantization issue on groom with guides groom cache with large displacement.

    • [3ds Max] The Datasmith 3ds Max Exporter plugin no longer changes the names of Max Materials.

    • [3ds Max] Fixed crash for Blend Material with null input Material.

  • Fixed an issue where the import options window was missing when re-importing an Asset from Alembic.

  • Fixed a playback syncing issue between groom cache and geometry cache when rendering in Movie Render Queue.

  • [3ds Max] Only textures referenced in exported Materials are exported.

  • [Solidworks] Default directional lights are excluded from export.

  • [3ds Max] Fixed export of camera parameters for standard cameras.

  • Alembic files imported as Skeletal Meshes are no longer imported if the Meshes are too big or the animations are too long. Both issues caused crashes during import.

  • Fixed an issue where groom caches were not being updated when rendering through remote MRQ.

  • Fixed an issue where Alembic geometry caches imported without "Flatten Tracks" had broken Meshes because the time offset computation was wrong.

  • [3ds Max]: Fixed reimport of RailClone objects.

Deprecated:

  • Removed support for custom extensions EPIC_animation_hotspots and EPIC_camera_controls from glTF exporter.

  • Removed support for creating proxy materials from runtime in glTF Exporter.

Framework

New:

  • Added support for redirecting DataTable row structs in the DataRegistry.

  • Actors can now change which Asset they browse to.

  • Actors can now only browse to Assets who only have an alias exposed.

  • Added a config option to disable the enable / disable checkbox for plugins in the plugin browser.

  • Updated plugin templates to be driven from data.

  • UEditorLevelLibrary::GetGameWorld now returns the editor world instead of the game world.

  • Added delegates in EdModeInteractiveToolsContext that allow UEdModes to receive Render and DrawHUD calls.

  • Added a new UInteractiveToolManager::PostActiveToolShutdownRequest function that allows a Tool to request that it be shut down (for example, a Tool that wants to apply an action and exit on-click).

  • Added a new UInteractiveToolManager::OnToolShutdownRequest delegate. If bound, PostActiveToolShutdownRequest will call this delegate first to allow higher-level code to handle the shutdown request (for example, by forwarding to EdModeInteractiveToolsContext::EndTool).

  • Added Toolstack support to tool menus.

  • Added PIE callbacks to the editor utility subsystem.

Crash Fix:

  • Fixed a crash if no group Actor is selected when attempting to add Actors to a selected group.

Bug Fix:

  • Fixed a bug that caused UEditorLevelLibrary::GetGameWorld to return the editor world instead of the game world.

  • Fixed bug with conflicting GameInstanceIDs used by NetTrace when running multiple sessions in PIE.

  • Fixed a problem when using iris replication where a NetConnection's ViewTarget was not properly updated.

  • Actors and components that aren't in the current editing context can no longer be selected.

  • Actors are no longer considered initialized when running deferred construction scripts due to pending Asset compilation.

  • The editor now forces outstanding Static Mesh compilation when saving a world to prevent construction scripts to be deferred.

  • The editor now tests if the world is valid before running deferred Actor construction scripts.

  • When considering compilation for games specifically, the editor now force compiles Static Meshes of unregistered components. This also prevents unnecessary deferring of construction scripts.

  • Fixed an issue where child Actor components were unable to be selected in the viewport when a user is selecting components inside an Actor.

Deprecated:

  • Deprecated the typed element selection set on the tool builder state. This can be replaced with the context object that exposes the typed element set within an asset editor. This fixes CIS errors and sets us up to remove this next release.

UI

API Change:

  • The FGenericAccessibleMessageHandler::RaiseEvent() function no longer takes a list of parameters and instead need to take a FAccessibleEventArgs struct. Users that use this API must upgrade the parameters to the new struct params.

New:

  • UStructs can now provide a CanEditChange override by setting the TStructOpsTypeTraitsBase2::WithCanEditChange trait.

  • The Reset to Default button is no longer hidden when a details row is disabled. Instead, it is grayed out.

  • Exposed SBorder's protected methods GetBorderImage() and GetBorderBackgroundColor().

  • KiB/MiB/GiB/TiB are now accepted spellings for the Units/ForceUnits metadata.

  • Added TAttribute::CreateStatic() to disambiguate in cases where Create() does not correctly detect that additional arguments are meant to be forwarded to the function.

  • You can now drag EQS queries from the content browser and drop them into the editor world. Additionally, the EQSTestingPawn will be auto-created and set up with the selected EQS query.

  • Added Widget List to Widget Reflector, which lists all currently active widgets, grouped by the location where they were created. This can be useful for pinpointing SWidget leaks. This requires UE_WITH_SLATE_DEBUG_WIDGETLIST to be defined, since it makes use of the functionality in FWidgetList.

  • Created a global name filter for asset paths that external code can assign.

  • SBorder now can be constructed with the .Padding(1,2,3,4) declarative style, just like SBox and widget slots.

  • Added SBox overrides for setting Padding() without constructing an FMargin, as is the case with slots.

  • Details view's IsPropertyReadOnly delegate is now evaluated every frame instead of only when refreshing the tree, similar to how IsPropertyVisible now works.

  • Added support for changing value of a SSpinBox using the mouse wheel. This can be enabled using the EnableWheel argument.

    • Added a new metadata property called WheelStep to specify the step value. The default step is either 1.0, or 0.1 if clamp range is less than or equal to 10.0.

    • Step can be modified by holding Control (1/10) or Shift (10x).

    • Both the internal SSpinBox of SNumericEntryBox and SPropertyEditorNumeric now use this new feature.

  • Added the owning struct name to EditCondition error messages to make it easier to find which property is breaking.

  • Changed UWidget::GetRenderTransform() to return a const reference instead of a copy.

  • Added a filtering mechanism to MainFrame's MRUFavoritesList and LevelEditorMenu's 'Open Recent Level' through an optional DoesMRUFavoritesItemPassFilterDelegate.

  • Timecode properties in details panels now support partial entry.

  • Fixed the SetRowFill RowIndex parameter name.

  • Editor Utility Widgets now use theirDisplay Name in the menu.

  • Section buttons have been changed from a segmented control to a wrap box of buttons instead.

  • Sections can now be multi-selected by holding down the Ctrl key.

  • Section selector visibility can now be toggled from the options dropdown.

  • Exposed SVirtualJoystick::FControlInfo to Slate API.

  • UWidget::IsVisible now checks for render opacity to determine widget visibility.

  • WidgetNavigation Resolve and TryRename now allow for customization of navigation behavior in a plugin for UMG.

  • Added a GetTextLineCount to SMultiLineEditableText and SlateEditableTextLayout to be able to get text line count.

  • Added AddVerifiedEditableText to FMultiBoxBuilder to expose SEditableTextBlock::OnVerifyTextChanged.

  • For list views, created a new delegate called OnFinishedScrolling that fires when an animated scroll finishes.

  • Added new blueprint nodes to set font materials for all types of text, the default style for rich text, and editable text blocks.

  • Added new options for Common Text Blocks to start and stop scrolling text through blueprint such as when a widget becomes hovered and unhovered. This also works with the overflow policy of ellipsis to turn on and off ellipsis when scrolling is active or not.

  • Added new blueprint node to create a dynamic material from a rich text block's default text style.

  • Refactored FGenericAccessibleMessageHandler to raise accessible events that include user Id and additional arguments. This allows more information to be passed around for modules that require more accessibility information, such as User or Controller Id. This creates the basis for multiple users to use the screen reader at the same time.

  • Added SlateScripting plugin, SlateScriptingCommands module and UICommandsScriptingSubsystem.

    • Enables registering commands dynamically within existing UI Command Lists through scripting.

    • Sequencer, Curve Editor, Content Browser, Main Frame, Level Editor and Level Viewports are currently the only systems exposing the command lists.

  • New methods have been added to SOutputLog.h and SOutputLog.cpp to create a new timestamp menu item and submenu in the output log settings menu.

  • The screen reader plugin can now support multiple users at the same time. Developers can provide key bindings to allow players to opt into the screen reader framework for accessibility functionality.

  • Introduced screen reader navigation policies. This allows the screen reader to navigate around UI elements on the screen separate from regular Slate navigation similar to how commercial screen readers behave.

  • Screen reader plugins refactor to use the new accessible focus API to support multiple simultaneous users.

Improvement:

  • Menu searching now works for Material attribute properties.

Crash Fix:

  • Fixed a case in the DrawLine Blueprint API where a crash would occur when points overlapped.

  • Prevented a crash when opening the Static Mesh Editor when using nullrhi.

  • Fixed a crash that occurs when using "Replace With" in the Hierarchy panel. This occurred when selecting a Blueprint that extends a Widget class in the Library.

  • Division by zero in SScaleBox::OnArrangeChildren is now prevented.

  • Fixed nullptr dereference when the level editor module is being unloaded since the tab's parent is already de-allocated if the engine is exiting. This bug is also prevented in Slate altogether.

  • Fixed a crash that would occur when auditing static meshes with no static lighting enabled.

Bug Fix:

  • Increased Content Browser item description width to 700 in tooltips.

  • Property matrix now correctly displays EditCondition checkboxes only when applicable to the row. Property matrix rows also hide if the EditConditionHides metadata is set.

  • SEnumCombo now only dismisses its own menu when an option is selected.

  • Expanding the Advanced subcategory no longer causes previously collapsed nodes to re-expand.

  • When multiple components of an actor are multi-selected and edited at the same time, all of them will now receive a PostEditChangeProperty() call.

  • Details row TitleProperty values are now retrieved recursively. This was a regression from UE4 that caused issues in cases that should have worked, such as with an array of instanced objects, because the category node would cause the search to end.

  • Viewport overlay widgets are now visible even when rendering a full-screen UMG widget.

  • Color picker for color properties on externally added FStructOnScope properties now resets and cancels correctly.

  • Show Only Modified now accounts for the visibility of a custom reset to default handler provided to FDetailWidgetRow::OverrideResetToDefault().

  • Scrolling a row out of the visible region of the Details view now commits any changes that were being made to that row.

  • Numeric properties can have ForceUnits metadata specified for them even inside containers.

  • The FPrimaryAssetId selector now respects DisplayThumbnail metadata.

  • Removed the Create menu's "Blendables" category.

  • The UObject::IsSelected on UVisual is now hidden to avoid confusion with UI selection state.

  • It is no longer possible to dock tabs into docking areas that are contained inside the tab.

  • Added Bengali, Gujarati, Odia, Kannada, Malayalam and Tamil to the list of character ranges that require complex text shaping.

  • You can now search for basic shapes in the Add Component list.

  • EditDefaultsOnly properties on UUserWidgets now appear in the UMG Designer details panel.

  • Fixed an issue preventing edits to Timecode properties in the Details panel from being correctly recognized in the undo system.

  • DefaultGameMoviePlayer now makes sure that a loading screen shows the User Widget until the end of the loading screen.

  • Fixed a case where ContentBrowserDrawer is not marked as the primary content browser when selected in ChooseNewPrimaryBrowser.

  • Correction to SceneViewport to use the cached display metrics instead of the Initial ones which could cause issues when monitor settings or resolution changes when the engine is running.

  • Correction to BP node Play Animation with Finished Event to correctly trigger the finish event on the next frame even if the game is paused and prevent from triggering it if the widget no longer exist.

  • Fixed issues when multiple Widget Interaction Components focus on the same widget.

  • When replacing a binding with new widgets, UMG will move the content of the old binding to the new one rather than reuse the existing binding. This fixes issues where UMG would incorrectly keep old possessable bindings.

  • Curve Editor Stacked View now properly renders labels.

  • Re-enabled color override for the Editor window title bar.

  • The Rendering > Advanced > TextureStreaming/LOD/etc. categories now use the correct display name.

  • NameContent in Details panel rows now correctly respects user-defined HAlign, allowing for labels to contain a HorizontalBox with both left and right aligned slots.

  • Details value widgets are no longer stretched due to property rows having a minimum height.

  • Advanced dropdowns in the Details panel no longer randomly disappear when scrolling.

  • Fixed a bug that caused some calculations with shadow offset not to consider font scale.

  • Fixed an issue where nested utility widgets could cause the open Level to be dirtied since they wouldn't properly be marked transient like the outermost utility widget.

  • Fixed issue where string table selection combobox wouldn't show the filter text box anymore if there were no results, making it impossible to clear.

  • Fixed a bug that would occur in List Views when changing the Consume Mouse Wheel setting to "When Scrolling Possible". This bug caused mouse wheel input to fail being consumed when scrolling up.

  • Fixed an issue where timestamps in asset auditor would use month instead of minute.

  • Fixed an issue where timestamps in the asset auditor would incorrectly clear when a custom audit is cancelled.

  • Fixed typos in "toggle screen messages" outputs.

UX

New:

  • Projects and plugins can now provide enhanced tooltip content for the editor, and they can override the default tooltip content.

    • If you use the SDocumentationTooltip widget, or standard UI items such as menus that create SDocumentationTooltip widgets, you can provide content for enhanced tooltips in the Documentation/Source folder of your plugin or project.

    • You can override default enhanced tooltip content by providing files with the same path and excerpt names as the default ones in Engine/Documentation/Source.

    • If an enhanced tooltip excerpt contains a variable named [VAR:ToolTipOverride], the content of that variable overrides the default content for the initial simple tooltip.

    • If you have documentation that you want to link to from editor widgets or enhanced tooltip content, you can now provide your own custom base URLs. You can define these programmatically by calling IDocumentation::RegisterBaseUrl(), or in the *Editor.ini file as follows: [/Script/Documentation.DocumentationSettings] +DocumentationBaseUrls=(Id="ID",Url="http://myBaseUrl/{PAGEID}").

    • You can specify the base URL ID any time you provide a page ID for a documentation link. For links in code, the methods in IDocumentation now accept an optional parameter. For links in enhanced tooltip files, specify the ID in the tooltip file in either the BaseUrl metadata at the top of the file, or in the [VAR:BaseUrl] variable within the excerpt.

  • VR Editor: Added a dropdown menu to the VR Mode toolbar button which you can use to quickly change between the standard VR Editor Mode and specialized modes such as Virtual Scouting.

  • Rather than specifying VR interactor or teleporter class overrides directly in editor preferences, these are now determined by selecting a blueprintable subclass of VREditorMode.

  • The "experimental" warning popup no longer displays if the Virtual Scouting class is active.

  • You can now use Shift+ left-click to duplicate-drag a pin connection.

  • Scene Capture render targets now start with the alpha channel disabled.

  • Created the experimental Landscape Texture Patch Component to apply repositionable, texture-based landscape height and weight map edits (editor-only).

  • Added proper support for property change type in the spline component visualizer (interactive changes when manipulating spline points, non-interactive change at the end of the drag operation).

  • Added Project Settings to deactivate landscape or water mesh updates during interactive changes of water body or island splines.

  • Reorganised Water Editor Project Settings.

  • Unified landscape brush command shortcuts with other modeling tools

  • Added a command to change both the brush size (left-right mouse move) and falloff (up-down mouse move). The default keyboard shortcut is Ctrl + Alt + right-click drag.

  • Added a DoesCommandSupportInput function to the editor viewport client in order to centralize copy/paste logic.

  • Improved formatting of landscape notifications.

  • Added BP setters for ForcedLOD and LODBias on landscape components.

  • SetLOD can now be called both at runtime and in-editor.

  • Added buttons to select all landscape spline segments or control points.

  • UWaterMeshComponent::ShouldRenderSelected is now editor-only.

  • Added visual logs for when the cache data is accessed and when the cache is expanded.

  • Cache area is now aligned on the whole landscape to avoid expanding the cache when expanding the cached area within the limits of an already sampled landscape component.

  • Decoupled the rendering of the water information texture (flow, depth, and shape data) from the landscape.

  • Implemented separate render passes leveraging the SceneRenderer interface to draw the water data at runtime.

  • Added a new optional Water LOD system which replaces water mesh tiles at a distance with simplified, non-dynamically tessellated meshes. This allows the water rendering system to scale for large worlds without needing to increase the resolution of the Water Info texture.

  • Added functionality to open other Content Browser instances by right-clicking on the tab of a Content Browser.

  • Changed the Close Tab keyboard shortcut from Ctrl + F4 to Ctrl + W.

  • Checkboxes in filter menus now show an indeterminate state when items in the sub-menu are a mix of enabled and disabled.

  • The Details Panel now shows a modified badge when any view option that filters down the results is active.

  • Renamed Select Mode in the Level Editor toolbar to Selection Mode.

  • Add functionality to the Outliner to see the current hierarchy of items stacked at the top. This can be enabled by enabling the Stack Hierarchy Headers option in the Outliner.

  • Exposed a function to sync to the current folder in the Content Browser to scripts.

  • Added a notification for when all Content Browsers are locked and the user tries to open one.

  • Redesigned the Physics Asset Profiles panel to be aligned with the UE5 style.

  • Added functionality to scroll to the current selection on pressing the F key in the Outliner.

  • Updated the column view in the Content Browser to use similar workflows as other column views in the editor (like the Outliner).

  • Water bodies with null materials can now cut holes in the water mesh quad tree.

  • When an item in the Outliner is selected and collapsed, the parent items are now highlighted.

  • Updated async notifications to be consistent with the UE5 style for all notifications

  • Added support for collision view mode for landscape heightfield collision components. The collision data is displayed when the CVar ShowFlags.Collision is set to 1. The CVar "landscape.ShowCollisionMesh" is used to determine which heightfield is displayed: 1 corresponds to the complex heightfield, 2 to the simple heightfield, and 3 to the editor-only heightfield.

  • Added a one-time popup for a user's industry for analytics. This popup can be suppressed either by turning off all analytics or specifically with bSuppressIndustryPopup on UAnalyticsPrivacySettings.

  • The Level Editor now supports up to 4 Outliners that can be enabled from the main menu (Window > Outliner).

  • Added a dedicated set of icons for Plastic SCM.

  • Added an edit layer insertion dialog prompting the user to choose where a new edit layer should be inserted in the current edit layer stack.

  • Added options to expand or collapse all items to the Outliner Settings menu.

  • Changed the Save and Browse buttons on Asset editor toolbars to icon-only.

  • Added filters for Material Layer Instances and Material Layer Blend Instances to the Content Browser and Reference Viewer

  • Disabled the Pinned Column and Context Menu options in the Outliner on maps with World Partition disabled.

  • Renamed the Level Column to Package Short Name in the Outliner on World Partition-enabled maps.

  • Adding BoldItalic and Italic font style to FStyleFonts. These are used in the AnimCurve viewer and Class Viewer respectively.

  • You can now use the Shift + Click shortcut to copy / paste in the Details panel.

  • Added support to copy / paste between different color types.

  • Added AllowCreate to SObjectPropertyEntryBox / SPropertyEditorAsset to prevent creating new Assets from the asset picker. This behaves similarly to NoCreate metadata on UPROPERTY, but allows on a non-property based customization.

  • The editor now allows painting on the edges of landscape components.

  • Added option to export a single file for grid-based worlds.

Improvement:

  • Landscape scene proxies are now only refreshed if CVarLandscapeShowCollisionMesh has changed from the previous value. This prevents hitches when unrelated CVars are modified.

  • The details section API has been rewritten so that categories can now be part of multiple sections simultaneously.

  • Sections are now sorted alphabetically. General and All are special-cased to be the first and last categories respectively.

  • Reference Viewer now indicates when the breadth limit has been reached.

  • Reference Viewer Overflow nodes can now be expanded by double- clicking.

  • Reference Viewer UI is more responsive when changing the search depth on large scenes.

  • Edit layer heightmaps and weightmaps are now properly deleted when deleting landscape components.

  • Landscape notifications have been reworked for better readability and to improve notification clutter issues.

Crash Fix:

  • Fixed a crash that happened when trying to access the visibility landscape mask on mobile: when the mobile mesh path is enabled, there's no such texture. This means that GlobalDistanceField will not support landscape visibility.

  • Fixed a crash that occurred when deleting components because the deleted components were still referenced in the shared weightmap texture usages.

  • Fixed a crash that occurred when using an invalid scale factor on the landscape copy/paste gizmo.

  • Fixed a crash that occurred when invalidating the lighting cache on landscape components.

  • Fixed a crash that occurred when adding spline points to oceans with non-zero shape dilation.

  • Fixed a crash when saving an existing, already-saved map containing a dirty landscape using Save As to rename it.

  • Fixed a crash when loading some Landscapes with ES3.1 preview render mode enabled.

  • Fixed a crash that occurred when copy/pasting landscape and water bodies across levels.

Bug Fix:

  • Fixed multiple issues with highlighting and deleting links using Alt + left-click when both ends had multiple links.

  • Ctrl + mouse wheel in Foliage editing mode now correctly adjusts size in 5% increments per mouse wheel click.

  • Fixed GetCompleteBounds calculation in World Partition worlds when the Landscape is composed of only a single streaming proxy.

  • Fixed a bug that caused Scene Capture render targets to display as a checkerboard in Texture Editor.

  • Fixed the "change landscape brush size / falloff / strength" commands that couldn't work with default chord values nor secondary key bindings.

  • Fixed "cmd" modifier not being taken into account all the time in copy/paste logic.

  • Fix an empty notification being shown when all remaining undo / redo transactions expired.

  • Fixed missing render dependency in Landmass (noise texture), which could lead to blockiness when the brush was running without the texture being fully loaded.

  • Fixed viewport not updating when switching landscape visualization modes.

  • Fixed Painting Restriction not appearing when there's no active paint layer.

  • Fixed "Use target value" in the landscape UX being displayed for sculpt tools while it's only valid in paint mode.

  • Sanitized suggested landscape layer info package name when creating a landscape layer info file associated with a layer name (which doesn't have the same restrictions that package names have)

  • Added support for non-square heightmaps in landscape edit layers local merge

  • Landscape edit layers local merge fixes.

  • Fixed assert when updating heightmaps of different sizes

  • Protected double-click behavior in the Outliner against deleted actors.

  • Fixed incorrect removal of IsGameWorld check in world partitioned-worlds.

  • Fixed a bug where ActorDescReferences was incorrectly used for PIE worlds.

  • Fixed various places where components within the LandscapeComponents member of ALandscapeProxy could potentially be null (they are null in the dedicated server).

  • Unified text formatting of double properties on set.

  • Fixed a delay of many frames while the landscape BP brushes were asynchronously waiting for the required materials to be compiled.

  • Added support for subsections in landscape edit layers local merge.

  • Fixed bHasLayersContent not being set properly for the main ALandscape actor in distributed landscape setups (One ALandscape, multiple ALandscapeStreamingProxy actors), which incorrectly dirtied the Level.

  • Fixed water brush letting the user change the list of affected weightmap layers while it's actually automatically populated by the list of layer names specified in the water bodies.

  • Fixed weightmap changes on water bodies not triggering the appropriate water brush updates.

  • Fixed landscape tools using ShowForMode not displaying properties when in weightmap mode with no active paint layer (Use Target Value and Painting Restriction).

  • Made landscape edit layers read-only, removed related context menu and prevent layer reordering in non edit layers-related landscape tools (Component Add/Delete/Move/Select,Mask,New/Resize Landscape).

    • Don't use a modal error message box when the currently selected edit layer is locked in those tools (since they're not edit layers-related)

  • Fixed transaction localization for landscape resolution change * Fixed New Landscape - Fill World not being transacted

  • Fixed assert when iterating over components from a parallel (game) thread.

  • Delayed the call of CustomBrush_Landmass's GetBlueprintRenderDependencies so that it doesn't start updating it until the brush is ready.

  • Memory reports now properly account for landscape collision.

  • The editor now logs an error when reading inavlid texture data on the CPU with SplineFalloffModulationTexture for Layer Info Object and doesn't apply modulation.

  • The editor now logs an error and reverts to the default texture when reading invalid texture data on the CPU for the alpha brush's AlphaTexture.

  • Fixed undo/redo for Layer Info Object not triggering an update of the landscape splines.

  • Landscapes no longer incorrectly start updating before their textures and materials are streamed in and compiled.

  • Landscapes with Landmass no longer flatten the first time they update when On Demand Shader Compilation is enabled.

  • Fixed data caching function used in the Smooth and Flatten tools when using combined layers.

  • Fixed ASan issue with dirty data (weightmap/heightmap texture resolving debugging code) by removing usage of lambda in favor of direct call to the dirty function.

  • Fixed redundant ifdefs and invalid comments.

  • Removed overallocation of material instances array (was previously done to account for hardware tessellation which doesn't exist anymore).

  • Renamed FLandscapeEditLayerReadbackResult to FLandscapeEditLayerComponentReadbackResult to better match what it actually is and changed the output type of readback results from ResolveLayersTexture from a map to an array.

  • Water Body components now have custom scene proxies which contain the geometry describing that water body as well as a small dilation region to solve undersampling issues with the water info texture.

  • Fixed an issue with resizing of new or imported landscapes by dragging the boundaries not working.

  • Fixed a bug causing no visual indicator highlighting the current selection when using arrow keys to navigate dropdown menus.

  • Fixed default water brush and water zone spawn behavior to more intelligently choose the correct landscape, support multiple landscapes, and set the zone bounds to properly match the landscape.

  • Fixed a bug where top-level menus would draw over tabs in certain situations.

  • Fixed curl noise being applied in both jump flood and cache distance field materials for water bodies, causing deep pockets near the shorelines.

  • Z scaling and non-Z rotation is now allowed for water bodies not rendered by the water mesh.

  • Fixed issue with lingering river mesh components after performing an undo operation.

  • Fixed missing Water in Water Waves Asset Editor.

  • Added a minimum size to the Sources Panel headers in the Content Browser to prevent overlap.

  • Fixed an issue causing drag on the splitters to fail in certain situations

  • Fixed Landscape.DumpLODs console command not producing output.

  • The editor now correctly sets the ParentTab for StaticMeshEditorViewport on spawning that tab, and also checks SEditorViewport::IsVisible for StaticMeshEditorViewport visibility, as it takes into consideration last time on screen.

  • Fixed a bug causing search text in the Content Browser context menu to disappear sometimes.

  • Fixed a bug in the Outliner causing an item to get deselected if it was collapsed.

  • Fixed an issue where frame notifications couldn't be dismissed if they would also time out because the pointer would reset.

  • If dismissing a toast created by the message log, the toast's expire duration is now correctly set to 0.

  • Fixed a bug that affected single-file export for heightmaps/weightmaps.

  • Fixed a problem where users couldn't import a single heightmap/weightmap file if it was named with the same prefix as the grid-based ones located in the same folder (for example, Heightmap.png with Heightmap_x0_y0.png, etc. being present in the same folder).

  • Fixed an assert when generating grass while there's actually no grass data.

  • Altered the ContentPadding of the WrapButton ComboButton so that the button appears as a circle, instead of the football shape that appeared previously.

  • Added the access specifier to Variables under the My Blueprint view.

  • Landscape preview settings no longer affect actual Landscape rendering.

  • The editor now checks that LastOuter is valid before dereferencing.

  • Fixed a bug where a map load triggered navmesh rebuild.

  • Fix an Asset importing error after deleting MobileStarterContent.upack.

  • Fixed an issue with water textures being generated in-editor at insufficient resolution.

  • Fixed landscape not updating on changes to water on Mac and Linux.

Deprecated:

  • The old WaterVelocityTexture has been deprecated and no longer contains data.

  • Renamed EditorViewport.SubMenu.Layouts in StarshipStyle to Icons.Layout and moved it to StarshipCoreStyle.

Foundation

New:

  • A Force reload option has been added for the AutomationOpenMap function.

  • Support for individual test exclusion for different RHI when parent suite does not exclude all RHI Enhanced management of RHI through the UI If a RHI is specifed, any child test can be excluded on an additional RHI by clicking on edit exclusion.

  • Made AFunctionalTest's Author and Description public properties.

  • Used dot syntax to name Blueprint functional tests instead of using the full package path. (replacing / by .)

  • Added an option to keep Play-In-Editor(PIE) open in the advance settings of the Test Automation Window.The Default behavior is off, however this behavior can be changed through project config settings.

  • Improved test exclusion list mechanic.

  • Renamed blacklist to excludelist.

  • Support has been added for the section exclusion rule to be able to exclude entire section of tests.

  • Marked excluded test as skipped in the report instead of entirely removed for test list. A check has been added for exclusion just before running the test.

  • Added support for exclusion management from the Test Automation window and added a column at the end of each row.

  • Exposed device information to the UE test report.

  • Added support for metadata in Gauntlet test report for Horde Limitations.

  • Management through the UI is limited to which tests are available through the active worker node. This means Runtime only tests are not listed from a worker that is Editor and platform specific, and are not clearly identified.

  • Added support for Blueprint Editor Utilities in UE functional tests

  • Added a SetFilter command to the Automation framework.

  • Debug Hud - Stat rendering optimizations. This cuts the cost of DrawStatsHUD by about half.

  • Added Draw text effects (shadow, outline) in same pass as main text draw to avoid calling draw several times.

  • Updated the CharacterList to cache the FCharacterEntry's directly to avoid creation/copying of them.

  • Updated FBatchedElements::AddVertex function to takes float vectors to avoid expensive LWC conversions.

  • Only set SImage MouseDown and DoubleClick event if bound. This can save memory when there are many widgets.

  • Added bAutoCollapseWithEmptyText to UCommonRichTextBlock to mirror UCommonTextBlock.

  • Adding ForEachLoadedAsset to FStreamableHandle. This allows for operations on the loaded assets without creating an intermediate array.

  • Tabs can now be inserted into the tab list.

  • Added the TabIndex parameter to RegisterTab. If a new tab is being inserted before the end of the list, the tab list will rebuild the tabs in correct order.

  • Added the option to defer rebuilding till next tick.

  • Added GetTextStyleSet function to URichTextBlock.

  • Set ConfigCache GetXOrDefault to return value from the config or default value.

  • Set OodleDataCompression to use one OodleScratchBufferCount per core in tools. It will still default to 2 Buffer counts per core for game runtimes. This results in a significant speedup in iostore compression at fast compress levels.

Bug Fix:

  • Avoided duplicates of Screenshot comparison artifacts when producing automated test html/json report.

  • Automated Test report path will now log only if it was generated.

  • Fixed Previously Excluded Test from not inheriting exclusion settings from the parent suite.

  • Added a Fix for incorrect return values for FUntilCommand.

  • Fixed Functional test from not running when the Navigation System is disabled.

  • Validated that the item at the tail of the automation latent command is the item that is completed before removing it.

  • Fixed Automation Worker Instance Name from not being unique for some console platforms.

  • Fixed const in FAutomationTestBase::TestEqual function signatures.

  • Fixes for UCommonActivatableWidgetSwitcher. If the switcher has an owning activatable widget, only activate switcher child if the owning widget is active.

  • Fixed issue in UPlayerInput where analog values weren't cleared when flushing pressed keys.

Deprecated:

  • Deprecated FAutomationTestBase::SetSuccessState and FAutomationTestBase::GetSuccessState functions.

Removed:

  • Disabled exclusion editing on remote sessions.

  • NotEnoughParticipant state in favor of Skipped.

  • Implicit conversions from large world coords to floats by explicitly using float vector types.

  • Direct index cache from the CharacterList as it didn't actually make it faster due to the complex logic when getting a character.

  • Unnecessary include libraries.

Build

New:

  • Added .so and .dylib as files to consider as library files to help reduce relinking on Mac and Linux.

  • Added the ability to compile specific files while a live coding session is active. The output is sent to a different location to prevent conflicts with overwriting object files for the live coding session.

  • Updated EpicGames.Build to be a .NET 6 project.

  • Added Unreal Build Tool plugin support. It is currently only used by C# UHT.

  • Added XGE config bUnavailableIfInUse to allow falling back to a different executor if XGE is in use.

  • Added XGE config MinActions to avoid using XGE for small groups of tasks.

  • Modified assembly cache to not include "ref" or "refint" directories which contain the reference dlls.

  • Added an option to include the CPP/WinRT language projection headers and set the TargetWindowsVersion to the configured value when using Windows 10 SDK.

  • Deprecated bCompileForSize UBT Target option and replaced with OptimizationMode enum to fine tune a balance between speed and code size.

  • Rewrote the GenerateClangDatabase mode in UBT to work with the clang tools like IWYU.

  • Updated the unity file logic in Unreal Build Tool to merge generated cpp files and module cpp files into the same unity files to improve compile times. This can be disabled globally by setting bMergeModuleAndGeneratedUnityFiles in the target to false or in a module by setting bMergeUnityFiles to false.

  • Extended BuildLibForMac.command with more options and better option parsing.

  • Added support to inline the generated cpp files into the module cpp files using a new macro UE_INLINE_GENERATED_CPP_BY_NAME. This improves compile times because less header parsing is required.

  • Added support for targeting arm64 on Win64 with VS2019 in the UAT BuildCMakeLib command.

  • Added a mode called PrintBuildGraphInfo to Unreal Build Tool. This mode prints out build information that can be used to help guide compile time improvements.

  • Added the ability to override the NumIncludedBytesPerUnityCPP from the module rules. This can be used to improve compile times by breaking up large unity files into smaller pieces.

  • Updated several modules to use shared precompiled headers to improve compile times.

  • Added support for targeting the Unix platform group in the UAT BuildCMakeLib command.

  • Added a "deprecation" path for engine includes to allow types to be moved without breaking licensee module builds.

    • Non-engine modules and targets will have to specify the version of includes from IncludeOrderVersion in TargetRules or ModuleRules. This setting will control the value of UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX where XXX is the version of the engine.

    • When moving types out of a header, Users will need to include the new location of the type in the header it was removed from but only if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX is set.

    • If a target does not change its IncludeOrderVersion to the latest version, UBT will print out a message telling users how to upgrade.

    • This change introduces a new set of SharedPCH permutations to make sure modules with older versions get the PCH with UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX set correctly.

Improvement:

  • Updated several modules to compile with unity files to improve compile times.

  • Updated several modules to use shared precompiled header files to improve compile times.

  • Optimized Unreal Build Tool's startup time.

Bug Fix:

  • Enabled the reference assembly to be generated in the old location for all projects that include the UE C# props file.

  • Marked UnrealBuildConfiguration to be serialized to json as a string.

  • Ignored compile actions that aren't using the C++ compiler when doing live coding. Resolves issues where changes that would contribute to the resource file would cause live coding to fail.

  • Fixed issue where compiling script modules in UAT where all modules were up-to-date would result in extra assemblies being returned.

  • Properly exclude build records which fail to parse from the active set of build records.

  • bStressTestUnity will now supersede adaptive unity.

  • Fixed an issue where the generated cpp files were not including the needed headers for the types that were marked in the header file.

Removed:

  • Removed several private precompiled headers to improve compile times.

Core

API Change:

  • FMath::Min/Max now rely solely on a definition of operator < instead of needing overloads for operator <= and >= respectively, so uses of these functions with custom types will now require operator < to be defined.

  • Experimental support for C++ Coroutines which can be used by setting bEnableCppCoroutinesForEvaluation to true

  • The default type for all integer types remains int32.

  • The base-global-module argument is now expected to be in the format --base-global-module=ModuleName.

  • The API previously allowed names up to 256 characters. Callers using longer names will need to use shorter names to avoid a failed assertion.

  • Replaced PanicFlushThreadedLogs with Panic when the program will be forced to terminate, and with Flush otherwise.

New:

  • Added the trace.bookmark console command which emits a TRACE_BOOKMARK. You can provide the argument with a single string which then becomes the bookmark name.

  • Added descriptions for various stat EngineStat commands. The stat description has been added to the output of stat help. Using the command - stat detailed will display the build string version (which includes changelist).

  • Added support for symbols such as "%c" width formatting in FGenericWidePlatformString. Supports "+" and "-" followed by digits as well as "*" for integer value argument.

  • Changed definition of FMath::Min/Max to be based on less-than comparisons. This both improves code generation in certain situations and makes it easier to use them with custom types.

  • Implemented a quick workaround to allow munmaps to happen with Mutex unlocked. Currently, We can't define UE_ALLOW_OSMEMORYLOCKFREE on Linux as we'll deadlock with the OsAllocatorCacheLock.

  • Mutex locks Munmap calls on Linux can take quite a bit of time (few ms in some cases). This should allow these to happen without the Mutex and remove some hitching.

  • Added context to PostCDOCompiled and call it for skeleton-only compiles

  • Support for serialization of TVariants has been added.

  • You can now optionally allow Blueprint class property GUIDs to be included in a cooked build.

  • Added "OnConfigSectionsChanged" delegate to FCoreDelegates, notifying bindees when the config is updated.

  • Added boolean bIsRegeneratingOnLoad to PostCDOCompiled context.

  • Allowed the meta-data for generated types to be cooked as optional data, for use with cooked editors.

  • Added FCoreUObjectDelegates::OnObjectPostCDOCompiled.

  • Added debugger visualizer for FIoStoreTocCompressedBlockEntry.

  • Refactored reference chain searching to handle multiple objects at once to reduce time spent scanning all objects and creating/deleting temporary structures.

  • Added ShortestToGarbage option to prevent duplicate reference chains by the root reference and the first garbage object encountered.

  • Added Special cases for the FGCObject referencer to avoid unhelpful deduplication.

  • Defined a new Tag for PluginBrowser allocations.

  • Added a struct FTopLevelAssetPath to represent the path of an object whose direct outer is its containing package. For example: /Path/To/Package.AssetName

  • Improved support for TVariant visitors that use rvalue-reference function parameters.

  • Added tagging for unassigned allocations.

  • Added TEnumFlagsRange which enables iteration over each flag set in an enum flags variable.

  • Unified a Play-In Editor(PIE) world leak that was reporting with LoadMap leak reporting.

  • Added metadata to crash context for hung thread or present hangs.

  • FNames containing full object paths have been deprecated across the engine. These strings are redundant and can take as much as 30mb of memory in a large project.

  • Added a TIdentity_T<> alias for typename TIdentity<>::Type.

  • Added Peek to TSpscQueue and TMpscQueue.

  • Added append to FString overloads for BytesToHex[Lower], FSHAHash, FGuid and optimized them.

  • Added a command line argument for underrun mode.

  • Added automatic bool-to-integer property conversions.

  • Added UE_ prefixes to math macros, and conditionally deprecated the old macros with a preprocessor switch.

  • Added TArray::Append which takes a parameter for any contiguous range.

  • Added a IsEmpty function to TSpscQueue and TMpscQueue.

  • Always log out config console variable settings when the last write to the console variable was from the constructor.

  • Added FGCObjectInfo::IsGarbage function to check Garbage and PendingKill flags.

  • Renamed garbage streaming levels before GC so that new copies of them can be reloaded when leaks occur with GC reference elimination (pending kill) disabled.

  • Moved TIsCharEncodingCompatibleWith, TIsFixedWidthCharEncoding and TIsCharEncodingSimplyConvertibleTo traits into their own header files.

  • Added conversions for UTF32CHAR-to-UTF8CHAR to FGenericPlatformString::Convert.

  • Windows memory mapping improvements have been added.

  • Added extra information to fname.stats command for hash table memory usage.

  • Fixed units for fixed overhead.

  • TArrayView is no longer passed by a const reference in TSet::Append

  • Added a TSet::Append overload for TArrayView of const argument type.

  • Added a component-wise multiplication operator to FIntVector.

  • Added Support for RotationVector conversions to Quat.

  • Added additional TCString<UTF8CHAR> functionality.

  • Added GET_VARARGS_RESULT_UTF8 macro.

  • Moved TMakeSigned and TMakeUnsigned into their own header files.

  • Added TasksInsights visualization for parent tasks.

  • Updated UE::String::Find* to accept UTF8CHAR views.

  • Added TCHAR<->UTF16 and TCHAR<->WCHAR support in StringConv.h for UTF-8 mode.

  • Added support for FGenericPlatformString::Convert and ::ConvertedLength with null-terminator.

  • Added UTF16TEXT macro.

  • Added MakeUniqueForOverwrite.

  • Added MicrosoftPlatformCrashContext and MicrosoftPlatformStackWalk to share code between Microsoft platforms.

  • When sync loading a package, Zen Loader will only execute nodes required for that package to finish loading.

  • Enabled interface support for AddDynamic and BindDynamic on delegates.

  • Added a minor improvement to deadlock detection in Tasks System. It will now detect waiting for task completion from inside that task execution, even if inside its inner task.

  • Added functionality to Tasks Insights tracing task destruction and a context menu item to jump to task's DebugName in IDE if it's a source location.

  • Added a mode for garbage collection to report a sample of garbage references rather than all of them. This mode can be enabled by setting gc.GarbageReferenceTrackingEnabled to 2.

  • Renamed leaked packages in in LoadMap during GC reference elimination. pending kill is disabled so that new copies of those maps can be loaded as free memory allows.

  • Fixed a missing log in LoadMap when ensures are compiled out.

  • Added ConstCastWeakPtr and StaticCastWeakPtr functions to match the SharedPtr and Reference equivalents.

  • Added nodiscard to relevant sharedptr-related functions.

  • Downgraded failure to obtain package name from file name to a warning in IoStore.

  • Platforms can now opt-in to all-thread backtraces, defaulting to on for Windows and Mac.

  • Fixed WaitUntilTasksComplete function to tolerate null tasks to TaskGraph.

  • Moved support for adding all thread callstacks to crash context from Windows to Microsoft.

  • Added TObjectPtr support to delegates.

  • Added FORCEINLINE to TIndexedContainerIterator dereferencing operators.

  • Added missing LLM tracking tags. Untagged Allocations went from > 40000 untagged allocations to 4400.

  • Instrumented new ParallelFor tasks for Tasks Insights. Markers for ParallelFor tasks now show task lifetime events, and point to which ParallelFor they belong to.

  • Added Extra GC logging from gc.GarbageReferenceTrackingEnabled . Logging will be completely removed in shipping builds regardless of the settings of the console variable.

  • New updates for TasksInsights. When selecting a ParallelFor timer it will draw arrows to and from its ParallelFor tasks.

  • DepletableMpscQueue - a multi-producer/single-consumer concurrent atomic queue that consumes all items at once, atomically, and leaves the queue in a usable empty state.

  • Added support for custom allocator for TSpscQueue and TMpscQueue.

  • Added Math constant constexprification and outlining to reduce massive code bloat.

  • Added delegate FCoreUObjectDelegatess::GetGarbageCollectReportGarbageReferencers for adding additional debug information to garbage reference tracking in GC.

  • Added GarbageObjectsToVerify function to world context to verify that important objects are cleaned up on world transitions.

  • Added commands -DebugCoreRedirects and -FullDebugCoreRedirects to the command line parameter that writes to the log when reading and applying core redirects.

  • Included referencing property information in HandleGarbageReference since it's guarded by a console variable. Allow ENABLE_GC_OBJECT_CHECKS to be overriden outside of GarbageCollection header file.

  • Added command-line options for -EnablePendingKill and -DisablePendingKill to override config setting.

  • Added ForwardAsTuple function as a mirror of std::forward_as_tuple.

  • Added C++ Coroutine Task implementation and support classes.

  • Added support to cross-compile editor plugins through the runUAT BuildPlugin.

  • Improved struct packing for TCounter from 32 to 20 bytes, and FScopedDetailTickStats from 32 to 24 bytes.

  • Added a lower case digits mode for FGuid::ToString.

  • Improved scoped cpu timers for FEngineLoop.

  • Added cpu timers for FEngineLoop::Tick, HeartBeat, TickHotfixables and TickRenderingTickables.

  • Added a scoped cpu timer for FStats::AdvanceFrame.

  • Made TVector2::Normalize function return a bool indicating whether the normalization was successful, matching the TVector::Normalize function.

  • Added FloatCastChecked and FloatFitsIn for runtime validation of acceptable precision loss when casting between floating point types.

  • Added support for signed and unsigned variants of FIntVector, FIntPoint, and FIntRect types.

  • Added support for 32 and 64 bit variants of FIntVector, FIntPoint, and FIntRect types.

  • Added functions ToHostLineEndings and FromHostLineEndings for FString converting between different platform line endings.

  • Updated Oodle to version 2.9.8. Several Oodle Texture encoder improvements to quality and performance, much faster encoding on M1 Macs.

  • Added log highlighting, based on log category and log search string. It uses the following Command line commands: -LogHighlights="LogNet Cyan, LogTemp Green" -LogStringHighlights="UNetConnection::Close=Purple, NotifyAcceptingConnection accepted from=DarkGreen"

  • Added AssetSizeQuery commandlet for rapidly getting asset size breakdown by class. The class summary and assets can now be saved to a .CSV.

  • Assets can be filtered by a wildcard match. This requires the compressed size to have been written back to the asset registry after staging.

  • Added FTopLevelAssetPath struct to represent the path of an object whose direct outer is its containing package.

  • Moved utility functions related to linker tables from FLinker to FLinkerTables to be able to have access to these functions from the AssetRegistry code

  • Garbage Collector can now store information about traversed references which can then later be searched through with FReferenceChainSearch.

  • FReferenceChainSearch will no longer store raw pointers to UObjects when constructing reference chains, instead it will only preserve basic information about UObjects that are separate from UObjects themselves so that FReferenceChainSearch objects can be used more than one frame.

  • Expanded LoadMap world leak tracking to add configurable severity and separate console variables for shipping configuration. This reduces memory usage and adds a low memory usage option for approximate direct reference and outer chain checks.

  • Added support to writing platform specific tags to the asset registry during cook by the book.

  • Allow command line arguments to the engine in LowLevelTests.

  • Added ParallelForWithExistingTaskContext, which is similar to ParallelForWithTaskContext except it takes a pre-allocated array of task contexts and launches one task per context.

  • Limited derived data cache bucket names to 63 characters.

  • Updated FSoftObjectPtr values stored in the asset registry tags to match the current format returned by FSoftObjectPtr::ToString.

  • Added IRequestOwner::LaunchTask to DDC to easily chain together tasks and cache requests.

  • Updated Mac and Linux to use libcurl 7.83.1.

  • Added a partial derived data cache record propagation to the hierarchy.

  • FEditorBulkData can now attempt to read payloads from package files without a valid attachment to the file on disk.

  • Added specializations of TValueOrError for void value and error types.

  • Added TryReadLock and TryWriteLock to FRWLock.

  • Added functions to serialize derived data cache types to and from compact binary, including strings wherever appropriate.

  • Serialized PKG_Cooked and PKG_ContainsNoAsset in the package flags in the FPackageFileSummary.

  • Restricted the giant FGCCSyncObject and FUObjectHashTables locks to the reachability analysis phase.It is possible to toggle to the previous legacy behavior with the command gc.LockBehavior=1.

  • Changed the CppStructOps registration code to use struct path names instead of short names. This allows identically named native structs to be registered in different modules

  • Printing references to stale objects will now take into account GarbageCollectorKeep flags that can prevent an object from being Garbage Collected even though it's not referenced.

  • Added UStruct::GetStructPathName and UClass::GetClassPathName functions that return an FTopLevelAssetPath type instead of an FString. This means that the engine is now enforcing UClasses and UStructs to be 'top-level objects'. Their Outer object can only be a UPackage object which has a null Outer object.

  • Added new utility functions that can be used to fix ANY_PACKAGE deprecation warnings. These functions include:

    • UClass::TryFindTypeSlow

    • UClass::TryFindTypeSlowSafe

    • UClass::TryConvertShortTypeNameToPathName

    • UClass::TryFixShortClassNameExportPath

  • Converted hardcoded short class and enum names to pathnames due to ANY_PACKAGE deprecation.

  • Added EPropertyFlags::CPF_NonNullable that can be used with FObjectProperty to ensure that setting nullptr to the property is a no-op and the set has no effect.

  • Added empty directory deletion to derived data file system cache store maintenance

  • Added automated startup tests to check if class / struct / enum / property metadata contains values with short type names to help with deprecating the ANY_PACKAGE macro.

  • When an assertion fails, logs will now be Flushed to provide more details in the debugger and log files.

  • Per object config sections can now also contain class path names.

  • Added the Packaging Reference Chunk Database system. This allows projects with iostore containers that have already been deployed to customers to upgrade or change packaging compression settings and avoid re-deploying content to end users.

  • This provides the previously deployed containers, and chunks containing the same data will be re-used instead of re-compressed.

  • Added Asset Bulk Data Diff Commandlet.

  • Added "Diff Tags" support. Commandlet and Diff Tags provide a way to understand why the bulk data for a given asset has changed. Changes are grouped by which diff tags caused the change which allow for rapid understanding of large patch sizes.

  • Added LoadFromCompactBinary as a standardized way to load from compact binary.

  • Added derived data cache replay functionality A cache replay can be created from any program that uses the cache, and can be replayed through any cache graph in any program that uses the cache.

  • You can save a cache replay by adding -DDC-ReplaySave=PathToReplay.ddr to the command line.

  • You can load a cache replay by adding -DDC-ReplayLoad=PathToReplay.ddr to the command line one or more times.

  • You can modify the cache priority on loaded replays with -DDC-ReplayLoadPriority=Priority. - For example, -DDC-ReplayLoadPriority=Lowest will queue replayed requests to execute asynchronously.

  • You can modify the cache policy on loaded replays with -DDC-ReplayLoadAddPolicy=CachePolicy and -DDC-ReplayLoadRemovePolicy=CachePolicy.

  • -DDC-ReplayLoadAddPolicy=SkipData will make the replay prefetch into the cache stores earlier in the cache hierarchy.

  • -DDC-ReplayLoadRemovePolicy=QueryLocal will make the replay query only remote cache stores.

  • You can Filter, save, or load operations by combining arguments. -DDC-ReplayMethods=Get+GetValue+GetChunks will process requests of the corresponding methods.

  • -DDC-ReplayTypes=Type1[@Rate1][+Type2[@Rate2]...] will only process requests of the corresponding types.

  • -DDC-ReplayRate=Rate will only process Rate% of the requests that do not match one of the type filters.

  • -DDC-ReplaySalt=Salt configures the salt used to filter by type and rate, which makes them match consistently between sessions instead of being random.

  • You can Load a cache replay with the console command: DDC.LoadReplay ReplayPath [Priority=PriorityName].

  • Added a compact formatting mode to the conversion of compact binary to JSON.

  • Added FindObject function overloads that accept FTopLevelAssetPath struct as the object path name.

  • Extended -DDC-MissTypes with more options to simulate cache misses. In the examples below, is the name of a node in the cache store graph, or you can use All to apply to every node.

  • -DDC-<Node>-MissTypes=StaticMesh+Texture will simulate a miss on every access to to static mesh and texture keys.

  • -DDC-<Node>-MissTypes=+Texture will simulate misses on 12.5% of accesses to static mesh keys and every access to texture keys. -DDC-<Node>-MissRate=5

  • -DDC-<Node>-MissTypes=Texture will simulate misses on every access to texture keys and 5% of other keys.

  • -DDC-<Node>-MissRate=5 will simulate misses on 5% of keys.

  • -DDC-<Node>-MissSalt=PositiveInt32 will set the salt used to match keys to simulate misses on. A key always has the same simulated miss behavior with the same salt.

  • Added EngineConsoleCommandExecutor to provide IConsoleCommandExecutor outside of the editor.

  • Set UnsafeTypeCastWarningLevel to Error for several widely-used modules. Projects with changes to these Epic-provided modules will need to fix any of these warnings in the modified code in order to build.

  • Unreal logging functionality is now used in LowLevelTests instead of LocalPrint.

  • Upgraded to BLAKE3 1.3.1.

  • Enabled the experimental Unreal Cloud DDC on Mac and Linux.

  • Added FCompositeBuffer::EqualBytes function to compare the contents of two composite buffers.

  • Added ConvertLegacyCacheKey to construct new cache keys from legacy cache keys.

  • Added a commandlet to export an asset registry database to a sqlite database, which allows sql queries of assets, types, and asset tags. This commandlet is in the plugin AssetRegistryExport and must be enabled to be used.

  • Updated zlib to 1.2.12.

  • Added IsInheritedInstance to exports.

  • Added missing generated public hash entries to ArchiveStackTrace.

  • Added support for writing back compressed asset size to an asset registry during or after iostore packaging.

  • Added iostore chunk hashes to the asset registry during cook.

  • Added a dedicated thread for logging.

  • Added -DDC-Verify arguments to control cache determinism verification.

  • -DDC-Verify will verify determinism on every access to the cache.

  • -DDC-Verify=StaticMesh+Texture will verify determinism on every access static mesh and texture keys.

  • -DDC-Verify=+Texture will verify determinism on 12.5% of accesses to static mesh keys and every access to texture keys.

  • -DDC-VerifyRate=5 -DDC-Verify=Texture will verify determinism on every access to texture keys and 5% of other keys.

  • -DDC-VerifyRate=5 -DDC-Verify will verify determinism on 5% of keys.

  • -DDC-VerifySalt=PositiveInt32 will set the salt used to match keys to verify. A key always has the same verification behavior with the same salt.

  • Added AppendChars(TStringBuilderBase&) to allow string builders to work as the output of algorithms.

  • Reduced stack usage of assertions, crashes, ensures, and fatal logs by between 8 and 24 KiB.

  • Replaced PanicFlushThreadedLogs() with the new GLog->Panic() that switches logging into a mode that the panicking thread takes over log flushing and only redirects logs to panic-safe output devices.

  • Utility functions like FindFirstObject or UClass::TryFindType have been introduced to provide similar to ANY_PACKAGE functionality in scenarios where providing an Outer object or object path name is not possible.

  • Added String/RemoveFrom.h

  • Cleaned global Engine header dependencies by removing includes of "Engine/NetSerialization.h" from global headers.

  • Minor dependency cleanup in ComponentSourceInterfaces.h

  • Added a softobject path table to the package summary header This is to felicitate validation by inspecting the header and allow asset patching by using the header without export loading.

  • Dependency cleanup in Chaos focused on removing includes from ChaosSolverConfiguration.h.

  • Added FStringView constructor to FStringFormatArg.

  • It is now possible to override system guids, which are often used for derived data versions, on a per stream basis allowing the guids to be changed in separate streams without causing merge conflicts.

  • Modified FlushTree to FlushRequest. It will now Automatically propagate explicit package load request association to package dependencies which allow flush requests to process only related packages while skipping others.

Improvement:

  • Optimized the FGCObjectInfo::TryResolveObject function to use only FNames instead of FStrings to search for objects.

  • Improved performance for FLinearColor to sRGB and UNORM conversions.

  • Refactored to store book keeping and allocations separately, including matching allocations to pools with pointer arithmetic.

  • Improved Blueprint API for soft object paths. They can now be easily created from path strings and loaded objects.

  • Renamed related Blueprint functions for clarity.

  • Optimized AssetDataGatherer cache load.

  • Optimized performance by limiting a contention between consumer and producers.

  • Improved AssetRegistry loading optimization.

  • Optimized macro WITH_CASE_PRESERVING_NAME FName loading to help editor startup time.

  • Core constexprification pass to reduce code bloat, improve performance and simplify searching for non-constexpr constants.

  • Optimized BuildCacheKey using FAsciiSet.

  • Improved several TArray comments.

  • Optimization in the LinkerLoad, when it has many bulk data loaders. Turned the TArray into a TSet. This speeds up loading certain geometry caches significantly.

  • Optimized the output redirector to process concurrent logging about 25 times faster

  • Optimized the derived data file system cache for network file shares.

  • Optimized formatting FDateTime to be about 7 times faster.

  • Optimized formatting of log messages to be about 3 times faster.

  • Refactored compiled-in FProperty constructors so that they have the same signature.

  • Improved ensure error message during package save when a name isn't mapped.

Crash Fix:

  • Fixed an unbound delegate crash in the directory watcher.

  • Added crash fixes with small iostore containers by changing the calculation of number of partitions for iostore containers to use the end of the last block rather than the start of last block.

  • Fixed a crash during package reload when failing to purge the old package.

Bug Fix:

  • Blueprint object and field names can now be used with core redirects.

  • Used pass by reference instead of pass by value for TArray to eliminate a copy in the UNetDriver::ServerReplicateActors_PrioritizeActors function.

  • Memory image determinism fixes: When building name patches, compare names case sensitively.

  • Fixed UObject::GetPreloadDependencies not gathering from C++ classes

  • Reserve byte array for FUniqueNetIdRepl::ReplicationBytes to minimize allocations and wasted space

  • Garbage Collection locks are no longer acquired when GIsInitialLoad is true.

  • Fixed an overflow issue where very large float A values would sometimes results in pixels with A=0 on FLinearColor to sRGB conversion.

  • Allow methods that can only be invoked from a constructor be available when fetching vtable addresses for HotReload and Live Coding.

  • Fixed FInstancedStruct edits not propagating to instances when editing a Class Default Object.

  • Fixed bugs in crash malloc. When a small pool was exhausted it became impossible to free any allocations in the pool, because Free used the same search function as Malloc which only considered pools with space available.

  • Fixed FName debug visualizers on clang and gcc platforms.

  • Fixed divide by zero in vectorized TTransform<T>::InverseTransformPosition and TTransform<T>::InverseTransformVector functions that were causing floating point exceptions.

  • When the engine renames a garbage package that cannot be freed because of GC reference elimination pending kill is disabled, removed those packages and their exports from the async loading thread's caches.

  • Fixed a compile error in static analysis builds when copy constructing a 2-tuple of different, but compatible types.

  • Marked packages as garbage in PrepareStreamedOutLevelsForGC so that weak pointers to them in the net driver's guid object cache become invalidated even if they are not freed because of dangling references when GC pending kill is disabled.

  • Fixed LaunchFixProjectPathCase assuming that TCHARs are WIDECHARs and fixed FOutputDeviceStdOutput::Serialize in UTF-8 mode.

  • Fixed memory corruption when converting a null-terminated string via StringConv<UTF8CHAR> where the string ends with two high surrogate pairs.

  • Give DEFAULT_SERVER_FAKE_FORKS a default value for all games/builds.

  • Fixed many invalid uses of TCHAR and TEXT in UTF-8 mode.

  • Fixed FString and TStringBuilder appending UTF8CHARs.

  • Made FFilteredActorCollector keep weak pointers to Actors in order to support disabling GC pending kill reference elimination.

  • Fixed FMapProperty::IsPermutation and FSetProperty::IsPermutation functions.

  • Replaced nullptr_t with TYPE_OF_NULLPTR to prevent errors being reported in IDEs utilizing clangd, like QT Creator.

  • Fixed UTF-8 decoding from emitting multiple chars for a correctly parsed codepoint but invalid value.

  • Fixed TNonRelocatableInlineAllocator leaking heap allocations.

  • Various Niagara class fixes for compiling under C++20.

  • Release pointers to components in FParticleSystemWorldManager when they are marked as garbage.

  • Fix EGuidFormats::Short so that it uses Base64 encoding as the documentation states

  • Fixed compile error in TIsInvocable when given a member function pointer and an incompatible target type.

  • Made TTransform trivially-copyable in vectorized mode.

  • Removed useless ANSI->UTF8 conversions. Fixed incorrect sign extensions during to-UTF8 conversions.

  • Fixed FGenericWidePlatformString asserting and going into an infinite recursion when setting PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION=1 in Windows.

  • Marked LocalPlayer as garbage when removing it from GameInstance to track outstanding references when GC reference elimination (pending kill) is disabled.

  • Disabled the use of PersistentGarbage flag because for removing reported garbage references.

  • Fixed TNonRelocatableInlineAllocator leaking heap allocations.

  • Fixed output when converting a string with an orphaned high surrogate at the end of the input.

  • Added UObject::GetImplementingOuter, an interface counterpart to UObject::GetTypedOuter.

  • Added header with state of editor-only-data-stripping to saved asset registry to allow properly loading cooked asset registries from a WITH_EDITORONLY_DATA binary.

  • Fixed a hang on shutdown of UELibrary caused by the trace thread not being shut down.

  • SceneCaptureComponent releases pointers to garbage Actors pre-GC.

  • Fixed broken assert strings in TArray64 and TArrayView64.

  • Made formatting functions FString::Printf capable of taking char* formatting strings in UTF-8 mode.

  • Fixed incorrect memory ordering in TSharedPtr::IsUnique in ThreadSafe mode.

  • Remove FAndroidPlatformString::Strncmp, which read out of bounds for unterminated string, and fall back to the faster FGenericPlatform algorithm.

  • Inserted dummy values into memory images for names like vtable pointers.

  • Fixed archetype flag from not being set during object duplication during text import of a UObject property preventing serialization and PostEditProperties from reading it.

  • FThread now supports the -nothreading command-line argument.

  • Fixed reversed ordering of mounted containers in the FilePackageStore.

  • Unified the alignment behaviors of FMallocTBB::TryMalloc and FMallocTBB::TryRealloc functions.

  • Made UClass::Implements private to prevent accidental misuse.

  • Added a scope object IModularFeatures::FScopedLockModularFeatureList to easily lock and unlock the list of modular features when accessing it.

  • Fixed render capture provider from firing an assert when accessing IModularFeatures from outside the game thread.

  • Avoid locking the modular features list when calling GetEngineCrypto, since the IEngineCrypto is only accessed once and stored in a static member.

  • Check the IsValid flag when comparing Tboxes, and more generally take the flag more often into account.

  • fixed implicit 64-bit to 32-bit conversion in ParallelTransformReduce.

  • Added CORE_API to FComplexStatUtils struct for games usage.

  • Fixed forwarding of -DDC=<Graph> to child processes to avoid initializing DDC and only forward non-default graph names.

  • Refactored initial load in AsyncLoading to remove the Zen loader dependency on the prebaked script object blob located in the global.ucas. This will rely on NotifyRegistrationEvent callbacks.

  • Made initial loading more robust when Blueprints are referenced by native Class Default Objects.

  • Fixed missing logging of callstacks for failed assertions.

  • Restored the functionality of the command DEBUG OOM. By default the command will leak 1MiB of memory per frame in 64KiB chunks, but these values can now be overridden by entering additional values after the command.

  • FAutomationTestBase::bSuppressLogs will now default initialize to false and keep its value if a derived class change it.

  • Nested subobjects that have overridden properties in a Blueprint are now initialized correctly from their archetype, and not the native default values.

  • Nested subobjects that are part of Objects created from a template will now correctly initialize their properties from the supplied template.

  • Fixed a regression that incorrectly flagged nested template objects as inherited instanced subobjects in the package export map.

  • The correct object will now be looked into when determining if the inherited instance should be instantiated.

  • Fixed CreateFileReader to respect the flags passed to it.

  • We now propagate the necessary object flags when duplicating an instanced subobject to another owner.

  • Calling Rename on a UPackage will no longer reset the loaders for all currently loaded packages which caused memory bloating in the editor.

  • Added support for structured bindings to UE_LOG, checkf, ensureMsgf.

  • Ensure that editor-only subobjects are instanced on load for cooked packages when running on platform targets that include editor-only data.

  • Fixed FObjectPtrProperty::Identical from not respecting deep comparisons.

  • DirectoryWatcherWindows will now handle ERROR_INVALID_PARAMETER when buffer size is too large to watch a network file share.

  • pendingkill flags will now properly clear to prevent asserts when duplicating Actors.

  • Fixed a data race in FAsyncWriter that was in the file output device.

  • AsyncLoading will no longer reconstruct existing destination subobjects in cooked packages, they should always have been created from the correct up-to-date template.

  • Fixed the console command obj refs -history=1 from not looking in Garbage History when it's enabled.

  • Fixed AssetManager ModifyCook to correctly apply cook rules to asset bundles so it handles labels properly.

  • Added ensure to set GIsGarbageCollecting=true for the complete IncrementalPurgeGarbage phase since we always want BeginDestroy to behave the same even if it is called from a full blocking Garbage Collection or from an incremental Garbage Collection step.

  • Fixed destroying a ChildActorComponent from failing an assert in the UObjectBase destructor that was checking for NAME_None.

  • Made GetTransientOuterForRename more available. This can be used to fix a crash when changing a class if that class needs to be within.

  • Fixed the use of FORCENOINLINE and UE_DEBUG_SECTION macros for logging and assertions.

  • Class verification is now being deferred to package import creation time on load whenever appropriate, so that load linker warnings don't emit false positives.

  • Fixed code generation for TFieldPath property in UFunction params.

  • Added propagation of derived data cache records that contain metadata with no values.

  • Fixed deadlocks during crash reporting by avoiding allocations in the FAsyncWriter::SerializeBufferToArchive function on platforms that use FPlatformMallocCrash.

  • Fixed IsDefaultObject to not return true for Class Default Objects.

  • Fixed compilation manager duplicating a subobject when one of the same name already exists.

  • Fixed instanced variable defaults from not duplicating on copy paste.

  • Moved exported symbols from TokenizedMessage to the .cpp file.

  • Fixed data loss that was caused by a failure to look up component templates during reinstancing.

  • Fixed incorrect assignment of GIsConsoleExecutable that caused performance degradation when stdout is redirected to a file or pipe.

  • Removed non-suppressible warnings from SetTimeStamp.

  • Fixed String Tables from not loading Metadata.

  • Fixed an edge case where objects could be post loaded during async loading without having been deserialized.

  • When saving an ini file, the SourceIniHierarchy wasn't being configured correctly, causing things like array clearing to not be handled correctly.

  • Previously an errant heartbeat present hang could be triggered if the macro PLATFORM_PRESENT_HANG_DETECTION_ON_BY_DEFAULT was disabled. This change resolves the initialization of present hang detection settings preventing a race condition that triggered the errant hang.

  • PLATFORM_PRESENT_HANG_DETECTION_ON_BY_DEFAULT can now be safely disabled.

  • Fixed a compile error when STATS is disabled.

  • Fixed potential deadlocks when serializing objects while holding the object hash lock and async building meshes.

Deprecated:

  • Removed out of date CEF content.

  • Deprecated FDateTime plus FDateTime operator.

  • Delegate nested binding types.

  • Deprecated UE_SECURITY_LOG and CLOSE_CONNECTION_DUE_TO_SECURITY_VIOLATION macros.

  • FBlueprintContextTracker::GetScriptStack which returned a TArray copy of the script stack is deprecated in favor of FBlueprintContextTracker::GetCurrentScriptStack and FBlueprintContextTracker::GetCurrentScriptStackWritable which return a TArrayView of the script stack

  • Deprecated PLATFORM_COMPILER_HAS_IF_CONSTEXPR.

  • Replaced DEPRECATED_MACRO with UE_DEPRECATED_MACRO.

  • Deprecate and remove the usage of FUntypedBulkData. Users should use the generic FBulkData or the typed TBulkData.

  • Deprecated StartAsyncLoading and CreateStreamingRequestForRange.

  • Deprecated and replaced the usage of StartAsyncLoading and CreateStreamingRequestForRange with a new batch API for requesting bulk data. The new API fits better with the I/O dispatcher API and does not assume that the bulk data resides in the same I/O chunk. The new API also removes state handling away from the bulk data instances.

  • Bulk Data - deprecate GetPackagePath/PackageSegment

  • Deprecated the public string view literals _SV, _ASV, _WSV, and _U8SV. which have been changed to TEXTVIEW, ANSITEXTVIEW, WIDETEXTVIEW, UTF8TEXTVIEW.

  • Removed aggressive subobject replacement. Replaced with a toggleable audit to report any cases where the aggressive replacement was in use from the replacement archiver.

  • Deprecated ANY_PACKAGE macro support for looking up UObjects using the ANY_PACKAGE macro. Programmers are encouraged to provide the Outer object or object path names when upgrading their project, such as FindObject<UClass>(nullptr, TEXT("/Script/Engine.Actor")) whenever possible.

  • Deprecated FolderName in UPackage and replaced it in PackageSummary with the PackageName.

Removed:

  • Ensure from FName about unfreezing names that were created for a case-insensitive target. We rely on the archive used for serialization to save names with their case intact.

  • References to Actors to help ensure partial GC when there are outstanding references.

  • Removed ignored calculated values from TBigInt::ToInt, FGenericPlatformMallocCrash::InitializeSmallPools and FArchive::SerializeCompressedNew functions.

  • Deleted SavePackage1. It has been replaced by SavePackage2 and is no longer supported.

  • Removed TObjectPtr.IsNull, TObjectPtr.IsNullNoResolve, FObjectPtr.IsNull and FObjectPtr.IsNullNoResolve.

  • Removed deprecated PackageGUID and Dynamic Type from FObjectExport

  • Removed rendering includes from PhysicsPublic.h in favor of forward declarations.

Dev Tools

New:

  • Added commands to open File History, Revision Graph, and Timelapse views from the UnrealVS.P4 menu.

  • UHT will now warn the user if any form of GENERATED_BODY is used in code that is being skipped.

  • Added warnings when C++ UHT is used. These warnings include the reasons why C++ UHT is being used. The warning is currently disabled but informational messages will still be generated.

  • Console feedback is now provided when starting live coding fails packaged builds.

  • Added compile PCH with -fpch-instantiate-templates in Unreal Build Tool if compiling with clang 11+. This flag has shown to improve compile times by 10-20% when using PCH.

  • Added support for deprecation macros for enum values in UHT.

  • Added support for final keyword on structure definitions.

  • Added --include argument to sync subcommand to limit the files synced in Unsync.

  • Added --files flag to info subcommand to list files in manifests in Unsync.

  • Added support for syncing subsets of files in a directory in UnsyncUI. File group is activated by finding any file that matches the regex, then groups from the regex can be used to populate the --include argument to Unsync CLI.

  • Added option to CSVInfo to extract specified stat values from the CSV.

  • Added -showAllStats which outputs all stat samples to the json file as an array.

  • Added -statFilters which lets you specify what stats to output values for.

  • Added additional info to the help text. + Added option to write events with their frame numbers.

  • Added the name of the platform when dumping the Manifest into FinalCopy_XXX.txt.

  • Added a new delegate to the CSV profiler that fires once on frame 0 of the capture so we can send the pause event as soon as valid.

  • The PerformanceTrackingSubsystem now handles sending the pause/resume events.

  • Added option to remove programs when generating project files.

  • Generate a .vsconfig that recommends Visual Studio components to be installed, this will prompt the user to run the installer in the Solution Explorer.

  • Allow custom output directory using -OutputDir= in Generate Clang Database with Unreal Build Tool.

  • Added support for specifying the C Standard when compiling plain C files.

  • Added the ability for an individual UObject class to change how its name is reported in stat IDs. This allows us to change stats like PlayerPawn.NiagaraComponent to PlayerPawn.FootstepFX.

  • Added a few implementations of the ANSI overload of FExternalProfiler::StartScopedEvent. This enables using the ANSI external profiler on all platforms.

  • Added import_text / export_text to wrapped structs in the PythonScriptPlugin. Any struct can now be exported to text or imported from text — similar to what you can do in C++ using the UScriptStruct.

  • Changed "named events enabled" text to render regardless of which path enabled it, instead of only when using the "stat namedevents" path.

  • Added metric for percent of frames where the game thread is over some budget in PerfReportTool. This metric can be added to summary tables.

  • Added OnCSVProfileEndRequested delegate that is called immediately before ending a capture that allows any final information to be written.

  • Added FVector4 support to Unreal.natvis so the W component appears in preview windows without manually expanding.

Improvement:

  • Improved support for contextual logging in UHT.

  • Updated Live Coding to Live++ 1.6.10.

  • Cleaned up formatting in both C++ and C# UHT.

  • Improved logging to show the object type being reloaded.

  • Updated PerfReportTool to treat extra links starting with '/' as links instead of link templates.

  • Changes to the Histogram summary table in PerfReportTool:

    • Removed the hitch table since the tool has a separate hitch summary.

    • New option to suppress the averages table.

    • Reversed from under to over budget.

  • Improved support for PreBuildSteps generating files.

Crash Fix:

  • Fixed a reliability issue with Live Coding where it could crash on startup.

  • Fixed a crash issue when LiveCodingConsole is run independently.

Bug Fix:

  • Fixed net enabled properties when would prevent properties from finding their getter/setter methods.

  • Classes that are detected by live coding that do not change in structure will no longer invoke the reinstancing system since it isn't needed. Changes to default values will be mantained.

  • Fixed an issue where project plugins would not compile with an installed engine.

  • Fixed wrong API macro from being used in C# UHT.

  • Fixed an issue where C# UHT was not catching some Blueprint properties contained in editor only sections.

  • Fixed UHT from failing to add enum metadata to a fixed array when a space appears in the array size.

  • Fixed an issue with LiveCoding reload where a fatal error would be generated even if a class had not changed.

  • Fixed issue where packaged Blueprint builds would not be able to start live coding without first having to clear the live coding source project variable.

  • Fixed a C# UHT issue where unterminated strings were not detected properly and could result in an infinite loop.

  • Fixed an issue in C# UHT where if an old style enum was returned from the "Implementation" method, the zero value would not be wrapped in the TEnumAsByte.

  • Fixed issue where Live Coding could remove properties from a class that contained delegates.

  • Fixed UHT error when class name contains only a prefix.

  • Fixed an issue where C# UHT would not declare shadowing errors where C++ UHT would.

  • The CoreNet header file will now be automatically included in UHT generated code when needed.

  • Fixed an issue where live coding would warn that a plugin was not enabled for live coding. This would happen if the plugin was not explicitly enabled by the project, but was loaded by another plugin.

  • Refactored HotReload/Live Coding re-instancing to re-instance classes more orderly and support the referencing of the new default object prior to the class being re-instanced.

  • Initialized UseShellExecute to the default of the .NetFramework to avoid issues. The default used to

  • Added ShortNames to Code Access plugins to reduce the pressure on path length.

  • Fixed the creation of multiple packages\platforms in a single call in BuildCookRun. The upluginmanifest file needs to be platform specific. It will prevent some of the packages from running otherwise.

  • Fixed csv profiler pause event not firing at start of capture.

  • The skipClient option in Unreal Automation Tool resulted in internal exceptions and infinitely looping test runs. Fix includes:

    • NullAppInstance only completed on WaitForExit, but some tests have completion criteria other than exit. To resolve this, NullAppInstance tests are now considered complete upon creation.

    • IDeviceUsageReporter now takes a platform reference and correctly handles a null platform. No events will be logged when given a null platform.

  • Fixed a C# Unreal Header Tool issue where struct properties were not performing all required validations.

  • Fixed a C# Unreal Header Tool issue where struct serializers were appearing in the wrong place.

  • Fixed the Rider project generator in the presence of platform extension specializations in Unreal Build Tool.

  • Added all files under Unreal Build Tool output directory to fix an issue running build setup on linux builders.

  • Fixed HelmTask in BuildGraph:

    • No longer modify the global kubecontext, but rather pass the context to use into helm.

    • Added an option to specify which kubeconfig to use.

    • Fixed an issue with values not being handled correctly.

  • Fixed an issue with HelmTask in BuildGraph not handling the situation when there were no values files.

Deprecated:

  • Enabled C# UHT by default. Set UEBuilderConfiguration bUseBuiltInUnrealHeaderTool to false to force C++ UHT to be used. C++ UHT will automatically be run if ScriptPlugins are enabled when a C# UBT plugin isn't detected in the same module.

Insights

API Change:

  • Added TraceAnalysis LLM tag which captures all memory allocated by the FAnalysisProcessor.

  • Added Trace/CpuProfile LLM tag which captures allocation of per-thread buffers used by the cpu profiler trace.

  • Unreal Insights: Added Exec function API to IUnrealInsightsModule and to IInsightsComponent.

New:

  • Added "FVirtualWinApiHooks::" and ".*/ConcurrentLinearAllocator.*" to symbol filters.

  • Added support for stats counters with the ShouldClearEveryFrame flag to reset to 0 at the beginning of each Game frame during analysis.

  • Added separate counters for frame variants of stats counters with a ShouldClearEveryFrame flag.

  • Added Open Source in Visual Studio option for any callstack frame of any allocation item, in the Allocs Table/Tree view.

  • Added the Trace.Screenshot command to that creates a screenshot and sends it to the trace file.

  • Added TraceAnalysis and Trace/CpuProfile LLM_SCOPEs to reduce Untagged allocations.

  • Extended the command line argument -ExecOnAnalysisCompleteCmd to be used without AutomationTesting and to run custom commands exposed by Insights components.

  • Added custom response file support for -ExecOnAnalysisCompleteCmd command line argument.

  • Added Tag column to the 4K Page Breakdown view preset.

  • Set the initial sorting mode to Descending for most numeric columns in Timers, Counters, Net Stats, Mem Allocs, and generic table/tree views.

  • Added Auto Open Live Trace toggle option in the main menu. If enabled, the analysis starts automatically for each new live trace session, replacing the current analysis session.

  • Added time limit for updating metadata for a trace. If the time limit is exceeded, the current metadata analysis stops, allowing other traces to update metadata, then it will retry with an increased time limit.

  • Added infinite symbol for End Event Index and Event Distance table columns in Allocs Table.

  • Added sorting for all columns in the trace sessions list view.

  • Changed Ctrl+C when copying the selected CPU/GPU timing event to copy the duration and the metadata of the timing event.

  • Added custom commands exposed by the TimingProfiler: - TimingInsights.ExportThreads file, - TimingInsights.ExportTimers file, - TimingInsights.ExportTimingEvents file [-columns="..."] [-threads="..."] [-timers="..."] [-startTime=...] [-endTime=...], The "..." params defines filters for list of columns, threads or timers; it supports *?-type wildcards.

  • Added Platform, AppName, Build Config, and Build Target of trace session being analyzed to the application title name.

  • Added LLM_SCOPE in FSlateApplication::OnSizeChanged in an effort to reduce untagged allocations.

  • Split the "Stats" column into 4 separate columns: Discovered, Cached, Resolved and Failed.

  • Added sorting for all columns.

  • Added Rename option in the context menu for a trace session. Allows renaming for the selected utrace file. The ucache file is also renamed automatically.

  • Added Delete in option context menu for a trace session. Deletes the selected utrace file. The ucache file is also deleted automatically.

  • Added Insights.Enumerate10K and Insights.Enumerate100K tests that can be run from Unreal Insights on any utrace files.

  • Added filtering for the list of trace sessions by Name, by Platform, by App Name, by Build Config, and by Build Target.

  • Added stats.NamedEvents 0/1 and stats.VerboseNamedEvents 0/1 console commands to be able to force enable or disable the NamedEvents. The existing stat NamedEvents and stat VerboseNamedEvents are still available with toggle state behavior.

  • Added error checking for large memory traces.

  • Added Insights memory scope in various places to capture untagged memory when Insights is running in the Editor.

  • Enabled SameValue aggregation for the Memory Tag column of the Memory Allocations table/tree view. The Aggregated value is equal with it's children value if all children have exactly same value, otherwise the aggregated value is empty.

  • Added Class Name column to the Allocs Table together with a custom view preset.

  • Added more UObject memory scopes to reduce the Untagged allocations.

  • Added F5 key shortcut to refresh the list of trace sessions.

  • Added the console command Trace.SnapshotFile. This command saves a utrace file with content of the trace tail buffers.

  • Added Empty Callstack for callstacks traced/resolved with zero stack frames.

  • Added Asset column and Asset view preset to the Memory Allocations table view.

  • Added "Path Breakdown" grouping for all string columns.

  • Added a toggle button to choose between searching and filtering the list of trace sessions by Name or by the Command Line. Added highlights for searched text.

  • Added LLM_SCOPEs in PythonScriptPlugin to reduce the Untagged allocations.

  • Added TraceUtilLibrary to control Insight traces from Blueprints.

  • Added MemoryTrace function name prefix to ignore callstack frames when detecting the top function of a callstack.

  • Updated icon for the UnrealTraceServer.exe.

  • Added new TimingInsights.ExportTimerStatistics command to the ExecOnAnalysisComplete parameter. This will export statistics for all timers to a CSV file and supports specifying a range inside the trace file through bookmarks.

  • Added "Session Browser" in the main menu. Opens the Unreal Insights Session Browser window.

  • Added "Open Trace File / Open in New Instance..." in the main menu. Starts analysis for a specified trace file, in a separate Unreal Insights instance.

  • Added "Open Trace File / Open in Same Instance..." in the main menu. Starts analysis for a specified trace file, replacing the current analysis session.

  • Added "Top Source File" and "Callstack Size" columns in Mem Allocs table and improved tooltip for "Top Function" column.

  • Updated description of some memory rules to avoid confusion.

  • Added LLM_SCOPEs to each analyzer in TraceServices and Insights plugins to reduce the Untagged allocations.

  • Added memory tracing for D3D11 and D3D12 using the "video memory" root heap / address space to match LLM stats.

  • Added GetTraceDestination, IsConnected and GetActiveChannelsString to public interface.

  • Added tracing for the cooking profiler.

Improvement:

  • Memory insights performance fixes for a large hash bucket in the backtrace.

  • Improved the performance and memory usage for sorting the Function column in the Allocs Table and in the sorting of text columns.

  • Implemented micro-optimizations to sorting code for Timers and Counters.

  • Improved coloring to highlight modules with failed status.

  • Improved performance of sorting,filtering, and grouping operations involving the top function of an allocation's callstack.

  • Improved performance of memory analysis (processing of live allocations in AllocationsProvider) with up to 50%.

  • Switched the short living allocations to use only the linked list, with a reduced size.

  • Improved metadata update by prioritizing the newer trace sessions. enabled parallel update for metadata.

  • Improved analysis of scoped memory events by avoiding a "strlen" for each scoped event.

  • Improved analysis of mem tag events.

  • Improved performance of filtering and grouping.

Crash Fix:

  • Fixed a crash in Unique Values grouping for string columns.

  • Fixed a crash when closing Unreal Insights while having a minor tab undocked in Timing Insights, Memory Insights, Asset Loading Insights or Networking Insights.

  • Fixed TraceStats crashing when the stat name is a wide char FName.

  • Workaround for crash in TRACE_LOG_MESSAGE when encounters string arguments are not null-terminated.

  • Fixed a crash when a CPU timing event has metadata with zero fields.

  • Fixed crash in the analysis of timing events emitted just before EndThread trace event.

Bug Fix:

  • Fixed the command line argument -AutoQuit to work without AutomationTesting.

  • Fixed a bug where changing a preset resulted in hiding the Hierarchy column.

  • Fixed "Audio" LLM child tags for Audio_Analysis, Audio_MetaSound and Audio_SpatializationPlugins.

  • Multiple fixes and improvements to TPagedArray and its iterator.

  • Fixed trace analysis to continue reading at least one more loop after encountering a SYNC point.

  • Fixed case where SourceCodeAccessor remains in a started state and does not respond anymore to more requests.

  • Fixed support for unicode file names for trace files in the UnrealTraceServer.

  • Fixed session name when a trace name contains a dot char.

  • Fixed deadlock for analysis thread when session completes.

  • Fixed issue where the number of Discovered symbols for a module was lower than Resolved and Failed.

  • Disabled Profiler if STATS is not enabled.

  • Fixed the order of GPU and GPU2 tracks.

  • Merged tags that had the same name but different id, when grouping by Tags in Memory Allocs table.

  • Fixed grouping by Tags in the Memory Allocs table when all tags are unknown/untagged.

  • Fixed StatsTrace from incorrectly tracing disabled stats.

  • Fixed callstack tracing not capturing correct backtrace for majority of allocations in Editor Win64 Debug.

  • Fixed analysis of timing events with metadata.

  • Fixed the full name of LLM tags to include parent names when there are multiple levels of inheritance.

  • Fixed track invalidation when a track filter is changed.

  • Fixed TextureProfiler to emit the inline stat spec events only once. The spec events are "important" trace events. These events are cached by the trace system, so they should not be emitted continuously.

  • Fixed Important Events cache stats displayed by Trace.Status console command.

  • Fixed allocations analysis to safely ignore errors re invalid MemoryScopePtr scoped events.

  • Fixed max width for the search boxes.

  • Fixed initialization of Platform Events.

  • Fixed missing tree items when multiple groupings are added in a generic Tree Table view. Groupings are now recursively applied correctly when a grouping creates a hierarchy of node.

Removed:

  • Removed Unique Values grouping for StartEventIndex, EndEventIndex and Count columns.

  • Removed Path Breakdown grouping for Top Function column.

Framework

New:

  • Added support for multiple concurrent devices in RawInputPlugin.

  • Increased the number of Axis to 24 and the number of buttons to 96.

  • Added support for objects being managed by the Significance Manager without reference elimination.

  • Cleaned up references between scene components when Actors are destroyed or streamed out, to avoid holding reference to garbage objects. On destruction, attachments are cleared between components owned by different actors. On un-initialize component, attachments are cleared between components in different outer hierarchies, i.e. different streaming levels. Note that this changes behavior so that attachments between scene components in different levels will be broken when either level is streamed out (made not visible) even if the level is not unloaded and garbage collected.

  • Added query functions for Blueprints to check if there were modifier keys held (Alt, Shift, etc.) given a key state struct.

  • Added logging to indicate when log levels have been raised to verbose levels to help track down log spam.

  • Unified how we modify GCycleStatsShouldEmitNamedEvents so that we guarantee it won't drop below zero.

  • Made FAssetData ~16 bytes smaller (technically 20, but there's an odd number of 32-bit structures now, so we'll shrink 8 when deprecated AssetClass is deleted). This saves about 5MB if the project has 300K+ assets. Ensure you switch any manual manipulation of ChunkIDs to use the helper methods.

  • Optimized code size and overhead for Insights markers generated for scope cycle counters. Down from 213 bytes per marker, to 142 bytes.

  • Added UE::LWC::NarrowWorldPositionChecked run time validating narrowing cast for FVector world positions.

  • Enabled ISPC on more supporting platforms and subsystems.

  • Added a UStruct-type parameter to TStructTypeBitSet type to further improve its type-safety.

  • Added Blueprint Graph Support for FInstancedStruct.

  • Added an "index iterator" to TStructTypeBitSet, allowing iterative retrieval of non-empty indices of a given container.

  • Added UPropertyBag and FInstancedPropertyBag, which allow users to configure and edit custom structs inline via UI or code.

  • Added a function to TStructTypeBitSet to fill an instance with an amount of false or true values corresponding to the number of known types tracked by a given bitset specialization.

  • Extended TStructTypeBitSet to support UClasses as well.

  • Added SetLineThickness() to UBoxComponent.

Bug Fix:

  • Fixed incorrect parent class in data only blueprints if parent class was changed without compiling.

  • Fixed crash after using LiveCoding to remove an interface function while the blueprint editor was open.

  • Fixed an issue where the SceneComponent hierarchy on component destruction was attaching the to-be-destroyed child components to new parents, and did not attach living child components to to-be-destroyed parents.

  • Fixed an issue where there was a possible division by zero in FHistogram::GetAverageOfAllMeasures.

  • Fixed an issue where strong pointers for UGameFrameworkComponentManager::AllReceivers were being stored, so failure to remove actors prevented world cleanup after PIE when GC reference elimination (pending kill) was disabled.

  • Removed the reference from Player to PlayerController when PlayerController removes its reference to Player in OnNetCleanup.

  • Fixed an issue where there was duplication of implemented interfaces in parent Blueprint classes.

  • Fixed an issue where references from LODActor where not being released when SubActors were destroyed.

  • Fixed an issue where user widgets were not being allowed to remove themselves from the player layers in the viewport even if the associated player controller was destroyed.

  • FComponentReference::OtherActor was converted to a weak object reference.

  • Fixed an issue where StructTypeBitSet.StructTracker was not being instanced per module.

  • Converted serialized external actor/component references to weak object references in the debug camera controller so that they don't prevent garbage collection.

  • Fixed the Reset to Default button behavior on Instanced Structs.

  • Fixed several truncation warning to the Engine module and its dependencies.

  • Fixed several issues with MassReplication when adding and removing clients.

AI

New:

  • In MassEntity, shared fragments have been changed from being unique per archetype to unique per chunk.

  • Added MassEntity optimization when new archetypes are added to the system. When a new Archetype is added, the queries will now only check against the newly added Archetypes, instead of running against all available Archetypes.

  • Removed the MassEntity Archetype filter because the system no longer shares fragments per archetype (fragments are shared per chunks). Users should now use Chunk filters on shared fragments.

  • Added a button in the property grid that validates the Mass Entity Config asset.

  • Added code that detects an infinite loop in BTDecorator_ConditionalLoop, just like in BTDecorator_Loop.

  • Added a new console command that freezes any Mass Movement. This helps users debug Mass Movement.

  • Added functionality to Mass Trait to allow users to specify fragment ownership and dependencies.

  • Added option where the user can specify to incur most of the Mass Fragment initialization cost in the first frame, instead of spreading the cost throughout the first period.

  • Added a pop up toast that informs the user that no errors were detected during the MassEntityConfig validation process.

  • Stopping a Behavior Tree during processing is now supported. The request is queued until the Behavior Tree processing is completed.

  • ANavigationData now supports external packaging. This prevents sublevel navigation data from being discarded when using OFPA.

  • Added a warning to UNavigationSystemV1::GetNavDataForProps when using invalid FNavAgentProperties.

  • The NavMesh tile pool can now be resized when being built through the UWorldPartitionNavigationDataBuilder (ignoring bFixedTilePoolSize).

  • A warning will now appear when tiles cannot be added to the NavMesh because the tile limit has been reached.

  • The NavMesh debug display property bHeightfieldSolidPostRadiusFiltering has been renamed to bHeightfieldSolidPostInclusionBoundsFiltering. In addition, several properties were given descriptions.

  • The initialization of dtNavMesh parameters have been moved to the init() and the parameters are now serialized in ARecastNavMesh. This provides safer initialization flow and fixed potential mismatches between the NavMesh Actor and the serialized NavMesh data.

  • Changed bAutoDestroyWhenNoNavigation to be false by default in the NavMesh.

  • The NavMesh FGameplayDebuggerCategory_Navmesh can now display navigation data name, even if not a ARecastNavMesh.

  • Added log tracking to FRecastNavMeshGenerator RebuildAll(), independently of hte loading time.

  • Changed OnNavigationGenerationFinished() to display the Actor label and full name, instead of the package name.

  • Extracted FNavigationDirtyElement from NavigationTypes.h and removed all include dependencies.

  • Copying cache data when filling navigation data chunk actors for Navmeshes using the Dynamic Modifiers Only mode.

  • Upgraded to use FVector::FReal rather than floats.

Improvement:

  • The NavMesh will only include the navigation relevant components when computing UNavModifierComponent navigation bounds.

  • Navigation will only update Actors and its components in the Navigation Octree if the Actor has been initialized.

Crash Fix:

  • Fixed a bug in ARecastNavMesh::InvalidateAffectedPaths where a pointer could be pointing to an invalid memory location resulting in a crash.

  • Fixed a bug that would result in a crash when the EQS Details panel was closed while selecting a Test or Generator in an EQS query.

  • Fixed a bug in FEditorBuildUtils::TriggerNavigationBuilder() where a missing package would cause a crash.

  • Fixed an issue where using the World Partition Static Navmesh would cause a crash.

Bug Fix:

  • Fixed an issue where a new stimuli was added while processing the existing ones and this was causing issues.

  • Fixed an issue in the Behavior Tree where a search would result in a Decorator or Service being ticked twice in the same frame.

  • Fixed a bug where the range loop of the AI Perception component would change while iterating through stimuli.

  • Fixed a bug where a Behavior Tree would crash when the Actor destroyed itself while inside a Behavior Tree notification (e.g.: Tick, BecomeRelevant, CeaseRelevant, etc).

  • Fixed a bug where UAIPerceptionSystem UnregisterSource(Actor, SenseClass) would not do anything if a null SenseClass was passed in. Now it correctly unregisters the source Actor from all senses.

  • Fixed a bug where sometimes a Behavior Tree would select the wrong node, if the selected node was a subtree.

  • Fixed an issue in the Behavior Tree where a queued request during a transition would be executed, even if the requestor was not active anymore.

  • Fixed a bug where the Mass Processors Config values that are edited via the Project Settings were not saved correctly.

  • Fixed a bug in the Visual Logger cone macro where the Origin parameter did not match its function definition.

  • Fixed the low height span filtering during navmesh generation (Fixed bugs where the NavMesh would not be generated under low height objects).

  • The World Partition NavMesh builder will now avoid saving empty packages, as the delete operation is already saving them.

  • Updated dtClosestHeightPointTriangle() to check the denominator to prevent NaN results. In addition, this change improved precision and calculation speed.

  • Fixed a bug where the World Partition NavMesh would not generate because of incorrect settings.

  • Recently added Hierarchical Instanced Static Meshes log will not be displayed to reduce clutter.

  • Fixed a bug where the transformed convex collision was generating an incorrect NavMesh.

  • Fixed a bug where the NavMesh would not generate correctly for Landscape Mesh Collision Components.

  • Fixed a bug in dtRandomPointInConvexPoly() where it would return an incorrect value when the s parameter is equal to 1.

  • Fixed an issue where RecastNavMeshGenerator was dirtying tiles if dirty areas overlapped them.

  • Fixed a navigation issue where using bShouldBuildNavigationData and UResavePackagesCommandlet would check out non-navigation data-related assets.

  • Fixed an issue in World Partition Navmesh where WorldPartitionNavigationDataBuilder was checking out packages that were being deleted, overriding their delete status.

  • Fixed an issue in the Navmesh where using int32, instead of FNavTileRef for updated tiles would result in tiles being reused from the tile pool while still being referenced in the updated tile lists

  • Fixed an issue in the Navmesh where using the bShouldDiscardSubLevelNavData property was not working in some use cases. This property now takes effect in ARecastNavMesh::PostLoad(), instead of ARecastNavMesh::PostInitProperties().

  • Fixed an issue where Foliage instance static meshes were not affecting the Navmesh.

  • Fixed an issue where UResavePackagesCommandlet was not waiting for Static Meshes to be compiled before generating navigation data.

  • Fixed an issue with the Gameplay Debugger Navmesh rendering where using bRestrictBuildingToActiveTiles and GetDebugGeometry() would gather data for all active tiles for each tile in the TileSet, instead of doing this once. This was causing high framerates.

  • Fixed an issue with Hierarchical Instance Static Meshes where they were not modifying the Dynamic Navmesh if there were no instances on the component register and the instances were added later on.

Deprecated:

  • Remove some deprecated methods and members in navigation.

AI Debugging

Crash Fix:

  • Fixed an issue where the GameplayDebuggerPlayerManager's editor-time ticking was getting its game-world tick via the tickable object mechanic. This was causing a crash in cases where GameplayDebuggerPlayerManager tried accessing UWorld.

Bug Fix:

  • Fixed an issue where users were not able to summon VisualLog while in the ‘-game' mode. This still requires ENABLE_VISUAL_LOG to be true.

AI EQS

New:

  • Changed the EQS Test's Reference Value to have the opposite effect matching its description and designed function. This change ensures the proper fix up of existing assets in PostLoad.

Crash Fix:

  • Fixed an issue with EQSTestingPawn where undoing editor-time actor movement from a "No EQS query results" location to a "some results" location was causing a crash.

Bug Fix:

  • Fixed an issue where EEnvTestScoreOperator::Multiply was not initializing the ItemScore value.

AI Navigation

New:

  • Added the ability to build navigation for runtime data layers.

  • Added options to select and display internal Navmesh tile generation steps by setting properties on a Navmesh actor.

  • Added the OnNavigationInitDone delegate to UNavigationSystemBase.

  • Added the FindOverlappingEdges() method to get wall edges that intersect a convex polygon.

  • Added debugging code to track when Navmesh regeneration is taking longer than the desired maximum time allocated per frame during the time-slice operation. Slow time sliced tiles are logged both in normal log files and the visual logger. See FNavRegenTimeSlicer::TestTimeSliceFinished().

  • The Navmesh recast ledge span filtering code now supports time slicing.

  • Removed dtOffMeshSegmentConnection::height because it was not being serialized. This variable is currently unused.

Improvement:

  • The corridor now caches navigation data around the path and allows smoother path following, with less access to the navigation data during the path following.

Bug Fix:

  • Fixed an issue with client-side dynamic Navmesh generation.

  • Fixed an issue where the bounds passed to FNavigationOctree::AddNode were not being validated properly.

  • Fixed an issue where the Navmesh rendering colors were not displaying correctly when originating from a recast.

  • Fixed an issue where building the Navmesh by using the chunky region partitioning included the remaining non-divisible cells into the last split.

  • Fixed an issue where CalculateMaxTilesCount() was not changing correctly per platform and target.

  • Fixed an issue where the Navmesh rendering was not displaying some triangles.

  • Fixed an issue where the warning "Can't load actor" would appear when building a World Partition Navmesh. This was caused by Actors being deleted but World Partition not being notified and trying to load deleted Actors.

  • Fixed an issue where the message "The Navigation Mesh needs to be rebuilt" was appearing when running a Listen Server and Client.

  • Fixed an issue where building the NavMesh with disconnected single cells would not build contours.

  • Fixed an issue where the message "The Navigation Mesh needs to be rebuilt" was appearing when there was no navigation being built.

  • Fixed an issue where UInstancedStaticMeshComponent's navigation relevancy could result in removal from the Navigation octree if UNavigationSystemV1::UpdateActorAndComponentsInNavOctree was called after the first ISM instance got added.

  • Fixed an issue where cell size was clamping incorrectly in the RecastNavmesh.

  • Fixed an issue where some memory in FNavigationMemoryStat was not being tracked correctly. We were calling FDefaultAllocator::ForAnyElementType instead of FNavigationMemoryStat::ForAnyElementType and we were not logging memory used via STAT_NavigationMemory.

  • Fixed an issue where the navigable areas were not checking that their recast tile indices would fit into an int32.

  • Fixed an issue where a missing Crowd Manager would result in a nullptr de-reference.

  • Fixed an issue where collision boxes would have their Navigation Area Class reset to NavArea_Obstacle on project load.

  • Added a fix for Server Assert at FNavRegenTimeSlicer::TestTimeSliceFinished upon initializing a session.

AI Perception

New:

  • Added a log message to make it clearer when a perception component is not attached to a controller.

  • Added the ReportTouchEvent() function for touch sense.

AI Smart Objects

New:

  • Added a method to retrieve a Behavior Definition from a request result.

Crash Fix:

  • Fixed an issue with the SmartObjectSystem where trying to register a SmartObjectComponent without a SmartObjectDefinition set would result in a crash.

Bug Fix:

  • Fixed an issue with SmartObjectCollections and Smart Object registrations not working correctly when Smart Objects were placed in a persistent map before the collection was built. The collection building keeps its role as a component-independent Smart Object entity collection.

Audio

New:

  • Added the AudioMotorSim plugin that provides a generic way to compose vehicle behaviors from a set of tunable, reusable components.

  • Added a Source Effect variation of Convolution Reverb.

  • Added a new Reverb AudioGameplayVolume Component, which controls reverb effects upon entering or exiting the associated volume.

  • Added a new Submix Override AudioGameplayVolume Component, which controls submix effect chain overrides upon entering or exiting the associated volume.

  • Added the Absolute Value MetaSound node.

  • Added OnListenerEnter and OnListenerExit Blueprint events for AudioGameplayVolumes.

  • Added the QToBandwidth MetaSound node that converts filter parameter values for ease of use with the Biquad Filter node

  • Added a name field to Audio Gameplay Volume Filter Proxy.

  • Added a name field to Audio Gameplay Volume Attenuation Proxy.

  • Added timecode rate and drop frame data reading from RIFF iXML for Sound Waves.

  • Added the au.Debug.Streaming console command to support audio stream profiling.

  • Added the Ring Modulation MetaSound node.

  • Added the ability to default AudioModulation ModulationControlMix stages to the value of a bus' parameter when changing a mix stage's associated ModulationControlBus.

  • Added the Trigger Select MetaSound node to support passing input triggers to output triggers based on given input indices.

  • Added Trigger On Threshold MetaSound nodes for Float and Integer types.

  • The WavePlayer MetaSound node now supports surround sound audio channel configurations.

  • Constructor pins have been added to allow you to set constant values for the lifetime of a MetaSound asset.

  • Added Bink Audio decoder libraries for Stadia.

  • Added low-level memory tracking for audio spatialization plugins.

  • MetaSound Sources now support surround sound audio output.

  • SoundWave Cue Points can now be accessed from Blueprints.

Improvement:

  • AGVListener tracks active proxy mutators to allow for a removal step.

  • AGVListener tracks owning audio device ID (instead of world ID).

  • Added detail customization to the AudioGameplayVolume Reverb component.

  • Renamed FillMutator to CopyAudioDataToMutator in the AudioGameplayVolume system to better reflect functionality.

  • Restructured creation code path in the AudioGameplayVolume system to remove the need for Super calls.

  • Renamed AudioGameplayVolumeProxyComponent to AudioGameplayVolumeComponent to reduce name length and to better reflect intent.

  • Renamed UAudioGameplayVolumeComponentBase to UAudioGameplayVolumeMutator.

  • AudioGameplayVolume Components may now be added at runtime.

  • Added profiling information for Audio Gameplay Volume Proxy types.

  • Reduced the baseline runtime memory footprint for MetaSounds.

  • Source Data Override plugins can now be implemented for all of our supported platforms.

  • Improved low-level memory tracking in audio-related code to provide more accurate data for analysis and debugging.

  • Re-enabled support for visualizing sound source attenuation shapes with the au.3dvisualize.attenuation console variable.

  • Renamed UMetaSound to UMetaSoundPatch for clarity and in response to community feedback.

  • Audio Modulation destinations now support sets.

  • Audio Modulation sources now support unions and can be mixed with each other at runtime.

  • Audio parameter transmitters will no longer be generated for SoundWave asset types which do not support parameters.

  • Improved support for 3rd party and plugin-defined DataTypes within MetaSounds.

  • Submix sends can now be performed before or after attenuation.

Crash Fix:

  • Fixed a crash that occurred when calling certain Audio Bus Blueprint nodes without input assets.

  • Fixed a crash that occurred in AudioCapture when no audio devices were enabled.

  • Fixed a crash that occurred when undoing changes to AudioVolume assets.

  • Fixed a crash that would occur when using the submix spectrum analyzer with an unclamped hop size.

  • Fixed a crash caused by the Flanger MetaSound node.

Bug Fix:

  • Adjusted Audio Gameplay Volume Proxy activation timing so that other components have a chance to initialize first.

  • Fixed an AudioGameplayVolume issue concerning an uninitialized listener at the origin.

  • Fixed an issue where Audio Gameplay Volume Listener Enter and Exit messages would propagate to disabled components.

  • Fixed errors in several tooltips.

  • Fixed an issue in GameplayStatics involving ownership assignment of new Audio components.

  • SynthComponent will now avoid taking destroyed component pointers when creating audio components.

  • Fixed unexpected Actor lifecycle behavior due to Sound Library holding strong references.

  • Generator nodes in MetaSounds will no longer behave incorrectly when given negative frequencies.

  • Fixed a frequency modulation issue in MetaSounds that would result in frequencies going above the Nyquist frequency.

  • Fixed an issue where the submix buffer listener would erroneously receive audio with sibling submix audio mixed in.

  • Fixed an overflow warning in the Soundscape system.

  • Changes made to virtualized MetaSound parameters from Blueprints or C++ will now be respected.

  • Fixed an incorrect calculation of real values of spectrum in AudioFFT.

  • Fixed an issue where setting the Wet/Dry value on the Compressor MetaSound node would introduce phasing.

  • Mixed values will now be properly passed in the associated parameter's units when using the Normalized Boolean option on a MetaSound Modulator Mix node.

  • Importing a 16-bit .wav file will no longer send a warning to the output log.

  • Fixed an issue where a Modulation Parameter's unit would not display correctly when used in a Control Bus Mix.

  • Undo and redo actions will now function properly when adding and removing MetaSound interfaces.

  • Fixed streaming seek failures in LPCM decoder.

  • Fixed a bug where MetaSounds did not properly virtualize if the WaveInstance's Volume Modifier value is set to 0.

  • Fixed a bug where putting large values in the Bitcrusher MetaSound Node's Bit Depth value would occasionally produce unexpected distortion.

  • Sample count in the Bink decoder is now properly updated when seeking.

  • Correctly modulating a parameter on a SoundWave or MetaSound will no longer display a mismatch warning.

  • The Parameter and Destination mismatch warnings now display all mismatches on the SoundWave or MetaSound.

  • The MetaSound Editor meter values and channel count now display correctly for mono MetaSound Sources.

  • Fixed an issue where MetaSound input nodes would create unexpected connections when renaming.

  • Fixed an issue where using multiple submix spectral analysis delegates would produce incorrect output values.

  • Fixed an issue where MetaSound nodes contained within comment nodes could produce unintended movement.

  • MetaSound assets with non-spherical attenuation will now virtualize properly.

  • SoundWave asset thumbnails will no longer disappear when dragging and dropping.

  • Fixed an issue where enabling the base submix toggle would not affect previewed MetaSounds.

  • Fixed an off-by-one error causing looping SoundWaves within MetaSounds.

Deprecated:

  • The MatchDevice option for Sound Wave Sample Rate Quality has been deprecated.

Blueprint

New:

  • Minor QoL improvements for Blueprint stack traces.

  • Warnings will always display the name of the function that tripped the warning.

  • Complete stack traces have an additional <--- to highlight the top of the stack.

  • Full paths are used, which helps track down the package that has the Blueprint.

  • Exposed UCurveBase class to Blueprint.

  • Move Blueprint extensions to private and exposed getters and setters.

Crash Fix:

  • Fixed crash in the script disassembler.

  • Fixed CompileAllBlueprints from crashing on a Blueprint function that contained a delegate input.

Bug Fix:

  • Tooltips for floats were not the same in the My Blueprint window for floats, the display should now include either a single-precision or double-precision next to the float type.

  • Event Dispatcher Inputs will now inform and warn the end-user when there is an existing matching input name.

  • Fixed a missing warning when macro pins have a name conflict.

  • Updated code comment on FScriptMapHelper and FScriptSetHelper FindInternalIndex functions. The API will now redirect potential callers to the more efficient method for iteration.

  • Exposed on spawn properties which use a BlueprintSetter if available.

  • Fixed Loss of precision with String to Float Real conversion.

  • Fixed a regression which caused the root transform to be discarded on a serialized Actor-based Blueprint's instanced component hierarchy after inserting a new root component into its native parent class.

  • Fixed FAssetData from reporting that a UBlueprintGeneratedClass is a UBlueprint which was causing the wrong ActorFactory to be selected.

  • The tooltip for float map values in Blueprint Structures will now show precision Similar to GetToolTipForComboBoxType and GetToolTipForComboBoxSecondaryType.This ensures that we can see the precision of the float type when it's a map value.

  • Fixed an Infinite Loop that was caused from Macros setup not being detected.

  • Fixed a regression that could block property value serialization of import text from creating a placeholder linker object in lieu of a deferred Blueprint class asset at editor load time.

  • Fixed a legacy pin default value mismatch warning check on node reconstruction to handle string diffs that convert to identical values.

  • Blueprint Class Default Object package export creation is now deferred on load so placeholder dependencies can be resolved prior to invoking the native base class Actor. This allows for proper component type override support at the Blueprint editor level.

  • Fixed a CIS Content Error where unhandled implicit casts were found during compilation of a function. The BP compiler had erroneously reported that python nodes might be missing implicit casts.

  • Delegate fixup was not working when bound functions are not in the current Blueprint. A consequence of using doubles in Blueprints is that delegate binding can fail if a native delegate signature uses floats. The proxy function graph will now read this property when it calls the original function.

  • Vector literal pins had lacked precision with high values Similar to other numerical Slate widgets. SGraphPinVector now has a template so that it can choose between a float and double representation. Currently, only the BP editor will use the double variant, while other tools continue to use a float.

  • SGraphPinVector2D and SGraphPinVector4 have been updated to use a template.

  • Fixed FBasicTokenParser::GetToken function to support double literals.

  • Added support for resolving weak references to placeholder linker objects created in deferred Blueprint object serialization paths on editor load.

Deprecated:

  • Deprecate Make Literal Double node Instead of having two float-related literal nodes, we should only have one.

  • Deprecated ClassNames and RecursiveClassesExclusionSet pins on make and break nodes for the native ARFilter struct type.

  • Deprecated UBlueprint::bHasAnyNonReducibleFunction.

Removed:

  • Removed engine plugin test assets that were no longer in use.

Blueprint Compiler

Crash Fix:

  • Fixed a crash when adding or removing variables from a Blueprint that inherits from another Blueprint.

  • Fixed a Blueprint compiler crash that occured after deleting a default instanced subobject element from a set or map variable.

  • Removed a redundant second-stage compilation pass after duplicating a Blueprint with a missing or invalid parent class, which could lead to a crash in certain scenarios.

  • Serializable data is now purged before consigning child function objects to the trash container during Blueprint class compilation. This avoids crashes related to serializing object references after they may have been freed.

  • Fixed a Blueprint compiler crash that occurred when struct type dependencies were missing

Bug Fix:

  • Delegate bindings are now fixed after renaming a custom event node without requiring a full Blueprint compilation pass.

  • Fixed the Blueprint compiler to generate a well-formed bytecode expression for a struct literal term when the struct type declares one or more fields of a type that does not have Blueprint support.

  • Fixed regression when reinstancing Blueprints that have complicated child object graphs.

  • Updated cache dependent lists prior to reloading and/or unloading a Blueprint's outer package.

  • No longer attempt to re-instance artifacts from a previous re-instancing pass when reloading a Blueprint asset.

  • Inherited component template overrides are now being included in Blueprint data validation.

Removed:

  • Removed the Blueprint editor project setting: "Force All Dependencies to Recompile". The command BP.bForceAllDependenciesToRecompile 1 can be used at the console for debugging if still needed.

Blueprint Editor

New:

  • Added a Break This Link command to graph editor, which is displayed instead of the Break Link submenu when there's only one link to display.

  • Exposed enum EAssetEditorOpenLocation to Blueprint

  • Blueprint namespace editor features are now enabled by default.

  • Blueprint graph pin value inspection tooltips are now expandable by default when debugging in PIE.

  • Reportedadditional context to the log without crashing the editor.

Crash Fix:

  • Fixed the source of a potential editor crash during Blueprint namespace harvesting.

  • Fixed a regression that led to an editor crash when right-clicking a Blueprint delegate variable without an active function graph tab.

  • Fixed an editor crash that would occur when replacing one or more references to a conflicting variable name after reparenting a Blueprint class.

  • Fixed a crash that occured when undoing an Add Event operation in the Blueprint Editor.

Bug Fix:

  • Enabled external DLL linkage for SFindInBlueprints (and related) Blueprint editor APIs.

  • Unloaded type assets are now included in the member type selector in the User-Defined Structure asset editor.

  • Blueprint-added component names are now validated on entry to conform to UObject naming conventions.

  • We now defer re-running construction scripts until after we fix up the template hierarchy when duplicating a component in the Blueprint editor.

  • Removed some unnecessary computations in FEdGraphPinReference::GetTypeHash.

  • Excluded override flag members from the optional input pin set on MakeStruct nodes. An "override flag" is an inline toggle-style Boolean edit condition.

  • Inline toggle edit conditions can no longer be exposed directly as an input on a MakeStruct node. This brings the MakeStruct node UX closer to parity with the Property Editor UX.

  • Composite nodes can no longer be pasted into Blueprint graphs that aren't schema-compatible with the node's subgraph.

  • Fixed a regression that could trigger an ensure when editing inherited variable default values in the Blueprint editor.

  • Fixed a regression that caused subobjects instanced from non-native archetypes to fail export creation, which led to some data loss on load.

  • Added guard code to catch invalid Blueprint node spawner references during Garbage Collection.

Blueprint Runtime

Bug Fix:

  • A stub function is now emitted if the Blueprint compiler backend raises an error during translation of compiled script statements to bytecode. This avoids a potential ICE report at runtime.

  • Blueprint execution will now bypass development-only nodes in a Blueprint function graph when a project is configured to compile them out at cook time.

  • Fixed latent call site targets in a compiled Blueprint ubergraph to avoid re-entry when the latent info term is declared as the first argument in the native API signature.

Gameplay

API Change:

  • Now Ability Tasks should make sure to call Super::OnDestroy only after they do anything needed to the Ability pointer, as it will be nulled out after calling it.

New:

  • Added support for Gameplay Effects to add blocked ability tags.

  • Exposed APlayerState::IsSpectator to Blueprints.

  • Added console variable for Blueprint Action Filter Caching. (set BP.EnableActionMenuFilterCaching to true to speed up right click menu in Blueprint graphs)

  • Converted FGameplayAbilitySpec/Def::SourceObject to be a weak reference.

  • Made a Ability System Component reference in the Ability Task a weak pointer so Garbage Collection can delete it.

  • Added WaitGameplayTagQuery nodes. One ia based off of the UAbilityTask and the other is of UAbilityAsync. This node specifies a TagQuery, and will trigger it's output pin when the query becomes true or false, based on configuration.

  • Added a templated version of the GetCharacterMovement function.

  • Added color coordinated outlines to changed nodes/pins in the Blueprint diff window to reflect their diff state.

  • Added virtual method to controllers to control if they participate in seamless travel.

  • Modified AbilityTask debugging in Console Variables to enable debug recording and printing to log by default in non-shipping builds (with ability to hotfix on/off as needed).

  • You can now set AbilitySystem.AbilityTask.Debug.RecordingEnabled to 0 to disable, 1 to enable in non-shipping builds, and 2 to enable all builds (including shipping).

  • You can use AbilitySystem.AbilityTask.Debug.AbilityTaskDebugPrintTopNResults to only print the top N results in log (to avoid log spam).

  • STAT_AbilityTaskDebugRecording can be used to test perf impact from these on-by-default debugging changes.

  • Added the ability to override the list of default Blueprint categories. These can be configured in the Blueprint Editor settings.

  • Exposed functions for fetching a scalar material parameter index and then setting the parameters by index to Blueprint in order to optimize cases with extreme amounts of material parameters where many are set each frame.

  • Made UDataAsset types diffable in editor rather than from text.

  • Removed redundant enum EWaitGameplayTagQueryAsyncTriggerCondition.

  • Removed AActor::DetachFence reducing size of AActor by 16 bytes. It's not necessary to prevent the Actor from being deleted before the component finishes its destruction. In Garbage Collection all objects must complete FinishDestroy before any objects can be freed, and UPrimitiveComponent's fence will ensure both objects live long enough.

  • Added a new Initialization State System to the Game Framework Component Manager. This system allows individual components to register with a global subsystem for handling initialization state changes for an Actor without requiring that the Actor knows about all possible components.

  • Components can broadcast their state during initialization and other components can listen for callbacks on state changes. This is designed to be used with Game Feature Plugins to build game-specific initialization flows that work properly in multiplayer situations.

  • Fixed typos with type name, FMinimapReplicationTagCountMap to match the type name FMinimalReplicationTagCountMap.

  • Added a new PreLevelRemovedFromWorld callback for cases where the handler needs to act on the level while it still has its OwningWorld.

  • Added support for preloading data registries and sources in the editor when a game feature is registered instead of waiting for full activation. This will show the valid keys in the picker UI but can result in missing errors for invalid accesses in PIE. This is currently opt-in with PreloadInEditor on the game feature action.

  • Updated the SignificanceManager which maintains lists of objects to update rather than rebuilding each frame. Previously we would build up the lists of objects to update, and the list of objects requring sequential post work each frame. We now update these lists in Register/Unregister to keep them in sync with ManagedObjects.

  • GameplayTasksComponent and AbilitySystemComponent now support the registered subobject API

  • Moved some replicated members to private access. Derived classes should use the Get/Set functions instead. By default these components keep replicating their subobjects from the ReplicateSubObjects function.

  • Added support for removing plugin-added gameplay tags when a gameplay feature is unregistered. With default settings this will only happen in the editor as removing tags at runtime is much riskier.

  • Added the Blueprint Header View plugin, a new tool to assist developers in converting Blueprints to C++.

  • Create the Platform Input Device Mapper. This provides an interface that platforms can use to create a map of Input Devices to their owning PlatformUser. This will allow for granular control of how many input devices are mapped to a single user, which some platforms want to do differently than others.

  • The API can be used to query what devices are mapped to which user, so that you can easily determine which controller should recieve a force feedback event, or which user has pushed a certain button.

  • Created the FInputDeviceID struct, which represents a single input device such as a gamepad, keyboard, or mouse. These are globally unique, and allocated by the Platform Input Device Mapper. This struct will replace the old "int32 ControllerID" that is used in various places to provide some type safety and maintainability.

  • Added Functions to query all the currently connected devices on a given platform, as well as get their current state and owning platform users. These can be exposed to Blueprints from the local player, game instance, or a subsystem in the future.

  • New delegates for the ConnectionChange and PairingChange of a gamepad device that utilize the new FInputDeviceId and FPlatformUserId.

  • Added functions to the GenericApplicationMessageHandler for the "OnController_X" functions.

  • Added visibility for local function variables inside the Blueprint diff tool.

  • Added debug recording of camera shakes.

  • Added a debug command to filter GameplayCue events.

  • Fixed Typo and format in K2Node_IfThenElse.

  • Added a showdebug Devices command that will display debug info about all current platform users and their connected input devices. This will display some basic information on the screen that will be useful while testing on different platforms.

  • Added an Input Setting to toggle motion controls. This can be useful if you want to enable/disable any logic inside of UPlayerInput::InputMotion. Adding this setting in the Input Settings will make it a config variable that you can simply set per-platform from the DefaultInput.ini, which will be useful when shipping on multiple platforms.

  • Added this flag on the player controller so that you can enable or disable motion controls per player if desired.

  • Added a boolean bShouldFireDelegatesInEditor property to the Enhanced Input Component. This will make sure that only Input Components that have the flag specifically set when they are created will fire in-editor delegates with an Editor Script Guard. This ensures that no game-only input actions will be fired as editor delegates while keeping the implementation details hidden from the editor users.

  • Added Register and unregister camera stand-in property accessors on module load and unload.

  • Added GameplayStatics functions for getting the player's platform user id instead of the older int32 controllerID.

  • Added a ShouldFlushKeysWhenViewportFocusChanges function to the player controller, which allows the GameViewportClient to check if the PlayerController keys need to be flushed when the viewport changes depending on the Input Mode you are in.

  • Blueprint Debugger's search field will now search for actual variable names as well as display names

  • Renamed UMatineeCameraShake to ULegacyCameraShake.

  • Added ability to check if a UInputComponent is in an APlayerController's input stack.

  • Added Override properties for the Player Input and Input Component classes on the Pawn and Player controller. This will give you the capability to override the input classes at the Blueprint level so that you don't need native C++ to override it.

  • Created accessors on the Enhanced Player input for the currently applied mapping contexts and mappings. These functions will make it easier for users to extend this class, while still keeping the AppliedInputContext and EnhancedActionMappings properties const and non-mutable.

  • Added the Enhanced Input Editor Subsystem. The Enhanced Input Editor subsystem will allow you to bind to Input Delegates in Editor Utility Actors or other Editor-time objects. The input is driven by an InputProcessor, and this subsystem will only incur any cost to the user if they manually enable it.

  • Added an input component to the Editor Utility Actor so that you can bind to enhanced input and other runtime input delegates in editor utilities outside of PIE. This will make it easier for virtual production teams to bind input of physical camera equipment to Actors in the level. Listening to input is opt-in per utility, and would currently only be triggered if you create an associated Input Action that is available to the Editor.

  • Made the TickForcedInput function protected on the EnhancedInputSubsystemInterface. Without this, the only place that you can tick the input on the Enhanced Input subsystem would be from the Enhanced Input module itself.

  • Added Degree ATan and Degree ATan2 to the k2node_mathexpression, as well as DegreeToRadian and RadianToDegree functions.

  • Added UTimelineComponent::GetScaledTimelineLength function, which returns the timeline's length divided by the play rate.

  • Changed the default behavior for variable name collisions with a native parent class, Blueprint variables will now be removed and all references in Blueprints will point at the native variable.

  • Added Enhanced Input developer and Platform settings which will allow you to specify per-platform input data. Created a "UEnhancedInputPlatformData" base class that can be subclassed in a Blueprint and placed on specific platforms. By default, this object has a map of Input Contexts that will "redirect" one context to another. This makes it possible to swap out Input Mapping Contexts on specific platforms, with an asset that will simply be added to the input ini of the game.

  • Added Gameplay cameras world subsystem for an easier way to start and stop animations.

  • Added a flag for flushing input when you change the UI mode on a player controller. This will ensure that any input actions get properly canceled and have their key state reset if desired.

  • Added new debug commandsAbilitySystem.DebugAbilityTags, AbilitySystem.DebugBlockedTags, andAbilitySystem.DebugAttribute to the Gameplay Ability System.

  • Automatically upgrade projects with the default input class to use Enhanced Input when the project starts. Enhanced Input is fully backwards compatible and users that were previously using the DefaultInput classes will not see any behavioral change. By default this behavior is on, but it can be turned off with the console variable EnhancedInput.bEnableAutoUpgrade.

  • Added a function to allow you to get the mapping context priority from the Enhanced Input subsystem.

  • Added a Scale by delta time input modifier. This can be useful if you wanted to have your look input implemented, then you don't need to add an additional deltatime call in your input code every time.

  • Added a ControlMappingsRebuiltDelegate delegate to the Enhanced Input local player subsystem. This allows you to listen for changes to control mappings or bindings for the UI and rebuild them.

  • Added support for input pins with multiple connections to the PinValueInspection tooltip.

  • Allow Debugging of Transient Blueprint object instances.

  • Added functions on the game instance and local player to create players based on a platform user id instead of the older int32 controllerId.

  • Fixed the Enum to String Node to not display as a compact node, which was making it look different from a Byte to String for clarity.

  • Added a menu bar to Blueprint Debugger for opening closed tabs.

  • Added better logging to indicate why Gameplay Abilities failed to be activated.

  • Added a project setting to suppress deprecation warnings for specific properties or functions in Blueprints.

  • Added helper methods in the engine to get the local player from a FInputDeviceId.

  • Added an FText action description to UInputAction.

  • Changed the category of the Input Mapping Context description field to be consistent with the input action's.

  • Created a new UnmapAllKeysFromAction function to be more explicit.

  • Added a Blueprint function to get a debug string representation of a Gameplay Attribute.

  • Allow calls to CreateChildActor to supply a function to manipulate properties before the construction script is run.

  • Extended Enhanced Input with a combo Input Trigger. This allows users to trigger an Input Action through the completion of a series of Input Actions that are specified by the user. Users can specify times to complete Input Actions and Input Actions that cancel/stop the combo.

  • Added support for dragging variables onto pins to automatically convert/promote them.

  • Added a new Gameplay Task resource overlap policy to cancel existing tasks.

  • Fixed a comment in the Gamemode class when ending the match.

  • Made action mappings within an input mapping context reorderable in Enhanced Input.

  • Added new ObjectIsA method that is Blueprint pure.

Improvement:

  • Optimized padding in AActor to reduce size from 664 bytes to 640.

  • Improved diff messages for local function variables inside the Blueprint diff tool.

  • Optimized sequencer camera animations by excluding unnecessary systems from the linker, and by using a much simpler bound object instantiator.

  • Refactored component instance data cache to be able to store actor or component instance data

Crash Fix:

  • Fixed a crash that occurred when opening a collapsed node after undoing the creation of a second execution pin.

  • Fixed a crash that occurs when splitting then recombining connected pins.

  • Fixed a potential crash in FBluepirntEditorUtils::FindAndSetDebuggableBlueprintInstances.

  • Fixed a crash when expanding Set Properties in the Blueprint Debugger.

Bug Fix:

  • Fixed issue where replicated loose gameplay tags were not replicating to the owner.

  • Fixed AbilityTask bug where abilities could be blocked from timely garbage-collection.

  • Fixed inconsistencies in the Blueprint diff tool where graphs wouldn't move together when you click a diff entry.

  • Fixed a bug where hovering over variables in the Blueprint diff tool caused them to jump around

  • Fixed a bug where the Add components list search didn't compare non-beautified component names.

  • Fixed an issue when a gameplay ability listening to activate based on a tag would fail to be activated. This would happen if there were more than one Gameplay Ability listening to this tag, and the first one in the list was invalid or didn't have authority to activate.

  • Destroyed the smart object collection Actor rather than using MarkAsGarbage so the level doesn't keep a garbage reference to it.

  • Variables marked EditInstanceOnly inside UStruct variables are no longer visible in the Blueprint details view.

  • Fixed a bug where changing a variable type inside of a Blueprint Structure caused a cannot parse value error.

  • Fixed bug where characters were repeatedly enter falling mode during lateral root motion due to gravity being inverted.

  • Members of structs in instanced objects in components are now correctly displayed.

  • Added an option to the game feature plugin creation template to allow setting EnableByDefault and properly show that in the plugin UI. This is used in Lyra to create default enabled game feature plugins.

  • Fixed a warning about the simulate options of the character's arrow component not being valid.

  • Fixed an issue where Blueprint callable functions on native interfaces were incorrectly detected as invalid.

  • Changed Game Feature plugins to load the DefaultPluginName.ini using the same method as normal plugins so it works on arrays. The old code to load PluginName.ini still runs with a log message.

  • Moved some Gameplay plugins with Blueprint hooks to initialize in PreDefault so they are ready for early Blueprint loads referenced by native code.

  • Changed the Common UI game viewport to check the override delegate before letting the UI block input.

  • Fixed a memory leak that occured when composite data tables have sources with conflicting rows.

  • Fixed editor UI when adding the first game feature plugin to a project, validation would always fail if Plugins/GameFeatures didn't already exist.

  • Fixed GameplayEffects that use Data Registries correctly from warning on load and improved the warning text.

  • Removed code from UGameplayAbility that was incorrectly only registering the last instanced ability with the Blueprint debugger for breakpoints.

  • Fixed NetworkPredictionCVars cmd description mismatch so that the commands match up with their proper functions.

  • Fixed a bug where UAnimDataModel would cause the debugger to hang while generating debug info.

  • Stop and discard camera shakes that are getting recompiled while they're in the previewer tool.

  • Only create a new default subobject when destroying a component if the owner's class is not native. Native owner classes do not have to have a DefaultSceneRoot when you drag in the C++ class directly from the content browser into the level.

  • Fixed BindAction function from not accepting additional function parameters.

  • Added a default console key for Hungarian keyboard layout.

  • Changed FCachedKeyToActionInfo::PlayerInput pointer to a WeakObjectPtr. In order to be Garbage Collected on level transitions.

  • Added a null check on the PlayerInput in OnInputOwnerEndPlayed because it is a weak pointer and not guaranteed to be there.

  • Do not allow pass by reference to be changed for array properties as they are implicitly always pass by reference.

  • Align Client names in Blueprint Debugger with PIE window titles.

  • Created camera shake instances using the world. The parent sequence is running in. This fixes missing context for camera animation sequences inside camera shakes.

  • Fixed SetupAttachment false positive ensure that occured when called on a component that already had an AttachParent.

  • Added a special case to FKismetDebugUtilities::FindClassPropertyForPin for reroute nodes.

  • Fixed Gameplay Ability System Ability getting stuck if EndAbility was called during the lock inside ApplyGameplayEffectSpecToTarget.

  • Fixed BP Debugger Step Over not behaving correctly with Sequence nodes with a branch as the end of the exec line.

  • Fixed a bug where delegate pins in LatentGameplayTaskCall nodes were not correctly compiled with delegates from super classes.

  • Fixed a bug where Debugging mode was not ended if the PIE Window was closed.

  • Fixed a jump resimulation issue that occured on the character movement component.

  • Input Action instance data that is flagged to trigger with StartedAndTriggered will now ensure that the Started delegate will always get called before the Triggered delegate.

  • Fixed sequence camera shakes not being torn-down correctly in some situations.

  • Fixed a bug where MultiLine metadata was applied to all new Blueprint variables.

  • Prevented abstract classes from being used by create object from class nodes

  • Fixed a bug where Step Over would sometimes break inside the function you're trying to step over.

  • Fixed a bug where the Blueprint Debugger would not find debuggable objects in a WorldPartition sublevel.

  • Fixed incorrect documentation of the FNodeHandlingFunctor function.

  • Fixed camera manager's BlendParams keeping outdated information.

  • Changed Make and Break nodes for the FInputActionValue struct in Blueprints to correctly take in a EInputActionValueType enum instead of the incorrect FInputActionValue struct.

  • Call the correct "OnController" function from the SVirtualJoystick. Before it was only calling OnControllerAnalog, which will result in normal FKey's never having their "Released" input be triggered. This fix calls OnControllerButtonPressed and OnControllerButtonReleased for non-analog keys, which will give the correct behavior.

  • Fixed the wrong serial on the first camera animation handle.

  • Fixed character movement data that could be left with dangling UObject references.

  • Fixed a bug in Network Prediction Examples plugin where locally-predicted Actors could exhibit stuttering motion.

  • Fixed deprecated Event Dispatchers on components that do not throw a warning on their attached Actors.

  • Fixed a bug that could allow stale Root Motion Source objects to stay in memory indefinitely.

  • Fixed issue where player pawns would not be spawned from the function RestartPlayerAtTransform.

  • Fixed a bug that prevented Network Prediction Insights tool from showing trace data samples.

  • Clamp the local pixel mouse position to the range of an int32 to prevent invalid casting bounds.

  • Fix to allow users to coerce a BlueprintImplementableEvent with no return value to treat the override as a function rather than an event.

  • Fixed a bug where the jump apex height could vary if root motion was active while a character jumped.

  • Fixed an ensure in FPreviewScene when using a GameMode that derives directly from AGameModeBase.

  • Fixing issue where private functions could be overridden in the "My Blueprint" tab.

  • Collision visibility option in the Blueprint editor.

  • ChildActorComponent now registers to the ChildActor's OnDestroy event. This allows the component to clean up its references if the ChildActor is destroyed through a path that doesn't involve the component itself.

  • The Blueprint callstack will now be dumped when the MostRecentPropertyAddress is null.

  • Fixed empty Actors having a root component with an Edit in Blueprint hyperlink.

  • Fixed issue where Enhanced Input Action node trigger events were incorrectly flagged as unsupported.

  • Updated icons for Enhanced Input assets so they display correctly.

  • Made ClearActionBindings and ClearBindingsForObject virtual on the UInputComponent and overrode the UEnhancedInputComponent to ensure the additional Enhanced action bindings are cleared. Previously calling ClearActionBindings on an EnhancedInputComponent would still leave some bindings uncleared.

Deprecated:

  • Demoted BlueprintSnapNodes plugin to Experimental.

  • Deprecated the IsPrimaryPlayer function on the APlayerState. This function always returned "True" incorrectly. Instead of using this function on the player state, you can use the Player Controller or ULocalPlayer's Platform User ID and check if that is the platform's primary user in the IPlatformInputDeviceMapper.

  • Deprecated UInputMappingContext::UnmapAction.

  • Deprecate the core delegates for OnControllerConnectionChange and OnControllerPairingChange in favor of the new IPlatformInputDeviceMapper versions that will allow you to get info about what gamepad specifically has sent input events.

  • Update SlateApplication and the message handler to take in FInputDeviceId and FPlatformId instead of the old int32 controllerid for controller input.

  • Deprecated the old version InputKey on the base UnrealClient. All Input functions on the client have been upgraded to take in a FPlatformUserId and FInputDeviceId in favor of a single int32 ControllerId.

  • Deprecated the GetPawnPhysicsVolume query in favor of new GetPhysicsVolume query that can be called on any Actor.

  • Made rerun construction scripts editor only.

  • Moved UCSModifiedProperties into sparse storage as only a small percentage of all components stored data in it.

Removed:

  • Removed the UEnhancedInputEngineSubsystem. This will be replaced in favor of a World subsystem after the player input has been separated from the player controller.

  • Removed "Within=PlayerController" on the Enhanced Player Input. This allows you to spawn a new player input without an owning player controller, such as with the editor input subsystem.

  • Removed AbilitySystem.Debug.NextTarget and PrevTarget commands in favor of global HUD NextDebugTarget and PrevDebugTarget commands.

  • Deprecated 5.0 functions from Enhanced Input. Enhanced Input was experimental when these functions were deprecated.

  • Old version of AddMappingContext.

  • Old version of RemoveMappingContext.

  • Old version of RequestRebuildControlMappings.

  • Removed float result components and the float blender system. Implemented double precision and handled float to double conversion during property instantiation.

  • The Default value to the name of the action with the common "IA_" prefix and replaced underscores with white spaces.

  • Removed MultiLine metadata tag instead of setting it to false in Blueprint variable details customization.

  • Unused local variables in Blueprint graph nodes.

Mass

API Change:

  • MASS_DO_PARALLEL is now enable for all non-UE_SERVER builds.

  • All the FMassEntityQuery hosted as properties by processors need to be registered at construction time.

New:

  • Made Mass's multithreading enabled by default.

  • Introduced a MassDebugger UI tool. The tool contains information on:

    • All registered Processors.

    • At runtime shows all Archetypes present at the time of data gathering (which can be manually instigated).

    • Archetypes display their composition

    • Comparisson between archetype compositions is supported.

    • Summary information is displayed when multiple archetypes are selected including total number of entities and memory allocated.

    • Mass Processing Phases' processing graphs along with dependency information

    • The views are synchronized meaning clicking an archetype or a processor in one view will reflect in other views marking relevant elements.

  • Marked a number of Mass or Mass-used systems as save to be accessed off-game-thread. Also added a dedicated traits template for shared fragments.

  • Added a TSharedPtr<FMassEntityManager> member to MassExecutionContext. This change has long been coming, we always use given execution context with only a single entity manager instance, and the lack of connection between context and the manager required some use cases to cache the manager.

  • Mass's original procedural Farm Test has been brought back and can be found in MassEntityTestSuite module.

  • Modified FMassArchetypeSubChunks to support archetype-less entities (i.e. built but not created).

  • Enriched MassEntityQuery with capability to declare USubsystem requirements, that then can be fetched at runtime via the MassExecutionContext. MassEntityQuery requirements are declared just like other requirements with a dedicated AddSystemRequirement call. MassExecutionContext supplies functions for fetching subsystem instances checking if active query declared them as dependency in a given mode (ReadOnly or ReadWrite).

  • Added another flavor of FMassEntityManager::GetOrCreateConstSharedFragment that makes for more consistent hash calculation (the function itself is calculating it).

  • Exposed parts of MassEntityTestSuite for reuse in other test-focused plugins.

  • Mass's gameplay debugger category now displays fragment composition of a selected entity.

  • Added mass.LogKnownFragments console command that prints out all "known" tags and fragments.

  • Added API functions to batch-change entity collection's tags.

  • Separated "entity management" and USubsystem elements of UMassEntitySubsystem. Now UMassEntitySubsystem hosts a shared ref of newly created FMassEntityManager type, and users are free to create their own FMassEntityManager instances to create isolated entity pools.

  • Added a way to mark up MassEntityQueries as owned by a processor and auto-registering such queries. Also added some verification code that ensures all queries run as part of processors are properly marked up as such. This change supports automated, resource-based processor dependencies.

  • Switched UMassEntitySubsystem.FlushedCommandBufferQueue from TQueue<T, EQueueMode::Mpsc> to more efficient TMpscQueue<T>.

  • Resource-based Mass processor dependency solving resulting in finer-grain dependencies resolution. The main change is that if a processor P in group A depends on a processor R in group B we no longer infer group A depending on group B (which was the case previously). In fact, groups are no longer represented outside of dependency solving step - once dependencies are solved we end up with a list of processors ordered in a way respecting both declared "execute after" and "execute before" dependencies but also dependencies resulting from requirements declared by Processors' queries.

  • Added debug name to Mass archetypes.

  • Made Mass gameplay debugger category's use of UMassDebuggerSubsystem optional and instead require UMassEntitySubsystem.

  • Changed how we treat missing dependencies in Mass dependency solving - used to be an error, now we create dummy temporary nodes to maintain before-after dependencies even if used in reference to a non-existing item.

  • Cut UMassDebuggerSubsystem's capability to host entity handles to be debugged and replaced the only use case (in Mass gameplay debugger category) with a custom query to fetch location-owning entities. The old approach had the downside of allowing to pick only entities that had a special debug fragment in their composition, which resulted in confusion while trying to pick entities.

  • Added MassProcessor.ProcessorRequirements to track subsystems (and potentially other elements) accessed by a given processor outside of MassEntityQuery.ForEachEntityChunk.

  • Added support for declaring subsystem requirements to MassEntityQuery and fetching subsystem instances from MassExecutionContext using TSubclassOf.

Bug Fix:

  • Made UMassSignalProcessorBase::OnSignalReceived thread safe.

  • Made MassEntityQuery.ForEachEntityChunk's path for entity collections utilize stored requirements mapping if given archetype is "known" by the query (i.e. its one of the cached archetypes). This is the most common case and reusing mapping save nontrivial of work.

Deprecated:

  • Renamed GET_MASS_CONFIG_VALUE macro in MassSimulationSettings to GET_MASSSIMULATION_CONFIG_VALUE to avoid confusion with the MassEntitySettings' one

  • Renamed FMassCommandAddFragment and FMassCommandRemoveFragment to FMassCommandAddFragments and FMassCommandRemoveFragments respectively.

  • Mass batching-focused API changes. "Old" mass commands completely removed and reimplemented as batched commands using the new batched API. Other renamed types:

    • FMassArchetypeSubChunks to FMassArchetypeEntityCollection

    • FSubChunkInfo to FArchetypeEntityRange

    • FArchetypeChunkCollectionWithPayload to FMassArchetypeEntityCollectionWithPayload

  • Extracted MassExecutionContext into a separate header/cpp files.

  • "System" and "Subsystem" names' use has been made consistent across Mass's code, favoring "Subsystem". A number of function and parameter names has been affected.

  • UE::MassEntity namespace has been renamed to UE::Mass, for consistency with overall Mass namespace naming.

  • Renamed MassProcessingPhase.h/cpp files to MassProcessingPhaseManager.h/cpp

  • MassSchematic and MassSimulationLocalCoordinator have been removed due to no longer being used.

  • Removed UMassLODProcessorBase due to it not serving an actual purpose.

  • Got rid of DECLARE_ENUM_TO_STRING-declared EnumToString functions declared for Mass enums. Use UEnum::GetValueAsString instead.

  • Constified FMassReplicationContext's LOD subsystem access

  • Cut FMassEntityQuery::ParallelForEachEntityChunk as defunct and no loner being used. We consider bringing it back, but it will be a brand new reimplementation to match current subsystem requirements accessing model.

  • Switched MassEntity from supporting interaction with USystems over to UWorldSubsystems. The main reason for the change is to avoid non-UWorldSubsystems special cases we don't utilize nor test at this time. The change is reversible once we have a non-UWorldSubsystem use case.

  • Introduced a FMassDebugger struct to host all debug-time API and avoid polluting other Mass classes with those. Existing debug-time functions will be moved over with time.

  • Renamed FMassExternalSubystemBitSet to FMassExternalSubsystemBitSet

Networking

New:

  • Updated to openssl-1.1.1n on all platforms. The Mac version contains arm64 support.

  • Enabled explicit base names when creating graph nodes in ReplicationGraph. This can improve readability when using logging and debug cmds like RepGraph.PrintGraph.

  • Added -forkautostatsport command-line option that automatically sets a unique port for each forked child with PerfCounters. Ports used will start at statsPort+1.

  • Setting net.AllowPIESeamlessTravel 1 will now enable experimental support for seamless travel in Play in Editor networking.

  • Added cheat to validate the old and new methods of replicating subobjects. Enabled via net.SubObjects.CompareWithLegacy. The comparison is run only for actors that converted to the new list. This calls the ReplicateSubObject virtual so the method still needs to be implemented for the validation to work.

  • Actor classes can officially control which of their ActorComponent get replicated or not.

    • Classes that want to control component replication need to override AllowActorComponentToReplicate to do so.

    • Classes can also return a ELifetimeCondition in the new function and set a net condition to specific components.

    • The override and net condition only work for classes that set bReplicateUsingRegisteredSubObjectList to true.

  • Added option to manually control untracked class reporting in ReplicationGraph.

  • Added optional config that will prevent Actors from replicating if they are not in the BeginPlay state.

    • Enabled via the net.ReplicateOnlyBeginPlay console variable.

    • The only exception is if a RPC is called on an actor before BeginPlay and opens the ActorChannel. This is because when opening the channel to send the RPC, we need to serialize the actor entirely for the client channel opening. If the actor has not begun play yet we will set up their components for replication and serialize them anyway. Note that sending RPCs this early is not recommended if the BeginPlay on the authority sets replicated variables that the client needs in his BeginPlay also.

  • Implemented optional support for assigning a TransactionId for LevelStatusUpdate and ServerUpdateLevelVisibility requests. This is used in multiplayer to allow servers to rely on level visibility status reported by clients to know what data to replicate to clients. Behavior is controlled by two CVars (by default, both are disabled):

    • LevelStreaming.ShouldClientUseMakingInvisibleTransactionRequest — if enabled client will send a request to server and wait for an ack before making a streaming level invisible.

    • LevelStreaming.ShouldServerUseMakingVisibleTransactionRequest — If enabled server will associate a transaction id to each call to ClientUpdateLevelStreamingStatus and wait for the response from the client of that particular request before updating LevelVisibility for replicated data. This is to solve some issues where we might have multiple requests in flight.

  • Added ActorComponent::ReadyForReplication virtual function to ActorComponent initialization flow.

    • This function will be called between InitComponent but before the component's BeginPlay.

    • It can be used to register pre-existing replicated subobjects or set up replicated properties early.

    • This is useful in situations where a component might call an RPC on itself very early inside BeginPlay and trigger the first replication of all its network properties.

  • Added a console variable that controls if actors and actor component classes use the new subobject replication by default or not.

    • net.SubObjects.DefaultUseSubObjectReplicationList needs to be enabled to opt-in to the new method by default.

    • Classes can still choose their own method by setting bReplicateUsingRegisteredSubObjectList in their constructor.

  • Added multiple console variables to control how much time is spent on each step of the replay recording process per frame.

    • demo.ForcePersistentLevelPriority: always record the persistent level first when using level streaming fixes and prioritization

    • demo.DestructionInfoPriority: allow destruction info be to prioritized lower than max int32

    • demo.LateDestructionInfoPrioritize: prioritize destruction info after the active actor set

    • demo.ViewTargetPriorityScale: scale view target replay priority

    • Demo.MaxDesiredRecordTimeMS: update MaxDesiredRecordTimeMS on the current world's demo driver

    • Demo.CheckpointSaveMaxMSPerFrame: update CheckpointSaveMaxMSPerFrame on the current world's demo driver

    • Demo.ActorPrioritizationEnabled: update ActorPrioritizationEnabled on the current world's demo driver

    • Demo.SetLocalViewerOverride: update SetLocalViewerOverride on the current world's demo driver

    • demo.MaximumRecDestructionInfoTime: cap the percent of a budgeted frame that can be spent replication destruction info

  • Added additional recording metadata to replay headers:

    • CheckpointLimitInMS

    • FrameLimitInMS

    • MinRecordHz

    • MaxRecordHz

    • Platform

    • BuildConfig

    • BuildTarget

  • Added -skipreplayrollback to not generate startup actor rollback state.

  • Added network granular memory tracking to multiple replay data structures.

  • Added networking granular memory tracking to multiple data structures.

  • Provided a delegate for game code to listen to for Replay ID updates.

  • Added support for using poll instead of select in BSD sockets. Sockets will use poll by default (if supported by the platform), but this can be toggled with the USE_SOCKET_FEATURE_POLL macro.

  • Added configurable limits for replay event sizes when loading save game replays.

  • Added configurable limits for the maximum number of network exports to read from a replay file during playback.

  • Added net.AllowPIESeamlessTravel to control seamless travel in single process PIE.

  • Added random data to handshake packets in an attempt to work around potential ISP packet-filtering issues.

  • Exceeding the maximum allowed replication size for an object now generates an ensure for improved visibility.

  • Make servers send close-reasons/NMT_CloseReason to client, for log-info/debugging.

  • Added more NetDriver/Beacon close reason coverage.

  • Added logging to help debug amortized replay replication times.

  • Added an API to retrieve the changelist a replay was recorded on while playing back the replay.

  • Use UWorld RemoveNetworkActor instead of directly calling NetDriver RemoveNetworkActor during seamless travel tick in case there is no NetDriver.

  • Improved LLM tag coverage for networking memory.

  • Added a compile time option for inclusion of the sub-object replication key feature.

  • Added a compile time option to remove usage of the replication graph ForceNetUpdate delegate.

  • Added checks for unsupported nested NetDeltaSerialize structs.

  • Added more comments and a warning around dependent actors in RepGraph.

  • Added Session ID's and Client ID's (Connection ID's) to packet protocol.

  • Added net.QueuedBunchTimeoutSeconds to replace a hardcoded value.

  • Added logging when the value of net.QueuedBunchTimeoutSeconds is exceeded.

  • Added a network driver setting for the maximum number of channels per connection.

  • Added a connection flag to control whether replication size limits can be ignored.

  • Prevent world settings for temporary transition maps from replicating in order to prevent warnings during seamless travel.

  • Exposed NetworkProfiler API for linking.

  • Added '-LogDebug=MatchStr' command-line parameter and 'LogTrace AddDebug MatchStr' console command to NetcodeUnitTest to trigger debugging on a particular log line pattern.

  • Added logging to assist in debugging actor channel failures.

  • Added replay result codes for failure to decrypt and missing event data.

  • Set an engine default for the net.PartialBunchReliableThreshold console variable to improve network performance of large bunches when there is packet loss.

Improvement:

  • Statsport/exec listener now returns a different error message when the exec callback is not registered, the cmd itself was not processed by the exec or the cmd is missing the 'c=' param.

  • Clamped replay priority into a valid range before rounding.

  • Adjusted recording CSV stats around actor vs destruction info.

  • Modified custom property replication conditions to be stored outside of any active network driver, and provided an API to modify them at any time.

  • Cleanup of sub-object references in replay recording.

  • Improved memory usage of shared serialization data.

  • Improved the memory usage of fast array replication states.

  • Adjusted the replay streamer interface to make it easier to add common analytics attributes.

  • Modified replay scrubbing to reduce memory allocations.

  • Improved memory allocation of the local file replay streamer.

  • Increased default value for NetPackedMovementMaxBits.

  • Refactored log tracing and added ability to trigger console commands on certain logs.

    • Command-line example: -LogCommand="ReadContentBlockPayload failed=obj list class=ShooterGameState"

    • Console command example: LogCommand Add ReadContentBlockPayload failed=obj list class=ShooterGameState

  • Changed subobject outer ensure to a log, so it now falls back to the default behavior (actor as outer) if outer is unavailable.

Crash Fix:

  • Fixed issue with ConnectionId assignment that could cause server crash.

  • Fixed multiple crash issues with asynchronous replay recording property validation.

  • Fixed handling of replication history when the maximum replicated size was exceeded for an object, which would often lead to a crash.

  • Fixed crash referencing spectator controllers when loading replay checkpoints.

  • Fixed a crash when using out parameters in RPC calls.

  • Fixed a replication graph crash in the ShooterGame sample when seamless traveling.

  • Fixed a replay crash when attempting to load a map that no longer exists.

Bug Fix:

  • SupportsMultithreadingPostFork will not assert if the command-line has not been set when called, instead, it will return true/false based on the DEFAULT define and hope the cmdline override will not break anything later.

  • Export FStreamingLevelActorListCollection to external modules.

  • Prevented actors outside the destruction radius but inside the current OutOfRange radius check from being added to the OutOfRange list in ReplicationGraph, and, instead keep actors in the PendingDestructionList until they get inside the send radius or outside the OutOfRange radius.

  • Marked NetDriver and related objects as garbage as much as possible when destroying the net driver. Released references to objects from open channels on clients during net driver shutdown.

  • Fixed grid cell node doubling child node actors.

  • Invalidated replicators on the client as soon as their object becomes garbage.

  • Cleaned up the replicator so it doesn't leak through AllOwnedReplicators. Handled the case where subobjects are marked as garbage during the channel update, or where the ability system marks a replicated subobject as garbage on the client.

  • Explicitly enforced bReplicateUsingRegisteredSubObjectList to false for classes for which we will not convert their ReplicateSubObjects function to the new method.

  • Actors flagged for serialization will now be serialized just before we call destroy on them with Replay Recording. This allows them to be serialized in a state where they still have most components and properties intact.

  • Fixed off by one bug in DisableAllReplicatedPropertiesOfClass which did not properly disable all properties.

  • Fixed an issue where NetConnection->ViewTarget was not properly updated prior to replicating data.

  • Released object references from dormant replicators when levels are streamed out or actors are destroyed.

  • Fixed NMT_Failure early disconnects from missing NMT_CloseReason.

  • Reduced the number of forced property comparisons when using SetReplicates.

  • Fixed a replay checkpoint recording issue when using push model dirty state tracking.

  • Fixed servers not ignoring the destruction info net messages.

  • Fixed uninitialized vector data when receiving new replicated actors.

  • Fixed a case where replicated sub-objects would not be recorded into replay checkpoints.

  • Fixed handling of invalid package paths received from clients that could cause a crash.

  • Use Owner instead of AttachmentRoot Actor for AttachParent when replicating attachment.

  • Fixed handling of actors destroyed in the middle of an amortized replay checkpoint save.

  • Fixed an issue where replicated scene components could be added to the AttachChildren array at the indices of unmapped references, leading to the component being overwritten when the reference was mapped.

  • Have UActorChannel::KeyNeedsToReplicate check if the subobject is pending dormancy in order to prevent cases where an unchanged key prevents the channel from going dormant.

  • Fixed potential package map name mismatch warnings in PIE.

  • Prevent stale/garbage LastViewTarget actor being added to Replication List.

  • Fixed missing call to PostReplicatedChange on the fast array serializer, when mapping previously unmapped objects (Items PostReplicatedChange calls were not affected). Fixed for both 'net.SupportFastArrayDelta' on/off paths.

  • Fixed a race condition in replay recording of torn off actors.

  • Fixed a case where recording a new replay would not stop an existing recording first.

  • Fixed a missing level name remap in PIE that prevented seamless travels from succeeding.

  • Changed the ensure for destroying a NetDriver during its tick to not trigger for PendingNetGames.

  • Fixed incorrect timestamp check, preventing disabling of challenge ack resend code path server side.

  • UNetReplicationGraphConnection::PrepareForReplication now checks if the connection is in the correct world.

  • Fixed RemoteViewPitch being generated incorrectly.

  • Fixed levels unnecessarily tracking destroyed actors during replay playback.

  • Fixed replays recording multicast RPCs from only relevant to owner actors.

  • Call NotifyControllerChanged from ClientRestart in case it is received with the valid pawn before APawn::OnRep_Controller is called.

  • Handle emptying the map name if CurrentMapName == DestinationMapName when no transition map is specified in order to prevent issues when seamlessly traveling to the same map.

  • Fixed compiling in shipping with stats enabled.

  • Fixed an issue where tracking and validating replicated subobjects would be skipped if custom subobject replication was used.

  • Replicated FSoftObjectPtrs to dynamic, spawned-at-runtime replicated objects now resolve properly on clients.

Deprecated:

  • Removed support for replay network smoothing mode in network playback data.

  • Deprecated the AES ECB packet handler component in favor of the AES GCM handler.

Removed:

  • STAT_RepLayout_AddPropertyCmd

  • Removed a strong level reference from replay scrubbing state.

  • Removed replay backwards compatibility handling for versions prior to the minimum supported version.

  • "LastCompletedSeamlessTravelCount == SeamlessTravelCount" check was removed from APlayerController::HasClientLoadedCurrentWorld to prevent issues when client finishes travel before the server.

Level Design and Art Tools

Bug Fix:

  • Fixed an issue when computing the distance of a full spline segment that uses constant interpolation. Function incorrectly returned a distance of 0 for all partial distances, however when computing the "full" distance with p=1 it should have returned the true distance between the points. This fixes another issue with generation of the Spline Curve's Reparam Table where spline keys would map to incorrect distances if a spline had any number of constant interpolation points.

  • Implemented an actionable message on load to create the water collision profile when it is not defined, rather than checking the DefaultEngine.ini on load.

  • Fixed default-enabled Editor modes showing up in random order, by giving the modes prescribed priorities.

  • Fixed an issue where the spline visualizer wasn't taking into account the list of enabled/supported spline point types for the given spline component.

  • Fixed Actors being attached to a Level Instance that is not being edited.

  • Fixed metallic, specular, and roughness being packed into a single texture.

  • Fixed import descriptor not refreshing when toggling Flip Y Axis setting from ImportExport tool. Also made option to flip coordinate on Y axis available when exporting tiled landscape.

Geometry Core

New:

  • Created a 'contain(other interval)' function to TInterval1.

  • Add a "prevent tiny triangles" option to Remesher. Currently the area threshold matches the threshold used when creating a cloth simulation mesh.

  • Exposed an optional second importance weight to the FPriorityOrderPoints class

  • Added FColliderMesh::FindNearestHitTriangle() and FColliderMesh::FindNearestTriangle() wrappers around mesh AABBTree functions.

  • Renamed ::GetAABBTree() to ::GetRawAABBTreeUnsafe() to discourage usage.

  • Added new oriented box fit variant that starts from the fast DiTO box and optimizes the fit iteratively, and changed modeling tools oriented box fits to use the new algorithm.

  • Improvements to the FMeshBevel operation, which resolves many failure cases in higher-level Beveling operations in Modeling Tools and Geometry Scripting.

  • Updated Degenerate triangles to now be filtered out when creating Complex Collision geometry for UDynamicMeshComponent, to avoid warnings in the physics system.

  • Added a new FMeshPlanarSymmetry class for detecting and applying planar symmetry to mesh vertices.

  • UDynamicMeshComponent now supports the Visible In Ray Tracing Component setting. However this does not currently override the UDynamicMeshComponent-specific Enable Raytracing flag.

  • Added FDynamicMesh3::EnumerateEdgeTriangles() function, which has the same API as ::EnumerateVertexTriangles().

  • Added function UE::Geometry::TrianglesToOverlayElements() in MeshIndexUtil.h which collects elements from triangles in a mesh attribute overlay.

  • Added FDynamicMesh3::EnableMatchingAttributes() function to expose FDynamicMeshAttributeSet::EnableMatchingAttributes() at the Mesh level.

  • UpdatedUDynamicMeshComponenttonow support a separate "transient" flag for disabling collision updates, configurable via SetTransientDeferCollisionUpdates(). This setting allows C++ code, such as code that implements a live 3D transform of mesh vertices, to temporarily disable collision re-generation without modifying the serialized bDeferCollisionUpdates UProperty.

  • Added a new FMeshResolveTJunctions class that attempts to fix situations in meshes where a boundary vertex lies on the interior of some other boundary edge (a "T-Junction"). Exposed this capability in the Weld Tool in Modeling Mode.

  • Updated Morphology.h to use sparse SDF due to memory savings over the dense SDF. The AutoLOD tool and the Morphology tool use this class, but the behavior shouldn't change.

Bug Fix:

  • Made GteMinimumVolumeBox3 robust to failing to find a convex projection for some faces.

  • Fixed a bug that made the fit always ignore results from the ProcessEdges pass, and added an option to always skip that pass (for a faster method that matches the previous behavior).

  • Fixed incorrect float casts in FAxisAlignedBox3d and FAxisAlignedBox2d when casting to FBox and FBox2D, making this cast function correctly at large world coordinates.

  • UDynamicMeshComponent now supports overrides to the color/material and normals, allowing display of vertex colors, group colors, or a (configurable) custom color, as well as facet normals (flat shading). These settings can be configured for any such Component in the Actor properties. The wireframe color is now also configurable.

  • Added an fp:precise pragma to the MSVC compile of XAtlas, giving more consistent results across platforms and build settings.

Deprecated:

  • We deprecated the timestamp on TDynamicPointSet3, as it was unused.

Geometry Script

New:

  • Added InvertMeshSelection function.

  • Added Geometry Script function SetMeshSelectionVertexColor, sets vertex color on selected faces/vertices, optionally creating "creases" in the vertex color overlay around the selection border

  • Added ThickenShells option to ApplyMeshSolidify function.

  • Added AppendMeshTransformed function that appends N copies of a mesh to another mesh, with a custom Transform applied for each.

  • Added ExpandContractMeshSelection function, which can grow or shrink a Mesh Selection based on mesh connectivity.

  • Added ApplyUniformRemesh function, which applies remeshing algorithms to a UDynamicMesh similar to the Remesh Tool in Modeling Mode.

  • Added ApplyMeshOffsetFaces function.

  • Added ApplyMeshInsetOutsetFaces function.

  • Added a 2D Voronoi diagram generation function.

  • Added ResolveMeshTJunctions function that exposes the new T-Junction Resolution algorithm.

  • Added AppendSweepPolygon function which takes the sweep path/curve as a list of FTransforms, instead of FVectors, giving the caller more control over rotation and scaling along the sweep. This function should replace usage of AppendSimpleSweptPolygon.

  • The CopyMeshFromStaticMesh Geometry Script function now works on UStaticMesh assets at Runtime, if the bCPUAccess flag was enabled on the Asset at cook time.

  • Added "Frozen" flag on GeneratedDynamicMeshActor. Users can disable expensive mesh recomputations when not editing procedural mesh generation parameters/settings.

  • Add support for optional Mesh Selection to:

    • TranslateMeshUVs

    • ScaleMeshUVs, RotateMeshUVs

    • SetMeshUVsFromPlanarProjection

    • SetMeshUVsFromBoxProjection

    • SetMeshUVsFromCylinderProjection

  • Add support for optional Mesh Selection to RecomputeMeshUVs.

  • Add a new GetMeshUVSizeInfo function that can be used to get UV Area/Bounds, and 3D Area/Bounds, for a given selection.

  • Added support for optional input Mesh Selection to ComputeMeshConvexHull function.

  • Added a new ComputeMeshConvexDecomposition function that exposes new automatic convex decomposition strategy.

  • Added SplitMeshBowties function.

  • Added RepairMeshDegenerateGeometry function.

  • Added GetMeshInfoString function.

  • Added support for optional Mesh Selection to:

    • ApplyPerlinNoiseToMesh

    • ApplyIterativeSmoothingToMesh

    • ApplyDisplaceFromTextureMap

    • ApplyDisplaceFromPerVertexVectors

  • Added ApplyMeshDisconnectFaces function.

  • Added ApplyMeshDuplicateFaces function.

  • Added a new ApplyMeshLinearExtrudeFaces function that supports linear extrusion of entire mesh or selection. Redirect previous ApplyMeshExtrude function to ApplyMeshExtrude_Compatibility_5p0.

  • Added a new ApplyMeshBevelSelection function, which supports various ways to interpret the MeshSelection as set of faces or edges to bevel

  • Added ComputePolygroupsFromPolygonDetection functionthat exposes new quad-detection algorithm (currently only quad polygons are detected).

  • Added an Auto-Compact option to Simplify and Remesh functions, that when enabled will automatically Compact the output mesh. This new setting is enabled by default, to reduce the chance of users hitting errors when passing the output simplified/remeshed mesh into downstream functions.

  • Added CopyMeshUVLayerToMesh and CopyMeshToMeshUVLayer functions. These can map a UV layer to a separate mesh, editing it, and then transferring the edited positions/topology back to the UV layer of the source mesh.

  • Added SampleSplineToTransforms functionthat computes a set of FTransforms at points along a USplineComponent, using various sampling strategies.

  • Added AppendSweepPolyline function, similar to AppendSweepPolygon but sweeps an open 2D profile curve instead of a closed 2D polygon.

  • Added a new FGeometryScriptMeshSelection type that can store/represent Vertex, Triangle, and Polygroup "selections" on a UDynamicMesh.

  • Add various functions for working with this new type, including:

    • CreateSelectAllMeshSelection

    • ConvertMeshSelection

    • CombineMeshSelections

    • ConvertIndexArrayToMeshSelection

    • ConvertIndexSetToMeshSelection

    • ConvertIndexSetToMeshSelection

    • ConvertIndexListToMeshSelection

    • ConvertMeshSelectionToIndexList

    • SelectMeshElementsInBox

    • SelectMeshElementsInSphere

    • SelectMeshElementsWithPlane

    • SelectMeshElementsByNormalAngle

    • SelectMeshElementsInsideMesh

    • ExpandMeshSelectionToConnected

    • GetMeshSelectionInfo

    • DebugPrintMeshSelection

    • GetMeshSelectionBoundingBox

    • GetMeshSelectionBoundaryLoops

  • Add various new Geometry Script functions for editing a mesh based on a mesh selection:

    • DeleteSelectedTrianglesFromMesh

    • TransformMeshSelection

    • TranslateMeshSelection

    • RotateMeshSelection

    • ScaleMeshSelection

    • SetPolygroupForMeshSelection

    • SetMaterialIDForMeshSelection

  • Added CopyMeshSelectionToMesh, which copies triangles identified by the selection to a new UDynamicMesh.

  • Added Geometry Script functions for manipulating FGeometryScriptIndexList, UVList, and ColorList objects, to bring up to parity with functions for Scalar and Vector lists.

  • Added options for the Geometry Script AppendMesh node's attribute handling.

    • Now by default, if meshes do not have the same attributes enabled, any attribute enabled on either mesh will be enabled on the result mesh. The caller can optionally make the result only enable the attributes on the source or the target mesh.

Bug Fix:

  • Added Geometry Script function CopyCollisionMeshesFromObjectwhich extracts meshed collision shapes, or the complex collision mesh, as a UDynamicMesh from various object types (StaticMesh, Volume, and DynamicMeshComponent).

  • Updated Geometry Script functions that read or sample from a UTexture2D to now work at runtime, but only if the texture format is VectorDisplacementMap.

    • If this is not the case, errors are now gracefully handled instead of hard crashing.

  • The Geometry Script function AutoGeneratePatchBuilderMeshUVs now gracefully handles a non-compact input mesh, and prints a warning if such a mesh is passed.

GeometryCore

New:

  • Added a vertex-based connected components class that can be used with any TriangleMeshType and supports connecting based on spatial proximity as well as triangle topology.

  • Made FMeshBoolean's automatic mesh simplification code optionally avoid simplifications that would noticeably change the vertex normals. We also enabled this feature when computing fractures, to prevent the fracture code from generating results with incorrect normals.

Bug Fix:

  • Fixed failure cases in the exact predicates library.

  • Adjusted FindNearestCurveToRay when processing segments in a curve, to balance the distance-to-ray-origin against the ray-segment distance to find the optimal segment.

  • Fixed issues with the GeometryCore FPriorityOrderPoints class:

    • It now uses the SpatialLevels argument.

    • The early-stopping optimization is fixed, so it no longer causes spatial 'clumping' of points when enabled.

    • The code no longer incorrectly refers to some of the importance weights as "curvature," as the class is general-purpose and other features are often used for importance weights.

    • An 'OffsetResFactor' (Offset Resolution Factor) parameter was exposed, to allow more control of how clumpy the distribution is; we recommend a value of 1 or 2 to best distribute the input points.

  • Fixed instability in initializing GeometryCore's TQuaternions almost aligned to -Z axis, or generally rotating almost 180 degrees with a TQuaternion::FromTo() call.

  • Fixed a few unsafe typecasts.

GeometryScript

New:

  • Added a Async Physics build for Dynamic Mesh component.

  • Added SRGBToLinear node for transforming vertex colors of dynamic meshes in GeometryScript.

  • Added LinearToSRGB node for transforming vertex colors of dynamic meshes in GeometryScript.

  • Added CopyMeshToSkeletalMesh node to GeometryScript.

  • Added CopyMeshFromSkeletalMesh node to GeometryScript.

  • Added BakeTexture node to GeometryScript.

  • Added BakeVertex node to GeometryScript.

  • Added CreateNewTexture2DAsset node to GeometryScript.

  • Updated Geometry Script functions to automatically fix mesh orientation when transforming meshes with negative scales.

  • Adjusted LineSegmentGenerators to use the given box center when computing box lines.

  • Added a PolyPath class to Geometry Script, which provides an (optionally-closed) polyline/polygon with 3D vertices, and a set of associated utility functions. The utility functions include one to generate a PolyPath from a USplineComponent.

  • Added the Spectral Conformal UV Solver option to the Geometry Script RecomputeMeshUVs function.

  • Added the Spectral Conformal UV Solver option to the Geometry Script RecomputeMeshUVs function.

Bug Fix:

  • Fixed transform handling in Geometry Script functions, by making them use ApplyTransformInverse() and InverseTransformPosition() rather than trying to invert an FTransform.

Modeling Tools

New:

  • The BakeAll tool now supports skeletal and dynamic meshes as source meshes.

  • Added sample filter mask support to the BakeTexture tool.

  • Added sample filter mask support to the BakeAll tool.

  • Added Object Space Normal bake support to BakeAll tool.

  • Added Position bake support to BakeAll tool.

  • Added Selective Tessellation Options to the Displace Tool to only tessellate and displace those triangles that belong to a specific material.

  • Added a Random Colors option to the collision geometry visualizations in the PInspct and Msh2Coll tools.

  • Initialized implementation of optional boundary constraint projection for the Remesh tool.

    • Constrained edges along a boundary can collapse, and vertices can move, but they are projected back to the original boundary curve geometry.

    • Vertices at boundary "corners" (defined using an angle threshold criterion) are constrained to not move or be deleted.

  • DynamicMesh3: Add comments to AppendTriangle functions saying the vertices must exist and the indices must be distinct

  • Added a Detail Customization class for AutoLOD properties to enable HintText to be used in some text entry fields when the field is empty.

  • Updated AutoLOD tool's UI to validate group layer name and weight map layer name when specified by the user. Issues a warning if the specified layer doesn't exist

  • Adjusted AutoLOD tool's UI to not clear the warning area if there is a non-empty result.

  • Turn selection checkboxes into buttons in PolyEd and TriEd modeling tools.

  • Added the Spectral conformal parameterization option to the Unwrap UVs tool.

  • Support running various tools only on limited selections in the UV editor, and support multi-asset selections.

  • Support seam edges to be collapsed by the remesher if Preserve Sharp Edges in unchecked in the Remesh tool.

  • Added a Smooth Boundary operation to the Mesh Selection tool.

  • Added convex decomposition options to Msh2Coll tool and Geometry Script collision functions.

  • Updated PolyEd to work better on many common open-boundary cases by placing extra selectable corners on sharp group edge bends.

  • Adjusted the Add Primitive tools accept/cancel so that the initial click can place the mesh and then the settings can be modified before accepting the tool.

  • Allow users to set specific extrude distance in PolyEd tool.

  • Allow users to create a new asset in CubeGrid tool if the underlying asset is deleted.

  • Various CubeGrid tool improvements. - Made the tool Accept/Cancel.

  • Added the ability to set block size at current power

  • Added ability to initialize the grid from a given actor, initialized to the current target.

  • Added the option for the grid sizes to follow the default editor grid (1, 5, 10, 50, 100, etc).

  • Allowed global mode for gizmo manipulation, to allow editor grid snapping to work.

  • Add Select All and Invert Selection actions to PolyEd.

  • Enable selection support within the UV Editor's Layout tool.

  • Enabled support of selection within the UV Editor's Unwrap tool.

  • Implemented support for snapping on gizmo initiated transforms in the UV Editor.

  • Added a new toolbar in the 2D viewport that resembles the snapping controls found in the main level editor.

  • Added support for selection mechanics within the 3D viewport.

  • Updatedthe 3D UV Editor viewport to support mouse picking and marquee selection modes, just as in the 2D viewport.

  • Provided a new Select All command bound to Ctrl + A. The Escape key will unselect all selected elements.

  • Added a bridge edge action to the PolyEd tool, which creates a face between two boundary edges. If the two edges being bridged are connected by edges at either end, this action will not weld the edges of the new face to the existing edges, potentially leaving holes in the mesh.

  • Made the transform gizmo in the PolyEd tool visible by default - appearing automatically when any portion of the mesh is selected.

  • Support for creating DynamicMeshActors in Modeling Mode is now enabled by default.

  • Mesh Booleans and CutMeshesWithMeshes. When filling holes, generate normals and UVs for the new patches

  • Updated the UV Project status bar message to include information about Shift+Ctrl+Click for repositioning without reorienting.

  • Adjusted the PivotAct tool to now show the active transform position and rotation in the tool's details panel.

  • Extended the edge weld action in the PolyEd tool to group edges. Edges that have vertices other than their endpoints can be welded by sequentially welding their simple edges automatically. If the two group edges being welded have different numbers of vertices, then the group edge with fewer vertices is split until the two have the same number.

  • Added support for symmetric mesh vertex sculpting in the VSculpt tool. Symmetry is detected and applied via vertex/point-set symmetry rather than topological symmetry. The Symmetry Plane is auto-detected (implemented in FMeshPlanarSymmetry) and currently cannot be specified by the user.

  • Added a "Find Quads" mode to the Polygroup Generation Tool in Modeling Mode ("GrpGen"). This mode attempts to reconstruct the source quads of a triangle mesh as Polygroups by incrementally finding pairs of triangles. The implementation of this algorithm is in the FPolygroupsGenerator::FindSourceMeshPolygonPolygroups() function.

  • Added support for creating and selecting a target Polygroup layer in the Polygroup Generator tool (GrpGen).

  • Added support for setting target groups from an existing layer. Users can perform operations such as copying groups between layers and duplicating an existing layer.

  • The Edit Normals Tool in Modeling Mode now allows the user to specify alternate Polygroup layers to define normal creases.

  • Added support for Spectral Conformal unwrapping mode in the UV Editor's Unwrap tool to match functionality existing in the Modeling Mode version of the tool.

  • Changed the selection gizmo placement in the UV Editor from being the centroid to the bounding box center of the selected elements.

  • Added support for a new launcher for the UV Editor to appear in the Modeling Mode UVs tools category.

  • Added a new ISM Editor Tool. Users can select and manipulate Instances in all the InstancedStaticMeshComponents of the selected Actors.

  • Added new high performance rendering components for handling mesh highlighting on large meshes in the UV Editor.

    • Includes 2D and 3D variations of Point Sets, Line Sets, and Triangle Sets. These are considerably stripped down from the previously used component classes, designed with the intent on reducing needed memory bandwidth to move data to the rendering thread.

  • Made the following mesh creation tools generate tangents for their created meshes:

    • PolyExt

    • PathExt

    • PathRev

    • BdryRev

  • Allowed selection mode changes even if the mechanic is not currently enabled in the UVEditor.

  • Added drag alignment mechanic to the plane control gizmo in PolyExt tool, enabling translational and rotational snapping when moving or rotating the plane used for drawing the profile to extrude.

  • UVEditor: Cleaned up options for the various UV Unwrap algorithms to only be visible to the user when the appropriate method has been selected to reduce confusion in the UX.

  • Added hotkey R to hide plane control gizmo in the PolyEd tool.

  • Added toggleable corner point visualization to the PolyEd tool.

Improvement:

  • Adjusted UVs to always stay aligned in the same orientation when using the CubeGrid tool.

  • Updated CubeGrid's UVs to be contiguous when performing multiple steps with the same selection.

  • Updated CubeGrid sides to maintain the same groups with repeated steps of the same selection.

  • Added support in CubeGrid for scaling UV's.

  • Added support in CubeGrid for focus hotkey.

  • Improved performance and runtime speed of rebuilding the UV overlays and meshes when edits or channel switches are performed, particularly on high polygon count meshes.

  • Cleaned up warnings in the UV Editor related to type truncation and loss of precision issues in adherence with coding best practices.

  • Improved WeightMap support in many tools in Modeling Mode, such as Duplicate and where possible Combine. In cases where weight map layers with duplicate names could be created, unique names are now auto-generated/enforced.

Bug Fix:

  • Improved Mesh Boolean and Self-Union (MshBool and Merge tool) results to better handle nearly-coplanar sliver triangles.

  • Fixed issue where the TargetMesh property was incorrectly set for skeletal and dynamic mesh targets in the BakeAll tool.

  • Fixed MaterialID bakes to overwrite pixel buffers instead of accumulate.

  • Fixed incorrect tangent normal bakes in the BakeAll tool by ensuring that the normals are transformed into the correct space for each source mesh.

  • Fixed issue where the preview material in the BakeTexture tool was not reset when output type was modified.

  • Fixed issue where the preview material in the BakeAll tool was not reset when the output type was modified.

  • Fixed correspondence strategy in FMeshMapBaker when input meshes are the same.

  • Fixed an issue where the error material was not shown when BakeTexture tool had invalid inputs.

  • Fixed an issue where the error material was not shown when BakeVertex tool had invalid inputs.

  • Fixed an issue where the error material was not shown when BakeAll tool had invalid inputs.

  • Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeTexture tool.

  • Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeAll tool.

  • Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeVertex tool.

  • Fixed an issue where vertex colors were incorrectly encoded when converting between static and dynamic meshes.

  • Fixed bugs with how the CubeGrid tool deals with materials.

  • Made the Msh2Coll tool use a background thread to compute collision shapes, so it will not lock up the editor while it computes.

  • Prevented BakeRS tool UI from allowing user to try baking only rotation, when the input's transform included both rotation and non-uniform scale, as UE transforms don't support this.

  • Fixed a crash when Displace tool tries to read WeightMap data from a deleted StaticMeshAsset.

  • Fixed PolyEd performance regression on highly tessellated mesh regions.

  • Fixed a bug where the number of the vertical slices being generated is always off by one in the Sphere Primitive Tool.

  • Corrected Lattice tool to hide the gizmo only if constrained vertices are selected.

  • Fixed PolyEd modeling tool failing to deal with certain bowtie group topologies.

  • Fixed a bug in the Displace tool where undoing changes to the Perlin noise properties would not update the mesh in the viewport.

  • Adjusted PolyEd offset and inset to work in pathological bowtie-related cases.

  • Fixed DisconnectTriangles in cases of bowties.

  • Fixed normal generation in CubeGrid tool.

  • Fixed crash in CubeGrid if gizmo is dragged without ever having selected anything.

  • Fixed PolyCut tool's handling of non-uniform scale

  • Fixed various UV editor undo/redo transactions not being expired when the editor is closed.

  • Fixed the exact predicates code accessing an index past the end of its local stack arrays.

  • Resolved the Lattice tool's handling of negative scales.

  • Fixed issue where converting a selection type resulting in an empty selection would cause an ensure to be thrown in the UV Editor.

  • Fixed handling of some transforms with a negative scale in the modeling tools and geometry script functions for managing collision geometry.

  • Adjusted the BdryRev tool to snap to the local mesh pivot if its rotation axis is 100,000 units (1000 meters) away from the target shape when the tool starts. This reduces the likelihood of confusing cases where the axis is too far away to be useful or visible.

  • Resolved bug where undoing a selection would continue to transform the previous selection using the interactive gizmo.

  • Fixed vertex sculpting brush alpha's "RotationAngle" display name not fitting in the available space, by changing the display name from "Rotation" to "Angle".

  • Resolved handling of negative scales for a number of modeling tools and geometry script functions.

  • Fixed issue in the UV Editor where activating some tools resets the selection mode, causing the user to re-select their desired mode after using the tool.

  • Made the PathRev tool warn the user if the draw plane and axis is far from the camera position, with an explanation of how to place the draw plane in the view.

  • Resolved issue where a crash would occur when a dynamic mesh is loaded into the UV Editor and then deleted externally before exiting the UV Editor.

  • Prevented crash upon opening the UV Editor if the live preview tab was closed prior to last exiting the UV Editor. Also forces the live preview tab to be opened automatically upon UV Editor startup.

  • Fixed issues where starting Play in Editor (PIE) mode wouldn't prevent the UV Editor from performing unwanted actions, such as saving assets.

  • Added a bSRGBConversion parameter to ProceduralMeshComponent's CreateMeshSection and UpdateMeshSection functions. The caller can control whether sRGB conversion is performed. To keep current results unchanged, the default values of this parameter for the two functions is different (Create doesn't convert, but Update does).

  • Corrected issue in the UV Editor where polygroups were being incorrectly set on operation factory instances in the Unwrap Tool.

  • Fixed for PolyEdit and PolyPath tools not rendering preview results when at Large World Coordinate scales.

  • Made vertex sculpting's symmetry detection more robust, so it should detect vertex mirror symmetry for arbitrary (non-axis-aligned) mirror planes.

  • Resolved issue in the UV Editor where displaying background texture incorrectly handled textures that need non-color samplers in materials, such as normals.

  • Fixed the level editor gizmo lurking invisibly, still clickable, in the HitProxy buffer after modeling tool start

  • Resolved crash when right-clicking on the asset tab in the UV Editor would fail an assertion.

  • Fixed a corner case in the BSP lightmap code causing a divide by zero and triggering an 'ensure' when the input spans zero range and exactly aligns to Scale. This happens at large-world-coordinate scales due to float precision.

  • Removed ability for the Editor Viewport Camera Controller to affect the UV Editor's 2D viewport. This solves the issues around keyboard navigation causing unexpected lockups in the editor during extreme zoom instances.

  • Fixed issue where the UV Editor's UI was in a semi-broken state after an autosave event occurred.

  • Fixed Merge tool not working at large world coordinate scales.

  • Fixed crash bug due to selection hover behavior in the UVEditor not being correctly handled by the Input Router during shutdown conditions.

  • Fixed the modeling mode split tool's "from output" material selection method for inputs with multiple materials.

  • Made sculpt tools focus on the sculpting brush using hotkey 'F', rather than the whole model.

  • Fixed crash bug occurring when selecting elements while multiple assets are loaded in the UV Editor.

  • Made PlanePositionGizmo use double precision to compute plane intersections, and not crash if plane intersection fails.

  • Fixed VoxBlnd, VoxMrph, and VoxWrap tools not showing a live preview of their result at large world coordinate scales.

  • Prevented "No Action" item from appearing in the Action dropdown for the Channel edit tool.

  • Fixed Lattice tool's Dimensions setting becoming editable on control point movement redo.

  • Corrected handling of negative scales in UDynamicMeshComponent::ApplyTransform.

  • Disabled cast shadows for the Preview UV Layout square.

  • Fixed Hole tool and Boundary Revolve tool from seeing polygroup boundary edges instead of mesh boundary edges.

  • Fixed the Boundary Revolve tool skipping the last vertex on open boundaries.

  • Stopped auto-loading settings from switching the target preset in AutoLOD. Users can now choose whether they want to instead write their current settings to that target.

Deprecated:

  • Deprecated the unused Timestamp and GetTimestamp function on TPolygon2 and TPolyline3. Any code that needs to track timestamps for polygons or polylines should do so separately from these structs.

  • The UPersistentMeshSelectionManager along with related functions and classes. This is replaced by new experimental functionality in the UGeometrySelectionManager class (disabled by default).

  • Removed UV Island Conformal Unwrap action, now that its functionality is superseded by the Unwrap tool having selection support.

World Building

New:

  • Added feature to move (Left Alt down) actors from Data Layer(s) to another data layer in the Data Layers Outliner.

  • Prevented most common cases of UV generation failure when performing material baking when using World Partition - HLOD.

  • Enabled Nanite on landscape HLODs if the source landscape proxies are Nanite-enabled when using World Partition - HLOD.

  • Added support to World Partition - HLODs for automatic texture sizing for Merged & Simplified HLODs and reused existing code to share it between all HLOD generation methods

  • In World Partition - HLOD, automated ScreenSize computation for "Simplify" HLOD method. ScreenSize option is now deduced from the meshes bounds and the configured draw distance.

  • Added "-DebugCapture" option to the WorldPartitionMinimapBuilder, which writes bitmaps of all captured tiles & the final minimap.

  • Instancing HLOD layers now has a "Disallow Nanite" option. This is necessary on Nanite meshes that have multiple LODs, otherwise the setting of the mesh's last LOD as the component ForcedLOD will not work.

  • Exposed HLOD options on landscapes when using World Partition - HLODs.

  • Added support for Approximate simplification method to Level HLODs

  • Changed HLOD actors folders & labels naming in the scene outliner

  • Unified autosubmit code for World Partition Builders

  • Added auto submit support to existing builders

  • Added auto submit tags support to allow scripts to provide robomerge tags for a CL

Improvement:

  • Fixed and Improved World Partition Spatial Hash Grid Preview editor material used to preview grids in the world.

  • Added highlighting full grid cells crossing the loading range radius .

  • Added loading range circle.

  • Extended the grid un-highlighted past the loaded area.

  • Added a small circle to identify the center point.

  • Fixed offsets.

Bug Fix:

  • Fixed screen percentage warping by setting the post-process to pre-tonemapping.

  • Fixed a bug where the World Partition minimap wouldn't capture LevelInstance since it never is able to UpdateStreamingState to load the actors in that LevelInstance before being captured.

  • Fixed a crash occurring in the HLOD builder commandlet when hashing landscape texture source data while potentially asynchronously building textures.

  • Fixed a few places where the FTextureSource's data was not being used.

  • Fixed crash in world browser when unloading a World Composition level that cannot be unloaded because of lingering reference.

  • Compute HLOD bounds in Z by using the subactors bounds rather than relying on the world's min/max Z when using World Partition - HLODs.

  • Improved error handling for the Merge Actor - Mesh Approximate Tool.

  • Ensure that child actor components are marked as HLOD relevant if the child actors are HLOD relevant for World Partition - HLODs

  • In the minimap builder, fixed stretched tile capture when tile wasn't square.

  • Fixed an issue where World Partition: Actors ActorGuid must not be reset in AActor::Serialize() when duplicating for PIE.

  • Fixed an issue where IMeshMergeUtilities::CreateProxyMesh() returns a single static mesh when it could return multiple meshes.

  • Makes sure skydome actors are excluded from HLOD in all Engine map templates.

  • Improved outdated HLOD detection

  • Excluded some HLOD builder subclasses from editor dropdowns.

  • Fixed an issue with ISMC custom primitive data being stored in the HLOD proxy descriptor.

  • Marked level packages created through UWorldPartitionLevelStreamingDynamic::LoadInEditor() as transient. This prevents the editor from asking to save those temp packages.

  • Fixed custom primitive data not taken into account in some specific cases with World Partition - HLODs.

  • Prevented false positive when testing for outdated HLODs

  • Hide texture size property unless texture sizing type is "Use Single Texture Size" or "Use Automatic Biased Sizes" in World Partition - HLOD: Material Proxy settings.

  • Avoided deleting World Settings from retained sublevels when using the World Partition - Conversion Commandlet.

  • Deleted HLOD actors from retained sublevels when using the World Partition - Conversion Commandlet.

Level Design and Art Tools /GeometryScript

New:

  • Added vertex color bake support to the BakeVertex tool.

  • Added CreateCircle and CreateArc functions to Geometry Script's new PolyPath class

Localization

New:

  • Expose ENGINE_API for QueueSubtitles.

  • Added support for preview versions of the localization manifests to be generated and deleted during a preview localization run.

    • This addresses false positives for localization warnings that can arise from comparing gathered strings to a stale manifest file.

    • Added a preview parameter to the Localization Unreal Automation Tool command which allows the command to run in preview mode.

    • Localization commandlets now generate *_Preview.manifest files during a run into the destination path specified by the config files.

    • The localization automation script will delete all files that end with _Preview.manifest at the end of the gather run.

    • Improved checks for manifest filename extensions to ensure no malformed manifest filenames are passed into the commandlet.

  • Introduced a Preview cmd line arg to GatherTextCommandlet to allow the gathering of source and asset files without checking out or writing any localization files. This makes dry runs to print all localization warnings much easier for debugging.

    • Introduced the -Preview arg and -GatherType param to UGatherTextCommandlet.

      • The -GatherType param can have values of All, Source, Asset or Metadata. Source will only gather source files, Asset will only gather Asset files, Metadata will only gather Metadata and All will gather all 3.

      • The -GatherType param is only supported in preview mode right now. This is because manifests are updated every single gather and we do not want the manifest to only reflect partial gathers.

      • Added additional logs to display when the commandlet is run with -Preview and -GatherType.

    • Refactored parts of UGatherTextCommandlet to reduce hard coded switch and param names.

    • Introduced a virtual function in UGatherTextCommandletBase to allow commandlets to be conditionally skipped in preview mode.

Bug Fix:

  • Inserted a no-break space between the currency code and the numeric value to improve readability when formatting a foreign monetary value.

    • When a currency is not from the current locale, the currency formatter may prepend or append the ISO currency code to disambiguate. However, this may cause readability issues. For example, 1500 Japanese yen is formatted as "¥1,500" in ja-JP, but it was formatted with its ISO currency code as "1 500 JPY" in es-ES or as "JPY1 500" in es-MX. In the last case, readers may mistakenly think that the price was 500 yen at a glance due to the spacing.

    • We inserted a no-break space between the currency code and the numeric value, so that it is now formatted as "JPY 1 500".

Online

New:

  • The callback of the gdk function XNetworkingRegisterConnectivityHintChanged is now called from the game thread, where we can safely call XNetworkingGetConnectivityHint.

  • Make Party Invite Reject a virtual method in SocialUser.

  • Only enable multiplayer subscription (which creates RTA connection) when create/join MPSD session.

  • Added callback to handle xbl multiplayer connection id change, to make sure connection id in MPSD sessions is up to date.

  • Added callback to handle xbl multiplayer subscription lost (lost connection to RTA), to stop multiplayer and delete all MPSD sessions.

  • Added USocialSettings::GetSocialPlatformDescriptionForOnlineSubsystem to get a social platform description by OnlineSubsystem name.

Bug Fix:

  • Fixed the potential playfab net driver initialization failure by delaying the authentication check of playfab user.

  • Cache the sanitized text only when successful, because it can fail to sanitize when becoming offline. When back online, we need to sanitize it again instead of getting it from the cache.

  • Fixed the connection failure of non-seamless multiplayer map travel on gdk when using playfab, listening server will no longer recreate the PlayFab EndPoint, so the URL of the EndPoint will not change.

  • Fixed the random playfab authorize failure when retry, now it depends on the waiting time to receive the custom session data change (contains new invitation data), not how many times it has retried.

  • Fixed the potential stuck issue when using playfab, now when error happens it will be returned to NetDriver, so it can be handled by map travel code.

  • Fixed UWebAPIDefinition class to use AutoCollapseCategories instead of CollapseCategories.

  • Fixed issue with H.265 being played using DX12 or Vulkan using WMFmediaPlayer.

  • Fixed DX12 playback with WMFmediaPlayer (H264/5, HAP, ProRes).

  • Fixed ElectraPlayer's close/shutdown code so it can also succeed during the engine's shutdown (PreExit) phase.

  • Made social user list keep weak pointers to users to fix GC errors when leaving PIE with GC reference elimination (pending kill) disabled.

  • Converted SocialToolKit LocalPlayerOwner to weak pointer.

Removed:

  • Removed PartyPackage.h. The PACKAGE_SCOPE usage caused issues with subclasses trying to override PACKAGE_SCOPE virtuals.

Crash Reporter

Bug Fix:

  • Stage Base.ini into crash reporter pak files to fix issues with missing configuration.

HTTP

New:

  • Added Verbose logging to track progress of HttpManager::Flush.

  • Added an option to increase HTTP log verbosity when a request is being retried.

Online Subsystem

New:

  • Added getter for EOS platform handle in OSSEOS, enabling sharing the platform with other systems.

  • Updated Android to EOS-SDK-Android-21924193-v1.15.3, and swapped to using the libc++_static variant.

  • Added IOnlineSubsystemEOS public interface header.

  • Changed BucketId in EOS Sessions to use BuildUniqueId to fix compatibility issues.

  • Updated CreateLobbyOptions fields:

    • Addition of lobby id override and lobby host migration options.

    • Removed hard coded search parameters from sessions and lobbies.

    • Refactored DestroyLobbySession to make use of lobby host migration logic.

  • Increased verbosity level for logs in FSonyHTTPRequest::TickSendState and FSonyHTTPRequest::TickThreadedRequest from Verbose to VeryVerbose.

  • Updated Steam SDK to version 1.53a (with native Mac M1 support).

  • Changed the default gamertag mode to Classic to reflect changes in GDK guidelines.

  • Added USocialToolkit::CanAutoRecreatePersistentParty to control whether we should automatically recreate a persistent party on unexpected loss.

  • Added a Compare method to party rep data that can compare a specific value without needing a full party rep data wrapper.

  • Added an overload Checkout method that does not return receipts to the IOnlinePurchase interface.

    • It is recommended to be used if the product (game) processes purchases via backend services, and the clients do not need to know about the purchase information.

    • Implemented for all supported platforms.

Improvement:

  • Refactored of logic surrounding Epic Id queries to construct UniqueIdEOS for lobby members. All logic making such queries now waits for them to finish before triggering any completion delegates. Refactored logic to mirror API Lobby data into OSS Lobbies.

  • Refactored session object captures in session methods to avoid errors in lambdas.

  • Moved support for account portal login to the base FEOSHelpers class for subclasses to use on Android.

Crash Fix:

  • Fixed some crashes caused by converted strings being moved prior to use.

  • Refactored of FOnlineAsyncTaskGDKRedeemCode to not end prematurely on app reactivation, causing a crash.

  • Added fix for crash in CopyLobbyData when the session data was outdated.

  • Fix for crash in FGDKAsyncBlock destruction.

Bug Fix:

  • Fixed some occurrences of unterminated string conversions.

  • Fixed OnlineStoreEOS to use the DecimalPoint value from EOS, not the one from UE I18N, as they disagree on the number of minor units in Chilean Pesos (Centavos).

  • Fixed no core affinity being set for GameChat audio thread on GDK platforms.

  • Fixed OSSEOS checking the data field of an auth token for validity, and ignoring the string field.

  • Update Win64 binary to EOS-SDK-21924193-v1.15.3, to fix inability to fall-back on browser for account portal login flow.

  • Fixed warnings about EOSSDK failing to load, when the SDK does not exist in the first two places we check.

  • Fixed OSSEOS headers so they are includable outside the plugin.

  • Fixed error/warning logging noise on LogEOSSDK when platforms are created and destroyed without being ticked, especially in commandlet runs.

  • Fixed CompoundSubsystemEnum ignoring ESocialSubsystem::Primary and not creating a unique value for a given combination of subsystems.

  • Added missing CREATE_MIRROR_PLATFORM_SESSION checks in OnlineSessionEOSPlus.

  • Added logic to cache the updated Auth Token after a refresh in UserManagerEOS.

  • Addition of logic to make FUserManagerEOS robust to callbacks returning after module shutdown.

  • Added logic to return canceled error if an EOS purchase was canceled.

  • Added missing early error exit to FUserManagerEOS::QueryExternalIdMappings.

  • Fixed CacheDirectory issue with Android EOSSDK initialization

  • Fixed the purchase validation issue on OnlinePurchaseInterfaceCrossgen that was caused by initializing the OnlinePurchaseInterfaceCrossgen before the OnlineIdentityInterfaceCrossgen.

Deprecated:

  • The OSS Oculus plugin has been deprecated in UE 5.1 and is no longer supported. The Meta QuestPlatform plugin can be found on either the UE Marketplace or Oculus Developer site.

Removed:

  • Code for unused and deprecated GooglePlay Billing library. Actual dependency is brought through gradle.

  • Deleted deprecated OnlineSubsystemTwitch.

Voice

New:

  • Added getter for EOS platform handle in EOSVoiceChat, enabling sharing of the platform handle with other systems.

  • Reimplemented SetPlayerVolume for EOSVoiceChat, now there is SDK support.

Bug Fix:

  • Fixed a voice over IP problem on Android and, more generally, if the platform does not implement GetMicrophoneAmplitude.

WebSockets

New:

  • Added optional/opt-in webserver to WebSocket server using the already available functionality from the underlying libwebsockets implementation.

  • Added serving static content through the websocket server without taking an extra port for a webserver.

  • Added ability to serve directories on disk as http mounts.

Bug Fix:

  • Fixed memory leak in FWebSocketServer where some manually created arrays were not using delete.

Platform

API Change:

  • The use of an integer "Controller Id" to refer to both a logical user and a specific input device is being deprecated in favor of the new FPlatformUserId and FInputDeviceId types.

    • In 5.1 it is possible to convert between those types and the deprecated Controller Id, but this will not be available in a future version of UE when full support is added for multiple input devices under a single user.

New:

  • Don't add messaging endpoint unless Xbox console is available to avoid long hang.

  • Added support for PlatformUserId to clearly differentiate between logical users and input devices. Instead of using raw integers for both the controller Id and the user index, there are now different types for users and devices. To support this conversion there are utility functions in GenericPlatformMisc and the online identity interface that allow conversion between the new types and integer indexes.

  • Added pool support in MallocBinned3 for larger than default alignment (16). Previously these allocations would allocate in page-sized blocks which could lead to large memory waste.

  • Load DP on demand when using dp.override.

  • Added Getters for ShaderPlatform Name, the Shader Format of the ShaderPlatform, and the ShaderPlatformPropertiesHash as defined in DDPI

Bug Fix:

  • GDBPrinter bug fixes: Fixed TSparseArray printer. Fixed FName printer so that it doesn't use a hardcoded value to determine if it's a valid FName or not. Disabled broken TMap and TSet printers, but you will see output from the TSparseArray printer so you can see the stored values.

  • Remove XboxCommon implementation of PublishSymbols so it uses the same implementation as Windows and don't attempt to compress pdbs. Fixes issues with failing to publish large PDBs that the compression format does not support.

  • Fixed valid SDK filtering in Turnkey by adding missing fields to SDKDescriptor declarations.

  • Fixed a problem that was preventing Platform Extensions from calling StartupModule on new extension modules.

  • Fixed IterateDirectory() method on Unix, iOS, and Mac so it's behavior matched other platforms (Windows, etc.).

  • Disabled PLATFORM_ALLOW_ALLOCATIONS_IN_FASYNCWRITER_SERIALIZEBUFFERTOARCHIVE on platforms which use FPlatformMallocCrash during crash handling.

Desktop

New:

  • Adding FirstMove events to windows. This is enabled with WindowsApplication.EnableFirstTouchEvent.

Linux

New:

  • Improved process for exporting to Raspberry Pi 4.

    • Added a new vendor ID for Broadcom.

    • Split ASTC and ETC2 support into separate texture formats for Vulkan, as ASTC may not be supported.

Bug Fix:

  • Added support for IsGamepadAttached on Linux.

  • Added support for Linux to search (using "which") for CLion outside of the default expected location.

  • Linux windows now have a reasonable minimum size, and no longer can be scaled down to 1 pixel wide/tall.

  • UE on Linux now locates any standalone Rider installation if it is either installed to the default location "/opt" (Rider Installation Guide), or anywhere else that is on the PATH.

  • Fixed an issue where global shaders would get cooked for Linux Server platforms if it had any targeted RHIs enabled.

  • The Chromium Embedded Framework (CEF) library that powers the Web Browser Widget has been updated to use Chromium's "Ozone" rendering backend under Linux. As a result, the Web Browser Widget now renders correctly in Linux environments that lack an X11 server, such as desktops running Wayland without the XWayland compatibility layer, and headless environments such as containers.

  • Fixed missing quotes in GenerateProjectFiles.sh.

  • Fixed QMake project generator defines.

Mobile

Bug Fix:

  • PipelineCaches directories are no longer trimmed in pak memory optimization. These need to be queried to discern when it is appropriate to kick off shader loads while installing data.

  • PipelineCaches directories are no longer trimmed in .pak memory optimization, as they need to be queried to tell when it is appropriate to begin shader loads when installing data.

Online

New:

  • Script added to retrieve Pixel Streaming Samples files from new repository in PixelStreaming/Resources.

  • Added Editor Streaming module for compositing and streaming of the Unreal Editor.

  • Pixel Streaming now uses WebRTC codec negotiation.

  • Pixel Streaming now supports custom protocols.

  • Pixel Capture plugin created which can capture pixel buffers and sample them at independent rates.

  • Added support for arbitrary audio input into Pixel Streaming.

  • Added a compute shader for faster I420 conversion when using VPX, this is faster than CPU readback and conversion in our tests.

  • Added peers can now swap roles between P2P and simulcast mid-stream. To test this new feature:

    • Simply toggle the PreferSFU toggle in the settings panel.

    • Click the new restart stream button in the settings panel.

  • The editor can now resize appropriately if requested by the front end when Pixel Streaming the editor.

  • PixelStreamingVCam supports camera control with ARKit.

  • Streamer will now attempt reconnection after a set delay instead of instantly.

  • Added embedded C++ signaling server, used for unit testing and some limited use cases where we cannot download servers (for example, offline usage in virtual production).

  • Added a new module in Pixel Streaming plugin called "PixelStreamingServers" that is the C++ API for launching a signaling server (embedded or downloaded).

  • Added datachannel support to SFU.

  • Added WebRTC C++ client behavior to pixel streaming system. This is used for developing unit tests.

  • Added a unit test that will start streaming, connect a client and check that a data channel message can be sent.

  • Added the ability for a user to start/stop streaming as needed through the use of PixelStreaming.StartStreaming and PixelStreaming.StopStreaming.

  • Added the ability for the stream resolution to be changed at runtime.

  • Added a ForceKeyFrame blueprints and C++ method which forces the module's default streamer to send a keyframe.

  • Added support for use of WebRTC version 96 with Pixel Streaming. Note: There are noticeable performance regressions introduced with this version that are being investigated. Version 84 remains the default.

  • Added the ability to stream the main Level Editor window to the browser.

  • Added a Pixel Streaming specific toolbar for starting and stopping streaming in the editor, as well as configuring some basic plugin settings.

  • Added ARKit transform support for controlling PixelStreamingVCam cameras with ARKit transform data received from the LiveLink app. See PixelStreamingVCamSession for handling of this data.

  • Added stat pixelstreaminggraphs that show real time graphs of Pixel Streaming stats.

  • Added -PixelStreamingInputController=Host (or Any) to optionally restrict stream inputs to a single host peer. The default is -PixelStreamingInputController=Any.

  • Added PixelStreamingServers utility to launch PixelStreaming servers from C++. (Added accompanying test too).

  • Added tests for FPixelStreamingSourceFrame, FPixelStreamingFrameMetadata, FPixelStreamingFrameAdapterProcess and FPixelStreamingFrameAdapter.

  • Added the ability to override the default InputDevice.

  • Added the ability to have multiple streamers.

  • Added support for LeftTriggerAnalog and RightTriggerAnalog to be sent as acceptable button press options in Pixel Streaming — even though they are analog inputs, some use cases require mapping them as buttons.

  • Added launch arg -PixelStreamingNegotiateCodecs to enable negotiating Pixel Streaming video codecs with the browser.

    • Default case: Negotiating video codecs is disabled and Pixel Streaming will only send a single selected codec, which can be configured using -PixelStreamingEncoderCodec=H264/VP8/VP9.

Improvement:

  • WebRTC version upgraded to 4664 (M96) on Windows.

  • Allow Editor dimensions to be set at launch time when Pixel Streaming editor with "-EditorPixelStreamingResX= and -EditorPixelStreamingResY=", or "-EditorPixelStreamingRes=".

  • Implemented more accurate Pixel Streaming frame time stats.

  • Fixed match viewport resolution browser side option.

  • Changes to improve performance of editor when Pixel Streaming plugin is enabled but not streaming.

Crash Fix:

  • Fixed PixelStreaming module state cleanup that was causing packaging crashes.

Bug Fix:

  • Fixed resolution changing which was broken in 5.0.

  • Fixed cirrus.js emitting ugly error message if config file was read only..

  • Fixed PixelStreaming controller input. PixelStreaming is now compatible with the new FGenericApplicationMessageHandler controller interface.

  • Fixed Pixel Streaming FPS CVar so that it correctly enforces FPS.

  • Fixed to make current Pixel Streaming compatible with older versions of UE signaling protocol where "playerConnected" message is not sent.

  • Fixed for format requests locking forever.

  • Fixed multi-peer Pixel Streaming not working with VPX codec.

  • Fixed so that NVENC now only needs to scale frames as needed, there was some extraneous scaling happening before.

  • Fixed on screen hud stats on startup that were not dismissable.

  • Fixed bug where SFU peers were unable to receive data channels messages from the streamer.

  • Fixed failing "connect" test where quality & input controller messages were being sent too early (before datachannel was established) for P2P peers.

  • Fixed PixelStreamingAudioComponent finding trying to find audio sink on a data-only peer and crashing.

  • Fixed PIXELSTREAMING_API exports on some files.

  • Fixed PixelStreaming.build.cs that was too harsh about excluding any file with 'node' in the name.

  • Fixed PixelStreaming.build.cs to exclude packaging the platform_scripts/cmd/coturn directory.

  • Fixed Vulkan fast texture copy codepath to not crash in some edge cases.

Removed:

  • Removed Pixel Streaming Samples as it has been moved to its own repository on GitHub.

  • Removed unnecessary CVarPixelStreamingWaitForTextureCopy due to refactor.

XR

API Change:

  • In an unlikely case you relied on the previous behavior, set FSceneViewExtensionContext::bStereoEnabled=true in your code before calling FSceneViewExtensions::GatherActiveExtensions()

New:

  • OpenXR: Expose xrGetCurrentInteractionProfile to blueprint

  • Added setting to specify which PIE instances get the VR headset if multiple PIE instances are used.

  • Added PrimaryPIEClientIndex setting to Editor Preferences > Level Editor > Play > Multiplayer Options > Client.

  • Added features related to play area bounds to OpenXR.

  • Added a Blueprint to get the bounds and their origin in UE world space.

  • Added a Delegate to respond to play area updates.

  • Added basic support for blink and pupil info in eye tracking. Will be false/0.0 if this feature is not supported by the platform.

  • XR: Added keyword "HMD" to IsHeadMountedDisplayEnabled, and IsHeadMountedDisplayConnected

  • OpenXR: Added OnDestroySession to IOpenXRExtensionPlugin.

  • Added haptic Soundwave support for stereo sounds.

  • Added Support for Gauntlet automation to launch on HoloLens devices

  • Exposed parameters of a fake stereo device for tweaking in UI (PR #9224 contributed by ppchavan001).

  • Initial change to support setting PixelDensity in OpenXR.

  • Added pipelined access to PixelDensity, and checks to ensure that app-set PixelDensity is not more than the runtime actually supports.

  • OpenXR: Register with FCoreDelegates::VRHeadsetRecenter Now that FOpenXRHMD supports ResetOrientationAndPosition correctly, we can register with the FCoreDelegate for those clients.

  • Added support for multi-viewport on PC (D3D11/12, Vulkan) for stereo rendering and enabled by default.

  • Added mono pass from plugin driven views in OpenXR.

  • HMD extensions are now opt-in rather than opt-out when setting up a view family.

  • Added protected access to AllocateDepthTexture

  • Added Emulated world/tracker locked quad layers for OpenXR

  • Translucency light volume textures are now shared between both views of a stereo pair.

  • Made VSM debug view work in both eyes.

  • Removed Omni-Directional Stereo Capture (experimental)

  • Added "Emulate Stereo" level play option for standalone games for easier testing of rendering issues in VR without a headset.

  • Added pipelined support for NativePresent in FOpenXRRenderBridge

  • Added more ways to enable OpenXR validation (-openxrdebug, -openxrvalidation)

  • OpenXR PixelDensity: custom quantization of width In the scenario where we have an atlased stereo texture, we need to make sure each half of the texture is aligned by 8 (new Strata requirement). We can do this by manually quantizing the texture after applying pixel density.

  • Added Lumen hardware raytracing in VR.

Improvement:

  • Extracted MicrosoftSpatialAudio from WindowsMixedRealityInterop so that it can be used with OpenXR rather than WMR.

  • Changed CalculateRenderTargetSize assert so that it tolerates Game or Rendering thread.

  • Improved tooltip for ShadingRate Material attribute.

Bug Fix:

  • Fixed a typo in Epic_openxr.h

  • Fixed MicrosoftSpatialAudio when using MicrosoftOpenXR -

  • Fixed hololens target settings ini lookup.

  • Fixed code that used to run while the RenderThread did not exist, and thus ran on the game thread, this code now runs on the render thread.

  • Fixed FScheduler members being shadowed by FHoloLensRunableThread

  • Fixed SceneTextures.cpp using module lookup functions in the render thread that are only safe to use without locking on the game thread.

  • Added an accessor for this information to IStereoRendering.h and cached the values in the oculus HMD implementation. This cached value can be safely read on any thread.

  • VectorVM fix for arm64 Neon -Need return type of MakeVectorRegisterInt64 for Neon to match SSE.

  • OpenXRAR - avoid assert in GetDisplayTime when the openxr session is not synchronized. -Checking IsFocused before trying to get time. xrLocateSpace is only supposed to work when in the focused state. Our pins will retain their last known position. During pin creation they won't locate at all which should result in them maintaining their unreal world position.

  • Fixed AR Tracked Geometry 64 bit FVector.

  • VR PIE now correctly resizes the viewport

  • Fixed thread safety of XR LockModularFeatureList.

  • Fixed OpenXRHMD initialize space locations to avoid bad quaternions.

  • Changed OpenXR xrGetReferenceSpaceBoundsRect make ensure on failure into a warning.

  • Changed FPostProcessRectParams to support 2DArray textures

  • Fixed shadow rendering using multiviewport in VR.

  • Fixed translucency artifacts in VR.

  • Fixed SingleLayerWater in Instanced Stereo in VR

  • Fixed issue where ValveIndex_Left_Trackpad_Touch would never call release.

  • Enable ISR + multi-viewport for PSVR2

  • Fixed the Editor Viewport not restoring correctly after exiting VR Editor Mode

  • Fixed properly pipeline frame state from Game Thread to Render thread

  • Pass SV_ViewID to VIEW_ID as uint, no more casting to float

  • Fixed volumetric cloud rendering in stereo.

  • Fixed too dark mobile preview.

  • Fixed volumetric fog in VR.

  • Fixed artifacts with the distance field shadows in VR.

  • Fixed XR scene textures to use requested extents more uniformly.

  • Fixed crashing in forward when velocity output in base pass and MSAA are enabled.

  • Fixed Nanite rendering in VR

  • Fixed bind InstancedViewUB independent of active stereo rendering The shader compiler will enable ISR or Mobile Multi-View in shaders, independent of whether they are actively engaged in stereo rendering.

  • Fixed support for the left texture for the Quad stereo layer.

  • Disable max viewport resolution

  • Fixed crash in ImgMediaMipMapInfoManager with -stereoenabled.

Deprecated:

  • Remove GetScreenPercentage blueprint function deprecated since 4.19.

  • The XR system click/touch FKeys, which cannot be bound in OpenXR, have been deprecated.

Platform Mobile

New:

  • Added r.Mobile.DesiredResX/Y for Android and -mobileresx and -mobileresy commandline overrides as alternative to using r.MobileContentScaleFactor.

    • Set either r.Mobile.DesiredResX or r.Mobile.DesiredResY to a value greater than 0, otherwise r.MobileContentScaleFactor will be used. If you set both, r.MobileDesiredResX will be used. These values are in pixels, and X and Y correspond to the current orientation of the device. Whichever dimension you set, the other one will be automatically calculated to preserve the aspect ratio. The final resolution used will be clamped to the device window resolution for the orientation.

  • Fixed Shader Complexity Preview ES31.

  • Added the static method ShouldCompileShaderFrequency to filter frequencies for mobile platforms. This can be used to only allow vertex, pixel or compute shaders.

Bug Fix:

  • APlayerController now enables motion controls by default.

  • Mobile platforms have UE_COMMONINPUT_PLATFORM_SUPPORTS_TOUCH set to true for the CommonUI plugin.

  • Mobile Texture Lookup Scene Depth now outputs WorldZ instead of DeviceZ.

  • Vulkan Shader Compiler now checks the Shader Format instead of the Shader Platform.

  • Added a method to check if Mobile post-processes should allow flipping. This is used to prevent Scene Captures from being flipped, as they are used as textures and sampled in the main scene.

  • Backbuffer now sets the TexCreate_ResolveTargetable flag for cases when MobileHDR is set to false and MSAA is enabled.

Removed:

  • SceneDepthAux removed from certain platforms.

Android

New:

  • libUnreal.so is now built against static libc++ due to issues with overriding new and delete. All our out of the box dependencies were updated to reflect this change. This was necessitated due to the engine upgrading to NDK 25b. Unreal Build Tool will scan for dependencies and throw an error if they require libc++_shared.so. You can disable this check using the bDisableLibCppSharedDependencyValidation option. You should update all dependencies in your project to build against static libc++, as mixing both static and shared libc++ within one app is unsupported by NDK and known to cause startup crashes. We still include libc++_shared.so in your .apk by default to give provide room to upgrade your project. If you have successfully upgraded your project to eliminate any dependencies on libc++_shared.so, you can skip packaging it using the bSkipLibCpp option within the /Script/AndroidRuntimeSettings.AndroidRuntimeSettings group of your .ini file.

  • To reduce binary size in Android shipping builds, all symbols except the ones called from Java are now hidden by default. Debug\Development\Test builds still have default visibility to allow symbolication of crashes and asserts.

  • Updated libunwind to the latest version from Github.

  • Android toolchain now supports both full and thin LTO options. You can enable these with any of the following options:

    • TargetRules

    • bAllowLTCG or bPreferThinLTO

    • UBT command line arguments: -LTCG/-ThinLTO. Please note that you have to enable both options if you want to enable ThinLTO. On Android, unlike on other platforms, PGO doesn't assume LTO, so if you have PGO builds and want to have LTO enabled, you'll need to enable LTO manually. This is due to toolchain issues, as having PGO assume LTO can cause extremely long build times and out of memory linker crashes.

  • Added Clang Analyzer support to Android toolchain. This can be enabled using the -StaticAnalyzer UBT command. Refer to TargetRules.cs for more information.

  • Added Android Toolchain option to disable stack protector. It can be disabled using the bDisableStackProtector option in the /Script/AndroidRuntimeSettings.AndroidRuntimeSettings group of your config file (*Engine.ini).

  • Added file and line number logging for UnrealPluginLanguage (UPL) warnings and errors.

  • Raised minimum Android version supported to 8.0 (SDK level 26).

  • Set the minimum Java compile SDK level for Android to 30.

  • If the -BypassGradlePackaging option is passed to UnrealBuildTool, Android packaging will be faster when only libUnreal.so changes.

  • Individual OpenGL uniform buffers now have the option to force using real uniform buffers instead of emulated uniform buffers.

  • Added Mobile Fidelity FX FSR as a plugin.

  • Added support to SPIRV to generate structs from arrays with constant access which allows OpenGLShaderCompiler. This improves packing of shader data.

  • Added ANDROID_SDK_HOME for AGDE to the SetupAndroid script.

Crash Fix:

  • Added SPIR-V patch pass to fix driver crashes on Android 10.

  • Fixed a possible crash on Macs where the editor would not properly shut down due to missing Turnkey support for Android.

Bug Fix:

  • Android builds macOS now uses the rootProject path for AFSProject construction for AndroidFileServer. This fixes broken build processes.

  • Because JCenter is now a read-only repository, mavenCentral repository is now preferred before JCenter. This is in compliance with Google's guidance regarding JCenter.

  • Removed deprecated AppCache settings calls from WebViewControl.

  • Fixed issues with Adreno version checks in MediaPlayer. These now use a more detailed regex search instead of parseInt to determine the modelnumber.

  • Fixed misnamed functions for background and foreground delegates in Android media plugins.

  • Added a check for ro.soc.model for ConfigRules chipset matching.

  • Fixed installing of the overflow OBB file for Android.

  • Fixed a null reference exception when running Turnkey on an installed engine build without Android support.

  • Android: Prevent hang during pause by flushing GT before blocking RT During Android Pause, the Event Thread (ET) will block the Rendering Thread (RT), followed by waiting for a Game Thread (GT) command to complete. With Vulkan enabled, there could be a scenario where the game thread (GT) is waiting on the RT to flush. If the GT is waiting on RT while the ET blocks the RT, the ET will then deadlock waiting for GT. Instead, the ET can wait on the GT to finish first, with an unblocked RT.

  • Added PropagateAlpha when generating the manifest for Android.

  • Android: Prevent hang during pause by flushing GT before blocking RT During Android Pause, the Event Thread (ET) will block the Rendering Thread (RT), followed by waiting for a Game Thread (GT) command to complete. With Vulkan enabled, there could be a scenario where the game thread (GT) is waiting on the RT to flush. If the GT is waiting on RT while the ET blocks the RT, the ET will then deadlock waiting for GT. Instead, the ET can wait on the GT to finish first, with an unblocked RT.

  • Changed the SDKManager check order for the SetupAndroid script.

  • Added missing support for Turnkey for Android on Mac.

Deprecated:

  • Removed legacy Visual Studio and NVidia Tegra Nsight Android project generators. These are now replaced by Google's AGDE.

iOS

New:

  • Fixed IMappedFileHandle::MapRegion to map files or regions smaller than the page size.

iOS, tvOS, and iPadOS

New:

  • Ignore iTunes DLL if the version number cannot be parsed expected.

  • Added tvOS Bink Audio Decoder library.

Bug Fix:

  • Fixed multiple bugs in MallocBinned, the default allocator for iOS.

  • Fixed iOS Remote Mac toolchain cwrsync home directory detection. This was causing issues with SSH key generation in some Windows Active Directory environments.

RAD

New:

  • Added the latest Bink binaries.

Rendering

New:

  • Added a reference motion blur mode to MRQ In this mode, the post-processed motion blur is ignored and the Path Tracer accumulates frames across temporal samples instead, denoising only once per-frame instead of once per-temporal sample. This can be used to workaround limitations of the post processed motion blur effect, and allows pushing the temporal sample count higher than otherwise possible.

  • Added experimental temporal denoising for offline path tracing that is spatially denoised. It gives a final touch to mitigate the temporal instability while preserving fine details. Enable the temporal denoiser in MRQ by adding the console variable 'r.PathTracing.TemporalDenoiser 1' when Path Tracing Denoising is enabled in the Post Process Volume Path Tracing settings when Denoiser is enabled.

  • Hair strand rendering now allows a negative threshold to disable the Path Tracer invalidation to work around cases where the hair simulation does not fully settle. It also removes the clamp so the threshold can be increased past 1cm without fully disabling it.

  • Added console variable r.SkinCache.SkipCompilingGPUSkinVF which enables you to skip compiling all GPU Skin Vertex Factor variants (except the pass through) if you are using GPU Skin Cache. The idea is that if you are using GPU Skin Cache and all Skeletal Meshes can fit within the cache at runtime, you only need the global compute shaders to perform GPU skinning. This means you will never need any GPU skin factory variants for any material, so they can skip compiling these shaders for significant savings.

  • Don't compile GPU Skin Virtual Factories for special materials when 'r.SkinCache.SkipCompilingGPUSkinVF' is enabled. This accounts for roughly a couple thousand shaders across all our special engine materials, and these shaders will not be used, even for special cases in the engine, so it is safe to skip them.

  • Only compile ‘FTrivialMaterialCHS' when the proper console variables have been turned on. This saves on having to compile this shader variant for every material. In internal test projects, this saves ~2,000 shaders of ~3% of all shaders, and saves 15 shaders from being compiled in WorldGridMaterial in that same project.

  • Avoid calling ‘Get Material With Fallback' which was forcing compiling of shaders for materials even when On Demand Shader Compile (ODSC) was turned on. In CitySample, we went from compiling 125,000 shaders down to 9,000 shaders, which went from spending 13 minutes submitting shaders down to ~15 seconds. Calling ‘GetIncompleteMaterialWithFallback' is safe to do in this case, since we don't actually need shaders from the material and are simply querying it for blend mode and for certain ray tracing flags.

  • When running with On Demand Shader Compilation (ODSC), do not try to fetch fully completed shader maps from the DDC, which improves latency.

  • MRQ will submit remaining jobs for compilation for all the materials in the world and block on the results before rendering.

    • MRQ

      • When running with ODSC in the editor Materials can have incomplete or partial shader maps. Shaders might be missing and we need to ensure all of them are compiled so we don't ever render a frame with the default material.

      • This logic will run before every render frame to properly handle new materials being loaded.

      • If there are no incomplete materials this logic is a no-op and very lightweight. ~600us.

    • UMaterialInterface

      • Added a function to UMaterialInterface to query if we have a complete set of shaders.

      • Made CacheShaders and IsComplete part of the public interface of UMaterialInterface.

    • Optimizations

      • 31x speedup to 'SubmitRemainingJobsForWorld'when there is no work to do. This went from 20ms down to 0.645ms. It only performs the material update context (which flushes rendering commands) when there are materials that actually need to do work.

      • This turns 'SubmitRemainingJobsForWorld' into a no-op when there is no work.

    • Misc

      • When blocking on all shader map be sure to spawn a slow dialog so we can see the progress of shader compilation. - Only spawn the dialog (a heavy operation) if there are jobs.

      • Always show the dialog even in PIE.

  • Enabled Editor On Demand Shader Compilation, which drastically reduces the number of shaders compiled when working in the editor. On average, a 1.6x speedup when opening the editor and a map in various projects. Best case, a 2.23x speedup.

  • Added a way to override the Sky Atmosphere visual sun disk radius from the material graph independently from the directional light radius.

  • Volumetric fog now handles height fog start distance.

  • When running with ODSC in the editor Materials can have incomplete or partial shader maps. In other words, some shaders might be missing. If a render system requires all shaders to be present and can't use ODSC functionality to compile the necessary shaders we need a mechanism for compiling just the missing shaders.

    • Added UMaterialInterface::CacheShaders which is implemented for UMatetrial and UMaterialInstance. The call is just forwarded along to CacheResourceShadersForRendering and InitStaticPermutation respectively.

    • You can call CacheResourceShadersForRendering multiple times (even with a completed shader map) and it will not recache uniform expressions. If the Resource's shader map is complete the function is a no-op.

    • FObjectCacheContext can accept a UWorld and will only return primitives that are in that world.

    • Added a function SubmitRemainingJobsForWorld(UWorld* World, EMaterialShaderPrecompileMode CompileMode) that will iterate all materials used by primitives in the world and compile the missing shaders.

    • SubmitRemainingJobsForWorld() is used in various scenarios in the editor to ensure al shaders are compiled for all materials before proceeding.

    • Explicitly try to compile UI and PP materials. Since we don't know which ones are used in the given world we just have to iterate all loaded ones. This is a potential area of optimization.

    • If there are already complete shader maps (if you are not running with the shader job cache), SubmitRemainingJobsForWorld is fast and results in a no-op for each material.

  • Added an ‘illuminance meter' to the HDR (Eye Adaptation) visualization mode that shows mean and accounts for viewport rect.

  • Fixed shadowed local lights looking dull at high exposure inside the volumetric fog.

  • Fixed a typo in RayTracingMaterialHitShaders.usf.

  • Added Vulkan external memory support.

  • Added scoped CPU markers to various D3D shader compiler functions to make this easier to profile when shader compilation is done in process.

  • Added Global Shader Types to the ‘DumpMaterialShaderTypes' commandlet. This sorts global shaders alphabetically so diffs between output is stable. Also, added stats for scanning the asset registry and dumping the stats, and added a separate global shaders histogram, but it is currently not being dumped into the output log. The full asset path is reported for materials and material instance constants to make them easier to find in the editor.

  • Added Sky Atmosphere transmittance on forward shaded translucent when per pixel mode is selected on the atmospheric Directional Light.

  • Added an analytics provider to ‘DumpMaterialShaderTypes' to track nightly statistics across various projects. It calculates the total shaders in the Default Materials as a good metric. This impacts editor startup time and is the default materials are the worst case scenario for usage flags. It only gathers analytics if passed in on the commandline.

  • Added the ability to pass ‘-analytics' through automated testing. The following analytics are reported: ProjectName, BuildVersion, Platform, ShaderPlatform, TotalShaders, TotalMaterials, Total MaterialInstances, TotalGlobalShaders, and TotalDefaultMaterialShaders.

  • Added an automated test to run the DumpMaterialShaderTypes commandlet, which is useful for catching shader count regressions on projects.

    • Added a new test called "ShaderTypeRegressionTest" which can be run with the command line: RunUAT BuildGraph -Script=Engine/Build/ShaderTypeRegressionTest.xml -Target="Shader Type Regression" -append:Projects="EngineTest" -append:Projects="CitySample" -append:Projects="Lyra" -append:Projects="MedievalGame[UnrealEditor]"

    • The results are saved to Engine\Programs\AutomationTool\Saved\...

  • Volumetric Clouds is now precompiled through DXC. This accelerates volumetric domain materials (cloud shaders) compilation time by at least 6x.

  • Replaced UE4 references with UE5 in related UnrealLightmass files.

  • Added DumpGPU viewer script for Linux and Mac. Currently requires the Chrome Browser to view the dump files.

  • ‘Set Source Cubemap Angle' for Skylight components is now exposed in Blueprints.

  • Added a warning when the maximum number of active ray tracing lights is equal to or greater than ‘RAY_TRACING_LIGHT_COUNT_MAXIMUM'.

  • Exposed ‘BuildLightMaps' command to Python and Blueprint Utilities.

  • Stat Groups are added to the list of stats printed when running "stat help"

  • Changed default value for World Position Offset culling distance in ray tracing to 120m.

  • Added support for multiple reflection captures for Single Layer Water materials.

  • The GPU Dump Viewer now dumps both .sh and .bat so a dump can be opened either on Mac, Linux, or Windows regardless of the platform the files were dumped from.

  • Added UE-DumpGPUPath environment variables to dump across Perforce workspaces at the same location by default on a dev machine.

  • Implemented proper support for togglable Stationary direct lighting on mobile and deleted 'baked Stationary as Static' path. This change makes high quality and low quality lightmaps have unified lighting content and now they differ only in encoding.

  • Added support for CustomDepth in Translucency pass on Mobile LDR.

  • Refactored mobile Custom Depth and Stencil to line up with Desktop on all mobile platforms.

  • Clustered local lights and reflections are now supported on Mobile Forward and Deferred rendering paths. Local light shadows are supported on Mobile Forward and Deferred, and need to enable full depth prepass to generate the ShadowMaskTexture.

  • Disabled Simple Lights when using the Mobile Forward Renderer.

  • Mobile now supports additional shading models, such as Two Sided Foliage, Cloth, and Eye. They use the same shading models as the dynamic lighting code path on Desktop.

  • Reduced the size of UParticleModuleSpawn to 224 bytes to fit in a smaller FMallocBinned2 pool.

  • Reset UniqueTables instead of emptying it to reduce allocator churn. Reset FCommandListResourceState::ResourceStates instead of emptying it to reduce allocator churn.

  • Changed the Reflection Capture's encoded HDR data to RG11B10 format.

  • Skip reflections for simple translucent materials for both Mobile Forward and Deferred rendering paths. Translucent materials will fall back to single reflection or sky capture on Mobile Deferred if clustered reflection is disabled.

  • Enabled Ambient Occlusion on Mobile LDR.

  • Initial work to support rendering with LWC-scale position. The basic approach is to add HLSL types FLWCScalar, FLWCMatrix, FLWCVector, and so on. Inside shaders, absolute world space position values should be represented as FLWCVector3. Matrices that transform into absolute world space become FLWCMatrix. Matrices that transform from world space become FLWCInverseMatrix. Generally, LWC values work by extending the regular float value with an additional tile coordinate. Final tile size will be a trade-off between scale and accuracy. Value represented by a FLWCVector thus becomes V.Tile * TileSize + V.Offset. Most operations can be performed directly on LWC values. There are HLSL functions like LWCAdd, LWCSub, LWCMultiply, LWCDivide. The goal is to stay with LWC values for as long as needed, then convert to regular float values when possible. One thing that comes up a lot is working in translated (rather than absolute) world space. WorldSpace + View.PrevPreViewTranslation = TranslatedWorldspace. Except 'View.PrevPreViewTranslation' is now a FLWCVector3, and WorldSpace quantities should be as well. So that becomes LWCAdd(WorldSpace, View.PrevPreViewTranslation) = TranslatedWorldspace. Assuming that we're talking about a position that's "reasonably close" to the camera, it should be safe to convert the translated WS value to float. The 'tile' coordinate of the 2 LWC values should cancel out when added together in this case. Materials are fully supporting LWC-values as well. Projective texturing and vertex animation materials that I've tested work correctly even when positioned "far away" from the origin. Lots of work remains to fully convert all of our shader code. There's a function LWCHackToFloat(), which is a simple wrapper for LWCToFloat(). The idea of HackToFloat is to mark places that need further attention, where I'm simply converting absolute WS positions to float, to get shaders to compile. Shaders converted in this way should continue to work for all existing content (without LWC-scale values), but they will break if positions get too large. General overview of the changes are as follows:

    • LargeWorldCoordinates.ush - This defines the FLWC types and operations GPUScene.cpp, SceneData.ush

    • Primitives add an extra 'float3' tile coordinate. Instance data is unchanged, so instances need to stay within the single-precision range of the primitive origin. Could potentially split instances behind the scenes (I think) if we don't want this limitation HLSLMaterialDerivativeAutogen.cpp, HLSLMaterialTranslator.cpp, Preshader.cpp

    • Translated materials to use LWC values SceneView.cpp, SceneRelativeViewMatrices.cpp, ShaderCompiler.cpp, InstancedStereo.ush

    • View uniform buffer includes LWC values where appropriate

  • Added Blueprint function "Resize Render Target 2D" to support changing the resolution of a Render Target.

  • Added an editor utility script function "Set LOD Screen Sizes" in "Static Mesh Editor Subsystem" to set the LOD screen size for static meshes. Useful for batch modification of LOD settings.

  • Scene Capture: Added Blueprint function node "DeprojectSceneCaptureToWorld" to support translating UV coordinates in scene capture space to a world space ray, similar to "DeprojectScreenToWorld" which operates on the player camera. Allows hit tracing operations into scene capture surfaces without requiring C++ code. A typical approach involves feeding "DeprojectSceneCaptureToWorld" the output of a "Find Collision UV" node (requires "Support UV From Hit Results" enabled in Physics Settings). The "Find Collision UV" node receives a Hit reference from a "Line Trace By Channel" node. You can then use the output World Position and World Direction as a secondary ray to feed into another call to "Line Trace By Channel" to find the collision in the Scene Capture.

  • Added a new console variable r.SkeletalMeshClothBlend.Enabled, which is set true by default. When the variable is false, the cloth weight used in skin rendering is set to 0 and the rendered mesh will effectively ignore the output of the cloth simulation.

  • With Vulkan, a UE4 specific fix has been disabled on UE5 that was causing performance hitches.

  • Move VulkanMemory.h to Private for easier hotfixing in the future.

  • Refactored Layers and Extensions for the following on Vulkan:

    • Split code for layers and extensions.

    • Keep string arrays for layer management, and share as much code as possible between device and instance layers.

    • Create a new class for extensions and manage them through a single flow.

      • Package the code for the extension and its features+properties together in a single place, so the device code only iterates on loops of generic classes.

      • Keep distinct states to track if an extensions: is supported by the engine, is enabled in the engine, is supported by the driver at runtime, is activated at runtime.

      • If an extension is present but a required feature isn't, disable the extension.

      • Remove feature structs from Vulkan Device when they were only used for init.

      • Track promotion status of extensions (for future dev).

    • Revisit some 'per platform' extensions that were enabled on all platforms.

  • Read Skeletal Mesh render data from streaming bulk data so the editor can load the cooked data that is not cooked in line. This fixes editor-only renders the highest LOD when using cooked data as only the highest LOD is cooked inline.

  • Added validation for invalid custom water bodies (no water mesh specified).

  • Added support for Large World Coordinates (LWC) on GPUSkinnedVertexFactory and SkinCache shaders.

  • Implemented GPUSkinCache debug visualization modes. 'Overview' mode shows skin cache on/off, recompute tangents on/off. 'Memory' modeshows skin cache memory consumption per sk mesh, includes RT if sk mesh uses a separate RT entry *) 'RayTracingLODOffset` shows RT LOD index offset from raster LOD index.

  • Fixed skeletal mesh previous frame local-to-translated-world position in large world coordinates for both GPUSkinVF and LocalVF PassThrough.

  • The r.UseLegacyMaintainYFOVViewMatrix console variable can now be set in config files.

  • Implemented support for asynchronous creation and deletion of FRenderResource. The resource list uses a thread local free list that is coalesced later.

  • Added support for FUintVector3 & FQuat4f as shader parameters.

  • Added support for callbacks to simulate any-hit and intersection shaders in inline ray tracing.

  • Added new ray tracing debug modes. ‘Dynamic Instances' mode shows instances that go through a dynamic path. ‘Proxy Type' mode shows instances colored by proxy type hash. ‘Picker' allows picking instances/triangles with a mouse to show BLAS and instance info.

  • Added support for "Distant Lights" to Virtual Shadow Maps (VSM), making it possible to support far more local lights with VSM shadows enabled by forcing caching, reducing page-table size, and round-robin updates on lights with a small screen-space footprint. Disabled by default, it can be enabled by setting r.Shadow.Virtual.DistantLightMode=1.

  • Virtual Shadow Maps now support split screen rendering with caching and correct page marking.

  • Changed how cards guides are generated at import time. This improves accuracy for picking the correct principal direction used for generated guides.

  • Changed hair cards guide to have a root/tip color to make debugging easier.

  • Added planar reflection support for hair strands.

  • GatherRayTracingWorldInstancesForView was split into several parts in order to run most of the work asynchronously. This saves up to two-thirds of the GatherRayTracingWorldInstancesForView rendering thread critical path time in large projects. The main rendering thread cost is now FPrimitiveSceneProxy::GetDynamicRayTracingInstances(), which currently can't be moved to a task.

  • The NVidia UReflexBlueprintLibrary API is now available to other modules.

  • Added Rect Light texture atlas support. This allows a single texture binding for all textured area lighting.

  • Added a project setting to disable per-object translucency shadows (disabled by default). To use translucency self-shadowing you must now enable this project setting. The Console Variable for this setting is r.Shadow.TranslucentPerObject.ProjectEnabled.

  • Improved groom decimation accuracy and fixed invalid hair decimation when the decimation factor is larger than 0.5.

  • Added Order Independent Transparency per-pixel sorting support for translucent Materials (experimental). Order Independent Transparency must be enabled in Project Settings and is off by default. It is currently only supported on PC Dx12. This is the initial step for fine grain/per-pixel sorting.

  • Added precomputed BSDF directional albedo path for non-editor target. This avoids running the BuildTable pass which is too long on low-powered platforms.

  • Changed the representation of hair strands from a cross to a quad cylinder to avoid self-shadowing artifacts and prevent discontinuities between segments.

  • GPU texture formats for 32 bit float uncompressed pixels are now available (R32F and RGBA32F). Some platforms only support point/nearest sampling of 32 bit floats.

  • Added previous position support for geometry cache and fixed hair strands motion vector when continuous level of detail (CLOD) is used.

  • Added Groom Binding listing, preview, and skeletal mesh animation, within the Groom Asset Editor.

  • Moving some of the FRayTracingScene initialization work into an asynchronous task which:

    • Adds FRayTracingScene::BuildInitializationData, which builds FRayTracingSceneWithGeometryInstances.

    • Adds FRayTracingScene::CreateWithInitializationData() that consumes FRayTracingSceneWithGeometryInstances data.

    • Runs BuildInitializationData as soon as ray tracing instance culling tasks finish.

    • Waits for scene initialization data in FDeferredShadingSceneRenderer::DispatchRayTracingWorldUpdates, which saves ~0.2-0.3ms of rendering thread time in large scenes.

  • Unified the 8 separate variations of WriteRawToTexture_RenderThread into a single function on FTexture2DDynamicResource.

  • Implemented and enabled two-pass Hierarchical Z-Buffer (HZB) occlusion culling for Virtual Shadow Maps when using Nanite geometry, making it render correct shadows under all forms of disocclusion. The console variable for this setting is ‘r.Shadow.Virtual.UseHZB'.

  • Improved and simplified 'ShaderPrint' to be the unique interface for outputting debug information from shaders. It regroups string printing, line, triangles, and widget (experimental) drawings into a single interface.

  • Added Groom Alembic supports for GroupName.

  • Added RootUV, Color attributes, Roughness attributes, and Precomputed Guide Weights information when importing a Groom Asset.

  • Added r.Shadow.Virtual.Cache.ForceInvalidateClipmaps that can be used to force invalidation for Virtual Shadow Map clipmaps, even when caching is enabled. This is useful when the light is constantly invalidating (moving sunlight, for example) to reduce cache-management overhead.

  • Changed voxelization to use an adaptive voxel size based on screen projection. This significantly reduces the cost of voxelization, shadow masks, and transmittance masks when grooms are further away from the camera.

  • Reduced groom binding data size by deduplicating unique triangle data. The data size of the resulting binding asset type is reduced to approximately 1/5 of the original.

  • Ray Tracing static primitive LOD calculations are now run asynchronously, as results are only needed much later for the FRayTracingSceneAddInstancesTask. This allows GatherRayTracingWorldInstancesForView() to start earlier on the rendering thread.

  • Disabled primitive octree culling (console variable 'r.UseVisibilityOctree') by default as this causes visibility culling issues because of the limited extent of the tree (HALF_WORLD_MAX).

  • Added tangent debug mode to the Groom Asset Editor.

  • Added ray tracing Material evaluation to hair strands and custom primitive intersection.

  • Fixed hair strands shadow culling when a hair instance is not visible in the primary view.

  • Added per-object triangle sorting per view in order to improve translucent ordering artifacts.

  • Implemented Large World Coordinates (LWC) support of Mesh Distance Fields data and related techniques.

  • Batch Top Level Acceleration Structure (TLAS) builds on platforms that support it.

  • Ray Tracing LightGrid is now calculated in translated world space.

  • More than one PreviewPlatform can now use the same ShaderPlatforms.

  • Improved expand bias in Distance Field Shadows by calculating the bias applied to two-sided meshes proportional to voxel size. You can adjust this bias with the console variable 'r.DFShadow.TwoSidedMeshDistanceBiasScale.'

  • Global Signed Distance fields are now updated in translated world space. The clipmap center is used as the origin of translated world space during the update.

  • Added console variable flags that automatically modify the KeyString when modified. The following KeyStrings are modified based on platform. The console variable r.MobileHDR is using this system now and others will follow in future releases.

    • ECVF_GeneralShaderChange = 0x200 modify the Shader KeyString for All Platforms.

    • ECVF_GeneralShaderChange = 0x400 modify the Shader KeyString for mobile Platforms.

    • ECVF_GeneralShaderChange = 0x800 modify the Shader KeyString for Desktop Platforms.

  • Create loose parameters uniform buffer to encapsulate GPUSkinPassThroughVertexFactory PreviousPositionBuffer. These changes ensure failure in MessPassProcessor.cpp in debug_editor build, due to PreviousPositionBuffer being a loose SRV parameter.

  • Enabled Hardware Ray Tracing (shadows, reflections, ambient occlusion, global illumination) and the Path Tracer to now work in large worlds.

  • Added support for capsule shadows in Large World Coordinates (LWC).

  • Added support for multiple layers in FRayTracingScene.

  • Added epsilon trace support in Raytraced Shadows to avoid self intersections.

  • Changed ShaderArchive, GlobalShaderCache, ShaderDebugInfo and Autogen to use ShaderPlatformName and not ShaderFormat when naming their output files.

  • Updated MeshUtilities::GenerateStratifiedUniformHemisphereSamples to use concentric disk sampling.

  • Support specifying MaxAttributeSizeInBytes in FRayTracingPipelineStateInitializer instead of always using RAY_TRACING_MAX_ALLOWED_ATTRIBUTE_SIZE.

Improvement:

  • Updated the Base Shape's material in Engine Content because it could cause invalidation of automatic image tests. The base color was changed from a value of (1, 1, 1, 1) to (0.9, 0.9, 0.9, 1.0). This change affects all base shapes (sphere, box, cylinder, and so on) that use the base shape material. Having a base color of 1.0 represents a physically unrealistic material that reflects 100% of all incoming light, which can create strange results where light never attenuates.

  • Increased the Sample Per Pixel limit in the user interface for ray tracing passes.

  • Adds a viewer console for GPUDumpViewer that can detect errors in the dump, such as incomplete dump.

  • Improved the velocity precision on Android GLES platforms by using UINT format instead of FLOAT format.

  • Improved the quality of AlphaToCoverage on mobile.

  • Upgraded Vulkan SDK from 1.2.162.0 to 1.3.204.0.

  • Improved VulkanRHI GPU rendering with earlydepthstencil.

  • Added texture address mode member to volume textures to allow control of all three axes at once.

  • Offloaded GPU scene uploads to an async task.

  • The HDR tonemapper is now using ACES 1.3.

  • Converted volumetric lightmap textures to RenderDependencyGraph (RDG).

  • Ported GPU scene buffers to RenderDependencyGraph (RDG).

  • Improved BuildHiddenComponentList performance by ~2ms in split-screen by expanding the hidden actor's components directly instead of doing it every frame.

  • Removed cases of AddCopyToResolveTargetPass which either weren't necessary or weren't performing multisample resolves.

  • Converted scene reflection capture path to RenderDependencyGraph (RDG).

  • Conversions from the working color space (as set in rendering settings) are now correctly accounted for in the CombinedLUT and tonemapper.

  • Improved water body map check error messages.

  • Renamed the editor experimental setting bEnableAsyncSkeletalMeshCompilation to bEnableAsyncSkinnedAssetCompilation.

  • Moved scene texture config and parameters into the Engine Library.

  • Moved scene renderer deletion off the render thread.

  • Moved RenderDependencyGraph (RDG) builder destruction off the render thread.

  • Moved dynamic mesh passes and BeginSceneOcclusion off the render thread.

  • Replaced thread-local MemStack with ConcurrentLinearAllocator across the renderer.

  • Refactored the ray tracing geometry update logic for Skeletal Mesh to simplify its process. This includes:

    • All skin cache entries needing RT geometry update are processed altogether in end-of-frame update whether batch dispatching or not, simplifies the logic.

    • Transition buffers to read immediately after skin cache DoDispatch calls, simplifies the logic.

    • No longer cache the flag to indicate whether RT geometry needs to be rebuilt, the logic is calculated directly when updating RT geometry.

  • Improved hair strands root UV precision.

  • Improved the performance of heightfield distance field management.

  • Added the Frequency name to the "Unrecognized shader frequency" Shader Compiler error.

  • Improved support for callable shaders.

  • Reduced memory usage during RayTracingScene setup.

Optimization:

  • Reduced GPUSkinPassThrough vertex factory shader permutations by merging it into local vertex factory. PassThroughVF is kept as a wrapper class.

  • Reduced morph target vertex factory shader permutations by merging it into the GPUSkin vertex factory.

  • Reduced multi influence cloth vertex factory shader permutations by merging with single influence cloth vertex factory.

Crash Fix:

  • Fixed a potential crash where deleted primitives could potentially be put into the ray tracing mesh command cache even though their resources were already released.

  • Fixed a potential crash in Movie Render Queue from null pointer dereference when searching MRQ setting classes.

  • Made some Volumetric Fog console variables safe from causing a crash to occur.

  • Fixed a crash when attempting to load ray tracing shaders when ray tracing is disabled.

  • Removed an assert that was firing when rendering hair.

  • Fixed an assert triggering because baked depth data was found to be invalid.

  • Fixed a debug crash when GPUScene and modulated shadow are enabled.

  • Fixed a crash while cooking Android with Lightmap Virtual Texturing enabled.

  • Fixed a crash that could occur when using High Resolution Screenshot with ‘Use custom depth as mask' enabled on Mobile Preview.

  • Fixed crash on Vulkan when trying to read data from TextureCubeArray.

  • Fixed a rare Vulkan RHI crash caused by an incorrect instance count when drawing indirect lines.

  • Fixed random crash occurring in HLOD builder commandlet, where we're hashing landscape texture source data while potentially asynchronously building textures. UTexture2D::GetSizeX() / UTexture2D::GetSizeY() should be prevented in those cases, since unlike in the landscape editor, nothing ensures that FinishCachePlatformData() is called on those textures and the returned sizes end up being wrong / thread-unsafe. Also fixed a couple of places where we were not using the FTextureSource's data (even though those calls should be fine since they happen in a place where texture compilation is done)

  • Fixed a crash that occurred when the bone name setup in a GroomComponent was incorrect.

  • Fixed a crash with Hair when per-pixel linked list (PPLL) rendering is enabled, and hair groom are selected, proxy geometry is queried/rendered.

  • Fixed a crash when using Materials with the UseHairStrands option enabled on a non-groom geometry.

  • Fixed a crash when rendering hair strands with the Path Tracer when hair length scale was lower than 1.

  • Fixed a crash that occurred when hair strands were rendered without any voxelization.

  • Fix a crash that occurred when setting curve decimation above one.

  • Fixed a crash that occurred when the number of DistanceField Mips was higher than DistanceField::NumMips.

  • Fixed crash in FHZBOcclusionTester when MapResults is called before Submit.

Bug Fix:

  • Fixed some issues that could occur when ‘ShowFlag.Rendering' is disabled.

  • Fixed Sky Light Capture not working correctly when toggling effect quality level.

  • Fix an issue with ‘GetMaxNumInstructionsForShader' that reported the incorrect instruction count for the given shader type. The function was not checking to see if the shader type in the pipeline was the same as the shader type we are asking for.

  • Applied fix for Volumetric Cloud to work with Large World Coordinates (LWC).

  • Ensure slow task dialog is shown when blocking ‘on all shader' maps to be compiled. This way we can see the progress on how many shaders are being compiled.

  • FFloat16 is not currently included in TShaderParameterTypeInfo, and increasing its array count will not increase its NumRows as intended. Simply hardcode correct values.

  • Do not allow ‘r.SkinCache.SkipCompilingGPUSkinVF=1' on mobile platforms (FeatureLevel == ERHIFeatureLevel::ES3_1). Some mobile platforms have a limit on how big buffers can be for skin cache positions. If we ever exceed this amount on a specific mesh, we skip the skin cache operation and need to fallback to a GPU Skin Shader. Since we don't know which shaders will be needed on a per-mesh basis, we must disable this feature and assume we need GPU Skin Shaders for ‘all materials'.

  • Fixed LoadAction to keep previous FinalLightingAtlas content if it was produced earlier (fix issue in Vulkan).

  • Prevent shifts by a negative value, which addresses static analysis warning: warning V610: Undefined behavior. Check the shift operator <<. The right operand is negative ('....' = [-1..254]) - Texture Resolution will be 1.

  • Fixed Sky Atmosphere not updating correctly the cached camera aerial perspective buffer settings after console variable tweaks.

  • Fixed a potential NaN in cloud depth texture with half float.

  • Applied a fix for broken fog due to Large World Coordinates (LWC).

  • Fix Game Thread and Render Thread access issues when performing shader compilation using FMaterial.

    • SubmitCompileJobs was assumed to be render thread only. Make this explicit in the function name and add a render thread check.

    • Added SubmitCompileJobs_GameThread to perform shader compilation submitted from the Game Thread safe.

    • Keep a ref to a GameThreadPendingCompilerEnvironment because the one on the GameThreadShaderMap goes away after we clone.

    • Added render thread check to GetRuntimeVirtualTextureOutputAttibuteMask_RenderThread.

    • Move simple enum types from ShaderCompiler.h to ShaderCompilerCore.h so we can access EShaderCompileJobPriority in MaterialShared.h

    • Fixed incorrect usage SubmitCompileJobs that was submitted from the Game Thread using the Render Thread maps.

  • Further reducing the geometry collection BLAS build count. a) Move the build out of the section loop so that we add one BLAS per geometry collection. b) Create the ray tracing geometry but delay the BLAS build later to dynamic raytracing geometry update.

  • Fixed geometry collection performance issue by creating one TLAS per geometry collection instead of one per transform.

  • Fixed a shader issue that was evident with SpeedTree foliage.

  • Fixed an issue with DumpGPU when only the 32-bit version of Chrome Browser is installed.

  • Fixed an issue with calling the DumpGPU command on mobile platforms.

  • Fixed an issue with DumpGPU's resource search by saving all resource descriptors into a single Base/ResourceDesc.json file.

  • Added dump timing measurement details to log when using DumpGPU.

  • Fixed an issue with ‘OpenGPUDumpViewer.bat' when a parent directory has a space in the file path.

  • Fixed issues with ray tracing translucency looking overly bright when the tonemapper is disabled.

  • Fixed an issue with missing GPUDumpViewer files from a packaged build on Android and iOS.

  • Fixed black mip 0 in DumpGPU when a texture has a mip chain on D3D11 by using the capture by compute shader.

  • Avoid divide-by-zero in GetLightMapColorLQ.

  • Fixed Lightmass wrong string formatting.

  • Ray tracing now takes into account the ‘Visible In Scene Captures Only' flag.

  • Fixed an issue where Static Lighting was broken when using Forward Rendering. The lightmap build data would get invalidated incorrectly while cooking.

  • Fix DumpGPU file write error.

  • When having lines that use world and screen space scaling in the same batch, OrthoZoomFactor can get overwritten, causing following vertices to potentially be generated wrongly.

  • Fixed an issue where ray tracing could accidentally be enabled when disabled in render settings.

  • Fixed incorrect Hierarchical Instance Static Mesh culling in ray tracing because bounds are not always initialized when the culling happens.

  • Fixed FNiagaraRendererMeshes::GetDynamicRayTracingInstances fails to use Reserve, MoveTemp, or Emplace_GetRef to avoid copies and reallocations.

  • Automation tests that do not have ray tracing enabled will now disable ray tracing explicitly to avoid enabling it by accident when D3D12 is active.

  • Fixed a bug with Cascaded Shadow Map caching on mobile.

  • Fixed a bug with DepthAux corruption on Mobile OpenGL.

  • Fixed an issue where the indirect lighting of translucency is too bright on mobile.

  • Fix an issue with depth of field jittering when the anti-aliasing method on mobile is set to Temporal Anti-Aliasing.

  • Fix a shader bug on mobile with pixel projected reflection.

  • Fixed an issue with stencil testing in Post Process Materials if MobileSupportFetchBindedCustomStencilBuffer

  • Fixed an issue with fetching depth in mobile's separate translucent pass with Vulkan subpass.

  • Fixed an issue with alpha detection in Virtual Texture builder causing tiles in the same virtual texture to use different formats.

  • Fixed an issue that the Multi-Sampling Anti-Aliasing (MSAA) was broken on Android.

  • Changed the precision of length2 from half to float to fix artifacts on Mobile Vulkan.

  • Fixed an issue with reflection being too bright on Mobile Deferred renderer with Static Lighting disabled.

  • Fixed an issue with mobile alpha coverage when the material is masked but writes every pixel.

  • Fixed an issue with resolving Multi-Sampling Anti-Aliasing (MSAA) texture on IOS.

  • Fixed an issue where the GlobalClipPlane doesn't work on depth-only vertex shader on Mobile Preview Shader platform.

  • Fixed an issue where the brightness was not consistent when using Multi-Sampling Anti-Aliasing on iOS.

  • Resolved an issue where depth content was not being kept when Temporal Anti-Aliasing was enabled. It was because the bKeepDepthContent was false if CameraCut is used and the SceneDepthTexture could be a dummy black texture (RGBA8 format) and a RenderDependencyGraph (RDG) validation failed at creating StencilTexture SRV which was expecting PF_DepthStencil format.

  • Fixed an issue when Multi-Sampling Anti-Aliasing (MSAA) is enabled, it would only output SceneColor for SunMask on iOS.

  • Fixed an issue with dark screens with Vignette enabled on Android.

  • Fixed an issue with counting Skeletal and Static Meshes memory with mesh streaming enabled. The IncrementMemoryStats was called at the FSkeletalMeshLODRenderData::InitResources and FSkeletalMeshStreamIn::DoFinishUpdate.

  • Fixed light flickering issue on Mobile Vulkan that could happen on Cloth and Hair assets.

  • Fixed an issue with Cascaded Shadow Maps when using split-screen on mobile.

  • Disabled GPUScene for landscape on mobile since it is not supported.

  • Fixed an assert on Vulkan when a texture is created from TransientHeap with Discard as its initial state.

  • Fixed CmdBuffer->IsSubmitted() assert on Vulkan.

  • Implemented changes on Vulkan RHI to avoid the automatic clearing of new targets when they are allocated in transient memory since it gets put in the upload command buffer that can execute earlier in the frame (when the same memory is potentially used by a different transient resource).

  • Resolved a bug that caused flickering in the Editor when using Vulkan.

  • Make it clear that PlatformData can't be null when creating texture cube array, fix static analysis warning.

  • Fixed a Scene Capture issue so editor-only components aren't created when running a commandlet.

  • Fixed 16 byte alignment of array elements for Vulkan. There are a few macros to help with conversion of cases where a single scalar is used in shader parameter arrays (and cannot be packed with other scalars).

    • [C++] SHADER_PARAMETER_SCALAR_ARRAY(MemberType,MemberName,NumElements): adds an automagically packed array of scalars to shader parameters.

    • [C++,HLSL] GET_SCALAR_ARRAY_ELEMENT(PackedArray, ElementIndex): returns the value at that index in the scalar array.

    • [HLSL] DECLARE_SCALAR_ARRAY(ScalarType, ScalarName, ElementCount): declares an automagically packed array of scalars.

  • For Vulkan, we fixed an occasional layout error in Virtual Textures depending on which pass runs first after it is resized.

  • Fixed an issue where a GameThread would stall (waiting for render thread) whenever a console variable was changed during gameplay.

  • Fixed a NaN error introduced by fog when it is used on materials used by DrawCanvas

  • Fixed mem report texture usage computation for landscape components. This includes:

    • HeightmapTexture / XYOffsetmapTexture, which are only used on the non-mobile path, were artificially increasing the ref counts on platforms where mobile and non-mobile paths are enabled (in mobile mode).

    • Weightmap[0], which contains the normal map in mobile mode, was not accounted for by the material instance's GetUsedTextures call, since it uses inlined HLSL code to sample it, rather than a texture sample material expression

  • Fixed the visual calibration (device-encoding-only) viewport passes for HDR in scRGB mode.

  • Fixed data race and potential double delete in FCanvas deletion path.

  • Enabling HDR in the Editor now supports use with both HDR and non-HDR monitors.

  • Fixed the "Selected Morph Target Vertices" Editor visualization, which was broken.

  • Bug Fix: User Interface HDR composition in the Editor is now consistent with in-game HDR composition.

  • Implemented a fix in the usage of ERayTracingPrimitiveFlags::UnsupportedProxyType. Its value is 0, so it must not be used with EnumHasAnyFlags().

  • Fixed "Primary Rays" Ray Tracing debug view mode by renaming ERayTracingPrimaryRaysFlag::ConsiderSurfaceScatter to PrimaryView and using it to initialize the first ray instance inclusion mask in the RayTracingPrimaryRays Ray Generation Shader (RGS).

  • Changed how hair strand textures are computed. These changes process hair strands textures in tile, and split computation over several frames to avoid Timeout Detection and Recover (TDR) on large grooms.

  • Fixed an issue with HighResShot not clipping the rectangle to image bounds, and allowing memory to be read out of bounds.

  • Changed groom bound computation when attached to a parent skeletal mesh, depending on whether it is attached relatively or not. The relative attachment is done based on attachment bone naming.

  • Implemented a fix to exclude primitives that are meant to be hidden in game from the ray tracing scene when game view is enabled or in Play in Editor mode.

  • Fixed an issue with hair strand shadows when Ray Traced Shadows is enabled. Ray Traced Shadows are now done in translated world space, replacing a previous temporary workaround for computing transversal in world space.

  • Fixed a crash when r.RayTracing.Shadows is enabled dynamically. Previously FScene contained an array of Ray Trace Shadowed lights, which was updated when a light was added or removed. However, this is incorrect as the light's Ray Traced Shadow state depends on console variables that may be changed dynamically. The solution is to check if the scene currently contains any lights with Ray Traced Shadows during rendering. This is more expensive but robust. The array of RT-Shadowed lights is removed as it was not used beyond checking if it's empty.

  • Fixed a reentrancy bug by making FSimpleMeshDrawCommandPass only run SetupDrawCommands the first time BuildRenderingCommands is called. This fixes a check in groom rendering.

  • Fixed a hair selection issue under certain camera position and view resolutions.

  • Fixed texture arrays with mip chains and streaming by adding an access point to texture arrays to get the mip data.

  • Texture2dArrays now stream properly, correctly handling LODBias and packed mip tails.

  • Platform Linux for the LiveLinkOverNDisplay Plugin was whitelisted in nDisplay.

  • Fixed hair strands support for light functions by ensuring that light functions evaluated for hair strands will fetch the correct scene depth value.

  • Fixed an issue where ACompositingElement could not initialize properly because Super::BeginPlay was not called.

  • Fixed "Single Sample Shadow From Stationary Lights" by propagating the flag to GPU-Scene.

  • Fixed the estimate for how many streaming texture mips to prefetch to avoid a blocking cache fetch on the main thread in the Editor.

  • Implemented a fix for depth bounds setting outside of valid range on fog pass. The Render Hardware Interface (RHI) validation layer now has checks to catch such issues in the future.

  • Fixed a leak when using the Null renderer (primarily for autotests), by implementing a valid Sync method.

  • Fixed a memory leak relating to UpdateTextureRegions inFRemoteSessionARCameraChannel::UpdateRenderingTexture.

  • Added support for root UV in hair card Groom Assets.

  • Fixed the visualization of Cards guides so they are only available when simulation is enabled.

  • Fixed missing update of hair ray tracing geometry when hair radius / tip / root / ray tracing scale are updated on a static groom.

  • Fixed hair LOD colorization on cards and meshes geometry.

  • Fixed a typo in the Blueprint action-menu category for composure export functions.

  • PR #9127: Corrected a typo in an FLiveLinkLog warning message.

  • Implemented code to use a conservative vertex count to initialize ray tracing geometries with multiple segments. The value of Segment.MaxVertices must be at least as large as the maximum value in the index buffer, plus 1. Previously this was initialized to per-segment vertex count, which can be too small.

  • Fixed a bug to hide the shadow of primitives with "hidden shadow" enabled when the actor is hidden in the Editor UI. Previously, the shadow would remain even if the primitive was hidden in the Editor.

  • Fixed Texture Profiler compiler errors.

  • Apply "Get Ray Tracing Quality Switch," "Get Path Tracing Quality Switch," and "Get Lightmass Replace State" functions to ray tracing callable and miss shaders.

  • Fixed an issue in FTextureLayout3d causing higher than expected memory usage.

  • Fixed an issue with the availability of heightmap visibility when building the Global Distance Field in cooked builds.

  • Fixed issues with Distance Field Shadows in water when using async compute.

  • Fixed issues with Distance Field Shadows when using split screen.

  • Fixed GlobalDistanceField corruption that occurred when a scene contained only heightfields.

  • Fixed issues with materials applying vertex offset or modifying opacity based on DistanceToNearestSurface.

Deprecated:

  • Deprecated bOverrideWaterMesh (WaterMeshOverride is enough to override the water mesh, no need for an additional boolean).

  • Deprecated the view uniform buffer from MeshPassRenderState.

Removed:

  • Removed all flip-y completely and only flip-y at the end on Android GL with a native window API since there is no need to handle flip-y on high level.

  • Removed the limitation of having a max of four local lights when using Mobile Forward Renderer.

  • Removed the ‘High Quality Reflection' option when using the Mobile Forward Renderer.

  • Removed the division of Pi on Mobile Directional Light's color in C++ to line up with desktop in shaders.

  • Removed the Mobile rendering project setting to set ‘Max Movable Spotlights / Point Lights'. On Mobile, this forces Movable Point Lights to be Static.

  • Removed view uniform buffer from ray tracing mesh draw commands and deleted FPersistentUniformBuffers::ViewUniformBuffer.

  • Crunch and zlib compression support on Virtual Texture tiles was removed from the engine.

  • Removed the r.CachedRayTracingInstances.CacheLocalTransform/LazyUpdate console variable.

  • Removed the deprecated FRayTracingSceneInitializer codepath.

Architecture

New:

  • Virtual Shadow Map cache can optionally be allocated per view. Can be a significant performance win by avoiding constant cache thrashing when rendering multiple view families (for example, this is used for nDisplay). Enable the feature on the FSceneViewStateInterface using AddVirtualShadowMapCache. See also the related RemoveVirtualShadowMapCache and HasVirtualShadowMapCache functions.

  • Added Virtual Texture warmup frames for Material baking. The number of warmup frames is controlled by the MaterialBaking.VTWarmupFrames Console Variable and defaults to 5. Warmup will only happen if the Material samples Virtual Textures.

  • Added support for updating the Virtual Texture system when using DrawTileMesh. This allows systems that capture or bake Materials to warm up source Virtual Textures correctly.

  • Added a renderer project setting to enable Virtual Textures to be used in opacity masks. This setting defaults to off, which is the current behavior.

  • The Groom system now supports reading the skinned mesh geometry cache from the deformer graph system. This allows Groom to stay synched to the animated mesh when deformer graphs are used.

  • Compression settings for Runtime Virtual Texture (RVT) streaming mips are now stored in the RVT Component instead of the RVT Asset.

  • Decal components are now exposed to Blueprints.

  • Added support for velocity vector output for objects that are marked as Static but have Materials with World Position Offset.

  • Translucency Sort Priority is now used to sort Mesh Decals.

Bug Fix:

  • Fixed sphere geometry vertex buffer to use FVector3f, rather than FVector.

  • Fixed a bug that caused a failure when setting a Material Instance Dynamic on a decal after World Partition streaming has already happened.

  • Removed an unnecessary warning that nothing will be written to virtual texture for empty foliage actors.

  • Implemented changes to force a depth prepass when Virtual Textures are enabled for a project. This fixes an issue where masked Materials could not be used with Virtual Textures when the depth prepass wasn't enabled.

  • Fix a bug with no velocity being written for Unlit Materials.

  • Fix a bug with Virtual Textures not updating correctly in debug view modes.

  • Fixed an issue where Adaptive Virtual Textures would read from pages that weren't fully mapped, which could lead to flickering or sampling errors.

  • Implemented changes to disable parallel Render Dependency Graph if it's not running in a dedicated render thread.

Lighting

New:

  • The Path Tracer now invalidates the path-traced out when decals are added, removed or transformed.

  • Implemented Subsurface Scattering support for the eye shading model.

  • Implemented Alpha Holdout blend mode.

  • Enabled progress display by default and reduced the default Samples Per Pixel value to 2048 in the Post Process Settings.

  • Dithered opacity masked Materials should now ignore the clip value.

  • The Path Tracer now takes the normal map into account at the exit point of the random walk for better detail preservation in Subsurface Scattering.

  • Added support for Light Functions in the Path Tracer. This also includes colored light functions when using them with the console variable ‘r.PathTracing.LightFuntionColor'.

  • Invalidate Path Tracer when Sequencer time changes This change also allows the Path Tracer to be used in the Niagara editor (with constant invalidation, but avoiding blurring).

  • Improved filtering of which scene proxies should impact Path Tracer invalidation.

  • Add support for path tracing in the Material Editor and Static Mesh Editors.

  • Added Light Function support for ray tracing. Lights with assigned light function materials will now show up correctly in raytraced reflections.

  • Implement Sky Atmosphere and Exponential Height Fog in the Path Tracer.

  • Added support for Distance Field Shadow on water materials using Single Layer Water. Set the console command ‘r.Water.SingleLayer.ShaderSupportDistanceFieldShadow' to enable it. This change requires restarting the editor.

  • Implemented Ray Tracing support for the Image Plate plugin.

  • Added support for a Light's ‘Source Length' setting in Ray Tracing.

  • Added functions on UExponentialHeightFogComponent to allow users to set Second Fog variables in code along with FSecondFogData struct to allow setting them through Blueprint.

  • Implemented a workaround for incorrect shadow ranges in directional lights due to the changed default values in the Unreal Engine 5.0 release. Old defaults are no longer loaded if they are part of Blueprints, regardless of the engine version used to create the Blueprint.

Improvement:

  • Improvements to Virtual Shadow Map static caching categorization. Primitives are still categorized initially based on mobility, but if a static primitive invalidates the virtual shadow map (usually due to the use of world position offset in a material) it will be transitioned to dynamic automatically to avoid continually invalidating the static cache.

Optimization:

  • Several optimizations to light loop for shadowed lights that together lead to some gains in scenes with several local lights, and large gains when using virtual shadow maps one pass projection with many local lights.

    • Reduced barriers and GPU idle time for small lights.

    • Decoupled virtual shadow map one pass projection from clustered shading. When only a virtual shadow map is present for a light and no light functions are used, it can now take a fast path in the light loop.

Crash Fix:

  • Fixed an assert on Light count when there are no lights in the scene.

  • Fix potential crash when ray-traced shadows are disabled for the project but there is still a Light in the scene that enables ray-traced shadows.

Bug Fix:

  • Applied a fix for potential NaNs in the hair shading model.

  • Fixed Moveable Lights not invalidating the Path Tracer.

  • Avoid invalidating the Path Tracer when a Moveable Light transform has been set but did not actually change.

  • Fixed a constant invalidation in MRQ renders when camera depth of field is animated.

  • Fixed missing scene invalidations when changing skylight or moving atmosphere / fog components.

  • Fixed a constant path tracer invalidation being caused by Post Process Material blending.

  • Fixed an issue with MRQ where the post-processed output is not accumulated properly when using the Path Tracer.

  • Applied a fix for Reflection Captures sometimes showing up black in packaged games.

  • Fixed the bug that Gizmos are affecting global illumination. Added translucent editor primitives support. Top view mesh elements with translucent materials will go through editor primitive rendering instead of the standard translucency pass.

  • Applied a workaround for potential GPU timeouts when raytracing procedural hair primitives from a long distance.

  • Fixed sky and cloud issues that could occur in split-screen.

  • Fixed skylight intensity not updating through Sequencer.

  • Volumetric fog history and pre integrated light froxel texture are now pre exposed to avoid smearing artifacts at super low exposure.

  • GPULightmass should complete shader compilation before building lighting. The alternative is to have lightmass constantly restart as new shaders complete.

  • Implemented code to avoid Distance Field Ambient Occlusion self shadowing when using the console variable r.AOQuality >= 2.

  • Fixed incorrect distance field indirect self shadowing.

Lumen

New:

  • Lumen support added for Scene Capture 2D. By default Lumen is disabled for Scene Capture to save memory, but can be enabled via post process override settings in the Scene Capture Actor (override Dynamic Global Illumination Method and/or Reflection Method to Lumen). Lumen requires persistent state to function properly, so Lumen for Scene Capture requires either bCaptureEveryFrame or bAlwaysPersistRenderingState to be set to true. Lumen will be disabled if both are false. The persistent memory usage for Lumen is significant, from 300 to 600 MB or more, depending on quality settings. The Texture Editor has been upgraded to display GPU memory usage for Scene Capture 2D to allow the overhead to be observed. By default the quality is set to minimum, but can be overridden with the Scene Capture Cache Resolution Scale post process setting under Lumen.

  • Surface cache generation algorithm is now more robust and able to cover a higher variety of meshes, including having surface cache for tiny scene elements.

  • Distance field stochastic semi-transparency for foliage Software Ray Tracing. This gives a more accurate representation of foliage, less over-occlusion.

  • Added Lumen Diffuse Color Boost to Post Process Volume. It allows brightening indirect lighting by calculating DiffuseColor for indirect lighting as pow(DiffuseColor, 1 / DiffuseBoost). Values above 1 (original diffuse color) aren't physically correct, but they can be useful as an art direction knob to increase the amount of bounced light in the scene. Best to keep below 2 as it also causes reflections to be brighter than the scene.

  • Enabled Lumen Radiosity on High GI settings.

  • Lumen Scene Direct Lighting now supports Rect Light Source Texture.

  • Added Skylight leaking control for Lumen as a new Post Process Volume setting that allows skylight to leak intentionally to prevent areas from going fully black with global illumination. It's useful for art direction, as it is a non-physical control, although it should be kept very subtle (.005 or less) to avoid losing HDR lighting contrast. Skylight leaking ramps up over distance, which creates Ambient Occlusion and keeps it from looking flat.

  • Lumen now supports the Two Sided Foliage shading model by accumulating irradiance for the backface, giving much higher quality foliage shading. The High GI scalability level disables r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse to avoid overhead. Also, improved Screen Probe hardware tracing biasing on two sided materials

  • Removed ray dithering fade at the end of trace distance when far field isn't used

  • When lighting surface cache pick N most important lights instead of N first lights. It improves lighting quality and fixes nondeterministic surface cache lighting as sometimes lights may be added to a scene in a different order. Control this with r.LumenScene.DirectLighting.MaxLightsPerTile.

  • Added an AffectIndirectLightingWhileHidden property to the Primitive Component, which allows hidden primitives to be injected into Global Illumination (GI) and Reflections. This is useful as an extra art direction tool to create cheap invisible area lights through GI.

  • Increased the Global Signed Distance Field (SDF) resolution when using Lumen Software Ray Tracing.

  • Added support for lighting channels for analytical lights.

Improvement:

  • In Software Ray Tracing mode voxel lighting volume has been replaced with an object grid, which allows sampling of the surface cache directly instead of a low resolution and leaky resampled voxel representation. This improves secondary bounces, reflections and GI from small emissive surface elements.

  • Optimized radiosity card tile memory size by allocating based on the update atlas size instead of a physical atlas size.

  • Added UPrimitiveComponent::InvalidateLumenSurfaceCache() to support manual surface cache refreshing on any material change.

  • Raised Lumen GI's intensity clamp (firefly prevention) by a factor of 2 now that Lumen has less noise.

  • Lumen lighting propagation is now faster while using editor movement widgets and toggling directional lights and skylights.

  • Lumen GI now uses Spatiotemporal Blue Noise, which gives much cleaner indirect lighting, especially when the camera is still and in screenshots. 'High' GI scalability quality in particular is improved.

Crash Fix:

  • Fixed a crash which occurred when reallocating surface cache pages with a modified aspect ratio after an object scale transform.

  • Fixed crash which occurred when enabling reflection hit lighting with a surface cache project setting.

Bug Fix:

  • Fixed Emissive Light Source not correctly encoded to be injected into the Voxel Lighting.

  • Lumen Screen Traces now skip hitting foliage materials to fix noise that could occur around grass.

  • Fix Radiance Cache leaking in Software Ray Tracing mode due to rays starting inside geometry.

  • Fixed randomly missing mesh cards from cook

  • Fixed mesh distance field volume interpolation on consoles.

  • Disabled Octahedral Irradiance format for Screen Probe Gather on Epic GI scalability settings as it doesn't handle gradients well.

  • Fixed Lumen GI and Reflections being culled at 1 million Unreal Units.

  • Invisible shadow casters are now filtered out from Lumen Scene.

  • Fixed an infinite loop that would occur when generating mesh cards for huge meshes.

  • Fixed area and capsule lights to respect source radius and length when lighting the surface cache.

  • Fixed non-Nanite per ISM surface cache generation.

  • Fixed an issue with indirect light rendering when the Lighting Complexity View Mode is enabled

  • Fixed missing Global Illumination energy on AMD GPUs.

Materials/Shaders

API Change:

  • The DirectX Shader Compiler (DXC) no longer allows duplicate semantics in shader signatures. Particularly using SV_InstanceID requires careful examination of vertex factories input as it will likely be already defined there.

New:

  • Exposed azimuthal roughness on hair through the scatter (Metallic) parameter. The default value of 0 corresponds to 1.0 azimuthal roughness (current behavior) while increasing the scatter amount makes the hair more and more forward scattering, leading to a softer appearance. The lowest possible roughness is limited to 0.1 to limit noise.

  • Implemented support for Per Instance Custom Data for non-Nanite use cases (including ray tracing shaders).

  • When switching between rendering preview modes, On-Demand Shader Compilation (ODSC) should be used. AllMaterialsCacheResourceShadersForRendering now accepts a parameter to decide whether to fully cache and complete all shader maps. By default this is true to maintain previous behavior. When switching preview materials this behavior defaults to false and we let ODSC in the editor handle which shaders need to be compiled, resulting in far fewer shaders compiled.

  • Set InstructionCount when compiling shaders with DXC, which fixes an issue where all compiles of SM6 shaders were reporting 0 instructions.

  • Implemented single shader file compilation for cooked platform On-Demand Shader Compilation (ODSC). For example, recompileshaders /Engine/Private/Lumen/LumenVisualizeHardwareRayTracing.usf which would result in: 1) the game sends the shader file string across the network to the cooking server, 2) cooking server finds all shaders of that type, 3) cooking server flushes those specific types from the global shader map, and 4) cooking server recompiles just those shaders and sends them back to the game. There is still work to do in this regard to refactor duplicate code in RecompileShadersForRemote, and to implement the ability for material shader maps to compile just specific shader types requested (which doesn't yet exist).

  • Added UCompileShadersTestBedCommandlet which is meant as a simple way to profile/test/optimize shader compilation. Currently, it only compiles the global shaders. Having a commandlet is faster and easier to run repeatable tests than dealing with starting up the editor. You can run your projects with this commandlet with ‘ProjectName -run=CompileShadersTestBed -ddc=Cold -ddc=NoShared -noshaderddc -trace=default,counters', which ensures you don't get results in any DDC and that you always compile shaders.

  • Added more information to the DumpMaterialShaderTypes commandlet output.

    • Keep track of a map from static parameter hash to a list of all mat instances that share the same hash (currently this data isn't being printed out.)

    • Print the full path to the parent material. Some assets have the same name making it hard to track down which asset we were referring to.

    • Generate and print out the static parameter hash for each material instance.

    • Added material instance function to generate a string which contains a comma separated list of base property overrides for material instances. These cause shaders to be stored with material instances.

    • Generate and print out the base property override string to see which material instances also cause shaders. This output looks like the following:

      • Base Property Overrides: True

      • bOverride_OpacityMaskClipValue_0, bOverride_BlendMode_1, bOverride_ShadingModel_0, bOverride_TwoSided_0, bOverride_DitheredLODTransition_0, bOverride_CastDynamicShadowAsMasked_0, bOverride_OutputTranslucentVelocity_0

  • Volumetric Cloud conservative density is now a float4 (conservative density in x and side float3 side payload in yzw).

  • Dump DDC keys for global shaders. The console variable r.Material.DumpDDCKeys has been renamed to r.ShaderCompiler.DumpDDCKeys. The directory they output to changed from "MaterialDDCKeys" to "ShaderDDCKeys." Break getting the global shader map DDC key string out into a function to make it easier to call when we dump DDC keys. Global Shader map section files are named "GlobalShaderMap-%s" where %s is the name of the section (usually a global shader type). Editor and Game shaders are dumped to separate directories. Exposed ShouldDumpShaderDDCKeys function so material code can see if dumping is enabled.

  • Added command line parameters to specify a specific shader model and material quality level to cook for. This is used to limit what cooking shadermaps to a single shader model and/or material quality level. It's useful for locally cooking or specific situations where you want to cook a minimal set of shader maps. Each command line parameter can be used independently. Also, added -CacheShaderFormat that when specified during a cook, the cooker will only compile this shader model if supported for each material. Added -CacheMaterialQuality that when specifying this during a cook, the cooker will only compile this quality level and default for each material. For example, -CacheShaderFormat=PCD3D_SM5 and -CacheMaterialQuality=[0,1,2,3]

  • Output the WorldGridMaterial's human readable DDC key string to the log. This is done for diagnostic purposes on users' machines, and for the build machines.

  • Added new shader compilation editor analytics.

    • ShadersCompiled: The number of shaders compiled.

    • ShaderDDCMisses: How many times we missed shader maps in the DDC. This is a measure of how many times we didn't find Global and DefaultMaterial shaders.

    • ShaderDDCHits: How many times did we successfully find shaders in the DDC.

    • TimeShaderCompilationWasActive: Wall clock time of how long shader compilation was active across your whole editor session.

  • Added better output to COTF + ODSC. Prints out what command is being run (global, material, changed, singleshader) and prints out exactly how many shaders were compiled.And added a function to convert command type enum to a string.

  • Added an exec command "Material DumpDebugInfo" which dumps debug information for each shader in the material given as an argument. It can be run like the following: "material dumpdebuginfo WorldGridMaterial". It can also be used to see which shaders get invalidated when changing shader code:

    • "material dumpdebuginfo WorldGridMaterial", change the shader usf/ush file, run "recompileshaders material WorldGridMaterial", then "material dumpdebuginfo WorldGridMaterial", and diff the outputs of the two.

    • The filename follows the following format: Engine\Programs\AutomationTool{ProjectName}++UE5+Main-CL-20942948-WorldGridMaterial-2022.07.05-16.11.42.csv

    • The file output looks like:

      • Frequency, Target, VFType, ShaderType, SourceHash, VFSourceHash, OutputHash, IsShaderPipeline SF_Pixel, PCD3D_SM5, FGPUSpriteVertexFactory, TShadowDepthPSPixelShadowDepth_PerspectiveCorrect, 2DD4725EA72D0498EB6B1E656F35564D97083FC8, 920506EE58508D22D29046DCE7DF15BF34940059, EC976B76E986CB7E5235B154F9A0B3AF3AB9B1AD, false SF_Vertex, PCD3D_SM5, FGPUSpriteVertexFactory, TVirtualTextureVSBaseColorNormalRoughness, A3C811C874410080F3138AEF4489CCA932D7395A, 920506EE58508D22D29046DCE7DF15BF34940059, CD25F583872C5ECF0E156EA8F50AF96B6B199BDA, fal

  • Water geometry now works with Pixel Depth Offset (PDO).

  • Added the ability to specific material and material instances to cook using the command line to the CompileShaders commandlet. This adds the ability to specify which -targetplatform we should compile shaders for. You can specify multiple platforms by adding them together. For example, "-targetplatform=Windows+MyNewPlatform - Call BeginCacheForCookedPlatformData" to compile shaders instead of CacheShaders since the former allows you to specify platform. The following are some additional usage examples:

    • Specify collection EngineTest -run=CompileShadersTestBed -targetplatform=Windows -collection=MyCollectionName

    • Specify material list EngineTest -run=CompileShadersTestBed -targetplatform=Windows -materials=/Game/MyNewMaterial.MyNewMaterial+/Game/Tests/Materials/CoolMaterial.CoolMaterial

    • Specify both a collection and material list EngineTest -run=CompileShadersTestBed -targetplatform=Windows -collection=MyCollectionName -materials=/Game/MyNewMaterial.MyNewMaterial+/Game/Tests/Materials/CoolMaterial.CoolMaterial

  • Reduced the size of UMaterialInstanceDynamic by 8-bytes to drop into a smaller FMallocBinned2 pool.

  • Added the control to turn on / off Screen Space Reflections on translucency dynamically using showflag and ‘r.SSR.Quality'.

  • The new HLSL translator supports Virtual Texturing.

  • The Material Editor colors wires based on data type when using the new HLSL generator.

  • Input and output data types are tracked for node connections in the Material Graph. Pins and wires are now color-coded by data type.

  • Run two passes of PrepareExpression. The first pass to determine types, and second pass to flag expressions that are used. This way we can skip flagging constant/zero expressions (which we don't know about during the first pass)

  • Added 'Total Thread Preprocess Time' for shader compilation. This instrument shows how long shader preprocessing takes for each shader compilation job, keep a running total in our shader stats per shader type, add logging to track total thread preprocessing time for all shaders, and fixup local variable names to match the output log names.

  • The new HLSL translator supports structs in preshaders, which enables constant folding to be tracked across struct assignments.

  • Implemented changes to optimize GetMaterialShaderMapKeyString during cooks.

  • The new HLSL Material translator now supports automatic mip bias input.

  • The new HLSL Material translator now supports flow control in preshaders.

  • ShaderDebugPath now respects the material quality level for '...\Saved\ShaderDebugInfo\PCD3D_SM5\WorldGridMaterial\Default\FLocalVertexFactory\FHitProxyPS' or '...\Saved\ShaderDebugInfo\PCD3D_SM5\WorldGridMaterial\Epic\FLocalVertexFactory\FHitProxyPS' :

    • Use 'LexToString(EMaterialQualityLevel::Type QualityLevel)' to convert the quality level enum to a string.

    • This specifically appends to the DebugName the material quality at the level in the code where we "know" about the material. I wanted to avoid changing the parameters to the function, 'GlobalBeginCompileShader', because it is material agnostic.

  • Generate if{}/else{} control flow rather than ?: for material switch expressions. Added non-static bool MCT type to allow plugging bool expressions into switch nodes when using new HLSL translator.

  • Support matrix types in new HLSL translator Other various fixes/additions.

  • Added support for Material Layers with new HLSL translator.

  • Implemented const-correctness changes in new HLSL translator. 1) FExpression* is mostly always 'const'. 2) Since expressions should not change after creation, UMaterialExpression::GenerateHLSLStatements/Expression are const-methods.

  • Some fixes for rules around promoting scalar values in new HLSL translator which supports some new node types.

  • Texture values are no longer generated as HLSL code directly. Instead, they are replaced with a new 'Object' type system, which allows expressions to generate C++ objects of arbitrary type. This gives the texture sample expression full visibility into the texture object being sampled, which simplifies some code generation. More importantly it will allow virtual textures to work, which wasn't really possible with the previous system

  • Added the "DumpMaterialExpressions" commandlet to dump an info table of all material expressions in the engine and the plugins enabled on the project to a plain text file which includes the following output material expression fields:

    • Name for the name of the UMaterialExpression class (shows in material editor node search).

    • DisplayName for the optional display name set on the class (shows in material editor node search and overrides Name).

    • Caption to show text displayed on the material expression node.

    • Description

    • Tooltip Output location <Project>\Saved\MaterialEditor\MaterialExpressions.txt

  • The experimental CFLAG_RemoveDeadCode was added to ShaderMinifier to run a shader rewriting step that removes unused functions and types from the shader source before compilation. This improves compile times.

  • Added DistanceFieldApproxAO Material node to calculate approximate ambient occlusion.

  • Fixed duplicated SV_InstanceID semantic across the shader code.

  • Added the ability to split the Pipeline State Object (PSO) cache among chunks, so each chunk contains the cache only for the assets it contains.

  • The Command-Line Argument -noshaderddc now applies to the global shaders as well.

Improvement:

  • Improved the specular and diffuse matching between Rasterizer and Path Tracer for SSProfile. Switch DMFP to MFP automatically.

  • Removed compilation (of never used!) legacy simple forward shading permutations from Windows shader databases (~27% reduction of SM6, ~22% reduction of SM5 when simple forward was enabled in the compiler).

Crash Fix:

  • Fixed multiple crashes that could occur when undoing materials in the Material Editor. The transaction system was not aware of the EditorOnly data owned by the UMaterial, meaning that any undo/redo operation left the editor-only data on the UMaterial in an incorrect state. For instance, UMaterialExpressions with properties missing, override virtual function Modify on UMaterial, and call Modify on the EditorOnly data owned by the UMaterial.

  • Fixed occasional failures to decompress shaders in ShaderCodeArchive.cpp.

Bug Fix:

  • We now ensure shaders are cached before drawing a tile with a material. In the editor with ODSC, shader maps could be incomplete resulting in them drawing a tiling with the default material (which never gets updated) If the material is detected to be incomplete, it will synchronously compile shaders so they are ready before drawing. Display a slow task if possible (not PIE)

  • Fixed noise caused by world unit scale for large distance screen space subsurface scattering.

  • Added console variable 'r.SSS.Checkerboard.NeighborSSSValidation' to fix subsurface profile border artifact when checkerboard is turned on. It is off by default due to performance concerns since it introduces one extra profile ID access per pixel at low quality (TAA mode by default), and four extra profile ID accesses per pixel at high quality.

  • Fixed the ‘Total Shaders' compiled counter and stat to account for the job cache DDC. We were potentially over counting actual shaders compiled if we found a job already in the cache. Now we increase the counter when we finish a job that was not cached, and use ‘JobsCompleted' on the FShaderCompilerStats as a proxy for the number of total shaders compiled instead of counting the number compiled in the ShaderCompilerStats, because these are wrong and don't account for the job cache. Also, added a trace CPU profiler scope to FinishCompilation.

  • Fixed an issue with wrong refraction happening when SingleLayerWater triangles are not horizontal in the world.

  • Shader compilation will retry now when the following conditions are true: r.ShaderDevelopmentMode=1, and bSpecialEngineMaterial==True. This allows you to retry compilation of special engine materials, like WorldGridMaterial, even if you have bPromptToRetryFailedShaderCompiles=False.

  • Fix for various issues with the "CompileShadersTestBed" commandlet by making it behave more like the cooker.

    • The commandlet shouldn't be configured for rendering. This was originally done to force shader compilation to happen in PostLoad. This caused textures resources to be created, which is not needed and was causing crashes.

    • Properly wait on potential DDC requests.

    • Wait on shader compilation by calling ProcessAsyncResults, which is exactly what the cooker calls.

    • While we have jobs to compile we process the results.

    • Be sure to flush rendering commands so we cleanup deferred delete objects like Shader Maps.

    • Added logging to commandlet.

    • Enabled "LogMaterial" for this commandlet so we can see DDC puts w/ DDC key.

  • Fixed long wait times in FODSCManager::Tick caused by running when cook-on-the-fly is not enabled. Also only flush in ProcessCookOnTheFlyShaders if some work was actually done.

  • When modifying a parameter value on a UMaterial, all expressions that match the name are updated, rather than simply the first.

  • Compiler errors are now generated if a Material tries to append more than 4 components worth of data.

  • Made sure that Blueprint exposed functions resulting in a Material (UMaterialInterface) draw are synchronously waiting for their shaders to be ready before issuing the draw command. This also removes double-update of canvas in Blueprint functions.

  • Fixed a bug where custom scene textures could not be read in widget Materials.

  • Removed fogging from water brush translucent Materials.

  • Fixed a case where only the first virtual texture sampled on an Actor decal was updated correctly.

  • Fixed a bug where decals that sample world normals were not able to write to emissive.

  • Code was rewritten to use HLSL precise keywords in a number of places, including where World Position Offset is used. This fixes broken velocity vectors, and broken Editor outlines for a range of Materials.

  • Fixed a bug with broken shadow casting from Material Instances when the "Cast Shadow as Masked" setting is enabled in the parent Material.

  • Corrected an issue with Material Instances on decals looking incorrect when using cook on the fly.

  • Fixed a bug with CorrelatedColorTemperature in TonemapCommon.ush.

  • Fixed writing Virtual Texture feedback in ThinTranslucency Materials by using a hard-coded stochastic alpha threshold.

  • Fixed issues with texture streaming on very skewed textures (4x1024 and similar) and non-power of two textures with cinematic LOD levels.

  • Fixed a rare crash when building Hierarchical Levels of Detail (HLOD) in a commandlet by removing shadermap access that can pose threading hazards.

  • Fixed hitching while precompiling the Pipeline State Object (PSO) cache.

Nanite

New:

  • Enable compilation and usage of tier1 Windows DX12 mesh shaders in Nanite if running under SM 6.6 w/ atomics.

  • Implemented initial Nanite raster pipeline register/unregister/de-duplication, including launching each raster pipeline during Nanite rasterization if programmable raster is enabled. Also hooked up graph GetMaterialMask function to Nanite HW raster pixel shader stage.

  • Implemented Nanite support for rendering complex collisions for the fallback meshes.

  • Added Nanite CPU Material culling to avoid unnecessary CPU and GPU overhead from numerous empty raster and shading dispatches/draws (content and view dependent).

  • Implemented basic HW triangle barycentric path for Nanite HW raster passes (NANITE_USE_HW_BARYCENTRICS). Some APIs and platforms can further improve this with special intrinsics.

  • Packed PixelValue into PageInfo for a single uint2 no interpolation VS -> PS param (so parameter cache performance is unchanged, since the cache perf is based on attribute count not element count), and also export PixelValue so depth only Nanite rasterization can use it if needed. The pixel shader behavior is unchanged though (PixelValue is only exported for 64b vbuffer).

  • Added ability to cull Nanite Instanced Static Meshes at a distance from the camera.

  • Refactored Nanite Material GBuffer passes to run off the render thread.

  • A Nanite Material override setting was added to Materials and Material Instances. The main advantage for this as opposed to using the NaniteSwitch Material Expression is that references from override Materials are not cooked on non-Nanite platforms.

  • Streaming data for Nanite can now be fetched asynchronously from the Derived Data Cache in the Editor.

  • The Nanite streamer now runs the GPU transcode in asynchronous compute on platforms that support it.

  • Added a Nanite MaterialCount debug visualization mode which can be enabled with the console variable 'r.Nanite.Visualize MaterialCount'.

  • Made imposter building optional with the console variable 'r.Nanite.Builder.Imposters'. This setting is turned off by default.

  • Implemented changes to improve disk size for smaller Nanite meshes.

  • Improved Nanite partitioning heuristics to produce fewer expensive multi-Material clusters.

  • The PreSkinnedPosition shader graph node now works with Nanite.

Improvement:

  • Removed a massive number of Nanite rasterizer shader permutations across all platforms/shaderdbs, significantly improving iteration times for the editor and cooker, especially when these numbers get multiplied by the number of materials that utilize programmable features in addition to the default material "fixed function" path.

    • CLUSTER_PER_PAGE has been fully removed (since we no longer ever run CLUSTER_PER_PAGE=0), which now makes it mutually inclusive with VIRTUAL_TEXTURE_TARGET.

    • HAS_RASTER_BIN has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load.

    • ADD_CLUSTER_OFFSET has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load.

    • HAS_PREV_DRAW_DATA has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load.

    • NEAR_CLIP (only change to significantly affect codegen) has been turned into a dynamic branch based on FNaniteView. This lets us merge depth clip/clamp rasterizer calls in VSM together instead of relying on HAS_PREV_DRAW_DATA, and a future optimization can now be done to merge local and directional light full Nanite pipeline calls together.

    • VISUALIZE permutation removed from VS/MS since it only loaded uniform values that passed down per-vertex into fragment stage as nointerpolation parameters. Pixel shader now constructs this uint2 directly under the VISUALIZE permutation.

    • NANITE_MESH_SHADER_INTERP removed by default but still left in the code, since it is a work in progress potential optimization for DX12 mesh shaders.

    • Removed explicit Lumen and VSM usage of NANITE_RENDER_FLAG_HAVE_PREV_DRAW_DATA (now the dynamic branch path is only taken if CullRasterizeMultiPass implicitly breaks the rasterization into multiple calls due to NANITE_MAX_VIEWS_PER_CULL_RASTERIZE_PASS overflow).

    • Performance was tested on a 2080Ti in AncientGame, and the delta is effectively noise (tested cached and uncached VSM). Further testing on other platforms will occur, but it is important to get this change in for all the benefits and easy to tweak things later if needed.

  • Added an optimization to Nanite rasterizer binning. Multiple triangle Material span indirections of a single cluster are now emitted, rather than a single cluster indirection where each rasterizer VS needs to re-calculate whether or not a triangle is contained in the active rasterizer bin.

  • Implemented a significant optimization in certain heavy programmable raster scenes to use a fixed function path in Nanite if the only programmable feature is World Position Offset (WPO), but Evaluate WPO is false.

  • Implemented a minor CPU optimization to deferred pipeline registration on the Nanite draw lists. This is experimental and work is ongoing.

  • Converted Nanite Streaming buffers to support the Render Dependency Graph (RDG).

Optimization:

  • Explicitly disable WPO evaluation on Landscape Nanite meshes.

  • Merged Nanite HW rasterizer passes into a single RDG pass, and also SW rasterizer passes into a single RDG pass. All passes update various buffers with atomics, so they are now always marked with SkipBarrier to disable synchronization between passes and allow for overlap. VSM in AncientGame campfire went from 4.64ms -> 3.41ms, Primary raster went from 1.34ms -> 1.07ms. Lumen raster 0.20ms -> 0.18ms. Much higher gains expected in content with high numbers of rasterizer bins (more overhead to remove using this optimization) MedievalGame is even better: Primary raster 1.82ms -> 0.92ms, VSM 2.99ms -> 2.07ms, Lumen 0.43ms -> 0.19ms

  • Optimized raster binning by merging separate HW and SW dispatches together, and also fixed the cluster thread group count so we don't spawn 64x useless thread groups. Tested on a 2080Ti with AncientGame campfire.

    • Separate HW/SW dispatch vs. Merged HW/SW dispatch Primary 1.28ms -> 1.02ms Directional VSM 1.66ms -> 1.52ms Local VSM 2.21ms -> 1.96ms

    • Merged HW/SW dispatch -> Fixed Cluster Counts Primary 1.02ms -> 1.01ms Directional VSM 1.52ms -> 1.43ms Local VSM 1.96ms -> 1.92ms

  • Big rewrite/optimization of Nanite programmable raster pipeline registration with GPUScene on the CPU, added raster bin visualization plus duplicate define code cleanup, added initial WIP two sided material support (will optimize the math shortly), and fixed a number of programmable raster VSM related bugs.

Crash Fix:

  • Fix a Nanite crash which occurred when enabling Shader Complexity Mode in a cooked build.

  • Fixed a Nanite crash that would occur when setting the Preview Render Level to SM5 after successfully rendering SM6.

  • Fixed a potential crash when Nanite Derived Data Cache requests fail during cooking.

  • Added vertex sanitation code to the Nanite builder to fix a potential crash when the input mesh has bad floating point data.

  • Fixed a Nanite streaming crash when all pages early out.

Bug Fix:

  • Fixed a race condition which occurred when accessing the RasterMaterial or ShadingMaterial WeakObjectPtr on the render thread.

  • Fixed incorrect calculations that occurred in Nanite micropoly rasterizer when two sided materials are used.

  • Fixed Nanite AuditMaterials logic to correctly handle Material instances changing Blend Mode.

  • Fixed issues with Nanite triangle culling on orthographic cameras.

  • Fixed an issue where Nanite Geometry Collections could go missing when raytracing.

  • Fixed a logic issue with Nanite instance culling where the "Visible In Scene Capture Only" flag would not work properly.

  • Fixed an issue where Nanite Static Mesh settings would reset every time you re-import.

  • Fixed an issue where cluster DAG cuts from the Nanite Trim feature were sometimes inconsistent between clusters and groups, which could potentially lead to encoder crashes.

  • Added logic to the Nanite streamer to retry Derived Data Cache (DDC) streaming requests if they fail. Derived Data Cache warnings were improved to include resource names.

  • Fixed an incorrect warning message for Nanite cluster buffer overflows.

Removed:

  • Fully removed Nanite and Virtual Shadow Map SM5 vendor extension, lockbuffer hack, and DX11 support from UE5

Niagara

API Change:

  • Previously, new renderers were added by UClass; now it's a manual process to register new renderers, which allows for more flexibility. See FNiagaraRendererCreationInfo for more details.

New:

  • Niagara node pins can be moved multiple steps at once.

  • Added a "loose type" mode to Niagara. Users can now treat position types as vector types.

  • Added unit metadata to system and emitter properties. You can enter values in seconds by default, but if you enter units in a different value it will auto-convert them. For example, entering ‘500 ms' will convert to 0.5 seconds.

  • Overview modes now have a simplified display when the view is zoomed out.

  • Improved Niagara pin type colors.

  • Changed the parameter types of transform nodes to more clearly differentiate vector and position types.

  • Made the Niagara component a Blueprint type.

  • Double-clicking on a script node now opens the selected version in the graph.

  • Added custom validation rule support to Niagara. Users can refer to UNiagaraValidationRule and its subclasses for examples to write their own.

  • The UI now shows convertible linked inputs for stack input bindings.

  • Changed the default value of the property Only Create on Spawn in the Component Renderer. The default value was previously true, it is now false. Previously, particles only got a component from the Component Renderer when they spawned, but now they will get that component as soon as it becomes available. This resolves issues that users had with burst systems, particularly when used in conjunction with Sequencer. Old assets are not affected.

  • Added file include support for CustomHlsl nodes.

  • Added a message to the emitter and script graphs when downstream assets are affected.

  • You can now specify version dependencies in modules.

  • Improved the audio player:

    • One-shot audio no longer loops.

    • Persistent Audio Components are destroyed when particles die.

    • Audio modules work in emitter and system scripts.

  • Added a setting to zoom-fit system assets when opened.

  • Added an option to collapse disabled Niagara modules.

  • Niagara components that are not auto-activated now stay off when you change users parameters.

  • Improved numerics resolution, and made type checking stricter for operation nodes.

  • Made the compilation status more obvious in Niagara's viewport.

  • Removed loose parameter bindings from main Niagara parameters.

    • Data Interfaces should now opt in to the new binding path by setting UseLegacyShaderBindings to false.

    • BindParameters, SetParameters, and UnsetParameters are now BuildShaderParameters and SetShaderParameters.

    • CreateComputeParameters and GetComputeParametersTypeDesc are now CreateShaderStorage and GetShaderStorageType.

    • Shader storage should no longer be required for the majority of cases. Only those which require data based on bound functions will need additional data, everything else should be statically set.

  • Modified Niagara Compute Dispatch to use FRDGBuilder through the pipeline.

    • Legacy data interfaces run on the Graph execution timeline. Some caveats now exist, for example peeking the current buffer on the MainDataSet will be wrong.

    • Converted data interfaces run on the Graph build timeline, executing passes as required.

    • Converted data interfaces have been updated to use new PreStage, PostStage, and PostSimulate functions.

    • Various other parts of Niagara have been updated to allow operations on the Graph builder timeline, for example, readbacks, debug drawing, profiling, and more.

    • Various global compute shaders have been updated to use shader parameter structs.

  • Added support for spawning over 16k max secondary particles per frame in Niagara Fluids.

  • SimCache functions now access data from Blueprints.

  • Added methods to get the socket index from filtered and unfiltered sockets.

    • Added Velocity to all functions to make it consistent.

    • Added Interpolated methods for World Space functions.

  • Added RGB and RGBA pins to dynamic parameter material nodes.

  • We now show pin names and added RGBA to the Particle Color node.

  • Removed a case that blocked SRV for uniform sampling.

  • Reduced the size of the GPU triangle uniform sampling buffer from 16 bytes per triangle to 8 bytes.

  • Added a custom element count binding for simulation stages.

  • Added reset to default option to the camera in the Baker.

  • Added camera bookmarks to the Baker.

  • Added Attribute Capture Mode options to Niagara SimCache. This allows you to capture all, renderer only, or user-supplied attributes only into the cache.

  • Created a Blueprint library for capturing Niagara SimCache data.

  • We now support position types for material parameter bindings.

  • We now detect if a data interface is being used with a CPU script or not.

  • We now allow the static mesh data interface to access GPU resources if it's not used by a CPU script.

  • SRVs will be available on the target platform.

  • Support added for Cube, 2DArray, and Volume Sample data interfaces to select both the texture and render target types. SetTextureObject function can take either parameter now.

  • Data interfaces can add renderer-only attributes for capturing. For example, if a data interface ran a process post cache read to update the state required to render the system, we may not cache it, since the sim cache will only store renderer-bound attributes.

  • Emitter Properties data interfaces can access data that is not part of the data buffers.

  • Added a method to the particle reader to understand local or world space.

  • Static mesh data interface CPU access warnings no longer include socket sampling.

  • Added validation rules to simulation stage budgeting.

  • There is now an option to reset Niagara and Cascade when crossing too many large world coordinate tiles, since this will result in rendering artifacts.

  • Added constant material parameter bindings for renderers.

  • We now track registered components on the Debug HUD, and optionally show their information.

  • Converted the Collision data interface to Render Graph.

  • Converted the Physics data interface to Render Graph and shader parameters.

  • Added SubUV to the renderer information. This removes the GPU data deduplication, but this should be done via data interface deduplication and is not robust when using pointers.

  • Added Sprite Renderer Info data interface for reading information from a sprite renderer inside a script.

  • Converted Audio data interfaces to use shader parameter structs.

  • Landscape data interface uses the shader template and shader parameters.

  • Cross level references now use TSoftObjectPtr instead of TObjectPtr.

  • Physics Field Update now uses Template, Shader Parameter, and Render Graph.

  • Added a project setting for sort precision. Renderers can now override this project setting.

  • Converted Niagara Debug Drawing to Render Graph.

  • Converted the EmitterProperties, ActorComponent, and SimpleCounter data interfaces to shader parameters.

  • Converted RasterizationGrid to shader parameters and Render Graph.

  • Converted GeometryCollection and ChaosDestruction data interfaces to Render Graph.

  • Updated the NiagaraVariant when calling array set functions.

  • Converted StaticMesh data interface to shader parameters and Render Graph.

  • Exposed occluded line drawing color scale and set defaults to 5%.

  • Added Matrix User Parameters Setters. This truncates to FMatrix44f so will loosen precision for large world coordinates.

  • Separated expanding bounds between dynamic and static. Added an option to snap bounds to units, to reduce update transform frequency as they grow. When no static bounds or dynamic bounds are present, we do not return the static bounds.

  • Converted the Grid2D data interface to use template and parameter structure binding. All read-write data interfaces now use correct formatting for shader parameters.

  • Converted example mouse data interface to parameter bindings.

  • Converted RenderTarget data interface to use template and parameter structure binding.

  • Curve data interface now uses template and parameter structure binding.

  • Converted GBuffer data interface to use template and parameter structure binding

  • Converted Spline data interface to shader parameters. Object Reader conversion and Neighbor Grid 3D conversion now use shader structures.

    • Converted MeshRendererInfo, VectorField, CurlNoise, Camera, and Occlusion data interfaces to shader parameters.

  • Rigid Mesh Collision data interface converted to Render Graph.

  • Converted Export data interface to use template and parameter structure binding.

  • Moved constant buffers into loose parameters, with the exception of the external cbuffer. Parameter binding is now enabled when possible, for example when there are no legacy data interfaces, external cbuffers, or view uniform buffers.

  • Initial pass for Niagara Simulation Cache. Currently a full restart cache per frame is generated. It only contains system simulation and particle data set information. This is still highly experimental, while it works in cooked and uncooked we fully expect the data formats will change.

  • Added support for shared static float buffers that data interfaces can push data into.

  • Added NiagaraDebugHud console command to quickly enable or disable the HUD.

  • Added a Blueprint method to modify filtered sockets and bones for skeletal mesh sampling.

  • We now flush Niagara pending ticks in batches if we inject a large amount in a single frame. Render Graph has a limit on the number of passes that can execute. We avoid surpassing this limit, for example, by skipping forward in the Sequencer timeline.

  • Added support for returning the bone scale on a skeletal mesh data interface.

  • Converted Hair to Render Graph.

  • Converted Texture data interfaces to use template and parameter structure bindings.

  • Added a method for data interfaces to draw to the Debug HUD. Debug HUD is now wrapped with WITH_NIAGARA_DEBUGGER to make sure it's compiled out.

  • Fixed an RHI resource leak by calling release on uniform buffer before memstack wipes memory.

  • Updated the Array data interface to shader parameters.

  • Converted the Async GPU Trace data interface to shader parameters and Render Graph.

  • Added an experimental VirtualTexture data interface.

  • Converted the Skeletal Mesh data interface to Render Graph and shader parameters.

  • Added support for pulling a bind pose vertex or triangle.

  • Added overrides for translucent sort priority and offset.

  • Updated the Graph node Add menu logic. Loaded enums no longer show up in the make/break list unless the library only flag is off.

  • Improved the UX for the Device Tree and CVar Conditions:

    • Cleaned up Niagara Device Tree. Device profiles have a new value called bIsVisibleForAsssets that lets you indicate which device profiles should be visible in other assets.

    • Improved tooltips and coloring on the Device Tree to better show what is enabled or disabled and why.

    • Added tooltips for CVar conditions to text entry and suggestion boxes showing the CVar help text.

  • Platforms now specify a min and max Niagara Quality Level they support, which reduces need for trawling .ini files and allows fragments to set the quality level.

  • CVar Conditions now have more control over what occurs when the condition is passed or failed. Previously they could only disable the set when the condition failed, which is now the default.

  • New renderers added to emitters have a default asset assigned (for example a material or a mesh).

  • Multiple tweaks and additions for making scalability smarter with regards to culling important player FX.

    • New master mode for scalability culling allowing us to pause all culling. Useful for special cases such as a front end.

    • Added ability to reset FXBudget on mode transitions.

    • Tidied up library spawn functions with an initialization struct version.

    • NiagaraComponents can now be told that they are a player effect explicitly.

  • Physics Asset is replaced by Rigid Mesh Collision data interface for skeletal and static mesh collisions. All Niagara Fluids templates have been updated.

  • Niagara scalability can now globally be paused or disabled via the console command fx.Niagara.ScalabililityCullingMode.

  • Added a function to get spline length.

  • Implemented cubic interpolation for 3D gas simulations (velocity and scalar advection). This gives a large increase in quality.

  • Removed "Common" section from the Parameters panel in the Niagara Editor.

  • Event spawn scripts can now modify the initial values for particle attributes, so modules dependent on this can function correctly when spawning from events. An example of how this could be used is the ScaleColor module. This is optional per event handler, but defaults to enabled. Existing content has this disabled to maintain existing behavior.

  • Streak source particles for fluid simulations to avoid artifacts.

  • Added Get Velocity to the Actor data interface.

  • GPU scripts now log their errors in the Niagara log in a more reliable way.

  • You can now bind the attached component or a local player using Add Source Mode.

  • Small scale force to break up mushroom shapes on 3D gas simulations.

  • Added an option on 3D Flip simulations to add more particles near the surface of the sim for more detail and smoother surfaces.

  • Renderers now have default assets assigned to them, and new renderers can be registered via the Niagara Editor Module.

  • Selecting from the Parameters panel will highlight active usages in the stack overview.

  • Added an Effects section to the Niagara Component. Also added a category with Debug and Reset buttons. You can now summon the Niagara Debugger to view given variables, emitter, system, component, and more in context in the Niagara Editor.

  • Improvements to Niagara's scalability visibility culling options. This inlcudes custom view frustum checks that allow some visibility culling that is not based on the results of rendering code. As such, this can be used for pre-culling.

  • The Niagara Outliner can now pull data from a running instance of the game for a specific Niagara System into a Niagara SimCache for analysis and debugging.

  • Fluid bounds are programmable and set via the setup of the simulation.

  • Generalized the UvMapping feature so that it can be shared by both static and skeletal meshes. It now takes a different approach when specifying the uv index for the static mesh via a system script level VM function.

  • Stripped data from NiagaraSystems when AV data is not required (server builds).

  • Added a new function called vector field (LoadSample) to grab raw values by index rather than interpolated values.

  • Added mesh streaming reporting to Niagara and Cascade primitive component to ensure renderable meshes are being adequately streamed in. It now reports a scaled instance at the origin of the component. It does not take into account dynamic mesh scale.

  • When saving from the NiagaraSystemToolkit we now save the version not in edit mode. This prevents recompilation when someone references the system (for example in a level or a cook).

  • Added turbulence and small scale field to Niagara Fluids. The new small scale turbulence can be used to add edge breakup on simulations. It works by incorporating a random vector at each cell, ranged by the density value inside the simulation.

  • Added a bounds calculator for Niagara Light Renderers.

  • Disabled dependency on the HairStrands plugin for Niagara Fluids. Old assets may now fail to run properly without manually enabling the HairStrands plugin for access to the NiagaraDataInterfacePhysicsAsset class. Newer assets are no longer dependent on this plugin, and in the future the class itself will be migrated to the Niagara plugin.

  • Improvements to the Rigid Body data interface:

    • Debug rendering now shows the actors providing rigid bodies.

    • Added an emitter-based script for selecting actors using physics queries.

    • Made improvements to memory and runtime performance.

Improvement:

  • Optimizations for cooking in Niagara.

  • Updated the UI to handle cache changing while the UI is open, and to use the new API to read the data.

  • Made changes to the Static Mesh data Interface API for consistency.

  • We no longer add to GPUDataInterfaces if the data interface is not used by a GPU emitter. This improves the performance and reduces the memory of generating GPU ticks in some situations.

  • Cleaned up the copy and paste behaviors for Niagara Overview Graphs.

    • Copying from emitters is now no longer supported. The intended behavior here isn't well defined, so users are directed to the more supported path of using the add emitter option from the context menu.

    • Creating comments is no longer supported in emitter graphs. The overview is transient so any comments would not persist.

  • Migrated NiagaraDataInterfacePhysicsAssets to NiagaraPlugin. Implementing an interface on GroomComponent produces consistent behavior.

  • Added a stack warning for emitters which exclusively use emitter-sourced objects and are using dynamic bounds.

Crash Fix:

  • Fixed a crash when using undo after adding a renderer.

  • Prevented a crash in the editor when a struct with an unsupported type member was used in a module script.

  • Fixed a crash when playing audio from a particle system on a platform that had audio disabled.

  • Fix a crash when an event spawn info had no space left.

  • Fixed a crash when using fx.SuppressNiagaraSystems 1 with NiagaraDataInterfaceArrayFunctionLibrary.

Bug Fix:

  • Fixed a bug where user parameters that are linked to position types were only partially converted to positions.

  • Fixed a few bugs with the search bar in the generated code view.

  • Fixed an issue when duplicating a module would also duplicate all the script variable guids.

  • Fixed a bug when position bindings couldn't see position variables.

  • Prevented Niagara compilations from stacking, now you can have at most one pending compile request.

  • Fixed a bug that prevented playing audio from Niagara in cooked builds.

  • Fixed a bug when the array index changed, but was not picked up correctly in the Geometry Cache Renderer.

  • Fixed an issue when user parameters that were bound to renderer position bindings were not updated to position types.

  • Fixed a bug where pooled effects attached to Actors in hidden sublevels were not hidden properly.

  • Fixed a memory leak when several script source copies were left in the root set after compiling a Niagara system.

  • Fixed properties not showing for CustomHlsl nodes when the first input was a data interface.

  • Fixed a bug when types for user parameters were not considered across emitters.

  • Fixed an issue when Niagara systems without auto-activation would reinitialize after a compile request.

  • Fixed a bug when setting bOwnerNoSee on Niagara components wasn't hiding the Component if one of the emitters used a Light Renderer.

  • Fixed issues with memory image names. We now:

    • Write to the MemoryImageNames array.

    • Copy the contents of TArrayView rather than the layout of the view object itself.

    • Handle the name layout during patch application on foreign platforms.

  • On the Actor's EndPlay, we now release references to the source Actor and Component from NiagaraDataInterfaceSkeletalMesh.

  • Fixed GPU executing particle update script on spawn when interpolated spawning is disabled.

  • Fixed an issue when holding onto task references longer than necessary.

  • Fixed Mesh Renderer dynamic parameter constant bindings not working.

  • Fixed a potential issue that could cause a crash in an edge case for Cascade's activation code.

  • Fixed an issue with bool select nodes on the GPU where data is passed from the experimental virtual machine (VM).

  • When fixed delta tick is enabled, we now force solo mode.

  • Changed GPU initialize LODResource to TRefCountPtr to avoid stream out.

  • Fixed an issue that could cause some errors from correctly showing up in the editor for GPU simulations.

  • Fixed an issue when ray tracing was using PreViewTranslation for GPU instances. This also resolved missing large world coordinate support for Niagara and ray tracing.

  • Fixed a bug with the Niagara Platform Set CVar text entry box.

  • Resolved a memory stomp on loading UNiagaraGraph.

  • Fixed emitter mode visibility tag and mesh index not working on Mesh Renderers.

  • Fixed when a previous external cbuffer was using the current data. When not calling PostTick on GPU Context, we didn't push the data from current to previous.

  • Fixed an issue when GPU scene mesh path was dangling into a potentially reallocated buffer.

  • Fixed an incorrect LOD calculation in GetFirstValidLODIdx.

  • Fixed issues with default quality levels for uninitialized device profiles that could cause incorrect scalability behavior.

  • Fixed the Niagara Editor preview not resetting correctly when changing the Scalability Mode preview settings.

  • Fixed an issue that would prevent local player FX reactivating after being scalability culled in some cases.

  • Fixed an issue causing some Niagara user parameters set from Blueprints to be reset when a system was reactivated.

  • All the renderer material bindings now show up in GetBoundAttributes. Prior to this change, there could be subtle differences in the data being preserved in cooked and uncooked.

  • Modified the warmup delta time, it now affects the tick count and time properties. Added stack warnings on systems and emitters if the emitter maximum delta time is smaller than the system's warmup delta time.

  • Fixed issue in the Scalability Manager that could cause no updates to occur in some cases.

  • Fixed an issue with a duplicate user parameter of type position or vector being created when a variable with the same name but opposite type already existed.

  • Static variables were depending on pin persistent GUIDs for caching. This is insufficient as some pins are zeroed out for persistent GUIDs. Picking the pin offset and parent guid in that case.

  • Fixed an issue when some InstanceOverrideParameter data interfaces were being used before being post-loaded, and so missing some required post-load fixup.

  • Fixed a bug that would cause the tick function for Niagara solo components to be left running even when the systems were inactive.

  • Now detecting if a function signature actually changes when upgrading a data interface function call. This was causing an unnecessary reallocation of pins when doing a static duplicate.

  • StackFunctionInput cache now correctly populates the data source.

  • Fixed type checking of visited parameters when evaluating Fail If Not Set errors, as we may have intentional type mismatches for large world coordinate types.

  • We now prevent caching shaders for scripts that are not associated with a system. This prevents the compilation of standalone scripts and scripts from standalone emitters.

  • Made CullProxy on NiagaraComponent transient, so that we don't try to save any references to the dynamically created proxy component.

  • Initialized UNiagaraScriptVariables added to graphs with default mode Value when the variable is in the module namespace.

  • Apply SystemLWCTile to track the large world coordinate tile when evaluating Mesh signed distance fields (SDFs) in Niagara.

  • Fixed an issue where BoundAttributes in NiagaraComponentRendererProperties were getting trimmed.

  • We now handle TypeDefinitions with transient structs during serialization. If a small world coordinate struct is available, we use the mapping of this struct during the session to serialize out the large world coordinate version.

  • Fixed an issue when systems that shared the same name (but different paths) would overwrite results when dumping byte code.

  • Cleanup natvis for niagara types:

    • Types have been moved into their own niagara.natvis file.

    • We can then resolve FNiagaraTypeDefinitionHandle through global pointers so that FNiagaraVariable can now be properly visualized.

  • Incorporated the type into the ordering of the attributes. This resolves an issue that resulted in multiple attributes with the same name, but compatible types (float and position).

  • Fixed two issues with attribute trimming Niagara particle scripts:

    • Parameters to an impure function that were using the StackContext namespace weren't being properly included in the dependency chain.

    • Custom HLSL nodes which internally used impure data interface functions wouldn't necessarily have their inputs marked as dependents (in the case where a dummy output variable was being used, which itself got trimmed).

  • Stale and garbage-collected actor components can no longer be accessed when using the ActorComponent data interface.

  • Fixed the FindQuatBetween script to handle the case where one (or both) of the input vectors are 0 length (an identity quat will be returned).

  • Made sure we only enable bAreaWeighting if the option is selected and the underlying data is present. If you have modified the mesh, but it hasn't actually applied the change, it now behaves as expected.

  • Fixed Niagara VM bytecode generation for if blocks when a variable was assigned and then used within the same block.

  • Fixed VM bytecode generation which was failing in a very small number of cases of the form:

    • A = GetFirstValue;

    • B = A;

    • A = GetSecondValue;

    • C = A; This would get GetSecondValue assigned to C instead of GetFirstValue.

  • Added an SSA pass to help reduce overwriting registers. This added logic removes self assignments, and adds logic to stop propagating when values are dirtied. From a sampling of scripts, about 2% are changed (where 1-3 unnecessary ops have been deleted).

  • Niagara shaders now respect r.DumpShaderDebugWorkerCommandLine as expected.

  • Implemented fixes for experimental compressed particle systems.

    • Only particle systems will have their attributes compressed.

    • Previous versions of our deny list will also be denied compression (we don't want to be comparing half Particles.Previous.Position with float Particles.Position).

    • Fixed stride being supplied to VF shaders.

  • Added a work around for an issue when Niagara GPU scripts for the editor platform would have compile requests that were never properly handled, including being put into DDC. This happened when compile requests were dirty on load.

  • Made sure that DataInterface curves are consistent with respect to UpdateTimeRanges and BuildLUT for WITH_EDITORONLY_DATA.

  • Fixed a bug where the Niagara stack did not reflect the compile status correctly, and only updated error symbols after clicking on it.

  • Transient systems created during script merging are now reset.

Path Tracer

New:

  • Added initial support for rendering water in the Path Tracer.

  • Exposed a missing path tracing show flag in scene captures.

Postprocessing

New:

  • Added support for a Screen Space Reflection input pass to scene view extensions, which mirrors the post-process Material blend location.

  • Extended Luminance Range is enabled for new projects by default.

Improvement:

  • Improved pixel shader animation and translucencies no longer ghost as much as in UE5.

  • Local exposure is now applied when calculating bloom.

Crash Fix:

  • Prevent crashes with post process materials when one of them is not a Material Instance and it tries to blend the parameters. The easiest fix is just to skip blending the materials together. The blending functions below only work on instances, so skip blending if we are just a material interface. This can happen in two scenarios: 1) A wrong material type is assigned into the post process material array, and 2) the same material is placed in twice. The MID lookup code above won't create two separate MIDs for the same material, resulting in this code trying to blend a MID with a Material Interface.

Bug Fix:

  • Fixed an issue with PlanckianIsothermal in TonemapCommon.ush

RHI

New:

  • Added parallel setup for Render Dependency Graph (RDG) passes, and offloaded RDG buffer uploads and uniform buffer creations off the render thread.

  • Changed the minimum driver version for Nanite on Vulkan, and also added a check for Linux.

  • On the Vulkan RHI, added an option to change pipeline queries to BOTTOM_OF_PIPE. This gives more precise measures for a single span, but might alter overall frame time on some platforms. TOP_OF_PIPE remains the default.

  • A draw texture utility was added to RenderGraphUtils, which is used for copying with format conversions.

  • Implemented support for parallel buffer creation and lock/unlock.

  • All platforms now use the same Vulkan SKD flow for compilation to ensure that the engine is always built with the provided version at a minimum. A local SDK is only preferred if it is newer.

  • Local uniform buffers were deprecated, as RHICreateUniformBuffer now works on any thread.

  • On Vulkan, DriverDenyList entries were split per operating system, as driver numbering is different on each OS.

  • DriverDenyList support was added to Linux.

  • Added DriverDenyList entries for Vulkan on Windows and Linux.

  • Added Render Graph (RDG) versions of UnifiedBuffer utilities.

  • For Vulkan, fixed all cases of single scalar in shader parameter arrays to respect 16 byte alignment.

  • Added static_assert to prevent the creation of new asserts moving forward. Used SHADER_PARAMETER_SCALAR_ARRAY/GET_SCALAR_ARRAY_ELEMENT for single parameters, or packed them with surrounding parameters when possible.

  • Added "ultimate" version of AddClearRenderTargetPass that lets the user clear multiple mips, multiple array slices, with / without a custom clear color or viewport and does so by using a clear action if possible. Note that the existing versions have not been deprecated since they are more straightforward (they clear only a single mip/slice).

  • In Vulkan, use vk_enum_string_helper to print enum names in debug messages.

  • Implemented support for fused CopySrc | CopyDest transitions for Vulkan in RDG.

  • In Vulkan, we set the initial state of GParticleCurveTexture to SRVMask since it might get bound before it is filled for the first time. This fixes a validation error.

  • Added support for RHI validation breadcrumb logging with transition validation errors.

  • Added parallel UpdateUniformBuffer support by taking a command list.

  • Made RHICreateUniformBuffer thread safe.

  • Added bindless resource support as a requirement for ray tracing on PC (SM 6.6 + Resource Binding Tier 3). Compile DXR shaders using the same profile when targeting PCD3D_SM5 and PCD3D_SM6 (for example,. lib_6_6 or lib_6_5 based on USE_SHADER_MODEL_6_6 define).

  • Ensure that BC6+7 textures have good mappings on all platforms and RHIs, including ES3.1 RHI for performance mode. BC6+7 should now be useful in multi-platform games.

  • Only set the D3D12 residency priority for acceleration structure resources on pool creation, rather than on individual BLAS creation. Saves significant CPU time when creating transient (short-lived) acceleration structures.

  • Use D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_IN / OUT instead of just IN for GPU bread crumbs. This is more accurate when there are multiple GPU commands back-to-back without barriers. However it may be slightly more expensive when many breadcrumbs are inserted. This also fixes MaxParameterCount in FD3D12CommandContext::WriteGPUEventStackToBreadCrumbData and slightly refactors FD3D12CommandListManager::FDiagnosticBuffer.

  • Reduced redundant D3D12 PSOs by ignoring vertex stream strides when computing the PSO cache key. D3D12_INPUT_LAYOUT_DESC part of D3D12 graphics PSO descriptor only includes the format, slot/semantic index, and so on. The stride is set at draw time using ID3D12GraphicsCommandList::IASetVertexBuffers. This saves a small percentage of total created low-level PSOs.

  • Added the r.RayTracing.EnableInEditor and r.RayTracing.EnableInGame console variables to control whether ray tracing effects should be enabled by default in the editor and in game (if corresponding game user setting does not exist).

  • Added support for creating raw buffer SRVs for any buffer in D3D12. In some RHIs, a raw buffer view can only be created if the buffer itself was originally created with a corresponding flag. However, modern RHIs such as D3D12 allow creating raw views for any buffer. This change adds FRawBufferShaderResourceViewInitializer to create raw views of buffers when GRHISupportsRawViewsForAnyBuffer is true.

  • Added Raster Ordered View (ROV) type support for shader binding.

  • Skip redundant calls to ID3D12Device5::SetResidencyPriority, which are extremely expensive The current priority can be stored in the D3D12 resource private data and redundant priority setting can be skipped. This is important for buffer allocations coming from CreateRayTracingBuffer.

  • Added the r.RayTracing.RequireSM6 console variable which can be used to only compile ray tracing shaders when targeting the SM6 D3D12 shader format.

  • Added Shader Model 6 warning dialogs, so that if a static mesh is detected to use Nanite, or a project is configured to use Virtual Shadow Maps and SM6 is not enabled in the project settings, a warning shows that SM6 needs to be enabled. Both cases only warn if the project was already configured to use a D3D platform.

  • Added an option for enabling Nanite in Project Settings.

  • Adding initial experimental D3D12 bindless support.

  • Added public interfaces and data for initial experimental bindless support.

  • Reworking shader platform settings on Windows to be per-RHI. This removes the ill-fated "min/max feature level" configs that can cause confusion. On Windows, "TargetedRHIs" is now split into "D3D11TargetedShaderFormats", "D3D12TargetedShaderFormats" and "VulkanTargetedShaderFormats". "TargetedRHIs" is still parsed for backwards compatibility. Using this, projects can now be more easily configured for D3D12-only or even Vulkan-only.

  • Updated FShaderFormatsPropertyDetails to use FName instead of FString for shader platforms. Also added a filtering method for mixed RHI platforms like Windows.

  • Reflection data is now included with SM6 embedded PDBs.

  • Added initial GetResourceFromHeap and GetSamplerFromHeap support.

  • Added TexCreate_Shared to FD3D11Texture3D.

  • Added a minimal interface to OpenGLDrv.

  • Added ERHIInterfaceType so the public RHIs can identify themselves.

  • Added templated GetDynamicRHI to avoid accidental Validation DynamicRHI casts.

  • Added depth clip control to the rasterizer state.

  • Added VRS D3D12RHI updates for defer ShadingRateImage binding to State Cache. Previously, we would bind the shading rate image plus related combiners as part of SetRenderTargetsAndClear. Instead, VRS images can now use the state cache infrastructure to reduce binding overhead.

  • Added "Supports Ray Tracing" to platform properties. This is checked in addition to the project/platform settings for RayTracing but is opt-in per platform instead of always enabled if the setting is enabled. This has the effect of reducing the number of platforms that say they support RayTracing which directly reduces the number of shader platforms that "support" RayTracing.

  • Added D3D12 Mesh shader support for ID3D12Device8, ID3D12Device9, and ID3D12Device10.

  • Created FShaderParameterMap::FindParameterAllocation method that returns the parameter struct instead of using reference parameters.

  • Implemented a change to migrate back to using UniformBuffer structs since the cbuffer uses the same name as the struct, we have to rename the cbuffer using a consistent prefix. The reflection handling also needs to reinterpret the renamed cbuffer as the correct UniformBuffer.

  • Added the ability to create a per-platform public interface for D3D12RHI.

  • Added Create functions to FRDGTextureDesc, which now derives from FRHITextureDesc instead of being an alias.

Improvement:

  • Added log messages for when D3D12CreateDevice fails.

  • FCubemapTexturePropertiesPS permutations have been modernized.

  • Changed WindowsTargetSettingsDetails to use shared functions to describe shader platforms.

  • Renderer dependency cleaned up by removing RenderGraph.h from SceneRenderTargetParameters.h.

  • Updated Agility SDK to 1.602.0

  • Refactored D3D12 descriptor management to go through a central manager.

  • Restored functionality to r.ShaderCompiler.EmitWarningsOnLoad.

  • Added more DXGISwapChain and DXGIFactory coverage in D3D12 and cleaned up adapter/swapchain code with available types.

  • D3D12RHI QuantizeBoundShaderState implementations now return the struct instead of taking it as an argument.

  • Moved ShaderParameterParser into its own source files.

  • Moved the bulk of SetShaderParameters to ShaderParameterStruct.cpp.

  • Shader reflection handling has been reorganized to funnel through common functions.

  • Moved D3D12RHI::ExecuteCodeWithCopyCommandQueueUsage into ID3D12DynamicRHI::RHIExecuteOnCopyCommandQueue.

  • Cleaned up the DXGI includes in D3D121RHI.

  • D3D12 descriptor heap size checks have been extended to allow for proper binding tier 3 support.

  • Moved Vulkan and OpenGL implementations of ApplyStaticUniformBuffers out of headers to remove header dependency on RHICore.

  • Reworked the parameter rewrite code to support automatic bindless conversion.

  • The Max RHIFeatureLevel is now output to the log on D3D12RHI creation.

  • Cleaned up D3D12 SRV and UAV implementations. Primarily renaming the "Initialize" methods to be more verbose about when they're called in relation to when the view is created. This allows us to identify when a CreateView call is for a newly-allocated descriptor or one that's been around for a while. Stubs added for deferred updates to bindless descriptors, not implemented yet. Unified a few RHI commands in RHICreateShaderResourceView to use a single command. Removed FD3D12ShaderResourceViewWithLocation and FD3D12UnorderedAccessViewWithLocation since they're no longer used.

  • Renamed the ShaderPrint uniform buffer to ShaderPrintData so it no longer collides with ShaderPrint() functions.

  • Switched ERHIFeatureLevel:SM6 from SM6.5 to SM6.6 in order to use the built-in 64-bit atomics.

  • Added TypedUAVLoad support checking for D3D12.

  • Added bNeedsExtraShaderFormats to TargetRules to protect hidden platforms from exposing their DataDrivenPlatformInfo defines to other hidden platforms.

  • D3D12 Mesh shader support will now be checked with all other CheckFeatureSupport calls.

  • Mesh shader support is now validated before creating D3D12 Mesh and Amplification shaders.

  • SetShaderParameters implementations have been cleaned up using a new helper class that loads parameters from passed in binary blobs.

  • DXGI includes have been cleaned up in D3D11RHI.

  • D3D12 Root Signature creation is now unified under a common path.

  • Updated Intel ExtensionsFramework version and added Intel Runtime support for atomic 64.

  • Added proper lifetime management to resources used by FRHICommandD3D12UpdateUniformBuffer

  • Updated the check for aliased textures in FD3D12TextureStats.

  • Launching a game that isn't cooked with any shader formats for the selected RHI now shows an error dialog before fatally quitting.

  • Added GRHISupportsLargerVariableRateShadingSizes to control support of 2x4/4x2/4x4 tile sizes. On D3D12, this maps to D3D12_FEATURE_DATA_D3D12_OPTIONS6::AdditionalShadingRatesSupported.

  • FRHITextureCreateDesc can now be constructed functionally via reference-returning Set functions.

Crash Fix:

  • Fixed a crash with Landscapes when using -rhivalidation. This fix ensures that the RHIBuffer is held for the life of the frame, as not all RHI backends have the Shader Resource View (SRV) to maintain a hard reference to the source buffer.

  • Implemented changes to avoid using the "groupshared bool" on Vulkan, as it has issues on some NVIDIA drivers. This fixes a crash in Vulkan engine tests (and playback of D3D12 captures in RenderDoc).

  • Fixed crashes that occurred when rendering offscreen in D3D12.

Bug Fix:

  • Fixed an assert when booting the QAGame Editor. Needed to use EnumHasAllFlags instead of EnumHasAnyFlags when testing BUF_RayTracingScratch, because it's a compound flag.

  • Fixed a bug with DriverDenyList support for Vulkan where no driver date was invalidating entries.

  • Fixed an issue with ProfileGPU scoping error in D3D12 where it erroneously included async compute scopes in the device GPU profiler stack.

  • In Vulkan, fixed a validation error where a view was created beyond its number of slices when the first slice index was offset.

  • Applied a fix for double signal of GPU fence in DX12 when performing All -> Graphics transition.

  • In Vulkan, allow MOBILE_EMULATION to be defined in VULKAN_PROFILE shaders. This fixes the gizmo not appearing when using Vulkan for Android emulation (alpha channel was not being set correctly for composite pass).

  • In Vulkan, when a slice is specified, create the view for only that slice or layouts will be altered by the render pass for other slices. Fixes bad layouts in Vulkan Mobile Preview.

  • Fixed a validation issue (in CitySample) with 2D copies using 0 as a Z component. This was resolved by adding DebugName to validation layer messages.

  • Fixed Anisotropy EngineTests on Vulkan.

  • Fixed a bug in CheckAllWritten() on Vulkan, and enabled it for graphic pipelines.

  • Fixed Render Dependency Graph culling behavior differences between Clang and Microsoft Visual C++ (MSVC) due to static initialization of shader parameter metadata.

  • Resolved a bug with texture 2D array resource creation.

  • Unified the DataDrivePlatformInfo for VULKAN_SM5 in a common VulkanPC fake platform to prevent settings on different platforms from overwriting one another. Previously they would all fill the same VULKAN_SMS in the FGenericDataDrivenShaderPlatformInfo::Infos array.

  • Fixed validation errors for unfreed resources which caused a loop on shutdown for as long as there were new entries to delete.

  • Added RHICopyTexture unit tests and fixed inconsistencies and bugs in that code.

  • Fixed validation errors on Vulkan where 2D default textures were used for Texture3D parameters.

  • Added BlackArrayDummy to system textures (single black pixel slice-texture array) because Metal requires texture arrays to be bound to texture array parameters.

  • Implemented changes to prevent collisions in the CurrentlyDeleting assert between an RHIThread running FRHIResource::FlushPendingDeletes and workers creating PSOs.

  • Fixed an issue with D3D12 validation errors encountered on the ray tracing indirect buffer. This was solved by duplicating relevant logic from GetResourceDescAndAlignment() into the ray tracing indirect buffer creation path so that D3D12RHI_RESOURCE_FLAG_ALLOW_INDIRECT_BUFFER is included for indirect buffers.

  • Fixed an issue with the SRV array slice not referencing the correct subresource in the Render Dependency Graph.

  • Fixed an issue where dxgi.dll was being freed before it was used.

  • Fixed an issue where view states were being set to the wrong FeatureLevel due to ULocalPlayer::PostInitProperties() creating view states before the UWorld was initialized.

  • RHI-specific arguments are now passed to launched processes as expected.

  • Implemented a workaround fix for the O0 crash in DXC when compiling FPathTracingRG.

  • Fixed issues involving RemoveUniformBuffersFromSource implicitly calling TransformStringIntoCharacterArray.

  • Fixed the missing VRS image state for XSX.

  • The Windows Feature Level checkboxes should now prompt the user to restart.

  • Addressed issues caused by improper handling of multi-plane texture formats.

  • Launching the Editor without selecting feature levels will now fall back to default feature levels as expected.

  • Fixed an issue where shader cooker stats would show incorrect shader format names.

  • Fixed instances where FRHITexture*Desc types were being used incorrectly instead of FRDGTextureDesc types.

Deprecated:

  • Deprecated CopyToResolveTarget method.

  • Deprecate D3D12RHI::ExecuteCodeWithCopyCommandQueueUsage.

  • Deprecated RHICreateTexture2DArray, RHICreateTexture3D, RHICreateTextureCube, and RHICreateTextureCubeArray.

  • Deprecated RHI*CommandList::SetComputeShader and switching to the PSO cache's SetComputePipelineState to move towards ComputerPipelineState as the default binding method.

  • Deprecated all of the Create functions in FRHITextureDesc.

Removed:

  • Removing the majority of D3D12RHI_API uses.

  • Removed the "equality comparison with extraneous parentheses" warning from DXC compiles.

  • Removed the Experimental label from PCD3D_SM6.

  • Removed more uses of GMaxRHIFeatureLevel. Focus started on GenerateMips and AddClearUAVPass.

  • Removed deprecated RHI functions.

  • Removed private RHI header includes.

  • Removed unnecessary dependencies on RHICore and RHI ThirdParty libraries.

  • Removed deprecated EShaderPlatform entries.

  • Removed the long-form create functions and constructors from FRHITextureCreateDesc in favor of the shorter versions.

UnrealLightmass

New:

  • Implemented ‘Lightmass Replace' material expression to work with GPU Lightmass This allows static lighting to be baked with a simpler material, or to tweak the color of indirect lighting through the material graph.

Simulation

Physics

API Change:

  • Exposed proximity tolerance as a parameter.

  • Chaos Immediate Physics which is used by Rigid Body Animation Nodes (RBAN) now creates a straight capsule body when a tapered capsule is requested in ChaosInterface::CreateGeometry. Previously tapered capsules defined in physics assets were just ignored. The new capsule will have a radius equal to the mean of the requested tapered capsule's radii.

  • Removed the console variable p.ChaosCloth.Solver.UseImprovedTimeStepSmoothing since there is no more solver dedicated code for the time step smoothing. A new console variable p.ChaosCloth.UseTimeStepSmoothing, which defaults to 1, has also been added to completely disable time step smoothing if ever desired.

New:

  • Added timestep post-processing in PBD evolution.

  • Added PoissonSolve function.

  • Add a 'skip fraction' to the custom Voronoi fracture tool, to remove a percentage of the 'live' sites.

  • Reduced the size of UPhysicsConstraintTemplate to 1008, so it fits in a smaller FMallocBinned2 pool.

  • Added a normals baking option to Fracture's AutoUV tool.

  • Added a grid distribution option for fracture mesh cut.

  • Added a 'custom' fracture pattern tool to support more user control of Voronoi fractures.

  • For optimization, RBAN memory usage has been reduced.

  • For Cloth, the Delete Cloth Asset button's tooltip has been updated.

  • Reduced memory footprint for triangle mesh implicit object when using LWC.

  • Added the missing Local Damping Coefficient in the SetDamping Blueprint function for Choas Cloth.

  • Added a menu option for the grab/poke interaction distance in the Physics Asset Tool.

  • Unregistered the cloth tick function whenever the owner Skeletal Mesh Component tick is disabled.

  • Changed the Physics Asset Tool simulate key to Alt + I.

  • Added an asset exporter abstract interface, and made it appear from the right click menu of the Clothing window whenever a corresponding modular feature is added.

  • Exposed per-axis constraint drive strengths etc on ConstraintInstance.

  • Updated Rigid Body Animation Nodes (RBAN) tonow optionally add kinematic objects at runtime to represent any Cloth Colliders defined in a parent skeleton. This can be used to improve the behavior of RBAN alternatives to cloth simulation (often used at lower LODs).

  • Added a Checkbox called Use External Cloth Collision on the RBAN node preferences panel to enable the kinematic objects feature.

  • Optimized the generation of geometry collections connection graphs has been.

  • Made the fracture mode interactive selection tool's "keep fraction" option attempt to space out the bones it keeps, rather than choosing completely at random. Gave user control of the random seed.

  • Added leaf and cluster selection tools to Fracture Mode

  • Improved the Children selection tool in Fracture Mode to not deselect nodes with no children.

  • Added project-default convex generation settings to Fracture Mode's project settings.

  • *Updated the Convex tool to include buttons to save and load convex generation settings.

  • We now apply project-default convex generation settings to all new or reset geometry collections.

  • Added an option to skip automatic removal of overlaps between neighboring hulls In the geometry collection convex hull generation settings.

  • New instance of geometry collections will now properly be initialized using the corresponding asset damage threshold array

  • Added AddImpulse and AddRadialImpulse functions to Geometry Collection component.

  • Added support for convex shapes in FBodyInstance GetShortestDistanceToPoint and GetClosestPointAndNormal methods.

  • Query based events now set ItemIndex when the hit component is a geometry collection corresponding to one of its specific parts.

  • Added multiple blueprint function taking this ItemIndex as an input allowing users to apply strain and/or break to specific part of the geometry collection.

  • Updated the CollisionObjectReductionPercentage geometry collection setting to also apply to convex collision, where it previously was restricted to other types of simple collision.

  • Added a flag on RigidBody AnimNode to allow it to use synchronous physics simulation.

  • Renamed CVar to p.RigidBodyNode.DeferredSimulationDefault to reflect that it's the project default, not an override.

  • Added an option to the AutoCluster tool in Fracture Mode to choose number of Voronoi sites as a fraction of total children to cluster, instead of directly specifying the number

  • Added options to the AutoCluster tool to (try to) prevent creating isolated children, by merging such clusters with neighbors, and clusters of all children (by skipping cluster creation in that case).

  • Added the ability for a geometry collection component to opt-out from sleep and/or break removal logic set on the asset.

  • Added a merge-selected-only option to the Fracture Mode TinyGeo tool, and stop selecting all after every merge.

  • Updated Geometry collections to now properly account for static meshes BuildScale parameter when importing geometry.

  • Added support for CCD, linear and angular damping for geometry collections.

  • Added asset-level option to use size specific damage thresholds for geometry collections.

  • Updated a number of the Fracture Mode tools run expensive computations in a background thread, with a regularly-sampled progress/cancel UI. This includes the Fracture tools such as Voronoi, Plane, and Mesh, as well as the AutoUV tool.

  • Added support for Enable Gravity parameter for geometry collections – only accounted for at initialization.

  • Updated the Convex builder to now use a new convex hull generation algorithm.

  • Updated the Geometry Collection Break events to now return the index of the specific piece. This "ItemIndex" can now be used to call blueprint functions targeting specific parts of the geometry collection.

  • Improved remove on max sleep feature for geometry collections to be able to also remove slow moving pieces, allowing for more efficient removal behavior.

  • Partial clusters will now crumble into smaller pieces after a certain time if remove on max sleep is enabled

  • Optimized collision impulse processing for Geometry Collections.

  • Added AddForce, AddRadialForce, and AddTorqueInRadians functions to Geometry Collection component.

  • Added interpolated asynchronous physics support for geometry collections.

  • Updated the p.ChaosCloth.Ispc command to register during static initialization (and in test builds), so it can be changed at startup for automated/unattended testing.

  • Added support for the Start Awake parameter for geometry collections.

  • Added a "Keep Frac" setting to the fracture interactive selection tool, to allow dropping a random fraction of the selection filter.

  • Provided an optimized code path for mostly vertical sweeps )

  • Added particle velocity visualization.

  • Changed the aerodynamic forces visualization colors depending on whether the particles are kinematic or dynamic.

  • Added support for Geometry Collections in Mesh Painting mode.

  • Geometry collection fragments hidden using the Fracture Editor Hide tool will now be excluded from the simulation.

  • Improved Chaos Cloth bending elements to be much more stable and correct, especially when the initial rest shape is not flat.

  • Added the "Buckling" feature in Chaos Cloth (i.e., biphasic materials), which adds "Buckling Stiffness" and "Buckling Ratio".

  • Updated Chaos Cloth bending element will now use its Buckling Stiffness rather than its Bending Stiffness once the cloth has bent beyond the limit set by Buckling Ratio.

  • Added options on geometry collection creation:

    • Ask if the user wants to duplicate input materials to create internal material slots.

    • Ask if the user wants to split the mesh by connected components, creating separate bones for each component.

  • Improved the names and organization of the geometry collection convex hull generation settings.

  • Overlap removal settings are now a separate group

  • Renamed "Can Exceed Fraction" to "Allow Larger Hull Fraction"

  • Renamed "Can Remove Fraction" to "Max Removal Fraction" and moved it to the overlap removal settings group.

  • Renamed the GeoMr' tool to TinyGeo in Fracture Mode.

  • Added a new GeoMrg tool in the 'edit' category which just merges the geometry from selected bones.

  • Added new blueprint functions to apply external and internal strain to specific geometry collection fragments.

  • Updated the Fracture Mode's validation tool into a modal tool with options, so the user can see what it will and won't do. Also added an option for it to remove 'clusters of one.'

  • Added the Chaos Cloth Air Pressure Field (Normal displacement). This adds a new "Pressure" field and map to cloth which is used to model a difference in air pressure on two sides of cloth (e.g., inflatable objects, puffy jackets, pillows).

  • Updated the fracture tools to propagate vertex colors internally on fracture via a smooth solve, so vertex colors are consistent within a fractured mesh.

  • Added standard fracture settings (including random seed to control the cut distribution) back to the Mesh fracture tool, except not Grout and Noise (as these aren't supported).

  • Updated Geometry collection to now caching their local bounds to reduce runtime overhead.

  • Updated Edge and Bending constraint debug drawing colors to be based on their parallel graph coloring. Constraints solved in parallel are the same color. This is largely for developer debugging, so you probably don't need to worry about it, but this is what the color change means!

  • Added the ability to define a timer for fragments ( including clusters) to be removed after a certain amount of time. This adds a new Remove On Break tool in the Fracture Editor that allows to set those parameters per fragment

  • Added several geometry collection blueprint functions to control individual fragments by applying linear and angular velocity as well as getting their initial level in the hierarchy.

  • Updated Existing Self Collisions in Chaos cloth (enabled via "Use Self Collisions") to now take normals into account and have a "Self Collision Friction" coefficient.

  • Updated Self collisions Chaos cloth to be (slightly) faster, especially on hardware with a lot of CPU parallelism. It is still not recommended to use self collisions where speed is critical.

  • Added a new "Use Self Intersections" flag has been added which will fix self intersections that were missed by the existing Self Collisions algorithm. This feature is highly experimental with significant changes and improvements expected in future releases.

  • Added anchored property to anchor a geometry collection fragment which allows it to hold the structure while still being able to be removed unlike setting its initial state to kinematic. This can be set by using the right-click menu in the hierarchy in the Fracture editor outliner.

  • Updated transient / un-Saved properties to work more logically for Geometry Collection data:

    • The ManagedArrayCollection 'Saved' flag controls whether the whole property is saved, rather than just its data.

    • Always save everything when transacting (ignore the Saved flag) Also when loading, remove properties that were not in the map that was loaded from.

    • Stop manually removing some unsaved attributes, as the Saved flag should take care of that instead.

    • Stop loading from the DDC (after already loading from the transaction history) for every undo/redo transaction.

  • Changed the geometry collection 'remove overlaps' fracture convex generation option to support more options -- specifically adding options to only remove overlaps on clusters, or overlaps of clusters with other clusters.

  • Added a Convex OverlapRemovalShrinkPercent variable to the geometry collection convex generation settings, to compute overlap removal on scaled-down convex hulls (without baking that scale into the hull). This gives additional flexibility when overlap removal is removing too much of the collision volumes.

Bug Fix:

  • Fixed hit event not reporting other component or actor when it is a geometry collection component.

  • Fixed crash in fracture mode AutoCluster tool when there are no bones

  • Disable radial fracture position (center, normal) settings when position is controlled by gizmo. Update tooltips to explain why they're disabled.

  • Updated Chaos Cloth to reset the field's outputs to avoid it affecting the cloth once it is no longer active.

  • Restricted the solver field update in Chaos Cloth to the currently active LOD set of particles, thus avoiding unnecessary updates for the inactive LODs.

  • Fixed the Chaos Shared Config ownership that was preventing some Skeletal Mesh assets from being saved once the first/original cloth asset owner had been deleted.

  • Fixed an issue in Chaos Cloth where the collision particles index wasn't reset during an LOD change, and was causing the external collision sources to be re-added multiple times.

  • Geometry Collection: Fixed shape generation not properly using relative size when clustering is on.

  • Fixed the stiffness exponentiation calculations in Chaos Cloth. Prevented a 0 Low or High painted stiffness to be turned into a small stiffness whose effect is still perceivable on all related constraints when values are close to 0 and 1.

  • Fixed issue where adding an element to the size specific array in a geometry collection asset details would sometimes add two.

  • Fixed a crash when FParallelClothTask::GetDesiredThread() was called outside of the game thread.

  • Fixed issue with heightfield depth computation when sample point is outside of the XY bounds of the heightfield.

  • Fixed convex generation to properly remove internal and invalid faces.

  • Updated Fracture Mode to only auto-scroll to bones in the outliner/histogram if they are selected via a single bone selection in the 3D view. This prevents the outliner view from auto-scrolling to the first bone in the list after every click while the user is multi-selecting within the outliner itself.

  • Fixed rotated box-shaped fields that resulted in a smaller area of effect than expected.

  • Fixed non-nanite cached geometry collections not properly updating their bounds in editor when using sequencer.

  • Fixed Geometry Collection's size specific damage threshold calculation to now properly accounting for max cluster level value.

  • Fixed inertia tensor calculation for geometry collection clusters when the original mesh has a world transform with a non zero rotation.

  • Improved performance of proximity detection when fracturing very large meshes, especially for meshes with regular face orientations.

  • Fixed inertia calculation for scaled geometry collection.

  • Deleted geometry collection components are now properly handled by the Chaos-Niagara interface.

  • Fixed complex collision display for spline mesh components.

  • Factorized FMeshBatch spline setup code.

  • Fixed a performance problem that caused the editor to take a very long time to convert a set of large static meshes to geometry collections.

  • Fixed issue where sleeping geometry collections could be unexpectedly woken up by distant fields.

  • Fixed performance bug in fracture mode that could cause a very long processing time on reset of a large geometry collection with many input parts.

  • Fixed an edge case where running sweep queries against dirty elements in the AABBTree could lead to an infinite loop.

  • Fixed issue where kinematically moving geometry collection would have their velocity set to 0 when activated by a field.

  • Chaos Cloth: Fixed the velocity calculations when MaxPhysicsDelta kicks in, preventing the cloth from receiving excessive impulses as the time step gets clamped.

  • Fixed capsule ray-cast sometimes returning false negatives.

  • Fixed off-centered rotations issues for geometry collections when using asynchronous physics or caching.

  • Fixed a crash due to fracture mode outliner being out of sync with geometry after an undo or redo.

  • Fixed Geometry Collection hit proxies rendering incorrectly for triangles referencing a few vertices in each buffer, due to an incorrect offset parameter.

  • Fixed geometry collection hit proxies rendering incorrectly in fracture mode when not actively selecting bones.

  • Fixed smoothed velocities computation that could cause rigid bodies to flip between a sleeping and dynamic state while falling if they add a small force applied to them.

  • Moved smoothed time step operations out of the solver of Chaos Cloth, leveraging the velocity scale to avoid cloth tugging issues. This also allows for more drastic change in time steps without causing the simulation to explode, as when using the slomo command for example.

  • Fixed the fracture mode AutoUV tool to use more appropriate texture types when baking. For example, using linear rather than sRGB mapping when encoding values like distances, curvatures, and normals.

  • Updated the fracture mode brick tool to work correctly with zero grout, rather than forcing the grout to always be non-zero.

  • Fixed Chaos cache manager not working after resetting a cached geometry collection.

  • Fixed the fracture mesh tool creating a very deep hierarchy when applying multiple cuts; it now only adds one level of children for a given fractured bone.

  • Fixed character movement interaction with scaled geometry collections.

  • Fixed bug where a blueprint Chaos collision event would not properly set the OtherComponent property.

  • Fixed the fracture mode AutoUV tool's box projection feature sometimes messing up unrelated UV layers, and generating bad results for isolated triangles.

  • Resolved rare crash when dynamically creating and deleting Chaos vehicles.

  • Fixed Fractures to now be computed in a consistent local space, rather than globally. This makes the noise applied to fracture surfaces not depend on the world-space position of the geometry collection.

  • Fixed fracture mode capturing 'escape' when in PIE and simulate modes, making it difficult to leave the mode.

  • Fixed cook warning related to selection material in geometry collection.

  • Fixed cached geometry collection bounds not being updated properly when scrubbing start time from caches in editor mode, causing them to sometimes be wrongly culled by the rendering system in editor.

  • Fixed crash attempting to retrieve shapes from a body instance that has no actor instance (e.g. welded bodies).

  • Fixed incorrect identification of owned instance shapes in GetSquaredDistanceToBody for welded instances.

  • Enabled mask filters for Chaos collision.

  • Adjusted zero-component scale behavior to always pass a valid scale to avoid creating invalid body instances due to invalid scales

  • Fixed physical material resolve for landscapes with a simple collision mip enabled. Both material assignments and holes should be represented correctly now.

  • Fixed rigid bodies no longer colliding after being constrained with a constraint using "Disable Collision". After the constraint breaks we now update the ignore manager for the bodies in question to re-enable their interaction.

  • Fixed incorrect class filter for default destructible material to allow proper selection and avoid warnings for missing classes.

  • Fixed exports of UShapeComponent templated methods so that the explicit instantiations can be called from external modules.

  • Minor Chaos non-unity build fixes.

  • Added warning for default physics collision handler to catch invalid actor references in pending collision lists.

  • Fixed player collision mode rendering of convex elements which was previously not taking element transforms into account.

  • Fixed use-after-move when building unions of implicit objects.

  • Fixed OnHit event propagation to correctly identify the shape that the collision came from and the component that owns it.

  • Added a memory barrier to TObjectPool to ensure no writes to the head block will reorder beyond grabbing a free item pointer

  • Fixed erroneous deleter being used for derived types of FProxyTimestampBase

  • Fixed physical material mask set operation causing the map array to endlessly expand on repeated calls.

  • Fixed a few control paths that could lead to the dirty grid acceleration in scene queries to get caught inside an infinite loop which was showing up as a write-deadlock on the main thread

  • Fixed disabled constraints never being removed from the constraint graph leading to severe performance degradation after long runtimes. Fixed disabled constraints never being removed from their owning particle joint lists - leading to dangling joint pointers in the particles.

  • Fixed geometry collection/provider asserting that its geometry is of inner types without unwrapping its implicit.

  • Fixed the cast helpers for Chaos geometries only accepting callable objects that return value types.

  • Changed null actor release message from Warning to Verbose as it is a valid code path currently when welding shapes into a body instance of a parent that is set to NoCollision.

  • Fixed a bug that was preventing physics constraint forces from being reported.

  • Hoisted branch evaluation allocations out of AABB inner loops, reduces repeated allocations within a frame when objects move in Chaos scenes.

  • Removed ensure in GetWorldVelocityAtPoint that required the object to be kinematic or dynamic. It is valid to request a velocity from a static object without firing an ensure - the velocity will always be zero in that case.

  • Fixed incorrect access to inner physics materials during update when a material had not yet been created.

  • Re-enabled scene-wide physics collision handler customization.

  • Grouped sibling choice and cost for AABBTree leaf insertion to avoid double cache misses.

  • Refactored nodes to be smaller so more nodes fit in a cache line.

  • Altered node access pattern during FindSibling to avoid repeated indirection through the Node array.

  • Fixed incorrect joint constraint termination leading to memory leaks and dangling joints that slow down the solver.

  • Changed coincident vertex Warning during tri-mesh cleaning to Display. This is a recoverable issue as we just delete those triangles and move on. Display will still message to the user that there are invalid triangles to address.

Deprecated:

  • Deprecated remove on fracture option for Geometry collections - this is now replaced by recently introduced and more flexible remove on break

Volumetric

New:

  • Upgraded Blosc to version 1.21.0

  • Added support for OpenVDB and Blosc on Mac and Linux in addition to Windows.

UI

New:

  • Added new LLM subtags for UI and increased UI LLM coverage.

  • Added a Blueprint-callable setter for bHideInputAction on CommonButtonBase.

Slate

API Change:

  • As the FTextBlockStyle is now embedded in the FEditableTextBoxStyle, it cannot be initialized the exact same way. If you need, you can now configure the FTextBlockStyle of an FEditableTextBoxStyle by calling SetTextStyle on it.

New:

  • Added InitialSortMode attribute to FColumn and STableColumnHeader. InitialSortMode will default to EColumnSortMode::Ascending as before.

  • Added icons for C++ widget classes.

  • Previously, UMG MultilineEditableTextBox contained both a Font with an EditableTextBoxStyle, and another Font with a TextBlockStyle. This was error-prone as it was not clear which one was supposed to be modified. To solve this duplication issue, the Font from the EditableTextBoxStyle has been removed, and the TextBlockStyle has been moved from the MultilineEditableTextBox to the EditableTextBoxStyle.

  • Added general support for external per-mode widgets to be displayed by UMG editor. This improves UMG editor extensibility.

Crash Fix:

  • Fixed a crash that would occur when capturing callstacks using Slate Insights in editor.

Bug Fix:

  • Fixed an issue where FDirectoryPath properties failed to disable the path selection button when the property is disabled.

  • Fixed the checkbox style on editor utility widgets.

  • Addressed an issue where zero-sized scissor rects were not culled.

  • Fixed an issue where the mouse was not properly locked to the game window.

  • Fixed several issues with Slate line and spline rendering.

  • Addressed an issue where SDockTab::OnTabClosed would not fire when the tabs were removed.

  • Fixed an issue causing slider and text selections to be offset when displaying in non-standard viewport resolutions.

  • Fixed the order of parameters in KeyEvent.

UMG

New:

  • Keyboard input type overrides are now available for Spinbox

  • Added an option to make moved widgets only invalidate the SWorldWidgetScreenLayer if they are visible.

  • Added list reordering to widget animations.

  • Added DrawSpline to Widget Blueprint library.

  • Added a size overlay for the currently selected widget to the UMG editor.

  • Exported FCommonAnalogCursor from the CommonUI module.

Crash Fix:

  • Fixed a potential crash that would occur in UCommonButtonBase::RefreshDimensions when the preview widget is rebuilt.

  • Added guards against CommonUI action router not existing on game shutdown.

Bug Fix:

  • Safeguards have been added to prevent null entries from being added to a ListView with SetListItems

  • Setting a Margin variable in a parent blueprint now correctly updates child blueprint variables as well.

  • Fixed a bug that caused the cursor to disappear while using PIE with CommonUI.

  • Fixed widget references not updating in UMG Designer on compile.

  • Fixed issues preventing zoom from functioning well at small sizes in UMG Editor.

  • Fixed rounded box outlines when using default CommonUI style with full transparency.

  • Added missing broadcasts in CommonLazyImage and CommonLazyWidget.

  • Fixed editable text box default focused color black.

  • Editable texts will now react instantaneously to any change to the font settings done in the UMG designer. Previously it was necessary to force a refresh.

Virtual Production

New:

  • You can now predetermine the number of frames to capture when using MediaCapture.

  • Multi-User: Added an option/cvar for closing Sequencer when a sequence is closed by a remote user.

  • DMXFixtures: Fixed visibility logic on all light fixtures to make sure it's responsive.

  • Extended INetworkMessagingExtension to support network monitoring. Subscribers can provide bytes lost, bytes received, and bytes sent that can be displayed in a Multi-User Server session.

  • Changed the default console variable values for Concert.EnableOpenRemoteSequencer and for Concert.EnableSequencerPlaybackSync to be true.

  • Improved handling of World Partition levels in a Multi-User session.

  • Added a delegate to the IConcertClientWorkspace class to indicate that a workspace has been synced and finalized.

  • Added the LiveLinkFaceImporter plugin to the Unreal Editor source. Previously this plugin was only available on the marketplace.

  • Added a setting to control the size of the work send queue for Multi-User. Sessions with a large number of transactions and clients that join late may cause this queue to fill up and never recover.

  • Fixed incorrect values sent over Multi-User when using the Console Variable Editor.

  • VP Roles improvements:

    • Moved roles to a menu in the level editor toolbar.

    • Mde it easier to select/remove roles.

    • Added roles subsystem to provide a basic Blueprint API.

  • Added modifier key to increment/decrement timed data monitor offset by 10 and 0.1. By default, the Shift key will increment/decrement by 0.1, and the Control key will increment/decrement by 10.

  • Changed VirtualCamera plugin to Runtime.

  • Added a function to VCam Modifiers that allows them to access their associated name in the modifier stack.

  • Added an intermediate dialogue when creating VCam related Blueprints to prompt for an optional InputActionContext. This dialogue is used when creating VCam Modifiers or VCam Widgets.

  • Changed Right Click Asset Creation Menu to "VCam" from "Virtual Camera".

  • Exposed ILiveLinkClient::GetSourceType to Blueprints. Name changed to GetSourceTypeFromGuid to avoid conflict with existing GetSourceType function using a Source Handle.

Bug Fix:

  • Added additional precautions to deal with "slightly off" blocked ranges being set to control "blocked synced" playback.

  • Improved the TCPMessaging retry on connection failure mechanic.

  • Fixed blocked/synced playback timeouts with enabled audio playback on player setup. Syncing was disabled.

  • DMXFixtures now checks if a DMX component is valid before reading it to avoid warnings in Blueprints.

    • Added support for camera Field of View in beam shader.

    • Fixed division by zero in zoom component.

  • Trashed VCam components are now properly disabled when they are replaced in the Editor (usually via rerun construction scripts).

  • Made LiveLink an explicit requirement of the VirtualCamera plugin.

  • VCamComponent no longer tries to access the Live Link Client during cook.

  • Fixed an issue where VCam Modifier Names were resetting when changing modifier properties in the Details panel.

Deprecated:

  • DMXFixtures - Deprecated MinQuality and MaxQuality UProperties. Now using BeamQuality and ZoomQuality.

IO

API Change:

  • CaptureSceneViewportImpl and CaptureRenderTargetImpl have been deprecated and replaced with InitializeCapture called for any type of capture and specific post initialize methods for each type of capture like PostInitializeCaptureViewport.

New:

  • Added an importer for ulens files. This makes it possible to associate a LensFile asset with a file on disk, so it can be reimported as well.

  • OpenEXR: Upgraded OpenEXR to version 3.1.5.

  • Updated MediaCapture to use RDG, and added structured buffer output support to media capture.

  • Added immediate rhi resource capture mode to MediaCapture.

  • Added support for UAV output configuration from media converter in media texture.

  • The Live Link API now allows deriving from LiveLinkProvider and MessageBusSource classes.

  • Added autodetection for Blackmagic genlock format.

  • Aja input format input is now autodetected by default.

  • Added automatic exporting of data collected during camera calibration to disk.

    • Added support for importing camera calibration datasets.

  • Added "Depth of Field Supported" flag to the LiveLink Camera Role to allow a LiveLink Source to enable/disable depth of field (Focus Override) on a Camera Component.

  • Media capture now automatically reopens media capture when media output is modified.

  • Added option to enable linear conversion when doing a media capture.

  • Added control key modifier to timed data buffer visualizer to zoom faster.

  • Added format autodetection for Aja timecode.

  • Added format autodetection for Aja Timecode Provider.

  • Added Aja GPU direct support for input. Enabled by the console variable MediaIO.EnableGPUDirectInput.

  • Renamed "Lens Distortion Component" to "Lens Component".

    • Fixed a bug to guarantee that a camera recorded with Take Recorder would have nodal offset baked into its recorded transform.

    • Added "Evaluation Mode" option to Lens Component to choose where the Focus and Zoom values used to evaluate a Lens File come from.

  • Added media playback buttons to the simulcam viewport to support pausing and seeking a file media source used for camera calibration.

  • Added ability for each controller in the LiveLink component to potentially control a different component.

  • Added "Distortion Source" setting to Lens Component, with options to use a Lens File, a LiveLink Lens subject, or to manually drive the distortion state.

    • Added "Filmback Override" setting to Lens Component, with options to use the filmback specified in a Lens File or a user-specified "Cropped Filmback".

    • Changed the Composure CG Layer setting to choose a Lens Component instead of a Distortion Source.

    • Deprecated Lens Distortion Handler Picker structure.

    • Deprecated methods for querying for a Lens Distortion Handler from the Camera Calibration Subsystem.

  • Added a new track recorder to Take Recorder to support recording distortion state from a Lens Component and applying distortion to a camera on playback of a level sequence.

  • Timed Data Monitor Improvements:

    • Put channels in alphabetical order in buffer visualizer.

    • Added buttons to increment/decrement frame offset and time evaluation offset.

    • Added dropdown to select evaluation offset type (frame vs seconds).

    • Fixed style not being registered resulting in white texture.

    • Added indicator in frame time to display when you are over your frame budget.

  • Added console command to reinitialize timecode and genlock. Commands are TimecodeProvider.Reset and CustomTimeStep.Reset.

    • Added support for Rivermax 2110 video streaming for input as a MediaSource.

    • Added support for Rivermax 2110 video streaming for output as a MediaOutput.

Bug Fix:

  • LensFile image dimensions are now saved on the asset itself.

  • Fixed IsChildOf called on nullptr in RemoteControl.

  • Fixed crash when adding LiveLink component.

  • Fixed a crash that happened when using file media capture with resolution that needs padding.

    • Fixed float FileMedia output expected stride.

  • Fixed crash caused by Media IO player not clearing itself from the timed data monitor system.

  • Fixed LiveLinkLightController not setting the LightComponent's "Use Temperature".

  • Fixed lens file import doing wrong coordinate conversion (unreal to opencv instead of the opposite).

  • Fixed Remote Control preset transactions being ignored by Multi-User.

  • Fixed NDisplay config "rebind all" not working if generated for a different config (Viewport properties excluded). Added context menu for rebinding viewport properties.

  • Fixed audio crashing when outputting audio with Blackmagic on Linux.

  • Fixed nDisplay exposed properties on viewports not being able to be rebound. Fixed some nDsplay properties changing to <multiple values> after being changed in the preset.

  • Fixed Blueprint event not being callable with raw Remote Control API.

  • In the Remote Control panel, exposing/unexposing now properly generates transactions in the undo history.

  • Fixed Aja media capture outputting a still image after unexpected engine closes.

  • Fixed Remote Control unexpose not working on nDisplay viewport properties.

  • Fixed desync between the Remote Control web interface and Unreal Engine when entering or exiting a Multi-User session.

nDisplay

New:

  • nDisplay: Added support for the resize tool in the OutputMapping UI to lock the aspect ratio when being dragged by holding shift.

Rendering

New:

  • Added OpenColorIO support for selecting displays and views when available in the configuration file.

Improvement:

  • Added OpenColorIO plugin Blueprint function to activate color transforms in game mode, called "Create In-Game OpenColorIO Display Extension".

  • Added 32-bit float lookup table texture support in OpenColorIO for improved precision, exposed as a plugin setting.

  • OpenColorIO plugin now uses v2.1's new GPU processor, while maintaining legacy support via a plugin setting.

Bug Fix:

  • OpenColorIO source and destination color space conversion settings are now correctly reset if no longer available in the configuration.

  • Fixed OpenColorIO crashing on Mac when using Lumen overview viewports.

  • Improvement: Migrated OpenColorIO viewport settings from EditorPerProjectUserSettings.ini config to plugin-specific OpenColorIO.ini file.

  • Fixed mismatch in Composure between preview window and viewport: the tone curve is now consistently disabled by default, with option to re-enable.

  • Fixed media texture trilinear sampling with new style output.

Tools

New:

  • Added the first version of the Render Grid plugin (still in heavy development), which allows you to render several variations (different materials, colors, etc) of the same level sequence with ease.

  • Switchboard: Added a "Vulkan" option to the nDisplay "Render Mode" setting.

  • SwitchboardEditor: The Switchboard toolbar button is no longer automatically hidden after desktop shortcuts have been created.

  • Sequencer Playlists: Added support for opening multiple Playlist assets simultaneously. Double-clicking Playlist assets in the Content Browser will now spawn new Playlists editor tabs.

  • Virtual Scouting: Added a new "Virtual Scouting" plugin, which contains code required for OpenXR compatibility. For now, the "Virtual Production Utilities" plugin is also still required to use Virtual Scouting.

  • Virtual Scouting: GetHMDDeviceType is now shimmed for backward compatibility when using the OpenXR plugin, instead returning the name of the deprecated VR plugin which corresponds to the active OpenXR interaction profile.

  • Virtual Scouting: Added a "Game View" toggle to the Virtual Scouting settings panel, and added an "Enter VR Mode" Blueprint function to the VPScoutingSubsystem.

  • Switchboard: Added a setting to allow finding levels that are inside plugins.

  • Virtual Scouting: You can now use the OpenXR aim pose for the laser origin when applicable, rather than the grip pose. We have added a socket named "OpenXrGrip" to the Virtual Scouting Oculus controller mesh (SM_Controller_RiftS), adjusted to coincide roughly with the OpenXR grip pose. For any mesh where this socket is present, the interactor mesh relative transform is adjusted to treat the socket as the mesh origin. This allows us to preserve the original mesh origin for compatibility with the deprecated Oculus VR plugin and its differing motion controller pose.

  • VR Editor: Changed UIBrightness upper bound property annotation from ClampMax to UIMax, in order to permit values >10.0 to be typed in.

  • Switchboard: Added support for hostnames in addition to IP addresses. Address-type settings fields will now attempt name resolution on the entered value, with highlighting to indicate the lookup status (yellow = pending, red = failed).

  • Added support to join all interfaces on multicast address when 0.0.0.0 is used for UDP unicast.

  • Enhanced Switchboard tool to allow users to save configurations outside of the main config folder.

  • RemoteControlWebInterface: Added dedicated view for Virtual Production FX, Color Correction & Light Card control.

  • Added SwitchboardListener and Multi-User Server as build steps in UnrealGameSync.

  • Added an option to the Multi-User persist dialog to allow users to make a file writable if source control is not enabled.

  • RemoteControlWebInterface: Added support for Controllers.

  • Enabled ShotGrid plugin for Linux.

  • Added Shader and Asset Loading status column to the Stage Monitor tool.

  • The VPBookmark Actor used by both Virtual Camera and Virtual Scouting has been nativized.

  • Added CineCameraComponent in VPBookmarkActor in order to save camera parameters on the bookmark

  • Added the function InjectInputForAction to the VCamComponent that will inject the input to whichever input system the component is currently using.

  • Added SetActorLabel function in the VCamBP function library that will be accessible from VCam modifiers and widgets.

  • Implemented GetWorld function in VCamModifier class that will expose Actor related functions for VCam modifiers.

  • Enhanced Input has been enabled in the VRTool and VirtualScoutingInteractor classes to support future development of VR in Editor toolsets.

  • All materials associated with the Virtual Scouting tools have been modified to ignore pre-exposure. They can now be used in scenes with physically accurate lighting values and remain visible regardless of lighting ratios or exposure level.

  • The Viewfinder tool now uses the CineCameraComponent filmback size and crop settings to define screen size and render target dimensions.

    • Viewfinder and Viewfinder_v02 now display focal length from the focal length variable on the CinecameraComponent rather than the lens preset name to support arbitrarily named lenses.

  • Take Recorder's "Review Last Take" now considers Multi-User setups where multiple takes may have been recorded.

  • VPCineCamera SceneCapture2Dcomponent no longer captures every frame, saving performance in VR Scouting sessions with multiple VPCineCameras spawned in.

  • UDP Messaging will now detect when a message cannot be properly routed and mark the endpoint as unreachable. This prevents the UDP Messaging module from initiating auto-repair, which would force the entire connection to be rebuilt.

Bug Fix:

  • Virtual Scouting no longer logs an error and refuses to launch if r.PostProcessing.PropagateAlpha is not set to 0, which otherwise led to the rendered image displaying all black in the HMD.

  • SwitchboardListener: Fix for building with bForceEnableExceptions ("error C2712: cannot use __try in functions that require object unwinding").

  • Sequencer Playlists: Fixed a potential crash when specifying out-of-bounds start/end frame offset values.

  • SwitchboardListener: Fixed expansion of %TEMP% in file destination paths on non-Windows platforms. This was causing a crash attempting to launch nDisplay devices running on Linux.

  • Switchboard: Fixed unhandled exceptions during creation of a new Switchboard configuration when attempting to invoke wmic to populate guesses for project/engine paths.

  • Switchboard now uses Build.bat/Build.sh instead of invoking UnrealBuildTool.exe directly, which ensures that the environment is set correctly.

  • Sequencer Playlists: Fixed an issue where hold sections could display the wrong frame for certain sequences.

  • For RemoteCotnrolWebInterface, there's no need to install NodeJS anymore. Plugins download required nodejs binary.

  • Virtual Scouting - the Sequencer tool now opens the first available level sequence Actor.

Upgrade Notes

Animation

Rigging

Upgrade Notes:

  • Hide Transform and TransformNoScale as available control types in Control Rig. Controls of Type Transform and TransformNoScale will continue to work — but users cannot create new controls of those types through the UI.

  • The Update event is now called Forwards Solve and the Inverseevent is now referred to as Backwards Solve in Control Rig.

  • Spherical Pose Reader can now be mirrored. Inner/outer falloff regions are independent. Added debug drawing of coordinate axes.

    • Node should behave as before, though you may find the inner/outer regions are tuned slightly differently after upgrading.

Sequencer

Upgrade Notes:

  • Root instance handles are now type-enforced in Sequencer.

    • This prevents passing an FInstanceHandle to something that specifically wants a root instance handle.

    • FRootInstanceHandle is implicitly castable to an FInstanceHandle, but not visa-versa.

    • Some forward-facing APIs that deal with root instance handles have been changed to use FRootInstanceHandle over FInstanceHandle.

Editor

Upgrade Notes:

  • Upgraded the remote_execution.py script in the PythonScriptPlugin. Changes are backwards compatible. No changes to previous code that utilizes remote_execution.py is necessary. Changes include:

    • Added macOS support and fixed problems with command socket not being able to start in Unreal.

    • Added Python 3.9 support.

  • Updated hair strands to support Alembic groom_group_cards_id for hair card generation.

    • In order to use the new Alembic schema field 'groom_group_cards_id', any relevant groom assets with this field must be re-imported.

Foundation

Core

API Change:

  • FAssetBundleData now only stores the paths of top level assets to save space, though it can still be populated by TSoftObjectPtr properties tagged with the appropriate metadata.

  • FSoftObjectPath and FTopLevelAssetPath should be able to replace FNames that referenced object paths in most cases without problems, however they are restricted to storing strings which have the correct form (for example, they start with a '/', they do not contain adjacent subobject delimiters, and so on).

Upgrade Notes:

  • FSoftObjectPath should be used to contain the paths of objects that may exist at any depth in an object hierarchy, such as /Path/To/Map.Map:PersistenLevel.Actor.Component.

    • It stores the first two components (the package name and top level asset name) as FNames and the rest of the path as an FString.

    • FTopLevelAssetPath should be used to contain the paths of objects which always have a package as their direct outer, such as /Path/To/Package.AssetName.

    • FAssetData::ObjectPath is deprecated, FAssetData::GetSoftObjectPath or GetObjectPathString should be used instead.

Dev Tools

Upgrade Notes:

  • Updated common memory reporting commands to properly use -csv output and added parsable delimiting to MemReport output.

  • Fixed audiomemreport command to properly redirect to a different OutputDevice (removed -skipcsvforaudio, added -log).

  • Any tools that parse the output of affected memory profiling commands like "obj list" or "listtesxtures" may need adjusted to respect the new formatting. These outputs should now use more standard csv formatting that doesn't include leading or trailing white spaces in cells. MemReport files now include "Begin/End command" notations for each section.

Framework

Upgrade Notes:

  • Large world support (~88 million km wide) is enabled for all worlds.

    • If your project relies on the 22km UE4 WORLD_MAX you may revert to that version by building with UE_USE_UE4_WORLD_MAX=1.

    • Alternatively project code can be updated to use UE_OLD_WORLD_MAX and equivalents as appropriate. Refer to EngineDefines.h for the complete list of OLD (UE4), LARGE (UE5), and HUGE_DISTANCE (precision limits) defines.

    • AWorldSettings::bEnableLargeWorlds was deprecated as part of this change. Test projects that previously relied on this toggle will continue to function and will now apply world bounds restrictions to actors further than ~44 million km from the origin. You may use AWorldSettings::bEnableWorldBoundsChecks to alter this behavior.

Gameplay

Upgrade Notes:

  • Enabled the Enhanced Input plugin by default.

    • Upon project startup, if you have not customized your UPlayerInput or UInputComponent classes in your project, they will automatically be set to the new Enhanced Input versions.

    • You can disable the automatic upgrade path by setting the console variable "EnhancedInput.bEnableAutoUpgrade" to false if desired.

    • Enhanced Input is fully backwards compatible with the old input system, so you can make your UPlayerInput and UInputComponent's based on the Enhanced Input equivalents and all old Action and Axis mappings will still work. This provides a solid upgrade path where you can upgrade your input code at your own pace, or just keep it and start using Enhanced Input for new features.

Level Design and Art Tools

Geometry Core

API Change:

  • Use volatile for INEXACT to force rounding.

Geometry Script

API Change:

  • Added an AggGeom to the dynamic mesh component to support the addition of the Async Physics build for Dynamic Mesh component. Collision update functions should update instead of the one on the current BodySetup. This ensures new collision changes are not overwritten by an async build replacing the BodySetup.

Upgrade Notes:

  • Update the CopyMeshToStaticMesh and CreateStaticMeshAsset Geometry scripting functions to use the standard engine FMeshNaniteSettings data structure to define Nanite settings instead of the previous custom structures/fields.

    • This is a breaking change, Blueprints that use the now-deprecated properties will need to be manually updated.

    • The previous NaniteProxyTrianglePercent values can be converted to the FMeshNaniteSettings Fallback Percent field by dividing the value by 100.

Modeling Tools

API Change:

  • This adjustment is designed to support tools where the selection type before the tool is activated is not compatible with the tool's function and requires conversion (for example vertices to triangles). The old behavior was also partially broken, where attempts to call a mode change on an inactive selection mechanic would result in the mode being changed transparently, but with no other processing taken, such as converting the active selection or sending undo changes.

Platform

Upgrade Notes:

  • Added a native async save API.

    • Any save game operations that are currently nested in AsyncTask calls or similar can be moved to use the new async save game API.

Mobile

Upgrade Notes:

  • Fixed issue where shader pipeline cache files could be incorrectly trimmed from the pak directory list.

Online

API Change:

  • AVEncoder no longer stores a width and height. These properties have been moved to the FVideoEncoderInput. This input is now the source of truth and both AMF and NVENC will adapt their resolution to the input resolution

  • Moved ECodec to public so the module can expose a method to select what codec the user would like to use.

  • Modified packaging of a PixelStreaming project so that ps-infra files are placed in a nicer location.

  • Renamed the encoders and their corresponding factories to better describe their purpose.

Upgrade Notes:

  • Fixed PixelStreamingAudioComponent that had delayed audio.

  • Fixed audio bitrate from Unreal Engine to browser that was set to a low default causing compressed audio quality in stream. The new default is now Opus maximum value of 510kb/s.

  • Fixed the Selective Forwarding Unit (SFU) not being added to the Pixel Streaming samples folder for a packaged project.

  • Fixed default max bitrate not being high enough to support 4k.

  • Fixed reconnections not autoplaying in the browser.

  • Refactored Pixel Streaming start-up logic to be a more uniform code path.

  • Refactored Pixel Streaming URL to use settings function like PixelStreamingIP and Port.

  • Fixed backwards compatibility break where offers from players would not result in a connection.

  • Fixed a deadlock scenario that could be triggered with rapid peer connects/disconnects.

  • Fixed a crash in WebRTC caused by not removing the audio sink when a peer disconnects.

  • Fixed streams being capped at 30fps by default.

  • Fixed incorrect WebRTC headers being included in the public header.

  • Frames now flow through a much more rigid set of operations to get streamed.

  • Video Sources have a Video Adapter and are fed by a Video Input.

  • Video Adapters are fed by the input and contain a number of Processes.

  • Processes take the input frame and adapt it to a format that the encoder can use.

  • Frame Buffers now contain a reference to the adapter, frame data is grabbed from here as needed by the encoder.

  • Adapters and their processes are public with the intention that users can implement their own adapt step for other encoders.

  • Streamer is now modular so we can have multiple streamers with their own inputs that stream to their own location.

  • Extracted out the copy texture into a rendering util and tweaked how it handles transitions.

  • Modify PixelStreamingModule to use new functions for creating a streamer.

  • Added optional codepaths to use WebRTC M96 or M84.

  • Refactored plugin to enable using our API for the new Pixel Streaming Player plugin.

  • Created a new PixelStreamingPeerConnection class to wrap the webrtc peer connection with specific pixel streaming behavior.

  • Made the signaling server connection public and renamed its observer methods so it is obvious when they are implemented.

  • Some small changes to frame buffers to make handling of cached data slightly safer.

  • Made use of lambdas more explicit where possible.

  • Remove unnecessary warning message from PixelStreamingAudioComponent.

Rendering

Architecture

Upgrade Notes:

  • Default to writing velocity in base pass instead of in depth pass. This is because we do not currently support nanite WPO with depth pass velocity (work to fix this is ongoing). To avoid any confusion or problems for licensees who are trying out the new nanite WPO, we default to this setting that works everywhere.

    • Licensees can locally set depth pass velocity if they are not using nanite WPO and want the potential performance improvement.

Postprocessing

Upgrade Notes:

  • Pixel shader animations no longer ghost.

  • Translucencies no longer ghost.

  • VFX no longer ghost.

Simulation

Physics

Upgrade Notes:

  • Geometry collection now allows import of collision from the static meshes they are generated from.

    • Existing geometry collection assets will need to be reset in the Fracture Editor to allow this feature to work.

    • Then the "Import Collision From Source" checkbox then needs to be checked to allow using them.

    • A "Collision" column mode in the Fracture Editor outliner has been added that will display if collisions are used, or are available or not.

  • Fracture Editor outliner can now display run-time damage information, including maximum damage, current threshold and if the piece broke or not.

    • In order to enable this feature, the component needs to have "Enable Run Time Data Collection" enabled.

    • Then, in the Fracture Editor, simply run the simulation then pause or stop and then refresh the Fracture Editor outliner in "Damage" column mode.

  • Size specific damage thresholds generation has been improved for geometry collections where bones can get assigned more predictable thresholds from the settings.

    • Existing assets will use the cluster only computability mode and will need to uncheck the "Per Cluster Only Damage Threshold" check box.

  • Added new interface to ChaosWheeledVehicleMovementComponent which enabled direct control over the drive and braking torque per wheel.

    • The new blueprint compatible functions are SetDriveTorque and SetBrakeTorque. They take two parameters, Torque specified in Newton Meters and a wheel index. The wheel index matches the wheel array in the wheeled vehicle movement component.

    • This has a few modes of operation allowing you to add to or completely override the torque at each wheel.

    • The new property ExternalTorqueCombineMethod on the wheel class ChaosVehicleWheel, has three states:

      • None [the default] - No external torque will be applied to the simulation when you call the above set torque functions.

      • Override - The external torque provided by the set torque functions will be used and any internal calculations for engine/ brakes will be ignored.

      • Additive - The external torque provided by the set torque functions will be added to any internal calculations from engine/ brakes.

    • This mode can also be changed at runtime via the blueprint compatible function SetTorqueCombineMethod.This is also defined per wheel.

    • There is no change to current behavior, the new feature is enabled by setting a new property (ExternalTorqueCombineMethod) which is defaulted to off.

  • Added brake and shock damage propagation options to geometry collection component (enabled by default). This allows finer tuning and more realistic breaks.

    • No upgrade needed, older assets will keep it disabled, only new assets will have it enabled by default.

  • In the Chaos Vehicle Plugin it was noted that the wheel forces were being applied to high up and not at the road surface.

    • Rectifying this means vehicle handling will change dramatically, likely requiring a lowering of the center of mass by approximately the wheel radius to get the same result.

    • To alleviate this issue a new property (bLegacyWheelFrictionPosition) has been added to retain the old behavior. This will automatically be enabled on any existing vehicles but will default to false on any new vehicles that are created.

    • To ensure all your vehicles are consistent on existing projects, ensure bLegacyWheelFrictionPosition property is enabled on the ChaosWheeledVehicleMovementComponent.

New:

  • Added a new connection graph method for geometry collection that filters overreaching connections by testing for bounds overlaps.

    • Because this method produces better quality connection graphs, it is recommended to use it when possible.

  • Added crumbling event for geometry collections that triggers whenever a cluster crumbling related function is called.

    • Crumbling event will only fire if Notify Crumbling is enabled on the corresponding geometry collection component.

UI

Upgrade Notes:

  • Added BP_OnPressed and BP_OnReleased blueprint-implementable events to CommonButtonBase of CommonUI for better control over visual states and animations.

UMG

New:

  • Calling Stop Animation is now an asynchronous operation.

    • This is currently enabled by default, but controllable through the UMG.AsyncAnimationControlFlow cvar (false disables this new flow).

    • When an animation would usually be ticked by the animation tick manager, it now schedules an update on Stop, and queues a latent action to finish stopping before it completes the operation.

    • Content that specifically relies upon Stop Animation being a synchronous call (that is, it relies upon animated values being immediately realized after Stop Animation has been called) should either disable UMG.AsyncAnimationControlFlow, or rework the content to respond to an OnAnimationStopped event (the latter being more preferable).