Unreal Engine 4.26 Release Notes

Overview of new and updated features in Unreal Engine 4.26

Choose your operating system:




What's New

With the release of Unreal Engine 4.26, you can create environments, characters, and creatures of unparalleled realism and design your entire production pipeline around Unreal Engine.

The production-ready Hair, Fur, and Feathers system enables you to design the most believable humans and animals. You can use the Volumetric Cloud component along with the Sky Atmosphere and Sky Light to author and render realistic or stylized skies, clouds, and other atmospheric effects with full artistic freedom. The new Water System makes it possible to create believable bodies of water within your landscape terrains that react with your characters, vehicles, and weapons. With an improved and expanded feature set, Chaos physics now lets you simulate Vehicles, Cloth, and Ragdolls in addition to Rigid Bodies so every aspect of the environment comes to life.

Sequencer now works in conjunction with Control Rig and the new full-body IK solution to create new animations inside of Sequencer, reducing the need to use external tools. Movie Render Queue (formerly known as High Quality Media Export) has been enhanced to support render passes enabling further enhancements to be made to the final image in a downstream compositing application. nDisplay multi-display rendering is easier to set up and configure in addition to enabling more pixels to be rendered at a higher frame rate, thus increasing performance and supporting larger LED volumes with existing hardware. The Collaborative Viewer Template has been significantly improved to enhance the collaborative design review experience, and enable more users to join a session. The Remote Control API has been improved to seamlessly connect properties and functionality in Unreal Editor to UI widgets giving users the ability to quickly change properties from an external device, such as an artist on stage changing the sky rotation or the sun position from an iPad.

This release includes improvements submitted by the incredible community of Unreal Engine developers on GitHub! Thanks to each of these contributors to Unreal Engine 4.26: adamnv, Aintaer, aknarts, Antonrr, bitdewy, blakeanator, broly, ckendal3,codeslicer0,D3adKnight,dd-sbinet, DecoyRS, dogles, doublebuffered, drichardson, erebuswolf, eugene-rho, geordiemhall, gmpreussner, gunsungithub, HafdisE, hgamiel, HSeo, iwlasny, jackknobel,jessicafalk, jgilbert-ca, jiahuah-owi, JorgeQuesada, jpark37,kristjanvalur, KristofMorva, LizardThief, lolmx, Magic Leap, Mattiwatti, mengran3275188,MichaelBell, Microsoft, moppius, muchcharles, muchcharles, nklose, Oculus, projectgheist,RPG3D, SertacOgan,Skylonxe, smallshake, stephan-nordnes-eriksen, The Coalition,tommybear, valval88, Vawx, vsolobay, yaakuro,Zeblote, zompi2

Major Features

Hair, Fur, and Feathers Ready for Production

With this release, we're excited to announce that the hair rendering system is ready for production! Over the last several releases, we've continued to improve hair rendering with visual improvements that are both performant and scalable across mid to high-end devices, and that supports a wider range of features across Unreal Engine.

image alt text

Groom Asset Editor

The new Groom Asset Editor replaces the properties editor with a fully-featured editor where you can manage and edit your imported grooms with visual representation in its own viewport.

Within the Groom Asset Editor, you'll be able to:

  • Make fine adjustments to your grooms for interpolation, strand look and length, physics and more

  • Use in-editor tools to generate and set up levels of detail (LOD) for strands, cards, and meshes

  • Manage your materials for various hair representations

For more information, see our Hair Rendering and Groom Asset Editor documentation.

Sky, Cloud, and Environment Lighting

This release is the culmination of work to bring dynamic time-of-day lighting for large worlds from sky, atmosphere, and cloud systems. We've also added a unified window to create and edit these environment and lighting components in a single place.

Volumetric Clouds

We've added a new cloud rendering system for large scale cloudscapes and atmospheric fog that offers a fully dynamic, material-driven workflow for cloud creation with scalable quality across console and desktop platforms. The system supports cinematic quality for film and television productions.

The material-driven workflow provides an artist-friendly approach using volume textures to create any number of cloud types and variations from billowing clouds extending into the atmosphere, a dreary overcast day, or even a cyclone that can be combined with weather effects you create.

image alt text

The cloud system fully integrates and supports interactions with environment lighting from sky atmosphere, sky light, and two directional lights (representing the sun and moon). Get started using the cloud system by dragging a Volumetric Cloud component into your scene and assigning a material with a volume texture to it. You can find an example cloud material already set up for you to start with in the Engine Content folder under Engine/EngineSky/VolumetricClouds/m_SimpleVolumetricCloud.

For more information, see the Volumetric Clouds documentation.

Sky Atmosphere Component Improvements

The Sky Atmosphere component sees several new and improved features this release that make it easier to use and scale quality across your projects.

image alt text

  • Sky can now receive shadows from opaque meshes and volumetric clouds.

    • Enable Cast Shadows on Atmosphere and Cast Cloud Shadows on a Directional Light to support atmosphere shadowing.

    • Control the strength of shadows with Cloud Shadow Strength and Cloud Shadow on Atmosphere Strength.

    • Opaque shadow distance, depth bias, and scalable shadow map resolution can be controlled by setting a decent shadow map resolution and extent to cover the world and achieve reasonable performance.

    • Clouds also occlude atmosphere multiple scattering below them. This sort of ambient occlusion is important for creating dark, menacing storms.

  • Improved scalability using a slider for the sample count used to trace the atmosphere.

    • Enabling volumetric shadows from opaque meshes or clouds requires more samples when tracing the atmosphere in order to make sure all the volumetric shadow details are captured. The sampling quality is now adjustable on the Sky Atmosphere component.

    • For cinematics, you can achieve higher quality results by increasing the sample count cap using the console variable r.SkyAtmosphere.SampleCountMax and typing in a higher value in the property field of the Sky Atmosphere component.

For more information, see the Sky Atmosphere documentation.

Real-Time Sky Light Capture

Sky lighting now supports real-time scene capture for atmosphere, clouds, height fog, and opaque meshes (using an Unlit Material with Is Sky enabled), which improves on, and is faster than, the Blueprint node. The Real Time Capture mode on the Sky Light performs all computations on the GPU without any CPU readback resolving hitches that could happen when capturing the scene.

For more information, see the Sky Light documentation.

Environment Light Mixer

The new Environment Light Mixer brings all your environment lighting components for sky, clouds, directional and sky lights into a single window for ease of access and editing. Designers and artists can create and edit these components from this window and choose the level of detail the properties panel displays.

image alt text

Start using the Environment Light Mixer in your scenes by selecting it from the main menu under the Window dropdown.

For more information, see the Environment Light Mixer documentation.

Water Rendering and Meshing System (Experimental)

We have a new, fully-featured water rendering and meshing system that supports large, open worlds enabling you to quickly create rivers, lakes, and oceans using spline-based workflows. The water system also offers unified shading and rendering pipeline integration along with surface meshing that supports physics interactions and fluid simulation with gameplay.

image alt text

image alt text

The Water plugin makes use of the existing Landmass plugin in order to let Water Body Actors interact with terrain surfaces using the non-destructive Landscape Edit Layers feature.

image alt text

The water system represents two functional components of world building, building and editing the rivers, lakes and oceans to seamlessly blend with your world, and a rendering and shading pipeline that uses materials and post processing to define the look and feel.

Water Rendering and Shading Features

The water rendering pipeline includes a number of improvements, enhancements, and properties that helps you define the look of water in your world. For you, this means being able to create your own materials or start with an editable, default material provided with the engine. It enables you to create, from the start, any types of water with a look you define, such as murky lakes, flowing rivers, or beautiful blue oceans.

The following attributes and features are available as part of water rendering and shading:

  • An underwater post process material that is automatically applied based on camera location that also allows for partial submersion in water.

    image alt text

  • Specified transitions between water body types that are material driven, such as the transition of a flowing river into a calm lake.

    image alt text

  • A caustics generation tool to help you define and render your own caustic materials, which can be applied below shallow water surfaces.

    image alt text image alt text

  • The Single Layer Water shading model that provides a physically based water surface with one depth layer that supports refraction and user-defined scattering, absorption, and extinction coefficients.

Water Body Actors and Editing

Whether you're adding water to a small scene or an open world, creating and editing them should be fairly seamless and effortless to do. Water Body Actors enable you to choose from a variety of water body types that can be placed in your level to represent water, such as rivers, lakes, and oceans. The spline based workflow for each of these water body types makes it intuitive and easy to jump in and start creating and editing your levels quickly.

The following features are available with the new Water Body Actors:

  • Create simple or complex worlds using different Water Body Actors that support blending and editing with terrain surfaces. Like Landscape Terrain, the Water Body mesh uses placed tiles that dynamically scale based on distance to achieve highly tessellated and detailed water surfaces up close and less detail further away.

    image alt text

  • Water Bodies feature a highly customizable Gerstner wave simulation that can be used for creating simple to complex water surfaces, making it simpler to create and edit the look of each water body placed in the world.

    image alt text image alt text

  • The spline-based workflow provides quick access to editing and duplicating water bodies to fill your world.

    image alt text

  • An interactive fluid physics simulation that allows for character and object interaction on water surfaces. These are represented by anything from water ripples, foam, and splashes.

    image alt text

Movie Render Queue Workflows and Enhancements (Beta)

This release expands the functionality of Movie Render Queue (formerly known as High-Quality Media Export) by adding new workflows and export capabilities.

New Workflows

There are several new workflows supporting exporting and rendering:

  • Support for Final Cut Pro XML - EDLs

  • OpenColorIO integration

  • Runtime support for implementation into your own application

image alt text

Render Pass Support

In order to generate content for use in the various aspects of a standard production pipeline, such as dailies, post, editorial, etc., Movie RenderQueue can now render different data in separate passes. The following channels are currently supported:

  • Matte IDs (Limited) / User Defined Layers

  • Z-Depth

  • World Position

  • World Normals

  • Ambient Occlusion

  • Reflections

image alt text

In addition to the channels, there are several other improvements:

  • Individual shots can be enabled or disabled to isolate the specific shots that you want to render.

  • Queues can now be saved to an asset which will store the current jobs, settings and shot mask.

  • Some configuration settings can now be adjusted on a per-shot basis.

Additionally, there are several UX improvements to streamline exporting and batch rendering when using a third-party render management tool, such as Deadline.

Pro Media Codecs Support

Render Movie Queue now supports the following codecs:

  • Apple ProRes (high bit depth 10-12bit)

  • Avid DNxHR (810-12bit)

  • Multi-Channel EXR (16, 32 bit)

image alt text

The following EXR compression settings are supported:

  • Uncompressed

  • PIZ

  • ZIP

image alt text

You can review all the documentation associated with Movie Render Queue at Rendering and Exporting in Sequencer.

Sequencer Non-Linear Animation (NLA) Tools (Beta)

Nonlinear animation enables you to quickly create, modify, join, and blend animation assets in order to create new animations and cinematics. This improves workflows around re-using and creating animation sequences, which is particularly helpful for virtual production.

This is supported in various ways:

  • Blending sequences together predictably and non-destructively.

  • Root motion solutions now integrate with gameplay more seamlessly

  • Ability to edit individual bones in a skeletal structure through Sequencer

  • Enhanced and streamlined various Sequencer tools to facilitate non-linear editing

image alt text

Import Control Animation onto ControlRig in Sequencer (Experimental)

You can now import sparse animation data from transforms in a DCC rig onto a ControlRig in Sequencer through FBX. This means that you are no longer restricted to just importing skeletal animation data into Sequencer.

To import FBX data, through the ControlRig track, select Import Control Rig FBX. You can specify what controls to import, and you can filter options for how the animation curves map to Controls.

nDisplay Improvements

In this release, we have added several features to nDisplay to improve the user experience and be able to render to different kinds of display surfaces. You can now easily customize your nDisplay config file with the JSON file format and use the binary format with cluster events for improved data throughput and latency.

nDisplay Configuration Viewer (Beta)

Easily configure your nDisplay setup with the new nDisplay Configuration Viewer. The viewer shows a tree of the configuration hierarchy, render nodes, windows, viewports, inputs, cameras, and projection policies—each with its own Details panel. You can also see a 2D layout of the viewports and a 3D representation of the projection policies.

image alt text

We have added Multi-GPU (mGPU) support with NVIDIA NVLink to be able to scale nDisplay to large LED Volumes. You can now specify which GPU in your system should be used to render an nDisplay viewport with the gpu_node parameter for the viewport in the config file. In an in-camera VFX scenario, you can see improved performance if you assign one GPU to render the camera inner frustum and another GPU to render the outer frustums with a lower screen percentage.

image alt text

image alt text

nDisplay VIOSO Integration (Experimental)

We have added integration and support for VIOSO technology in Unreal Engine for projector warping and soft edge blending on highly complex surfaces. You can load warp and blend files in the native VIOSO format (.vwf) using the following nDisplay projection policies:


  • Native SDK integration

image alt text

nDisplay DomeProjection ProjectionTools Integration (Experimental)

We have added integration and support for DomeProjection ProjectionTools technology in Unreal Engine for projector warping and soft edge blending on massive dome surfaces. You can load warp and blend files in the native DomeProjection format using the nDisplay projection policy native SDK integration.

image alt text

Deterministic Cluster Rendering with Chaos (Beta)

We have added deterministic rendering for real-time features such as Chaos to achieve visual coherency when rendering across cluster render nodes.

Fixed Issue with Sky Atmosphere Renders

The Sky Atmosphere was being captured by one of the Scene Capture Components used by nDisplay, even when flagged to not do so, and this would manifest as a brighter upper half of the scene. We've provided a workaround so this issue should not occur anymore in nDisplay.

In-Camera VFX Template

Use the in-camera VFX Unreal project template as the starting point for configuring your live-action LED stage. Features demonstrated in the project include:

image alt text

  • nDisplay configuration and Blueprint setup for In-Camera VFX

  • Inner frustum and outer frustum

  • Mesh-based warp to define the LED wall in nDisplay

  • Live Link

  • Chroma key and tracking markers

  • Color Correction Regions

  • Web Remote Control

  • OSC

Collaborative Viewer Template Improvements

In this release, we redesigned the UI and added more user input for collaborative sessions. We also improved performance so your session can scale to a larger number of users.

Voice Communication in Collaborative Sessions

You can communicate with other users in a session using voice over IP, enabled by default in the project. You can toggle voice communication on or off in the desktop UI.

Redesigned UI

All UI elements have been redesigned, from the 2D desktop UI to the VR Menu. The 3D avatars have been revamped and an indicator now appears when remote participants are not in view.

image alt text

image alt text

Networking Improvements

We made performance improvements to the networking Blueprints to avoid bottlenecks and disconnections. The network settings have been tuned for high load so you can have more participants with smoother object manipulation and movements.

image alt text

Two-Handed Interactions

You can now use two hands or controllers to interact with different objects at the same time in your immersive experience.

image alt text

Remote Control API (Beta)

The Remote Control API is now a fully compliant REST API with GET, PUT, POST, and DELETE access. We also included a companion web app with default widgets, such as sliders, gauges, and buttons, for controlling properties remotely in the engine.

image alt text

  • Persistent Web Connections - Your WebSocket connections now persist so you can receive live data without closing the connection.

  • Web Server in a Packaged App - You can now run a web server in your packaged app to be able to control it remotely from a web app.

  • Remote Control Preset - We added the Remote Control Panel to show all the controls exposed in a Remote Control Preset Asset. With this panel, you can expose properties in the UI and expose Function Libraries that aren't viewable in the Details panel.

  • Remote Control Preset API Layer - In addition to the user-friendly Remote Control Preset, we have added an API for it so you can easily access information in the scene, such as retrieving all exposed actors.

  • HTTP Server Port Change - The default HTTP server port for the Remote Control API is now 30010.

Chaos Physics (Beta)

Chaos Physics is the lightweight physics simulation solution used in Fortnite. With this beta release, we are making it available for developers learning to work with this feature. PhysX is on by default with Unreal Engine 4.26 (available in the Epic Launcher) and will be deprecated in a future release when Chaos Physics is enabled by default.

A special build with the Chaos solver on by default will be available in the near future.

image alt text

The following features are available in the Chaos Physics beta release.

See the Chaos Physics overview for more information about these features.

Chaos Vehicle (Experimental)

To experiment with making a Chaos Vehicle, read the Chaos Vehicle Setup guide. Otherwise, to convert a PhysX Vehicle to Chaos, read this conversion guide.

Zen Loader (Beta)

We are releasing the runtime Zen Loader for next-generation consoles to leverage the latest in hardware technology with benefits including:

  • Improved load times

  • Reduced load times for streaming and booting processes

  • New input/output mechanism that offers a low-overhead interface for data access

  • APIs that will interface with next-generation storage APIs, enabling data to read directly into target memory with minimal CPU overhead

Although based on the existing EDL loader, Zen Loader does not support the complete feature set of the EDL loader.

Improved Mesh Creation Tools (Experimental)

The Mesh Creation tools have been expanded with additional tools and enhancements to further facilitate the creation of mesh assets inside the engine. The updates to the toolset create an expanded workflow for basic modeling and editing tasks in the editor.

image alt text

These tools can be accessed by navigating to Edit > Plugins in the top menu bar and enabling the Modeling Tools Editor Mode plugin. With the plugin enabled, click the Modes button in the toolbar and select the Modeling option or press Shift + 7.

Primitive Creation Toolbar

Parametric primitives received their own toolbar to make accessing this standard set of customizable primitive shapes easier.

image alt text

Improved Revolve Mesh Tools

We have added two new tools for the creation of custom revolved meshes. Artists can interactively draw a new cross section in the Editor window or select an existing one, and revolve it to create a large number of unique shapes.

image alt text

  • User defined axis allows for customized rotation

  • Take your shapes to the next level with user defined parameters

Improved Mirror Tool

Users can now mirror a selected mesh around a defined axis. Optionally, the new mesh can be merged with the original mesh or another new mesh can be generated:

image alt text

The Mirror tool now includes several enhancements that removes dependence on symmetry and combines several repetitive functions into a single tool that enables you to combine and weld your meshes together, flip normals, and mirror your assets across an axis.

Boolean Tool

The Mesh Creation toolset now includes the Boolean Tool. Boolean operations create a single static mesh using the intersection, union, or difference of multiple static meshes.

image alt text

1, Boolean: Union; 2, Boolean B-A.

The Boolean toolset also provides the option to subtract the overlap of two static meshes or extract just the trimmed out section of those meshes.

Improved Mesh Editing Tools (Experimental)

The Mesh Editing toolset has been extended with new tools to accommodate common modeling techniques and practices. Additionally, existing tools now have new options for greater usability.

image alt text

image alt text

  • Using Insert Edge, quad based Polygroups can be interactively split with the option to retriangulate the resulting mesh for cleaner topology.

  • The Edge Loop tool can be used to add single or multiple edge loops onto a mesh that has quad based polygroups.

  • The Hole Fill tool has been enhanced with new options for smooth hole filling.

  • Artists can now create shelled meshes or expand existing mesh forms using the Offset tool to offset a mesh by a specified value.

  • Tangents can now be configured or recalculated on a selected mesh using the Edit Tangents tool.

Improved Sculpting Tools (Experimental)

image alt text

The Sculpting and Deformation tools have been extended with new features and brush options. Artists can now create custom weight maps in-engine which can enhance the functionality of the Smooth and Displace tools.

image alt text

Weight map

image alt text

Displaced mesh with weight map

Datasmith Exporter Plugin for Navisworks Ready for Production

Further expanding the number of 3D applications supported by Datasmith, we now support Autodesk Navisworks.

Our Navisworks Exporter plugin contains many of the same features found in our other Datasmith exporters and has support for Navisworks 2019, Navisworks 2020, and Navisworks 2021.

Export Metadata

The plugin fully supports exporting metadata from your Navisworks scenes. The data is prepended with tab names using the following format:

[TabName]_[PropertyName] = [Value]

image alt text

In the image above, the result would look like this:

MyTab_MyStringProperty = "MyStringValue"

MyTab_MyBooleanProperty = "Yes"

MyTab_MyFloatProperty = "0.000"

MyTab_MyIntegerProperty = "0"

Datasmith Exporter Plugin for Rhino is Ready for Production

As part of our goal to support the widest range of 3D applications, Unreal Engine now supports exporting Datasmith files directly from Rhino.

Our new exporter works similarly to our existing Datasmith plugins, and features support for MacOS and Rhino 6. The plugin maintains object names, pivot points, material names, layers, hierarchy, etc., identically or very similarly to the existing UE 4.25 Rhino import plugin.


To help preserve these important details, you can now add custom properties on assets as a key value pair, and have these values carried over to your scene as Datasmith metadata:

image alt text

Rhino Worksession Data

The Rhino Exporter plugin can export data loaded through worksessions as part of your scene. Datasmith will import the data as if these objects were a part of the native scene.

Improved USD Live Actor and Stage Importer (Beta)

We continue to expand Unreal Engine's support for Universal Scene Description (USD) interchange format from Pixar. A number of different applications use the USD format and several enhancements have been added to it to facilitate the integration of Unreal into existing production pipelines:

image alt text

USD Stage Improvements

  • You can now animate UsdGeomXformable transforms directly in Sequencer and write the animation back to USD.

  • Added support for USD Lights (UsdLuxLight schemas).

  • Added support for normal maps from USD Preview Surfaces.

  • Added support for USD Blend Shapes as Unreal Morph Targets.

  • USD geometry animations will now playback through Unreal Geometry Caches for improved performance.

USD Importer Improvements

  • New USD importer that can import all USD schemas supported by our USD Stage.

  • The new importer will import static meshes, skeletal meshes, morph targets, anim sequences, materials, actors, cameras, lights and hierarchical static mesh components (HISM).

  • Handle the representation of LOD levels in USD by using Variant Sets and Variants.

USD Exporter Improvements

  • The USD exporter now has the ability to export vertex colors, opacities, LODs, and material assignments when exporting static meshes.

  • Bake and export Unreal Engine Materials straight to USD as USD Preview Surfaces.

  • Added the ability to export Skeletal Meshes and Morph Targets.

Other USD Improvements

  • Added support for USD on MacOS.

  • Support for the USDZ file extension.

  • Upgraded the USD SDK to 20.05 with Python 3 support.

Improved Alembic Streaming (Beta)

image alt text

Alembic is widely used throughout the Media and Entertainment industries as a mechanism for caching out complex static or animated data into streamable cache files on disk. Unreal Engine now supports streaming cached Alembic data directly into the engine without having to first import it as a Geometry Cache.

Inter-Process GPU Texture Sharing (Beta)

image alt text

TextureShare is a new plugin that efficiently sends and receives GPU textures and buffers between Unreal Engine and any other process while bypassing the CPU. TextureShare supports synchronization mechanisms and thread barriers so that coherency is kept between shared applications. You can use this feature through nDisplay or standalone.

New Virtual Camera (Beta)

We've restructured the Virtual Camera architecture to be a modular Component so you can customize, extend, or create your own Virtual Camera. We've also provided a new Virtual Camera implementation built on this redesigned architecture for a production-ready solution. Virtual Cameras not using this new architecture are now deprecated.

The new Virtual Camera includes:

  • All features work in the Editor with Multi-User support.

  • Redesigned user experience.

  • Extensible core architecture for developing Virtual Cameras.

  • Ability to route the output of the Virtual Camera to Composure, Media Framework, Editor viewports, or any devices running the Unreal Remote app.

  • Ability to overlay custom UMG controls over the output and interact with them in the Editor or on a device.

  • Built-in support for controllers and other hardware input in addition to touchscreens.

  • Added the Modifier system to manipulate camera data with custom effects such as filtering, tracking, and autofocus.

  • Ability to switch to any custom tracking system with Live Link.

  • Desktop operator panel to help facilitate the camera operator.

  • Updated the iOS app, Unreal Remote, with a new UI and improved streaming performance. ARKit data from the app is now sent with Live Link.

Frame Accurate Video Feedback (Beta)

There are several enhancements to improve frame accuracy during video feedback:

  • Playback for tiled based media will only stream what is in the camera's view to the GPU. This means that the entire clip does not need to stream and significantly cuts down on processing time, making the playback quick and efficient.

  • Media Track now supports Apple Pro Res and Avid DNxHR codecs clips.

  • The EXR Reader GPU module is now optimized for increased speed and minimal CPU usage when EXR uses uncompressed RGB or RGBA.

DMX Plugin is Production Ready

The DMX (Digital Multiplexer) plugin connects Unreal Engine with external controllers and devices that use the DMX protocol. With bi-directional communication and interaction over ArtNet and aSCN networks, you can control stage shows and lighting fixtures from Unreal, and pre-visualize the show in a virtual environment during the design phase.

DMX Improvements

image alt text

In this set of quality of life improvements for broadcasters and live event producers, the DMX plugin adds better UX, consolidated UI elements, improved performance, refactored code, and DMX Matrix support. In addition to creating a DMX button in Unreal Engine, this release revamps the following features.

  • DMX Monitor

  • DMX Controllers panel

  • DMX Output Console panel

  • Fixture Type panel

  • Fixture Patch panel

  • DMX Attribute Map

Additionally, the plugin now supports DMX Multicast and Unicast.

DMX and Sequencer

image alt text

DMX and Sequencer are integrated so that developers can use a physical DMX and Unreal Engine to build their shows. This integration makes it possible to create a custom DMX timeline, enabling users to easily and quickly make linear lighting experiences that make use of animation and event triggering. With Sequencer, it is possible to utilize features like curves and sub-sequencing to program and control DMX without the need for Blueprint scripts or C++ programs.

DMX Pixel Mapping (Experimental)

image alt text

DMX Pixel Mapping translates a pixel buffer (render target) to a DMX stream. With this mechanism, we enable developers to use live render target texture data to drive DMX fixtures or to drive low-resolution LED panels and devices — essentially, every pixel represents a DMX fixture.

image alt text

DMX Pixel Mapping LED strip

DMX Pixel Mapping features the following.

  • Include tools for XY coordinate sampling and ordering

  • Use texture data to animate LED tape or low resolution LED displays

image alt text

LED display

To learn more, read about the DMX Plugin.

DMX FixturesVFX Blueprints and Template

For users who are interested in providing DMX support for various industries — live show designers, audio-visual (AV) integrators and specialists, or creative agencies and production companies — we are enhancing the DMX user experience by releasing DMX Fixtures and VFX Blueprints that are showcased in the provided DMX Template

The DMX Fixture system now uses a C++ based modular system that enables users to enable or disable a variety of sub-features, including the following.

  • Pan

  • Tilt

  • Gobos

  • Strobe, and more

The DMX Fixture system also features a volumetric beam shader with adjustable quality levels, and a Matrix and Pix Bar Fixture Model. Additionally, for Blueprint scripters, we provide a set of VFX Blueprint Actors that have DMX enabled, including the following Actors.

  • Pyro

  • Lasers

  • Fireworks

  • Water fountain

DMX Template

We created a beta DMX Template to demonstrate the following features.

  • Receiving and sending Artnet + sACN protocols

  • Fixture patching and GDTF support

  • Attribute mapping

  • Fixture proxies

  • Sequencer integration

  • DMX recording

  • Pixel mapping

image alt text

DMX template

We also show developers how to pre-visualize (previs) live venues, utilize fixture control, and work with a real-time content trigger.

Live Venue Previs

Using DMX, you can pre-visualize live show stages and a variety of live venues with the following features.

  • Fixture patching

  • DMX input and Blueprint logic

  • Sequencer integration and DMX recording

Fixture Control

With Unreal Engine, you can control DMX Fixtures with the following features.

  • Fixture patching

  • DMX output and Blueprint logic

  • Pixel mapping

Content Trigger

Using DMX in Unreal Engine, you can trigger real-time, generative or pre-recorded content with the following features.

  • Fixture patching

  • DMX input and Blueprint logic

To learn more, download the template and read the DMX Template overview guide.

Stage Monitor (Beta)

image alt text

The new Stage Monitor tool connects to all the machines in a Multi-User session and reports performance stats and hitches, such as FPS and GPU usage. You're able to view these reports from any machine in the session and you can contextualize the reports into critical sections for easy filtering as well as export them as a JSON file.

Switchboard (Beta)

Switchboard is an extensible PySide app that coordinates the many devices and tools interacting with the scene and generating data on a Virtual Production stage. Switchboard supports the following operations:

  • Launch multiple Unreal Engine and nDisplay instances on different machines and automatically connect them with the Multi-User Editor.

  • Sync content with Perforce on all machines.

  • Set take naming and initiate recording in Unreal Engine via Take Recorder and on additional performance capture software and devices.

  • Provide diagnostic information about nDisplay sync status.

Live Link XR Plugin

You can now use your XR devices as virtual cameras for performance capture or as live camera tracking for live action shoots with the Live Link XR plugin. The Live Link workflow is the same whether using XR devices or other tracking systems, so you can exchange your tracking system based on the needs of the project and the availability of the devices. In this release, Live Link XR only supports Steam-based devices.

Visual Dataprep Tool is Ready for Production

The Visual Dataprep tool offers a clear workflow with high-level building blocks to describe preparation processes, from data import to UE asset creation. Dataprep is now production ready and has received user interface and usability improvements. Users also have access to a variety of new operators and selection filters.

  • Substitution Material Table - Create a Substitution Material Table directly in Dataprep to quickly substitute Materials on incoming models.

    image alt text

  • Mesh Modeling Operations - Mesh Modeling operators are now available in Dataprep. These include Decimation, UV generation, and more.

  • Improved Graph and Selection Tools - Dataprep has received several improvements to the graph and selection tools.

  • Users can now bypass unnecessary nodes in the graph.

  • Select all visible Actors from a set of Actors.

  • Select all Actors overlapping a set of Actors.

  • Selection transform and all operators and filters now work with Actor Components.

  • The Input Panel has now been updated for enhanced readability and usability.

  • You can now select Actors in the Scene Preview that are using assets selected in the Content Preview. The reverse can also be done.

  • When using the Preview filter, the selection will be automatically synchronized with the Content Preview and the Scene Preview

Support for OpenColorIO

You can now extend your control over the color space of the images and linear media you render with Unreal, keeping colors consistent all the way from camera capture through your work in the Unreal Editor to final output. We've extended our support of OpenColorIO (OCIO) color transformations, allowing you to:

  • Set a color space transformation for each Editor Viewport.

  • Set a color space transformation when you render shots in the Movie Render Queue.

  • Set a color space transformation for each nDisplay Viewport.

Control Rig Branching and Looping

Branching and looping give the ability to create flexible and dynamic Control Rigs with a minimal amount of setup. Looping allows users to create dynamically populated collections of objects (bone chains, lists of controls) that can be iterated upon. This significantly reduces the size of graphs, and improves graph performance, construction time and the flexibility of the rigs.

image alt text

  • New branching / conditional nodes make it possible to branch a graph based on conditional factors.

  • Looping makes use of logic to create more concise and flexible graphs.

  • Support has been added for grouping of items and supporting nodes.

Control Rig Inversion

image alt text

With Control Rig inversion, users can now remap existing animations onto Animation Rigs which can be modified using Sequencer. Users can now modify existing skeletal animations with easy to use Control Rigs. The new Backwards Event node defines how a bone maps to a control or other controlling logic.

  • Numerical PreSequencer functionality to allow users to Bake to Control Rig by running the Backwards Event per frame of the animation in Sequencer.

Control Rig Component

Users can now access Control Rig data from Blueprints with the Control Rig Component. This enables users to drive Control Rigs with Gameplay logic in Blueprints, re-initialize Control Rigs to fit differently proportioned characters, and read or write other Control Rig data directly. Additionally, users can now attach non-skeletal mesh objects to the Control Rig hierarchy with accessors in the Control Rig Component.

image alt text

  • New Setup Event in Control Rig allows skeleton and controls to be initialized.

  • Skeleton and Controls can be placed during a Control Rig Initialize state.

  • Getter and Setter functions are available in Blueprints to get or set bone and control transforms/values.

  • Control Rig controls and debug drawing are visible in Blueprint viewport.

  • Static Mesh transforms can be driven by getting bone transforms from Control Rig.

Fullbody IK Node (Experimental)

For users who need to procedurally modify character poses at runtime, the Fullbody IK solver has been added. Based on Jacobian Pseudoinverse Damped Least Squares, the Fullbody IK Control Rig node has additional properties for controlling stiffness, bone limits, pole vectors, and other solver parameters.

  • Works on any skeleton.

  • With additional properties, such as constraints and stiffness settings, users can refine the solver to meet specific artistic requirements.

GPU Lightmass (Beta)

Unreal Engine's light baking system, Lightmass, now offers a next-generation GPU-based variant built from the ground up. GPU Lightmass improves on the CPU-based Lightmass system by leveraging DirectX 12 and DXR ray tracing capabilities to significantly reduce the time it takes to build complex scenes, achieving speeds on a single host comparable to a distributed swarm render of the CPU-based system.

image alt text

Credits: Art created by Dekogon Studios - www.dekogon.com

The new GPU Lightmass improves on the current light baking system by:

  • Using a progressive lightmapper with optional real-time preview in the viewport.

  • Offering multiple modes for building lighting: Full Bake and Bake What You See

  • Significantly increasing the speed of light bakes for complex scenes.

  • Producing a more physically accurate result than CPU-based Lightmass.

You can start using GPU Lightmass by enabling the GPU Lightmass plugin and setting the following project settings:

image alt text

  • Set the Default RHI to DirectX 12 (requires Windows 10 build 1809 or later)

  • Enable Ray Tracing support (requires a DXR-capable card)

  • [Optional] Enable Virtual Texturing and Virtual Texture Lightmaps for interactive preview mode

    image alt text

    image alt text

Unreal Insights Insights

Memory Insights (Beta)

With the addition of Memory Insights, Unreal Insights now gives users visibility into how their applications use memory so developers can better understand how their work impacts application performance and engine behavior.

image alt text

Default Graph tracks are available to display memory usage for Total, TrackedTotal, Untracked, Meshes, Textures, Physics, and Audio.

To learn about additional LLM tags in the Memory Insights panel, read the updated overview for Unreal Insights.

Slate Insights

To help UI developers understand how their user interface is performing, we are extending Unreal Insights with UMG and Slate profiling tools. While using the Slate Insights extension, developers can use Slate Frame View to get a list of Widgets being painted, invalidated, or updated per frame.

image alt text

If the developer enables GlobalInvalidation, they can identify the Widgets responsible for a costly frame.

To learn more about the UMG and Slate profiling tools, such as Slate Frame View, read this Slate Insights overview.

Mobile Rendering Improvements

The traditional mobile rendering pipeline is improved, including both optimizations of existing features and newly available post-processes.

Virtual Texture Compression for Mobile (Production)

We have added texture compression support for runtime virtual textures on mobile. This will enable mobile devices to use virtual textures with greatly improved performance. Refer to the Virtual Texturing Reference for more information on how to work with virtual textures.

Reflection Capture Compression for Mobile (Production)

Reflection Capture Components now support texture compression on Mobile devices. This reduces the memory footprint of reflection capture, making it more viable for Mobile projects.

Ground-Truth Ambient Occlusion (GTAO) on Mobile (Experimental)

Ground-Truth Ambient Occlusion is now available for mobile devices. This implementation of ambient occlusion enables mobile projects to improve the appearance of indirect lighting and shadows with a low performance cost.

GTAO disabled

GTAO enabled

With GTAO enabled, ambient occlusion is noticeable in the corners of this scene. Modular Building Set courtesy of PurePolygons

When implementing GTAO on Mobile, Mali devices will experience performance issues, as they have fewer than 1024 maximum compute shader threads.

Dynamic Spotlight Shadows for Mobile (Experimental)

Dynamic spotlight shadows are now supported on Mobile. This allows spotlights to cast shadows on both static and moveable meshes.

Pixel Projected Reflection for Mobile (Experimental)

We have added Pixel Projected Reflection support for Mobile devices in 4.26, enabling reflection planes to generate screen-space reflections on Mobile.

image alt text

Currently, the following modes are supported:

  • Usual — The planar reflection actor will function identically on all platforms.

  • MobilePPR — The planar reflection actor will work as normal on PC/Console platforms, but uses pixel projected reflections on Mobile platforms.

  • MobilePPRExclusive — The planar reflection actor will only be used for pixel projected reflections on mobile platforms. This leaves room for PC and Console projects to use traditional SSR instead.

Ray Tracing Updates and Improvements

We continue to expand feature coverage and push the boundaries of ray tracing in games, such as our recent effort to bring ray tracing support to Fortnite. Our effort to support ray tracing in Fortnite has increased real-time performance and brought a number of optimizations that improve quality, and can be used in your own projects.

image alt text

1, Ray Tracing enabled; 2, Ray Tracing disabled.

This release includes:

  • Optimized CPU Performance with efficient buffer allocators, heap management, faster dynamic path, and better RTPOS handling, which also helps make DirectX 12 a better experience moving forward.

  • Improved GPU Performance with more accurate disabling of non-visually relevant world position offset (WPO) evaluation, spatial structure for more efficient lighting sampling, culling options for objects behind the camera view, and more.

  • Increased Stability that resolves many crashes and sources of instability within the engine that have been found wider adoption of ray tracing in games and projects.

  • Many Visual Improvements for ray tracing features that includes improved global illumination quality and performance with support for two-side foliage, extended translucency support, translucent shadows, and more.

Improved Baking Tools (Experimental)

Our Baking tools enable you to conveniently bake maps for normals, ambient occlusion, curvature, position and texture straight to your project's Content Browser.. Artists can select meshes and bake maps based on specific UV channels.

image alt text image alt text

Improved UV Editing Tools (Experimental)

Our UV Editing tools continue to expand with new options for displaying and adjusting UV layouts inside the editor. The new UV Display options provide a way to visualize the UV layout of the mesh in the editor viewport while using any one the UV tools. The new Cut Selected Edge UV tool provides artists with a convenient way to adjust the UV map of a static mesh without having to make changes and export again from their 3D software.

image alt text

Volume Editing Tools (Experimental)

Edit collision and volume shapes directly in the engine using our new suite of Volume Editing tools. Convert BSP shapes, existing volumes, or collision shapes into static mesh Actors and edit them using the Mesh Editing tools. These meshes can then be converted back to a volume or collision shape once they have been customized.

Gen5 Temporal Upsampling (Experimental)

We are now actively working on a new Temporal Upsampling algorithm that is specifically designed for next generation platforms and PC. We're currently shipping and battle testing Fortnite at 4K using this new algorithm. While it is under active development, Gen5 Temporal Upsampling enables higher image quality output than the current Temporal Anti-Aliasing (TAA) and Temporal Upsampling, despite requiring it to be configured with a lower screen percentage to accommodate its additional performance cost within an identical frame rate for a fair quality comparison.

Gen4 Temporal Upsample

Gen5 Temporal Upsample

The performance benefit of a higher quality temporal upsampling technique really comes when lowering the screen percentage beyond compensating for the higher upscaling costs. It frees new GPU budget on the rest of the frame to reinvest by enabling, or increasing, quality of other rendering features that ultimately contribute to a final output pixel of higher quality.

The older Gen4 Temporal Upsampling will be maintained and isolated from active development of Gen5's to avoid any regression on existing content for as long as we support these platforms.

Python 3.7.7 Support

We have added support for Python 3.x in Unreal Engine to follow the VFX Reference Platform guidelines after Python 2.x reached its end of life earlier this year. The engine is shipping with Python 3.7.7 but includes support for Python 2.7. After this release, Python 2.x will be deprecated in the engine.

USD support in Unreal Engine has also migrated to Python 3.x. If you need to continue to use Python 2.7, you will need to recompile the USD plugin and the engine to target Python 2.7. For details on how to change the Python version in the engine, see Scripting the Editor using Python.

Datasmith Improvements

Datasmith continues to receive performance improvements and expand its support for your favorite 3d software packages:

  • The Datasmith Exporter for Revit adds support for Revit 2021.

  • The Datasmith for 3ds Max plugin has been expanded with support for several Corona Materials and Maps.

Improved Datasmith Performance

Datasmith has received several performance enhancements that will better support Automotive and Manufacturing users with large and complex CAD models:

  • Compilation using MSVC2017 with proper optimizations settings.

  • Implementations of a temporary solution for reading Siemens JT monolithics models in Multi-Threading.

  • Optimized performance by enhancing memory allocation.

MacOS Support for Datasmith Export API

If you're a third-party developer wanting to add Datasmith support to a design application that runs on Mac OS X, you can now use the tools and helper classes in the Datasmith export API to create your own exporter to translate your objects and scene data to .udatasmith files.

Object Property Tracing in Animation Insights (Experimental)

Animation Insights now supports tracing the properties of gameplay-relevant objects such as actors, components or anim instances. This allows you to visualize how properties in your objects are changing over time without needing an external debugger, as well as supporting both native and Blueprint classes.

image alt text

To use it, enable the 'ObjectProperties' trace channel, then in editor right-click on your actor to trace its properties. Components and other objects can have their properties traced by right-clicking on their track in Insights.

Anim Node Property Access System

Animation Blueprint nodes can now have their pin-exposed parameters bound to any accessible property in your game via the Property Access system.

image alt text

This has a number of advantages over piping data in via pins:

  • Data is always accessed in a thread-safe manner.

  • Reduces the need to marshal your data into your Animation Blueprint manually.

  • Binding multiple nodes to the same value is simpler and more readable - less graph. clutter.

  • Performance is improved over the regular 'fast path' by ~25%.

  • Supports bindings to functions, arrays, linked objects, nested structures and all combinations of the above.

Quartz (Beta)

image alt text

Quartz, a new audio tool in 4.26, provides a way to schedule the onset of sounds with sample-accuracy clips to all sounds in the audio engine bringing a higher level of control in the audio rendering process.

With Quartz, you can play world sounds on perfect, sample-accurate time boundaries (musical or otherwise) and arbitrarily synchronize those sound emitters across the world.

Audio Modulation (Beta)

image alt text

The new Audio Modulation plugin includes a more intuitive subset of features for mixing source audio, and for dynamically controlling and parameterizing audio properties by:

  • Exposing a flexible, decoupled, generic parameter modulation and mix system

  • Establishing a more robust set of tools for auditioning and debugging a game mix

  • Providing an API that can be easily extended, and used for further modulation of sources, effects, submixes, and various other audio types via plugins

Audio Stream Caching

Stream caching is a way of loading audio at any point and releasing it automatically when not in use. With stream caching, you set a fixed memory budget for audio and the engine handles the rest, streaming in audio data as needed. This gives sound designers the advantage of loading audio assets as needed without overrunning memory boundaries. While this feature has been around since 4.24 in Beta, it is now in full production across all platforms for 4.26.

Desktop Renderers for Mobile (iOS - Beta/Android - Experimental)

In Unreal Engine 4.26, we are providing the forward and deferred desktop renderers for Mobile devices, which will provide an improved rendering feature set for compatible devices. These are available for iOS devices as well as Android devices using Vulkan. The iOS implementation is considered Beta in terms of feature readiness, while the Android Vulkan implementation is considered Experimental.

image alt text

The Infiltrator Demo running on iPad Pro with the desktop forward renderer

For more information about these rendering options, refer to the Forward Shading Renderer guide.

Mobile Deferred Renderer (Experimental)

Unreal Engine 4.26 now features a deferred rendering mode for the Mobile renderer. This mode supports high-quality reflections, large numbers of dynamic lights, lit decals, and other techniques that are not supported by mobile forward shading.

Mobile Forward Renderer

Mobile Deferred Renderer

The default Mobile forward rendering versus the new deferred renderer

Currently, the Mobile deferred renderer is supported on iPhone 6 and later iOS devices, as well as Galaxy S9 and later devices for Android Vulkan.

Anisotropy is Ready for Production

Anisotropy is now ready for production! We've improved on its performance and have exposed it by default without introducing any additional performance tax when it is unused.

Anisotropy can be used to control the shape and orientation of specular highlights and reflections, most commonly to represent brushed metal materials.

image alt text

1, Anisotropic Response; 2, Isotropic Response

When a material uses anisotropy, an anisotropic pass is enabled that emits additional gbuffer properties for just the objects using the anisotropic material. Additionally, if the scene contains anisotropic materials the lighting pass will light each pixel using the anisotropic BRDF only if that pixel contains anisotropic properties. Effectively, the cost of anisotropy is proportional to the number of pixels displaying such a material.

Anisotropy is only enabled by default on PC and next-generation consoles (XBXS / PS5). It currently does not support area lights, or spot and directional lights with a source area size.

For more information about Anisotropy, see the Material Inputs documentation.

UMG and Slate Input Debugging Tools

While debugging a user interface (UI), reproducing an input (for example, from a Gamepad or Keyboard) sequence without interfering with a process can be challenging. With this release, we provide a tool to debug UI navigation, and to visualize the static behavior of navigation events. This enables developers to efficiently identify inputs that are related to a specific UI bug.

image alt text

Simulating Navigation Events in Widget Reflector*

The Widget (or system) may deliver a different result at runtime.

To learn more, read about Widget Reflector.

Console Slate Debugger

The console version of Slate Debugger now features the following profiling extensions.

  • A Paint option that displays the Widgets painted for this frame

  • With GlobalInvalidation mode enabled, the debugger will help developers find Widgets that frequently invalidate the user interface

And the following input extensions.

  • More filters and event options

  • A routing option that enables developers to observe how the system selects a Widget as the event handler

image alt text

To learn more, read the Console Slate Debugger reference.

LiDAR Point Cloud Improvements

The LiDar Point Cloud plugin features improvements to performance and workflow, as well as added support for more file types.

image alt text

  • Support has been added for the LAZ and E57 file formats.

  • The new LidarClippingVolume actor works real-time with all LiDAR components in the scene.

  • The plugin now allows the user to calculate the Normal vector for points. This can be done for the whole cloud or for selections.

  • The RAM requirements to import, process, and export point clouds have been significantly reduced.

  • Invert selection: A toggle has been added to allow switching between all selected and all unselected points.

  • Dynamic Point Budget: There are new systems to control the point budget on screen:

    • r.LidarTargetFPS X - this will continually tweak the point budget to maintain overall FPS of X.

    • r.LidarIncrementalBudget X - if set to true, this will automatically increase point budget to very high values (sub 10 FPS) as long as the viewport remains stationary.

  • Removed the 2 billion points per asset limit

OpenXR Integration (Beta)

You only need to add one plugin, the OpenXR plugin, to your project to target multiple XR devices. The OpenXR plugin now supports extension plugins from the Marketplace so you can add functionality to OpenXR without relying on Engine releases.

image alt text

Credits: OpenXR and the OpenXR logo are trademarks of the Khronos Group Inc.

We added support for the following features in Unreal Engine's OpenXR plugin:

  • Input, such as eye tracking, hand tracking, and grip and aim poses.

  • Unreal Engine's point of interest in the real world, ARPin.

  • DirectX12 RHI.

The platform-specific plugins are still available in 4.26. You can choose whether to use the OpenXR plugin or the platform-specific plugins.

Azure Spatial Anchors (Beta)

You can now designate points of interest to persist in the real world between sessions for your immersive mobile apps. We have added Azure Spatial Anchor support for ARKit and ARCore to Unreal Engine and updated the C++ API.

image alt text

RHI Changes: Barrier Refactor, RDG Updates

This is an API update. These changes should go unnoticed by end-users who do not work with the source code.

The RHI resource barrier/transition API was refactored to support split transitions, subresource state tracking, and explicit resource states. Split transitions enable overlap of workloads on the same hardware pipeline, and more explicit state transitions result in more targeted GPU cache flushes. The new transition API requires both the current and destination states of the resource, mirroring the design of modern graphics APIs. The states are also more granular now: instead of generic readable/writable states, the new API has separate flags for render target, SRV, UAV and so on. This allows for more precise barriers to be sent to the GPU, which can improve performance in some cases.

We have also removed most of the implicit barriers which were performed internally by the RHIs, most notably those inside BeginRenderPass. The calling code must now explicitly transition render targets to the correct state before starting a render pass.

The current state of a resource can be difficult to track in some cases. We recommend using the Render Dependency Graph (RDG) for new rendering code, as it takes care of state tracking and barrier batching. The old transition API is now deprecated and will be removed in a future engine release. Existing code which uses these functions will trigger compiler warnings, and will need to be converted to use the new API.

We have added a validation layer which checks if resources are in the correct state when commands are submitted (draw calls, compute shader dispatches, copy operations etc.). This can be enabled by adding the -rhivalidation flag to the command line, and it works with any RHI.

The RDG implementation now supports async compute scheduling, merging of render passes, culling of unused passes, merging of read-only states and split transitions tracked at the subresource granularity. Uniform buffers with RDG resources are now supported. The deferred renderer has been further refactored to use a unified RDG builder instance. Everything after the depth pre-pass is now a monolithic render graph.

Improved Smart Re-tessellate

The Re-tessellate tool has been enhanced to give users more control over which surfaces they would like to regenerate triangles.

New options for re-tessellation include:

  • All intact and altered surfaces (but not deleted)

  • All surfaces

Attenuation Distance Scaling with Sound Classes

You can now scale sound attenuation based on distance when using Sound Classes.

Submix Effects

This feature provides the same digital signal processing, or DSP, as the stereo delay for source effects, but applied to submix effects.

Garbage Collection Improvement

By favoring fast reference collection, we improved the performance of garbage collection by reducing FArchive usage.

To learn more, read about Garbage Collection.

Improved Variant Manager

The Variant Manager continues to make it easy to set up variations and toggle the visibility of Actor hierarchies. Users can now set up dependencies between Variants, use Python to set Variant thumbnails, and set a thumbnail image for Variant Sets.

image alt text

Windows Metal Shader Compiler for iOS

We are introducing a new shader compiler for Metal on Windows. This enables Windows users to compile shaders for iOS projects with a greatly simplified workflow, as they will no longer need to use remote shader compiling.

To use the Windows Metal Shader Compiler, you will need to install the Metal Developer Tools for Windows. You can then enable the shader compiler under Project Settings > iOS.

iOS/tvOS Gamepad Input (Production)

iOS, tvOS, and iPadOS 14, now supports a wider range of input devices, including gamepads, keyboard, mouse, and trackpad. Additionally, users can re-map gamepad buttons for Xbox and PlayStation controllers at the OS level, and the OS provides handling for the button display.

As of 4.26, we have re-factored input handling for these devices to take full advantage of the new options for input devices, and you can use the Get Gamepad Button Glyph node in Blueprint to retrieve glyphs accurate to your users' mappings.

ChunkDownloader Plugin (Beta)

We have integrated a new patching plugin called ChunkDownloader into Unreal Engine 4.26. This is the system used for patching in BattleBreakers, and it is ideally suited to games with large numbers of small content files to deliver with regular updates.

When ChunkDownloader is initialized, it will download the latest version of the manifest file first. For subsequent .pak file downloads, it will use the manifest to check if any local files are up to date, discard any that are not present in the manifest, and download files that aren't already on disk.

For details about how to get started using ChunkDownloader, refer to the ChunkDownloader Quick Start Guide.

Support for Google GamePAD (Beta)

Unreal Engine also supports Google's Play Asset Delivery system, which is available for App Bundle builds on the Google Play Store.

When you create an App Bundle build (.aab), you can separate assets such as textures, models, and text files into .pak files, then include them inside your App Bundle build as Asset Packs and upload it to the Google Play Store. Google's dynamic content delivery system will install an optimized .apk to the user's device, and using the libraries included with the GooglePAD plugin, you can request downloads for the asset packs you provided. These can be configured to be delivered at specific phases in your application.

Refer to the Google Play Asset Delivery reference for more details on how to use Google GamePAD in your projects.

The plugin is still in Beta and requires some manual setup to separate .pak files into asset packs.

Sun Sky Plugin Performance Improvements

The Sun and Sky Actor (part of the Sun Position Calculator plugin) takes advantage of the latest improvements to Sky Light rendering with real-time capture mode, removing visual discrepancies between sky and materials while improving performance for your scenes.

For more information on this plugin and its usage, see the Sun and Sky Actor documentation.

Niagara Updates and Improvements

We continue to improve on stability, performance, and overall memory usage with this release, including:

  • A continued effort to increase performance across platforms and lower memory consumption.

  • Better integration of Niagara particle systems with Sequencer.

  • Updates to user interface to improve user experience and usability.

  • New Array Inputs to allow for arrays in the Niagara UI stack. Arrays can be created by users and have built-in options to directly address them by index, and choose array elements randomly at spawn time, every frame, or to interpolate through the array elements with a linked attribute.

  • A new set of Particle Attribute Reader modules have been added that allows for one emitter to sample another emitter's particles and make decisions from that sampling, such as spawn from them, which attributes to copy, and what to do with them once sampled. This behavior operates on the GPU and enables a lead/follower relationship. The newly generalized constraint function for rigid and flexible chains in Niagara emitters takes advantage of the Particle Attribute Reader.

    image alt text

  • A new built-in Niagara Profiler that integrates with the existing stats system to provide live in-editor profiling of modules for CPU and overall script costs for the GPU. It also works for Emitter and System scripts.

    image alt text

For the latest information, see the Niagara Visual Effects documentation.

Niagara Random Inputs Refactor

The Niagara Random Number Dynamic inputs have been renamed Random Range X to match more closely with their Blueprint counterpart. Using random number dynamic input now defaults to only calculating the random number once at spawn time, simplifying the use of random numbers in update scripts. When used in an emitter or system script, the spawn can be set to recalculate once per loop. For instance, such as calculating a spawn burst time every loop.

The new Array Inputs are available in a new set of random array dynamic inputs that are available with Select X From Array, which automatically creates an array of numbers that are either randomly chosen or can be addressed directly in the stack UI using an array index.

image alt text

Cascade to Niagara Converter (Experimental)

We now have a Cascade to Niagara Converter plugin that enables you to quickly migrate your particle systems from Cascade to Niagara.

image alt text

To use it, enable Cascade to Niagara Converter in the Plugins window. Once enabled, you will be able to right-click on Cascade particle system assets and select "Convert to Niagara System" to generate an equivalent Niagara System in the same directory. The generated Niagara system saves a log of the conversion process to help guide upconverting from the Cascade paradigm.

The Cascade to Niagara Converter tool is experimental and does not support all modules, renderers and properties of Cascade systems, including Events, Beam and AnimTrail renderers, Vector Fields, and per-LOD scaling. It is suggested to use this Converter tool as an introduction to authoring FX assets in Niagara with equivalent behavior to Cascade, and as a guide for assisting in upconverting Cascade systems.

Conversion of Cascade systems is enabled through a python scripting layer which supports drop in/out scripts per Cascade module to enable customized asset conversion and generating new Niagara emitter and system assets programmatically.

Niagara Component Renderer (Experimental)

The Niagara Component Renderer is an experimental node that can be added to your Niagara Emitters under the Render stack. It provides per platform scalability overrides with a variety of component types available in the editor. The Component Renderer enables you to quickly assign any component type, such as a point light or static mesh component, and allows you to bind data front our particle simulation to any of the component properties. It is ideal for artists and designers who want to iterate quickly on ideas for their projects with a range of new features.

Niagara High Quality Particle Lights

Niagara now supports high quality shadowed lighting from particle simulations using the Component Renderer node using the Point Light Component. This is ideal for those targeting high-end and cinematic projects.

Unlike the Light Renderer node, which only provides basic properties and lighting for your simulations, a Component Renderer that uses the Point Light Component provides artists and designers with the full set of light properties and features.

image alt text

Playing Audio from Niagara Particle Simulations

It's now much simpler to play audio from particle interactions using a simple one-shot "fire and forget" sound effect or with more complex control over the audio, such as controlling the pitch of the sound while it's playing. This improves workflow over exporting particle data to Blueprint to trigger any audio effects that are needed.

For One-shot sound effects that keep playing even if the Niagara system is disabled or destroyed, you can set them up by adding the Play Audio node to a module stack and configure it there. Now, everytime the module is evaluated, it checks the Particles.PlayAudio attribute and creates a sound effect if that attribute is enabled.

For full audio control that enables advanced control over audio that will keep playing when the enabled binding is true and stops when the Niagara system is destroyed or reset. You can set this up by adding a Play Persistent Audio module to a module stack and configure it there. To change the properties of a running sound, add the Update Persistent Audio module to the stack and configure it there.

To get started, check out the updated Content Examples project available on the Learn tab of the Epic Games Launcher, where both of these approaches are showcased.

Advanced Niagara Example Content

The Content Examples project adds many new Niagara particle examples to learn from with this release.

image alt text

You can access these latest additions by downloading the Content Examples project from the Epic Games Launcher under the Learn tab. Then, load up the Niagara and Niagara_Advanced Levels.

Niagara GBuffer Data Interface (Experimental)

This data interface allows you to read attributes from the GBuffer within a Niagara GPU simulation. For example, read diffuse color, world normal, custom depth, scene depth, scene color, etc. Open the Niagara_Advanced level, sample 1.4 for an example of exactly how to use this.

Removed: OpenGL Desktop Rendering

OpenGL was deprecated in 4.23 for use in desktop rendering (SM4/SM5). It is now removed as a desktop option in 4.26. Vulkan is the supported RHI on Linux. OpenGL can still be used to run the mobile renderer on desktop to debug GLES problems by passing these flags on startup: "-game -opengl -featureleveles31". Passing "-opengl" alone will show an error and use the default RHI for the platform.

New Runtime Performance System in Sequencer

As the complexity, scale, and fidelity of real-time cinematic content continues to push the envelope of quality in Unreal Engine, we can critically assess the runtime capabilities of Unreal Engine's cinematic tool, Sequencer, and identify areas of optimization potential.

In 4.26, we are rolling out a new underlying runtime architecture that enables much higher performance for large-scale cinematics and concurrent UI animations than previously possible. Re-organising the runtime data structures and logic using data-oriented design principles has enabled greater optimization potential when dealing with large data sets, enabled greater third-party extensibility, and paves the way for more interactive and dynamic sequenced content in the future.

To read more about these system changes, behavioral changes between older versions and 4.26, and API breakages, please see the tech blog-post Sequencer through a new lens: Cinematic performance in 4.26.

Sequencer Quality-of-Life Enhancements and Improvements

There are several new Sequencer quality-of-life enhancements and improvements.

UI/UX Improvements

  • Global marker

  • Curve Editor

  • Camera shake source shake track with in-editor preview

  • Tree groups enable you to create custom views of specific tracks. This enables you to easily view and adjust specific tracks without having to adjust the track hierarchy.

  • Subsequences now show the full breadcrumb trail in the browser hierarchy

  • You can now frame selected keyframes quickly using the hotkey "F".

Pipeline Improvements

Sequencer now supports access to the scripting layer in Python. You can now use the following through the Editor Utility widget:

  • GetSelectedSections, SelectSection

  • GetSelectedTracks, SelectTrack

  • GetSelectedFolders, SelectFolder

  • GetSelectedObject, SelectObject

  • EmptySelection

Evaluation Improvements

You can now playback specific frames and stop at any point. This helps with cueing systems for live events and broadcasts.

Live Link Face for iPad

We've updated the Live Link Face app to officially support iPads as well as iPhones so you can easily utilize the larger screen for face captures.

Color Correct Regions

Use Color Correct Regions to apply color grading to a region in your Unreal scene. For an in-camera VFX shoot, you can match the lighting and shadows between your real-world set and the Unreal scene displayed on the LED volume.

Timecode and Sync Improvements

In this release, we have added several features for capturing timecode data. When using AJA or BlackMagic SDI capture cards for genlocking the engine, it is possible to run them faster than the timecode source. Now it will automatically generate the in-between timecode values instead of repeating them.

Timed Data Monitor

The plugin Timed Data Monitor aligns the evaluation of multiple Live Link and Media sources based on their source timecode. In the Timed Data Monitor panel, you can manage the multiple sources and view their synchronization status.

Custom Attributes on Nodes

We have added support for custom timecode attributes on nodes. Take Recorder generates custom attributes using the current timecode when recording both Actors in Sequencer and Animation assets. In addition, FBX imports and exports now preserve timecode data.

Custom attributes stored and evaluated from Animation Sequence assets is experimental and should not be used for production projects.

AR Unification (Beta)

We identified common functionality for feature sets across our supported AR platforms and consolidated them into a general AR tool suite in Unreal Engine. With the platform-agnostic AR tool suite, you can compile the same APIs on every platform, even when they're not supported.

ARCore 1.18 Support

You can have real-world objects occlude the holograms in your augmented reality app using the Depth API from the latest ARCore release. The Depth API uses depth-from-motion algorithms to generate a depth map with a single RGB camera.

image alt text

ARKit 3.5 Support

You can use the advanced features available in ARKit 3.0, including scene geometry, instant AR, and improvements to mocap and occlusion.

ARKit 4.0 Support (Beta)

We have included support for ARKit 4.0 and its features, such as the Depth API, which uses the LiDAR scanner, and Geo Anchors for designating points of interest in the real world.

New: Platform SDK Upgrades

In every release, we update the Engine to support the latest SDK releases from platform partners.

image alt text

  • Windows

    • Recommended:

      • Visual Studio 2019 v16.5

    • Minimum:

      • Visual Studio 2017 v15.6

    • Windows SDK 10.0.18362

    • NET 4.6.2 Targeting Pack

  • IDE Version the Build farm compiles against

    • Visual Studio - Visual Studio 2017 v15.9.4 toolchain (14.16.27023) and Windows 10 SDK (10.0.18362.0)

      • Minimum Supported versions

        • Visual Studio 2017 v15.6

      • Requires NET 4.6.2 Targeting Pack

    • Xcode - Xcode 11.1

  • Android

    • Android Studio 3.5.3

    • Android NDK r21b

      • NDK r20b is also supported to address compatibility issues on some low-end devices.

  • ARCore

    • 1.18

  • ARKit

    • 4.0

  • Linux "SDK" (cross-toolchain)

    • v17 clang-10.0.1-based (CentOS 7)

  • Oculus

    • 1.44

    • API Level 23

  • OpenXR

    • 1.0

  • Google Stadia

    • 1.53

  • Lumin

    • 0.23

  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 10.4.0 + optional NEX 4.6.4

    • Minimum Firmware Version: 10.0.2-1.0

    • Supported IDE: Visual Studio 2019, Visual Studio 2017

  • PS4

    • Orbis SDK 8.008.011

    • System software 8.008.041

    • Supported IDE: Visual Studio 2017, Visual Studio 2019

  • XboxOne

    • XDK: July 2018 QFE-13

    • Firmware Version: Recovery October 10.0.19041.4981

    • Supported IDE: Visual Studio 2017

  • macOS

    • Supported

      • macOS Big Sur 11.0.1, Latest Xcode 12

    • Recommended

      • macOS Catalina 10.15.7, Latest Xcode 12

    • Minimum

      • macOS Mojave 10.14.6, Xcode 11.3.1

    • Machine Architecture Note

      • Added preliminary support for native Apple Silicon for macOS targets*****

      • Some SDKs do not yet contain ARM64 slices (e.g. Steam, Vivox).

  • iOS / tvOS**

    • Recommended

      • Latest Xcode 12

    • Minimum

      • Xcode 11.3.1

    • Target SDK version 12.00 - 14.XX

Major Upgrade Notes


  • Bug Fix: Fixed UAIPerceptionStimuliSourceComponent's issues with unregistering from all senses if RegisterForSense has already been called during its lifetime.

  • New: The Environment Query Editor is now an engine plugin that is enabled by default; Individual users are no longer required to enable it via the experimental settings. The editor is still considered experimental and disabling the plugin will remove access to the feature.

  • New: Fixed issues in AIPerceptionComponent where perceptual data associated with actors were no longer valid and being broadcasted through delegates.

  • New: Moved AI domain automation tests to 'System.AI' over from 'System.Engine.AI'.

  • New: Removed AIController dependencies of the AIPerceptionComponent and now it can be used with non-AI agents.

  • New: Made the UE4ML plugin public. Engine/Plugins/AI/UE4ML/README.md contains the basic documentation.

  • Improved: Added a tiny optimization to avoid calling AIPerceptionSystem.OnNewPawn when the perception system is configured to not care about new pawns.

  • New: Switched AIPerceptionSystem's stimuli aging from previously using a timer to now counting elapsed time. In normal circumstances this doesn't make any difference, however, this change does help when trying to use the perception system in replays where UAIPerceptionSystem::StartPlay ends up not being called.

  • New: Added a blueprint-callable function to AIPerceptionComponent.GetPerceivedHostileActorsBySense and the native alternative GetHostileActorsBySense in addition to a new flexible filter GetFilteredActors that can use any arbitrary predicate for filtering.

Behavior Tree

  • Crash Fix: Fixed a BlackboardComponent issue resulting in a failed check crash when a new BlackboardComponent is being created as part of AAIController::UseBlackboard call and the BB asset being used has synchronized keys.

  • Bug Fix: Fixed an issue with behavior tree combo buttons in the editor resulting in creating multiple instances.

  • Bug Fix: Fixed Behavior Tree highlight for decorators using abort priority.

  • Bug Fix: Fixed stats for instance memory, number of loaded templates and number of created instances.

  • Bug Fix: Fixed computation of the child execution index of a composite node when the child is a task node with services.

  • Bug Fix: Fixed a bug where a tick function that is ready to run during the current frame could get rescheduled back to a previous frame

  • Bug Fix: Fixed a bug with Behavior Tree Component not Ticking even though ticking was still enabled.

  • Bug Fix: Fixed a bug in UBTNode::CastInstanceNodeMemory that was making it impossible for BT node child-classes to extend its parent class' memory structure.

  • New: Newly created Blackboard assets using the "New Blackboard" button are now automatically assigned to the BehaviorTree.

  • New: Added unregister queue for decorator abort to prevent removing auxiliary nodes while iterating through them.

  • New: Added unit tests when exiting a branch due to a parent decorator failure to validate that all auxiliary nodes below it are unregistered.

  • New: Made automatic creation of "SelfActor" entry in newly created blackboard assets optional. This is controlled via AddBlackboardSelfKey property in the Project Settings.

  • New: Added a failed-case warning to UBehaviorTreeComponent::RestartTree to let the user know that restarting has failed and why.

Debugging Tools

  • Bug Fix: Fixed FGameplayDebuggerCanvasContext::PrintAt functions to properly save and restore previous cursor and default positions

  • Bug Fix: Fixed EQSTestingPawn to update it's query and results upon selection in the Editor.

  • Bug Fix: Fixed SIGHT_LOG_SEGMENT and SIGHT_LOG_LOCATION AIPerception logging macros.

  • Bug Fix: Fixed Label drawing on a numerous amount of vislog shapes.

  • Bug Fix: Fixed CrowdManager from not displaying debug drawing if it's being run in Client-Server PIE.

  • New: Zoom is now applied at cursor position in VisualLogger.

  • New: Added tweakable cvars to control refresh rate "ai.debug.nav.RefreshInterval" and size of the displayed area "ai.debug.nav.DisplaySize" for navmesh through the GameplayDebugger.

  • New: AI testing framework improvements:

    • Changed signatures of test-time FAITestBase methods to give those functions a way to signal that the test went wrong.

    • Added an easier route for implementing a bunch of high-granularity tests using a common fixture. (see the IMPLEMENT_INSTANT_TEST_WITH_FIXTURE macro)

    • Switched a numerous amount of 'latent' AI tests to properly mark them as 'instant'.

    • Changed how assertions are being tested to replicate how UTEST_* macros work. Updated all AI tests to utilize the new approach.

  • New: Improved FGameplayDebuggerCategory_Perception::CollectData so that it can now collect PerceptionComponent data even if the current DebugActor is not AI-controlled.

  • New: Added a console command to the gameplay debugger (gdt.EnableCategoryName) that allows setting an enable/disable state of a category indicated by a partial name.

  • New: Added a flag to VisLog settings that controls how we differentiate between logged objects. The default behavior remains, but by setting the flag ForceUniqueLogNames, we generate IDs more probable to be unique across the engine session.

  • New: Enabled the capability to summon an in-game hud for GameplayDebugger during replay playback.

  • New: Added an option to enable shadows by default for gameplay debugger's text. (DebugCanvasEnableTextShadow in Project Settings).

  • Improvement: Fixed a vislog's performance and architecture issue that resulted in vislog constantly recreating AVisualLoggerRenderingActor in client-server PIE due to vlogging with different worlds.

  • Bug Fix: Fixed computation of the navmodifier area in the NavModifierComponent when using the failsafe extents.

  • Bug Fix: Fixed a scenario where navmesh might get deleted on load when streaming in NavigationData and NavMeshBoundsVolume from different levels depending on the loading order.

  • Bug Fix: Fixed holes in NavMesh caused by single voxel areas near the area boundary.

  • Bug Fix: Fixed computation of the vertices count between mesh and detail mesh when creating the BVTree in DetourNavMesh.

  • Bug Fix: Fixed InstancedStaticMesh components that were not registered to the navigation octree if their associated mesh was assigned post registration.

  • Bug Fix: Added error reporting and fixed calls to GetNavigationParent in UNavRelevantComponent that were being made before the cache initialization.

  • Bug Fix: Added a safe-guard to make sure FRecastBuildConfig.tileSize doesn't end up being 0.

  • Bug Fix: Fixed mesh loading dependency for static mesh using a ComplexCollisionMesh and ensured physical meshes are created before creating the nav collision. This fixes missing collisions when using ComplexCollisionMesh to create nav collisions for meshes.

  • Bug Fix: Fixed missing navmesh tiles when cooking maps from the editor 'Launch'. This includes fixing multiple AI tests failing when locally running in a cooked build, and enemy bots not moving when launching Sanctuary in the ShooterGame example project.

  • Bug Fix: Changed UNavigationSystemModuleConfig::UpdateWithNavSysCDO to no longer copy the value of UNavigationSystemV1.bStaticRuntimeNavigation since it resulted in the the value of static bStaticRuntimeNavigation persist between maps.

  • Bug Fix: Fixed possible NaN when calling GetPolysInBox.

  • Bug Fix: Fixed a serious issue with FRecastQueryFilter::SetIsVirtual that resulted in losing virtual function overrides if called on a derived filter class.

  • Bug Fix: Fixed navigation octree not being updated when custom navlinks state change. This fixes dynamic navmesh updates causing navlinks to reset to their default state.

  • Bug Fix: Modified how we react to RecastNavMesh's generation-category value changes. The main goal is higher reliability while changing properties in the editor, meaning that the property being changed is the driving factor of other properties' changes which keeps the value from being changed.

  • Bug Fix: Fixed a navmesh rasterization offset by one when projecting spans to bottom. This is related to the usage of the bFillCollisionUnderneathForNavmesh property.

  • New: Changed the CrowdFollowingComponent dependencies to use IRVOAvoidanceInterface from the movement component instead of the UCharacterMovementComponent.

  • New: Added CSV stats for navigation generation tasks.

  • New: Added error reporting for large areas dirtying the navigation data. Error reporting is disabled as long as navigation lock is effective.

  • New: Added advanced property "DirtyAreaWarningSizeThreshold" in NavigationSystem to report warning logs when tiles larger than the specified threshold are pushed to the dirty queue.

  • Optimization: Optimized RecastNavMeshGenerator MarkDirtyTiles by reducing search size in dirty tiles set and the number of copies between containers. The order of the pending elements is now preserved if tile sorting isn't used.

  • New: Added compile switches for segment links (WITH_NAVMESH_SEGMENT_LINKS) and cluster (WITH_NAVMESH_CLUSTER_LINKS) to allow projects that don't require them to save memory.

  • New: Added support for asynchronous pathfind queries with dynamic generation.

  • New: Synchronization between the async pathfind query tasks and the game thread. The sync point is implemented in OnWorldPostActorTick. This prevents pathfind requests from running at the same time as Navmesh generation tasks or beyond the engine frame boundary.

  • New: Replaced task to broadcast async pathfinding results by a queue that is flushed by the NavigationSystem update. This prevents tasks from being started during loading or other undesired locations.

  • New: Replaced task to register new active path instance by a lock to ensure all paths are registered for potential invalidation before adding a generated tile on the main thread.

  • New: Added a new project setting bUseExtraTopCellWhenMarkingAreas to control the addition of extra cells on top of shapes when marking areas. Added a similar option on FAreaNavModifier to allow exceptions. This is useful for objects that affect navigation on the floors above them.

  • New: Made UNavCollision.AreaClass read only in the StaticMesh editor if bIsDynamicObstacle==false.

  • New: Added 'bMaskFillCollisionUnderneathForNavmesh' option on NavModifierVolume to go along with 'bFillCollisionUnderneathForNavmesh'. This allows navvolumes to mark a 2D area to be ignored by the fill under feature.

  • New: Added additional logs to track geometry and their bounds when added to navigation.

  • New: Ensure to mark map packages as dirty when navmesh tiles are built, except for when automatic navigation build is occurring on load.

  • New: RecastNavMeshDataChunk can now be used to move and rotate navmesh tiles on the tile grid.

  • Added utilities to allow movement and rotation of navmesh tiles on the tile grid (dtTransformTileData and dtComputeTileOffsetFromRotation).

  • New: Added functionality to properly account for time slicing across multiple generators. The time slicing is now calculated in the navigation system.

  • New: Added some more stats to help trace down long navmesh tile generator times.

  • Improvement: Improved logging of locks and rebuild all for the navmesh.

  • Deprecated: IsNavigationBuildInProgress(bool) and IsBuildInProgress(bool). These functions behaved inconsistently between the different navmesh build types and were causing issues.


  • Crash Fix: Fixed a crash when re-opening an asset editor after a new preview mesh is applied.

  • Crash Fix: Fixed a crash when duplicating older Control Rigs.

  • Crash Fix: Fixed a crash when opening a level with a saved skeletal mesh component that has a post-process anim Blueprint.

  • Crash Fix: Fixed a crash when compiling an actor implementing an interface referenced by its mesh component's anim notifies.

  • Crash Fix: Fixed a crash when trimming a rich curve with invalid key handles.

  • Crash Fix: Renamed FComponentData in AnimationBudgetAllocator.h to FAnimBudgetAllocatorComponentData. This fixed a crash that's suspected to be caused by the compiler generating code with the size of another struct with the same name.

  • Crash Fix: Fixed various crashes when playing back Geometry Cache.

  • Crash Fix: Fixed crash when exiting while async animation compression is still in progress.

  • Crash Fix: Fixed crash in TallyErrorsFromPerturbation when animation contains a track that doesn't exist on the target skeleton.

  • Crash Fix: Fixed editor crash when exporting anim sequences with a changing UIDToArrayIndexLUT.

  • Bug Fix: Fixed FStringView overload of IAnalyzer::FEventData::GetString to now return the correct buffer size.

  • Bug Fix: Fixed notifies from not being fired for linked instances when running "root motion from everything".

  • Bug Fix: Pin watches now work for property access bindings.

  • Bug Fix: Fixed some thread safety issues with parallel physics blending.

  • Bug Fix: Fixed linear interpolation in the Pose Driver.

  • Bug Fix: Restricted fast-path MakeStruct support to split pins in order to ensure nodes update correctly.

  • Bug Fix: Fixed a bug with AnimNode_SaveCachedPose not properly propagating Initialize to children.

  • Bug Fix: Fixed linked anim graphs that were not properly tearing down their anim instances in TeardownInstance.

  • Bug Fix: Restricted Animation Blueprint compiler subsystem APIs.

  • Bug Fix: Re-enabled ticking for controlled components when the animation budget allocator is disabled.

  • Bug Fix: Implemented a Guard against tracing object properties when the channel is disabled.

  • Bug Fix: Fixed root motion playing faster when the animation budget allocator is enabled.

  • Bug Fix: Animation Layer defaults for a single group can now come from different Animation Blueprints.

  • Bug Fix: LinkAnimClassLayers can now be called from within UAnimInstance::UpdateAnimation.

  • New: Moved away from templated getters for value arrays, replaced with regular function overloading.

  • Bug Fix: Fixed baked additive data for Custom Attributes. Previously the base sequence data was not taken into account. + Changing additive automation test to use an animation sequence as base pose rather than ref-pose

  • Bug Fix: Ensure geometry caches adhere to lighting channels.

  • Bug Fix: Changed how multiple additive states are handled within the Animation Sharing system to ensure state-specific animations will be ticked.

  • Bug Fix: Fixed crash reimporting a skeletal mesh in skeletal mesh editor with LOD or weight filter applied.

  • Bug Fix: Fixed a crash when inspecting a BlendProfile property within the Blueprint Diff tool.

  • Bug Fix: Fixed SkeletalMeshes with AnimSharing from being unable to turn off ticking.

  • Bug Fix: Fixed Control Rig from folding into itself when loops are present.

  • Optimization: Heavily optimized TraceSourceFiltering plugin runtime performance.

  • Bug Fix: Added new EulerTransform Control Type to allow rotations above 180 degrees.

  • Bug Fix: Fixed collapsing hierarchy when using root motion on additive animations.

  • Bug Fix: Fixed virtual bones being reordered during removal.

  • Bug Fix: Changed how Anim Node Live Link determines whether or not an animation and basic roles are supported.

  • Bug Fix: Async anim compression now cancels existing attempts if we are requesting a new compression on the same animation.

  • Bug Fix: Fixed baked transform curves crash when the track doesn't currently exist.

  • Bug Fix: Fixed deterministic cook issue with the pre smart name skeletons.

  • Bug Fix: Fixed insert frame leaving raw/source animation data in invalid state.

  • Bug Fix: Get marquee selection is now working with Control Rig controls.

  • Bug Fix: Stopped UAnimSequence CDO from trying to load a compression scheme.

  • Bug Fix: Fixed looping in marker sync blend spaces.

  • Bug Fix: Removed filtering on async anim compression toast notification.

  • Bug Fix: Fixed blend space marker sync popping when markers land on animation boundaries.

  • Bug Fix: Fixed Apply compression in the editor from blocking the main thread.

  • Bug Fix: Added new functionality when selecting multiple Controls with different gizmo's supported (pos,rotate,scale), Select will now use the first gizmo, otherwise a flash will indicate as you cycle between them.

  • Bug Fix: Added option to edit mode in Control Rig. Edit mode will now translate multiple objects in their own local space instead of the first object's local space.

  • Bug Fix: Removed USkeleton reference from anim compression to address thread safety.

  • New: Sync groups can now optionally sync with other linked instances.

  • New: Added CustomAttribute feature to support float/int/string curve data within AnimationSequences on a per-bone basis.

  • New: Added customization details for (Baked)Custom attribute structures - Showing bone name rather than the index - Grouping the attributes according to their types - This will only show the number of keys for individual attributes. (no data)

  • New: Added support for URO/interpolation of custom attributes #misc fix attribute look-up crash with nullptr skeletal mesh

  • New: Added hide baked custom attributes property, which was causing performance issues with Slate.

  • New: Added AnimSequence.h Include into CustomAttributeCustomization.cpp

  • New: Moved deprecated functionality to AnimSequenceBase and deleted all overrides from child classes.

  • New: Reworked the TraceSourceFiltering tab.

  • Pulled out source filtering widgets into a separate CompoundWidget.

  • Wrapped different filtering widgets within SExpandableArea rather than into splitters.

  • Fixed incorrect ComboButton style name.

  • New: Reworked (SourceFiltering) World filtering tab.

  • New: Added toggle button style it, World filtering will now use toggle buttons rather than menu items.

  • New: Introduced high-level actor class filtering concept to TraceSourceFiltering plugin.

  • New: Added Actor class specific filtering.

  • New: Added Widget to SourceFiltering tab for setup.

  • New: Added Actor class filtering data to SourceFilterCollection.

  • New: Added filter picking functionality to session service.

  • New: Added ActorCollector, similar implementation to TActorIterator, this functionality filters the AActors at UObject hash table level, drastically increasing performance for a large number of actors vs IsA() within user filters.

  • New: Added ForEachObjectOfClasses.

  • New: Added the ability to create a data source filter class from within the Source Filtering tab.

  • New: Added Blueprint and Python exposed functionality to retrieve curve names from an Animation Sequence.

  • New: GetBoneIndex, GetRigidBone and GetBoneWeight on FSkinWeightVertexBuffer are now exported.

  • New: Converted 'a.SkinWeightProfile.LoadByDefaultMode=1' from Scalability to Default cvar. Users should set these in the device profile rather than scalability from now on.

  • New: FullBodyIK plugin - this includes a FullBodyIK Solver Node that you can use in the ControlRig.

    • Takes a list of Effectors as inputs.

    • Takes a list of Constraints, which you can apply to any joint within the chain.

    • Enables users to tweak Joint's Limit, Stiffness, and PoleVectors.

  • New: Added the ability to scale gizmo's in the Animate Panel.

  • New: Eigen library has been upgraded to 3.3.7

  • New: Added an "AddToClient" method in ULiveLinkPreset that will not destructively add subjects and sources to Live Link.

  • Improvement: Optimized TallyErrors to significantly reduce anim compression overhead and worker thread blocking.

Animation Assets

  • Crash Fix: Fixed a crash when deleting a pose if the pose was prior to a base pose.

  • New: Added Support to ControlRig AnimNode and Pose Driver to support LOD Threshold for optimization.

  • New: Added Weighted Tangents for Rich Curve in Animation Editor.

Animation Blueprints

  • Crash Fix: Fixed a crash when selecting nodes in sub-graphs of deleted nodes.

  • Crash Fix: Fixed a crash when compiling an anim BP containing an animation node with a TMap exposed as a pin.

  • Bug Fix: Prevented pasted linked anim graph nodes from referencing Blueprints with other skeletons.

  • Bug Fix: Fixed ensure when resetting a preview mesh while a specific animation is set to be previewed for an animation Blueprint.

  • Bug Fix: Fixed Linked Anim Layer nodes without input poses failing to trigger inertial blends.

  • Bug Fix: Fixed being able to place input poses in state machine state graphs.

  • Bug Fix: Fixed inertial blending not being triggered when switching a Linked Anim Layer to a child Animation Blueprint.

  • Bug Fix: Added the option to force an update on the K2Event Node, to guarantee that the node is up to date in case any function declarations have moved from parent to child.

  • Bug Fix: Sequence players can now use bindings for pin-exposed sequences.

  • Bug Fix: An orphan pin will no longer be created when hiding a pin.

  • Bug Fix: Removed experimental flag from linked anim layers.

  • Bug Fix: Fixed an issue with sync group collisions when syncing with 'component' scope.

  • Bug Fix: Fixed an issue with ConvertComponentPosesToLocalPoses.

  • New: Enabled auto-sizing functionality for bone reference widget to allow it to grow larger to show the full bone name.

  • New: Added support for CopyPose AnimNode to allow ComponentSpace Pose. This can be useful when you want to copy a part of the hierarchy as an optimization.

  • New: Added Support for CopyPose AnimNode to select which joints to copy from 'select a root bone to copy from'.

Animation Tools

  • Crash Fix: Fixed a crash when tracing an animation Blueprint with linked anim graphs/layers.

  • Crash Fix: Fixed a crash when closing the animation document tab with a curve editor tab open.

  • Crash Fix: Fixed editor crash in PersonaMeshDetails.cpp.

  • Crash Fix: Fixed a crash when removing a curve that hasn't been edited.

  • Crash Fix: Fixed a crash when a native control rig is selected when creating a new ControlRig.

  • Bug Fix: Fixed Animation Insights tab from always popping up in the editor when the plugin is enabled.

  • Bug Fix: Fixed frames provider to use Algo::LowerBound, it now supports int64.

  • Bug Fix: Added FStringView overload to string store.

  • Bug Fix: Fixed to prevent animation asset preview tooltips from continuing to advance after closing.

  • Bug Fix: Added a feature to loop animation insights playback inside the currently selected range.

  • Bug Fix: Fixed notify tracks not resizing when external modifications are made to notifies.

  • Bug Fix: Added copy/paste keyboard shortcuts for anim notifies.

  • Bug Fix: Converting a curve to metadata now zooms-to-fit for a consistent appearance.

  • Bug Fix: Added safety checks to prevent OOM when panning anim timeline after an anim notify is placed.

  • Bug Fix: Fixed notify labels jittering when label color changes.

  • Bug Fix: Fixed keyboard shortcuts registered in the Insights plugins from not functioning in standalone app.

  • Bug Fix: Fixed and improved snapping in animation editor timelines.

  • Bug Fix: Fixed Animation Insights traced data not appearing until PIE is stopped when enabling tracing while PIE is in progress.

  • Bug Fix: Disabling snapping to grid when editing 1D Blend Spaces now functions as expected.

  • Bug Fix: Changed Animation Graph Overrides layout to make it more readable with long property names.

  • Bug Fix: Added Ensure to maintain global and initial transforms in Control Rig, when reparenting items in hierarchy view.

  • Bug Fix: Moved Control Rig BoneIndex to CachedRigElement.

  • Bug Fix: Added Support for debug watches on variable nodes. You can now right click pins on variable nodes and debug watch them in the editor.

  • Bug Fix: Control Rig now uses defaults when exporting RigVM memory contents. Previously the VM was storing differences to a zero mem version of each register, with this fix we now use the default for structs.

  • Bug Fix: Control Rig will now draw bones in the editor when there is no skeletal mesh.

  • Bug Fix: Fixed marking assets as dirty upon opening Control Rig.

  • Bug Fix: Fixed Bool Math Constants from not working correctly in Control Rig.

  • Bug Fix: Fixed connectability issues by allowing mutable nodes to connect to previous nodes in the execution stack.

  • Bug Fix: Fixed a bug with resetting ControlRig Mapping info.

  • New: Added basic RBF interpolation nodes to Control Rig.

  • New: Added ability to trace an Object's property to the trace stream.

  • New: Added functionality to preserve camera speeds in animation editor viewport similar to how we preserve FOV.

  • New: Moved virtual destructor to ControlRigDrawContainer from ControlRigDrawInterface.

  • New: Implemented Base functionality around interaction rigs in Control Rig.

  • New: Introduced new "offset transform" for controls which allows spatial offsets without the use of spaces.

  • New: Implemented Looping in Control Rig. Users now have the ability to build graphs which can loop, solve multiple parts of the pose sequentially or perform a computation multiple times.

  • New: Implemented RigElementCollection for Control Rig. The collection data type allows the ability to group a series of items in the hierarchy using name based search, hierarchy traversal, and group operations such as union, difference etc.

  • New: Added Support for ControlRigComponent in Sequencer.

  • New: Added Support for Curves in the Control Rig Component.

  • New: Added Mirror functionality in Control Rig for hierarchies. Includes support for bones, controls, and spaces. This functionality can be utilized by right clicking elements in the hierarchy and choosing "Mirror" to create a matching, mirrored hierarchy.

  • New: Added Support for enums in Control Rig. Controls can now represent enums. To utilize this feature, turn the Control to be of type int32 and enable the enum setting in the details panel.

  • New: Added RigVM Support for external variables in Control Rig. External variables represent unowned memory and allow the VM to read / write to those.

  • New: Added Control Rig Inversion: Added Backwards event to enable users to define the execution to invert the rig, solving from an existing pose to animation inputs.

  • New: Added Control Rig: Constant folding - allows the VM to fold constant branches into a resulting set of values to optimize runtime performance.

  • New: Added Control Rig Component - a new component to host a Control Rig on an actor and connect other components. For example, this allows the ability to drive static meshes.

  • New: Added pin redirector functionality to Control Rig. Pins / struct members now properly support redirectors. If you need to change a data structure after serializing assets, you can rely on the default pin director functionality in the project ini files. The Control Rig graph will pick up the redirection and adjust pin default values accordingly for backwards compatibility.

  • New: Enabled blueprint-side variables and implemented an upgrade path. Control Rig now uses normal Blueprint Variables (through the MyBlueprint) widget. Parameters are auto converted to public variables in UE 4.26.

  • New: Added support for if and select branching in Control RigVM. New If and Select nodes perform branching based on a value selection. To use this functionality drag a pin out and look for If and Select in the context menu.

  • New: Added Support for nested dynamic arrays in Control RigVM.

  • New: Added Aim Math node in Control Rig.

  • New: Introduced bracketing scope system to bracket init, update, setup, interaction and sync in Control Rig.

  • New: SetRelativeTransform node now replaces SetRelativeBoneTransform.

Deprecation Note: Users won't be able to create the old nodes, but content won't break. Nodes will be flagged as "deprecated" with a red node title.

  • New: Updated descriptions, keywords, and tooltips in Control Rig nodes.

  • New: Lift error reporting nodes to be interactive - nodes will now show changes as the graph is running in Control Rig.

  • New: Added new generalized GetTransform node to replace GetBoneTransform and 5 other nodes in Control Rig. The GetTransform takes in an item, and can now read any transform within the hierarchy.

  • New: Added Control Rig operation nodes : Name endswith, startswith, contains. String operation / Name operation nodes.

  • New: Control Rig will now Save default expansion state for nodes. Users can provide a default expansion state for a node and save it by right clicking the node and choosing "Save Default Expansion State".

  • New: Enabled Control Rig Component to drive the root component of an Actor.

  • New: Added a new Control Rig Ability to create collections by drag & dropping.

  • New: Added a Control Rig Collection Difference node.

  • New: Moved mode on FK Rig to UProperty instead of Control RIg.

  • New: SetTransform node in Control Rig will now replace SetBoneTransform, SetSpaceTransform, SetControlTransform, SetInitialTransform, SetInitialSpaceTransform. Users won't be able to create the old nodes, but content won't break. Nodes will be flagged as "deprecated" with a red node title.

  • New: Added support for sending events from a Control Rig to the Engine/Editor.

  • New: Added an "Additive" option to the context menu in FK Control Rig.

  • New: Added Branching support for execution model in Control Rig.

  • New: Added new Control Rig node: Propagate to Children Unit. This node enables the ability to propagate a transform change within the hierarchy to the children of a provided item. This is useful if you want to delay the propagation to a later time and manually call it.

  • New: Initialize Verlet integrator during the first run, not during init. To avoid an issue concerning determinism, we now initialize all verlet simulated nodes during the first run of the node instead of initialization time.

  • New: The Rig Hierarchy now uses Int32 for comparison of hierarchy topology versions. (adding, removing, renaming / repairing items).

  • New: Introduced notion of SliceContext per pin in Control Rig.

  • New: Added weight to fit on a curve node in the Control Rig.

  • New: Added new node to Control Rig 'Quaternion Scale Unit'. A node which enables magnitude scalability of a quaternion.

  • New: Added 'Twist Bones Unit Node' to Control Rig.

  • New: Added PreSetup / PostSetup events and support units to Control Rig Component.

  • New: Added new functionality to Control Rig to support entry names + init execution.

  • New: Enabled Control Rig access to mapped elements in Blueprint.

  • New: Added Blueprint functionality to Control Rig component. You can now drive the Control Rig Component's functionality through Blueprint.

  • New: Added Hierarchy accessor units such as GetParent, GetParents, GetChildren and GetSiblings to Control Rig.

  • New: Introduction of slice context and support for a loop node in Control Rig.

  • New: Added Support for additive mode to FK Control Rig.

  • New: Introduced slices data structure to ExecuteContext and Dynamic Memory support in Control Rig.

  • New: Disabled Control Rig auto-compile during setup mode.

  • New: Added new hotkey Ctrl+Shift+G to reset all Control Rig transforms.

  • New: Provided access to event names and information about controls being accessible. The Control Rig API including the RigVM API has been extended to provide access to the supported event names as well as the accessibility of Controls.

  • New: Pin Watches now support slices (multiple values per loop) in Control Rig.

  • New: Added new node 'Item Exists' to Control Rig. Item Exists node will return false if a specified item cannot be found.

  • New: Enabled Shift P hotkey to Parent/Unparent User defined bones. Within the Rig Hierarchy Widget or the Control Rig Editor viewport press 'Shift+P' on your keyboard for parenting or unparenting the selection to the root of the tree.

  • New: Added draw space functionality to Control Rig. The Control Rig Editor's viewport now provides the option to draw all spaces by default.

  • New: Introduced support for the constant / varying state of pins and nodes in Control Rig to prepare for constant folding.

  • New: Events coming from Control Rig will now provide a total time.

  • New: Added Ensure to set map range and other settings on alpha interp during Execute in Control Rig.

  • New: Enabled the option to retain control values within the ControlRigEditor during compile. Within the editor preferences you can now choose if you want to retain the pose of Controls during a compile or not.

  • New: Added a new menu entry for adding an FK Rig in Control Rig and removed additive and automaticbonecurve rig from the asset filter when adding a track.

  • New: Added a new setting to Control Rig that enables the automatic reset of all transforms on compile.

  • New: Control Rig / RigVM: Change MaxArraySize tag to ArraySize Since we no longer support resizing of arrays we are dropping the Max prefix.

  • New: Replaced Control Rig Name unit.

  • New: Added Copy & Paste functionality to mouse location in Control Rig.

  • New: Added Support to Control Rig for creating comments using the 'C' hotkey.

  • New: Moved all DebugSettings on Control Rig node to "details only".

  • New: Added DetailsOnly functionality for RigUnits. Pins can now provide the "DetailsOnly" meta tag to make them show in the details panel.

  • New: Implemented access to all Control Rig control values in python. This includes minimum and maximum.

  • New: Upgraded Control Rig's AimBone, BoneHarmonics, ChainHarmonics and DistributeRotation to use FRigElementKey.

  • New: Added Mirror functionality to the Control Rig graph. To use, right click on a selection of nodes to allow string replacement and mirroring of transform pins.

  • New: Control Rig Sequencer will now use a display name test to track a name, rather than the class name.

  • New: Implemented new SetControlVisibility Node in Control Rig. You can utilize Control Visibility within the graph to hide sets of controls.

  • New: Implemented RigVM access to currently active instructions.

  • New: Implemented new nodes to Control Rig 'Collection enumerate', 'Index accessor' and 'get length'. These nodes enable the user to get the index of an enumeration as well as the overall count / length.

  • New: Added new ControlRig Component to get two auxiliary Blueprint functions which simplify mapping elements.

  • New: Added new Plane intersection node to Control Rig.

  • New: Implemented int32 nodes and all related int32 math nodes to Control Rig.

  • New: Control Rig will now Set Initial Transforms on Controls in order to affect Offset.

  • New: Renamed Control Rig helper nodes for item and collection.

  • New: Implemented Control Rig API for introspection on available events / entries.

  • New: Added support scale for BasicIK in Control Rig.

  • New: Added Control Rig support for auto compile during setup mode.

  • New: Added weight to Control Rig DistributeRotation node.

  • New: Replaced GetBoneRelativeTransform with GetRelativeTransform node in Control Rig. Users won't be able to create the old nodes, but content won't break. Nodes will be flagged as "deprecated" with a red node title.

  • New: Replaced AddBoneTransform with OffSetTransform node. Users won't be able to create the old nodes, but content won't break. Nodes will be flagged as "deprecated" with a red node title.

  • New: Added Control Rig functionality to apply effector transform even if FABRIK or CCDIK doesn't change bone locations. In certain scenarios FABRIK and CCDIK nodes would not perform changes to the effector in the past.

  • Improvement: Improved keyboard workflow in Control Rig with pin name list widgets.

  • Improvement: Improved gizmo material and integrated with eye adaption in Control Rig.

  • Improvement: Added Branch folding for branch, if and select nodes. Optimized Compiler to remove unnecessary dead branches when using If and Select nodes.

  • Deprecated: Removed IControlRigManipulatable and IControlRigManipulationLayer in Control Rig.

  • Deprecated: Deprecated Blend(Transform) Node in Control Rig.

  • Deprecated: Removed ControlRigPickerWidget. The Control Rig Picker is no longer supported and has been removed.

  • Deprecated: Deprecated all other get transform nodes and updated "GetUnitLabel" in Control Rig. Users won't be able to the old nodes anymore, but content won't break. Old nodes will show up as "deprecated" with a red node title.

  • Deprecated: Removed the manipulation module and moved the GizmoActor to the Control Rig module.

  • Deprecated: Disabled Point Simulation Node in Control Rig. Please note that this node is using a deprecated point solver which is going to be replaced by another physics solver. Please do not rely on this node.

  • Deprecated: If you were using the "MaxArraySize" metadata tag in a custom Control Rig node, replace it with "ArraySize" for 4.26+.


  • Crash Fix: Fixed various crashes when importing Alembic as a Geometry Cache or a Skeletal Mesh.

  • Bug Fix: Fixed materials not applying correctly to a flattened GeometryCache.

  • Bug Fix: Fixed a bug when importing animations that would try to report invalid progression values on an animation with multiple channels.

  • New: Added a new Alembic import option to skip computing tangents that can improve playback performance of a streaming Geometry Cache.

  • New: Added an experimental editor plugin to stream a GeometryCache from an Alembic file without having to import it as an asset. Enable the "Geometry Cache from Alembic File(Experimental)" plugin to start using it.

  • New: Improved playback performance of animated meshes inside a USD stage.

Skeletal Mesh

  • Bug Fix: Fixed missing macros in FSkinWeightVertexBuffer and FSkinWeightDataVertexBuffer.

  • Bug Fix: Explicitly specify which UAV buffers participate in overlapped compute shaders.

  • Bug Fix: Exposed Skin Weights public API to external modules.

  • Bug Fix: Fixed PoseableMeshComponent to now tick when the transform is updated.

  • New: Added warning on mobile if skelMesh LOD number of influences per vertex is greater than twelve.

  • New: Exposed pre-skinned vertex buffer to local vertex factory so that pre skin vertex position is available to material nodes that use it when derived vertex factories generate position buffers that are post skinned.

  • New: Exposed pre-skinned vertex buffer to local vertex factory so that pre skin vertex position is available to material nodes that use it when derived vertex factories generate position buffers that are post skinned.

  • New: Added LODSyncComponent to synchronize LOD across different mesh components, for example, SkeletalMeshComponent or GroomComponent. This can be used for synchronizing LOD to ensure the intended LODs are used together between different parts.

  • New: When the recomputing tangent option is on in GPUSkinCache, allow the user to select which Vertex Color channel to use to blend between the recomputed tangents and the skinned tangents. The color green is used as the default channel color.

  • New: Allowed classes that have FBoneReference properties to specify what skeleton to use by inheriting from IBoneReferenceSkeletonProvider.


  • Crash Fix: Fixed a crash on an audio device hot swap when channels have changed.

  • Crash Fix: Fixed a garbage collection crash with an async task owned by FMixerSourceBuffer.

  • Crash Fix: Fixed a crash due to a race condition with the Audio Spectrum Analyzer.

  • Crash Fix: Fixed a crash on load with the Oculus audio plugin.

  • Crash Fix: Fixed a crash that occurred during Submix Graph editing when trying to connect certain pins to or from a parent submix.

  • Bug Fix: Cooked Quality Node Culling now works properly; when enabled, projects will only cook the branches of the quality node that are enabled for that platform, discarding all other branches. This saves memory and speeds up serialization.

  • Bug Fix: Fixed a SoundConcurrency issue where StopLowestPriority and StopLowestPriorityThenNewest had swapped logic.

  • Bug Fix: Fixed a deadlock caused by listeners attempting to access an audio device instance during device destruction when it should no longer be accessed.

  • Bug Fix: SoundCueTemplate code now utilizes the new ClassTemplateEditorSubsystem.

  • Bug Fix: The proper SoundClass per SoundWave now shows when using stat waves/au.debug.soundwaves 1.

  • Bug Fix: Low-pass filters now behave correctly when set through a Sound Class mix.

  • Bug Fix: Fixed a submix issue with muting audio output in unrelated submixes.

  • Bug Fix: Fixed issue with ambisonic decoding where rotation had to occur in both elevation and azimuth to update the decoding instead of either/or.

  • Bug Fix: Fixed a bug where SoundCues wouldn't update the Stream Caching loading behavior of their USoundWaves.

  • Bug Fix: Fixed the mic noise gate threshold for OSS VoIP.

  • Bug Fix: Fixed a bug where sounds with a short fade-in were not playing.

  • Bug Fix: Impulse responses (IRs) have been removed from the list of assets that can be created from the Content Browser. This fixed an issue when using raw imported .wav data vs. compressed data for IR Assets.

  • Bug Fix: Fixed the default device selection in OSS VoIP.

  • Bug Fix: Fixed an issue with a flipped X-axis in ambisonics decoding.

  • Bug Fix: Fixed a bug where sounds in a concurrency system were becoming orphaned and stale if set to PlayWhenSilent.

  • Bug Fix: Added a normalized version of FSpectrumAnalyzer::GetMagnitudeForFrequency() called GetNormalizedMagnitudeForFrequency().

  • Bug Fix: Fixed submixes not re-registering in editor when modifying an effect array or reparenting submixes. Also fixed a crash that occurred when attempting to call InitInternal() from a render thread.

  • Bug Fix: Fixed a memory stomp in the editor when importing audio files.

  • Bug Fix: Fixed a bug with import math for impulse responses.

  • Bug Fix: Fixed an error on the gains of the upmixing function Mix2ChannelsTo6ChannelsFast.

  • Bug Fix: Fixed an issue with AudioComponent::StopDelayed() not stopping the audio component under certain conditions.

  • Bug Fix: A fix was made for the submix envelope follower delegate not outputting the correct envelope for the submix.

  • Bug Fix: Fixed a race condition on rebuilding the submix graph.

  • Bug Fix: Fixed an issue with updating params on submixes.

  • Bug Fix: Fixed a bug in the source effect chain initialization that caused source effects to not play in certain cases.

  • Bug Fix: Fixed the ability for audio components to control source bus sends in Blueprint through SetSourceBussendPreeffect and SetSourceBusSendPostEffect.

  • Bug Fix: Swapped function descriptions to match audio volumes for interior and exterior settings.

  • Bug Fix: Fixed an issue with sound class-based distance attenuation scaling.

  • Bug Fix: Fixed the audio component start time offset for playback percentage.

  • Bug Fix: Fixed short XMA stream truncation.

  • Bug Fix: Fixed a bug with passing an incorrect target platform name for cook overrides.

  • Bug Fix: Fixed an issue with soundfield submixes connecting to incompatible soundfield submixes in the submix graph. They are now shown as disconnected and incompatible.

  • Bug Fix: Fixed an issue with submix assets not opening correctly when double-clicked in the Submix Editor.

  • Crash: Fixed a crash caused by the immediate teardown of an audio device if the device fails to initialize.

  • Bug Fix: Fixed the audio distortion when resuming after a constrain/suspend app life cycle event on Xbox.

  • Bug Fix: Fixed a buzz issue with resonance when outputting to output > 2 channels (such as for surround) and graph has no binaural sources to process.

  • Bug Fix: Fixed a crash when calling GetMMDeviceInfo.

  • Bug Fix: Fixed an assert in FinishRecordingOutput when given an invalid path argument.

  • Bug Fix: Fixed a COM exception in the audio mixer.

  • Bug Fix: Fixed an issue with the non-realtime renderer outputting silence.

  • Bug Fix: Fixed a race condition in the audio renderer by refactoring the audio render buffers to use a thread-safe circular buffer.

  • Bug Fix: Fixed an OSS VoIP failure that occurred after level travel.

  • Bug Fix: Fixed an APU crash caused by a race condition on shutdown on Xbox.

  • Bug Fix: Fixed the support for audio Niagara Data Interfaces on the CPU.

  • Bug Fix: Fixed an issue of sounds failing to cull based on priority.

  • Bug Fix: Fixed an issue where sound cue node culling was not working in non-editor builds.

  • Bug Fix: Fixed an issue with rotating ambisonics sound sources.

  • Bug Fix: Fixed to ensure on servers when USoundWave::RetainCompressedAudio is called. Retained audio is not relevant for servers.

  • Bug Fix: Fixed a regression in the way SoloSound console command works.

  • Bug Fix: Fixed an issue for when sample rate quality changes asset do not recook.

  • Bug Fix: Fixed an issue with source buses and submixes not getting properly imported or discovered when the editor is run with -nosound.

  • Bug Fix: Fixed a bug with quality 100 seekable streams (LPCM) hitting the EOF correctly.

  • Bug Fix: Fixed a bug with baked envelope data returning data for non-looping sounds.

  • Bug Fix: Fixed a hang on PIE exit.

  • Bug Fix: Fixed a shutdown for single-threaded applications.

  • Bug Fix: Fixed a rare hang when the application exits on Xbox.

  • Bug Fix: Fixed a dynamics processor key gain issue.

  • Bug Fix: Fixed an issue where the reverb dry level was not working correctly.

  • Bug Fix: Fixed a bug with the IR asset being in the correct category in the sound submenu.

  • Bug Fix: Fixed a race condition with audio device swapping.

  • Bug Fix: Fixed a Solo Sound Wave action that was not working.

  • Bug Fix: Fixed an issue with the Create New option in the editor for IR assets since they are converted from SoundWaves.

  • Bug Fix: Fixed an issue with audio assets getting compressed/retrieved from the DDC even when cooking the server, which resulted in long server cook times.

  • Bug Fix: Fixed a bug with multiple submix effects not processing.

  • New: Migrated modulation plugin debug commands to work properly with the au.debug.soundmodulators command.

  • New: A new interface was added for procedural audio generation to avoid UObject dependencies in the audio render thread: the ISoundGenerator.

  • New: Audio volumes can now send audio to submixes.

  • New: Dry (initial sound) and wet (repeated sound) level controls were added to submixes.

  • New: Improved the FAudioChunkCache::GetChunk()—if it is called with bBlockForLoadCompletion, it will perform that load synchronously instead of starting and waiting for an async task.

  • New: Added a LoadingBehavior category to the Audio Stream Caching section in AudioMemReport, as well as an on-screen debug print.

  • New: Added a new Audio Bus Asset feature that allows audio to be routed to effects but not rendered as audible.

  • New: A multiband compressor was added to the DSP library.

  • New: Multi-channel sources can now send to source buses.

  • New: Real-Time Submix Spectrum Analysis Delegate contains a host of improvements and new functionality over the existing submix spectral analysis utilities:

    • Convenience functions for creating spectrum bands make it easier to choose the right set frequencies for the sounds you want to visualize.

    • Custom delegate events and a configurable update rate provide easy control over the runtime cost of performing spectral analysis.

    • Normalization and Auto Range make the spectrum analyzer robust to all types of content.

  • New: Subtitle-related properties of Sound and Dialogue Wave are now exposed to Blueprints.

  • New: Added AssetUserData support to SoundBase.

  • New: Organized attenuation categories when they display in the Details panel.

  • New: Added a new convenience method in Blueprints for creating an OSC Server and Client that avoids common problems with the garbage collector.

  • New: Moved the Audio Modulator update to the audio render thread for smoother transitions and better audible masking of game thread hitches.

  • New: Added the ability to use PlaySound2D for non-UI related sounds.

  • New: Updated libsndfile to 0.1.9.

  • New: Added a Modulation Envelope Follower Generator.

  • New: Added a Class template.

  • New: Added the ability for plugins to define their own Modulation Generators.

  • New: Added data-driven Modulation Parameters, which are now assets that can be referenced by Modulation Destination Settings and modulator types.

  • New: Added delegates for reporting when playstate and virtualization change in an AudioComponent.

  • New: Added functions to audition Modulation Mixes in the editor.

  • Improved: Added an SIMD-optimized version of the plate reverb effect.

  • New: Added visual data and layouts for linear and unit encoding for Modulation Bus values in the editor.

  • New: Added a retrigger threshold for sound concurrency. Sounds that trigger on the same sound concurrency below the threshold will not be played.

  • New: Added new CVAR-based debug commands that replace and deprecate the older, stat-style debug commands.

  • New: Added an option for enabling all viewports in editor (present and future), as well as per viewport, by setting -allViews to on or off.

  • New: Added support for True Stereo impulse responses for the Convolution Reverb Submix Effect.

  • New: Additional multichannel mixing controls provide the tools needed to create a consistent convolution reverb for stereo and surround channel configurations.

  • Deprecated: Deprecated OnStart and OnStop synth component virtuals as they are redundant to OnBeginGenerate and OnEndGenerate.

  • Deprecated: Deprecated specialized import for multiple .wav files with special cased file names.


  • Bug Fix: Expected errors in automated tests are no longer reported as errors in commandlet runs or causing commandlet runs to return a non-zero return code.

  • Bug Fix: Fixed a typographic error ("Screnshots") for Automation errors.

  • Bug Fix: Fixed Linux packaging failure resulting from Lumin key being copied locally into Gauntlet.

  • Bug Fix: Fixed an issue where, on some platforms, new and modified screenshots for the automation framework could not be approved in the Editor.

  • New: Added stompmalloc and d3ddebug options to the EngineTest BuildGraph script.


  • Crash Fix: Fixed a crash on cook with Blueprint nativization enabled if an unexpected class type was specified in the 'ExcludedBlueprintTypes' list.

  • Crash Fix: Fixed crash loading a map after adding an entry to a set on an instance of a Blueprint when the set's default values in the Blueprint had at least 1 entry.

  • Crash Fix: Fixed an occasional crash during nativization of child Blueprint assets that were reparented to a native Actor class in an older editor version.

  • Crash Fix: Fixed a crash when renaming a nested UserDefinedStruct would incorrectly access pin indices after reconstruction.

  • Crash Fix: Fixed a crash when creating a Blueprint User Struct with the same short name as a C++ struct.

  • Crash Fix: Fixed a crash in SetLinker when loading actors with components that have subobjects.

  • Crash Fix: Fixed a crash that could occur after deleting and replacing references to a Blueprint asset.

  • Crash Fix: Fixed crashes that could occur after reloading Blueprint assets from the Content Browser.

  • Crash Fix: Using Undo after duplicating Custom Event nodes no longer causes a crash.

  • Crash Fix: Fixed a crash in SGraphPinKey construction of orphaned pins.

  • Crash Fix: Fixed a crash that could happen when gathering asset registry tags from a cooked Blueprint.

  • Crash Fix: Fixed an editor crash after converting a class with a user-defined type dependency when using the Blueprint native code generation developer menu tool.

  • Crash Fix: Fixed an editor crash that could occur when compiling a Blueprint Function Library with a function graph that contained an error if a dependent Blueprint contained a call to the library function in its construction script.

  • Crash Fix: Fixed an editor crash on process exit if one or more Blueprint assets were still being indexed in the background.

  • Bug Fix: Prevented pin types from propagating on the target array if it is a wildcard and there is already a connection type.

  • Bug Fix: Updated EnumEditorUtils to propagate to user defined structs as well, not just classes when the order of an enum is changed.

  • Bug Fix: Fixed the Blueprint delegate references not being updated after duplication.

  • Bug Fix: Added a missing code thunk for nativized Blueprint assets utilizing an array swap node.

  • Bug Fix: The construction script is now correctly run from FinishSpawning when an actor is spawned via Blueprint in the editor world.

  • Bug Fix: Fixed Reset Instance Changes to Default for Blueprint added components.

  • Bug Fix: Function nodes added by dragging from the function list will now correctly snap to the grid.

  • Bug Fix: Disabled adding parameters to functions during PIE.

  • Bug Fix: CompileAllBlueprints whiteList option will now work as one. Previously, It was acting as a black list.

  • Bug Fix: Fixed call in editor buttons visible in Blueprint editor.

  • Bug Fix: Fixed incorrect encoding on UHT boilerplate source files generated from a nativized Blueprint class header file with Unicode characters in one or more Blueprint function names.

  • Bug Fix: Fixed a potential C++ type ambiguity in a nativized Blueprint function call site with at least one input argument that accessed a non-native member through an unconverted stub class.

  • Bug Fix: Hid Shortest Path Pin by default on the Ease Function Blueprint node.

  • Bug Fix: Added missing nativized Blueprint typecast support for map key/value and set element wildcard-typed function call inputs.

  • Bug Fix: Fixed an edge case in nativized Blueprint ctor code generation where custom collision profile response values would sometimes not be applied to a mesh instance.

  • Bug Fix: Component Expose on Spawn properties are now correctly set before OnConstruction or OnRegister events occur.

  • Bug Fix: No longer display the bindable events if the object property cannot be resolved.

  • Bug Fix: Added Component nodes now correctly hide the comment bubble on disabled "ghost" nodes.

  • Bug Fix: TSubclassOf is now correctly reflected to nativized Blueprint C++ code for "wrapped" object ptr types.

  • Bug Fix: Fixed negative time check in K2_SetTimer.

  • Bug Fix: Instanced components will no longer remain visible in the component tree view after resetting to Blueprint defaults.

  • Bug Fix: Fixed a bug where using a reroute node connected to GetClassDefaults would cause pins to become hidden on compile.

  • Bug Fix: Fixed a bug where variables created by promoting a pin would lose their default value on undo.

  • Bug Fix: Fixed an unrecognized tab that appeared when opening a Blueprint that was not up-to-date in defaults-only editor mode.

  • Bug Fix: Fixed "Call Parent Function" nodes having an incorrect tooltip in duplicated Blueprints.

  • Bug Fix: Fixed non-commutative binary operators in FBasicMathExpressionEvaluator.

  • Bug Fix: Removed the ability to create a Property Reference type in the Blueprint editor as it is not functional on it's own. Native FFieldPath properties can still be used with a customization.

  • Bug Fix: Added missing code thunks for auto generated SetMapPropertyByName()/SetSetPropertyByName() call sites in a nativized Blueprint class.

  • Bug Fix: Fixed a compiler error that occurred when removing interfaces from duplicated Blueprints.

  • Bug Fix: Added IsConnectionDisallowed to UK2Node_CallArrayFunction to correctly block connections from related object classes.

  • Bug Fix: Added a KismetSystem function for setting FColor's properly, instead of incorrectly calling the setting for "FLinearColor" upon compilation.

  • Bug Fix: Added 'Self' as a reserved name for function parameters in Blueprints.

  • Bug Fix: When collapsing a to Function and Add Function in a const Blueprint, it will now automatically make the new function const.

  • Bug Fix: Updated the green "+" or "view" buttons in the details panel to properly utilize the ComponentTemplate class so native component delegates will show up as well.

  • Bug Fix: BP Variable sets will now only clear wildcard types if both pins are empty.

  • Bug Fix: Removed an unnecessary call to NotifyPostChange which was causing UserDefinedStruct recursion guard to trigger and not save references to assets.

  • Bug Fix: MaterialParameterCollection can now be promoted to variable in Blueprints.

  • Bug Fix: Map Variables now have an icon in the Blueprint Editor Action Menu.

  • Bug Fix: Fixed interface-typed inputs on non-native Blueprint functions leading to a compile error in its nativized C++ code if the input was cast to an object inside the function graph.

  • Bug Fix: Fixed case sensitivity for Switch on String node.

  • Bug Fix: Added soft class/object support to FDynamicOutputHelper::IsTypePickerPin. Remove invalid ensure about dynamic output pin directions.

  • Bug Fix: Updated the amount of padding for graph nodes by default so that it better fits our compact math nodes.

  • Bug Fix: Fixed non-nativized Blueprint stub functions failing to copy values back out to any output parameters after VM execution when using exclusive nativization.

  • Bug Fix: Fixed the default BlueprintNativeEvent method definitions in the DataSourceFilter/IDataSourceFilterInterface APIs to be overridable in C++ in order to support nativization of Blueprint implementers.

  • Bug Fix: Added more explicit messaging for map/set errors when attempting to create a container of non-hashable type.

  • Bug Fix: Disabled connections of exec pins to array, set, or map container nodes.

  • Bug Fix: Made local function variables global when converting from a function to an event.

  • Bug Fix: Fixed keyboard navigation issue after renaming a component in Blueprint Editor.

  • Bug Fix: Added UFUNCTION parameter name validation to UHT on native functions.

  • Bug Fix: No longer set autogenerated nodes to transactional unless the owning graph is also marked as transactional.

  • Bug Fix: Added ATAN2 naming alias which allows it to be placed in the Math Expression node.

  • Bug Fix: Removed Blueprint recompiling on rename as it is redundant with new BP Compiler updates and causes a re-entrance into FileHelpers::SaveWorld.

  • Bug Fix: Dragging off a pin in Blueprint Function Libraries will now allow the user to Promote it to a Local Variable.

  • Bug Fix: Components added directly as a child node will now have an initial transform consistent as if they were added to the root and then attached to the parent node.

  • Bug Fix: Native Components will now only display the "Add Event" context menu if editing is allowed on them.

  • Bug Fix: Duplicating a function now correctly updates the details panel to edit the new function.

  • Bug Fix: Marked child Blueprints as modified when removing an interface to prevent phantom references in the Reference Viewer.

  • Bug Fix: All subobjects are now preloaded when preloading templates for the Inherited Component Handle.

  • Bug Fix: Fixed duplicate nodes being created when Promoting a collapsed graph to a function or macro.

  • Bug Fix: Exported the FFindInBlueprintsResult and FStreamSearch APIs.

  • Bug Fix: Duplicating variables inherited from a parent class in the MyBlueprint panel now copies the default value from the old variable to the new one.

  • Bug Fix: Enabled renaming Enumerators to the same name with different capitalization.

  • Bug Fix: Self-context function calls that are implemented as an event will now be properly created as such.

  • Bug Fix: Enabled wildcard pins for assignment nodes to take on container types from other wildcard pins.

  • Bug Fix: Fixed Blueprint type-checking logic so that an error is properly raised after a member variable changes type.

  • Bug Fix: Fixed an edge case where custom collision profile response values were not being applied in nativized Blueprint ctor code.

  • Bug Fix: Refactored UEdGraphPin::GetPrimaryTerminalType to use the existing FEdGraphTerminalType::FromPinType method.

  • Bug Fix: Fixed non-functional collision in a nativized Actor Blueprint with one or more components set up to use a custom collision profile to override the component's inherited default collision response.

  • Bug Fix: Added a check to guard against a reported crash while scanning a new object redirector to a Blueprint asset when surfaced by the directory watcher.

  • Bug Fix: Fixed variables on spawned Blueprint instances from not being initialized to modified native struct types with details customization and no UPROPERTY() fields.

  • Bug Fix: Fixed a compile error during packaging when nativizing a Blueprint class with a MakeStruct node used to create an FFrameTime struct value literal.

  • Bug Fix: We now validate bound events at compile time to ensure that the owning component has not been removed from the Blueprint. This may throw Blueprint Warnings in existing assets and exposed events that were bound, but never called. The error will read " does not have a valid matching component".

  • Bug Fix: Blueprints with containers that reference user-defined structs that have been deleted outside of the editor are no longer unfixable. Users can now delete these references so that the Blueprint compiles again.

  • Bug Fix: Skeleton classes will now only reinstance into valid class hierarchies, enabling garbage collection to handle them properly, avoiding reprocessing during every instance.

  • Bug Fix: Blueprint diff tool's AdvanceMapIterator and AdvanceSetIterator will now correctly advance valid iterators. This fixes a bug where only the first element in a map would be diffed against, but it would be done N times.

  • Bug Fix: We no longer relocate transient ICH override templates when compiling a parent Blueprint class. This avoids archetype lookup failures on a child class load.

  • Bug Fix: Added functionality to break custom event node links when promoting from a collapsed graph to a new function graph to avoid creating a cross-graph pin link.

  • Bug Fix: Fixed an issue where Blueprint functions called from UMG or async callbacks would run in the wrong client/server context when using Play In Editor. Now every time a Blueprint function gets executed it will correctly set the "world context" which should fix issues with soft object references.

  • New: Added Move to Parent option for variables and functions in MyBlueprint list.

  • New: Added Copy/Cut/Paste Support for variables, functions, and macros.

  • New: Disabled editing of default values on soft object reference member variables.

  • New: Added "Create Matching Function" context menu option to unresolved CallFunction nodes.

  • New: Improved Replace Node References feature and promoted from experimental.

  • New: Component tick properties can now be modified by a Blueprint that has added a component of that type.

  • New: Instead of just removing connections on latent action nodes, rewire them if possible and if not then create an orphan pin.

  • New: Exposed TSoftObjectPtr variants of LoadStreamLevel, UnloadStreamLevel, and OpenLevel.

  • New: Generated new Variable GUIDs when duplicating Blueprint assets, preventing them from finding false positives in Blueprints.

  • New: Added GetPlatformUserDir to kismet function library.

  • New: Fixed static functions on network-enabled classes like Actor to correctly handle Authority Only/Cosmetic correctly.

  • New: Blueprint Variables now show tooltip text when hovering over the tooltip EditableTextBox in the details panel.

  • New: Added reverse function for arrays to Blueprint API.

  • New: Added bOpenInEditor parameter to CreateBlueprintFromActor and CreateBlueprintFromActors.

  • New: Adjusted the Blueprint debug toolbar to better fit on the screen for smaller window sizes.

  • New: Added the ability to convert functions and events from the "My Blueprint" window as well as by right clicking on the node.

  • New: Added export flag to UK2Node_GetSubsystem.

  • New: Enabled Vectors and other struct types to edit the value and slider range metadata in the details panel.

  • New: The context search will now prefer options that have been favorited by the user.

  • New: Added automatic naming of Blueprint variables to match their target pin when "Promoting to Variable".

  • New: Added controllable length to ArrowComponent and expose in TargetPoint, which grants ability to use them as an editor visualization from Blueprints.

  • New: Added GetSystemPath function for finding the full path to an Asset on disk.

  • New: Subsystems that are marked NotBlueprintType in their metadata are now hidden from showing up as subsystem targets in Blueprint editor, allowing native-only subsystems. Static functions will still be available.

  • New: Added suppressable warning dialog when attempting to rename RepNotify functions.

  • New: Added prompt when pasting unresolved function nodes to ask how they should be resolved.

  • New: Added new "Random" and "RandomFromStream" to KismetArrayLibrary.

  • New: Enabled UEdGraphPin to opt out of "Friendly" Names in Editor without explicitly declaring an override.

  • New: Added int64 type to Temporary variable action registry and GetValueFromString in Blueprints.

  • New: Actor Component Blueprints now use the same Data Only Blueprint logic as all other types. They will open in the Data Only Blueprint editor if they contain no nodes.

  • New: Blueprint debugger commands Step (Into/Next/Out) will now ignore the currently selected filter object, making it easier to trace execution from one Blueprint to another.

  • New: Blueprint Editor will now display which Blueprint library is currently being loaded so that developers can have visibility on which libraries take a long time to load.

  • New: Exposed InterpToMovementComponent's AddControlPointPosition and ResetControlPoints functions to Blueprint.

  • New: Added an on-by-default CVar that enables users to suppress warnings about events that are missing their bound components. Turning this on will result in possible silent failures of the Blueprint compiler.

  • New: Added a new Blueprint compiler safety check that will warn when a bound event's component has been deleted. This can possibly expose a lot of previous silent failures. If you wish to disable these warnings, then you can set the Config variable "bp.PinValidityCheck.bDisplayMissingBoundComponentWarning" to false in your DefaultEngine.ini file. We don't recommend turning off these warnings in the long term, but it can be useful to clean up the issues over time on large projects instead of all at once.

  • New: Added function alias "FCeil" for "Ceil" on math expression nodes

  • New: Added wildcard connections to the wildcard pins in the Format text node so that it can be used inside of macros.

  • New: Added Preview Playback FPS option to SubUVMaker, changing settings will no longer reset the preview result.

  • New: Added new Macros "Create and Assign Render Target" and "Create and Assign MID" that handle the logic to assign the resulting assets to variables and avoid re-allocating memory if the variable still contains data that matches the requested input.

  • New: Added Cloud Compositing BP tool to Volumetrics Plugin, includes some example shaders from simple billowy clouds to storms.

  • New: Made SubUV maker work with Niagara systems and capture them directly in the editor viewport.

  • New: Exposed more LiDAR interactions to Blueprints.

  • New: Added a simpler preview subUV that works better and is easier to start from.

  • New: Added override functionality for fluid simulation testing in Landmass.

  • New: Added a "DisableSplitPins" metadata tag for native make/break nodes. Adding the metadata tag to the "meta" section of your UPROPERTY tag will disable split pins on your custom UClass/UStruct.

  • Improvement: Improved behavior when using the Blueprint debugger object filter on an actor that was dynamically spawned. It will attempt to save and restore your selected actor/object over multiple PIE sessions until the filter is manually changed.

  • Deprecated: Fixed "Quaterion" typo by renaming two functions with the type to Conv_VectorToQuaternion and Conv_Vector4ToQuaternion.


  • Crash Fix: Fixed a crash in UnrealHeaderTool when you have a UInterface but no corresponding IInterface.

  • Crash Fix: Fixed a crash when using the property system to edit a TMap property with a TWeakObjectPtr key.

  • Crash Fix: Fixed rare crash occurring during LoadTime analysis threading issue where EditCpuTimeline ended up being called without being under the proper edit session scope.

  • Crash Fix: Fixed hot reload crashing when creating a new user-defined Blueprint struct.

  • Crash Fix: Fixed a crash in UnrealHeaderTool when parsing two headers with the same leaf name but different paths.

  • Crash Fix: Fixed shutdown crash in monolithic editors, this was due to a global static being marked destroyed and falling out of scope.

  • Crash Fix: Fixed an UnrealHeaderTool crash when you have a UInterface but no IInterface.

  • Crash Fix: Fixed skiprows crashing in CsvToSvg, csvdir will now read .csv.bin files.

  • Crash Fix: Fixed nullptr crash when cooking.

  • Crash Fix: Fixed a crash when running clients and -nullrhi. Ensure the preload screen manager is running even though there is no window to render.

  • Crash Fix: Fixed a rare crash when incremental Garbage Collector is running and other threads create new UObjects.

  • Crash Fix: Fixed TCHAR_TO_UTF8 crash for illegal UTF-16 strings that end with the first half of a UTF-16 surrogate pair.

  • Crash Fix: Fixed Garbage Collector crashes caused by Object class 'ClassPrivate pointer' being null, and added an assert to FObjectPropertyBase::CheckValidObject when an object class is null.

  • Crash Fix: Fixed a crash when generating native code for Blueprints that contain 'Property Reference' variables.

  • Crash Fix: Fixed a rare crash when destroying objects caused by logging code trying to log path names of destroyed objects.

  • Crash Fix: Fixed a crash when saving Blueprints with 'Set Float Attribute' node.

  • Bug Fix: Fixed potential precision error in FEngineWaitLatentCommand::Update and FStreamAllResourcesLatentCommand::Update.

  • Bug Fix: Changed DDC file writes and reads to be silent. This avoids commandlets failing because of errors logged during access to DDC.

  • Bug Fix: Fixed usage of SCOPED_NAMED_EVENT and TRACE_CPUPROFILER_EVENT_SCOPE in various places. This avoids scope event names to get additional quotes and avoids the overhead of using macros with dynamic string as scope names.

  • Bug Fix: Fixed TRACE_PLATFORMFILE_FAIL_OPEN to use -1 as an invalid handle for trace events.

  • Fixed missing TRACE_PLATFORMFILE_END_WRITE event when write operation fails to write all bytes.

  • Bug Fix: Updated ProjectManager.cpp.

  • Bug Fix: Remapped soft/weak object pointers when duplicating multiple actors.

  • Bug Fix: Fixed the FGenericPlatformOutputDevices::GetAbsoluteLogFilename() not reporting the correct log filename when more than one instance of the same application was running. This could lead to attaching the wrong log file to a bug report.

  • Bug Fix: Fixed leaked process handles on Windows.

  • Bug Fix: Fixed issue where the crash reporter was truncating some pointers.

  • Bug Fix: Fixed XMLFile. It wasn't properly dealing with a single quote in a content field.

  • Bug Fix: Fixed a race condition occurring when an ensure and a crash executed concurrently.

  • Bug Fix: Fixed the name generation of the folder containing the crash/ensure artifacts to avoid collisions.

  • Bug Fix: Fixed a race condition when generating the crash error message.

  • Bug Fix: Fixed a deadlock that could occur between an application and CrashReportClient.

  • Bug Fix: Fixed CrashReportClient HttpSendTimeout configuration having no effect because it was set before GConfig was initialized.

  • Bug Fix: Fixed a variety of subobject instance issues:

    • ComponentInstanceDataCache will now compare instances when evaluating whether objects are identical or not.

    • ComponentInstanceDataCache now preserves object names by duplicating them in unique objects rather than directly in the transient package where the name could already be taken.

    • ComponentInstanceDataCache now overwrites objects with the same name when restoring a duplicated object during the apply phase.

    • Fixed PPF_DeepCompareInstances between 2 instances not working. Now only template against template is skipped.

    • Deep comparisons now work on objects instanced in Blueprints. Instead of insisting the CDO itself has a DSO of the correct name, we simply compare that the objects have the same name and that they either have the same archetype, or one is the archetype of the other.

    • Comparisons of instanced objects in containers are now correctly using a deep comparison for property panel purposes.

  • Bug Fix: Fixed a bug that resulted in an infinite loop when launching a project where the editor was built with a Unique Build Environment.

  • Bug Fix: Fixed UnrealHeaderTool wrongly emitting a UObject::Serialize adapter function when a type provides overloads for both FArchive& and FStructuredArchiveRecord.

  • Bug Fix: Fixed UnrealHeaderTool generated code when a BlueprintNativeEvent UFunction is inside a WITH_EDITOR block.

  • Bug Fix: Fixed a hang in UnrealHeaderTool when a class inherits an interface with the same name except for the prefix.

  • Bug Fix: Fixed a bug in FVector::Coplanar. The test was returning a false result when plane B was 'under' plane A.

  • Bug Fix: Fixed usage of Encode 7bit in trace code. It may now use up to a maximum of 10 bytes.

  • Bug Fix: Fixed FString::TIsCharRangeNotCArray and FString::TIsTCharRangeNotCArray to avoid recursive template instantiation on some compilers.

  • Bug Fix: Fixed issue where application aborted when plugins failed to load due to EnableAllPlugins command.

  • Bug Fix: Removed CPF_HasGetValueTypeHash from FArrayProperty as arrays are not hashable.

  • Bug Fix: Changed the generated code emitted for properties by UnrealHeaderTool to avoid a PVS static analysis warning.

  • Bug Fix: Renamed CVar Debug.EnableLeakTest to EnableLeakTest. It was not possible to change from the console as "DEBUG" was consumed by UEngine::Exec.

  • Bug Fix: Fixed a MallocStompOverrunTest for 64 bits platforms. The original code was not causing a buffer overrun because of the 16 bytes alignment.

  • Bug Fix: Fixed a compile error TSparseArray::PointerToIndex.

  • Bug Fix: DisableEnginePluginsByDefault is now saved as part of the written Uproject JSON.

  • Bug Fix: Added support for namespaced native base types of UStructs in UnrealHeaderTool.

  • Bug Fix: Fixed a compile error in TLruCache::RemoveByPredicate.

  • Bug Fix: Fixed a compilation error with Algo::Rotate.

  • Bug Fix: Increased read buffer limit to 1MB (from 48K) for reading metadata from a trace file.

  • Bug Fix: Fixed TSet not being able to accept const pointers as search inputs when the element type was a non-const pointer.

  • Bug Fix: Fixed the nulling of properties during hot reload when a reinstanced object refers to another reinstanced object.

  • Bug Fix: Removed the "Channel" suffix from channel names when tracing them. This fixes regression for Trace Data Filtering plugin (showing "Channel" suffix and presets not working anymore) and backward compatibility with previous traces.

  • Bug Fix: Added comments to TRACE_CPUPROFILER_EVENT_SCOPE macros.

  • Added TRACE_CPUPROFILER_EVENT_SCOPE_STR macro that receives static string parameters.

  • Fixed SCOPED_NAMED_EVENT macros adding extra quotes to named events when traced.

  • Fixed SCOPED_BOOT_TIMING to use TRACE_CPUPROFILER_EVENT_SCOPE_STR instead of the dynamic string version.

  • Bug Fix: Fixed FString::ParseIntoArray when the string has uninitialized reserved memory but is zero length.

  • Bug Fix: Fixed TSet properties' text import of a struct type, where the struct doesn't initialize all of its members in the constructor.

  • Bug Fix: Fixed ObjectName:FieldName reversal bug in FField::GetPathName. Added StringBuilder version of FProperty and UObject GetPathName to optimize allocations in Niagara graph cooking.

  • Bug Fix: Changed GetNum(std::initializer_list) to return int32. This fixes the construction of a TArrayView from an initializer list.

  • Bug Fix: Fixed bias in Array_Shuffle.

  • Bug Fix: Fixed ObjectName:FieldName reversal bug in FField::GetPathName().

  • Bug Fix: Fixed TArrayView comparison ambiguity with == and != when both operands are TArrayView.

  • Bug Fix: ReadLibraryImportsFromMemory will no longer read past the end of the Imports table. This could result in invalid symbols added to the ImportNames table which resulted in increasing the engine start time.

  • Bug Fix: Allowed FStringView to be used with the ByHash TMap functions for FString TMap key queries.

  • Bug Fix: Forced stat groups to register in the constructor of their FThreadSafeStaticStat. This fixes a situation that prevented a group without FScopeCycleCounter from being activated if no other group was activated.

  • Bug Fix: Disabled copying of FUObjectItem.

  • Bug Fix: Prevented precision loss when passing an int64 value with basic math expression. The default value of the min and max is now the limit of the numeric type.

  • Bug Fix: Save INI files as UTF-8 by default.

  • Bug Fix: Subsystems will not attempt to instance non-authoritative classes.

  • Bug Fix: Avoided a stack overflow in FOutputDeviceRedirector.

  • Bug Fix: Added double overloads of IsNaN and IsFinite for Unix and Mac.

  • Bug Fix: Added an Ensure to AssetRegistry OnPathAdded and OnPathRemoved events are always fired hierarchically.

  • Bug Fix: Prevented the render thread from tracing an unmatched frame event.

  • Bug Fix: Fixed pak signature file data from incorrectly storing the original decrypted master hash after the initial load. This behavior caused future chunk hash mismatches to incorrectly report a master table corruption.

  • Bug Fix: Fixed CrashReportClient/CrashReportClientEditor sometime uploading the wrong log file.

  • Bug Fix: Fixed GenericPlatformOutputDevices to reserve and lock the name of the log file to prevent a concurrent instance to use it and ensure CrashReportClient.exe pick up.

  • Bug Fix: Fixed memory hangs when flushing async loading and the queue gets stuck on a low priority job which is not being serviced due to throttling. Please note that this is disabled by default due to a potential performance impact, but can be enabled via the CVar pakcache.AsyncLoadingAllowFlushProtection.

  • Bug Fix: Fixed a present hang detector race condition.

  • Bug Fix: Fixed initialization workflow of ExternalProfilers.

  • Bug Fix: Fixed a random memory corruption when using FMallocBinned.

  • Bug Fix: Fixed a Check failure in FD3D12CommandListManager::EndTrackingCommandListTime when running ProfileGPU.

  • Bug Fix: Fixed access violation in subsystem container startup discovered with the command '-stompMalloc'.

  • Bug Fix: Disabled use of FPreloadFile for the asset registry. To re-enable define ASSET_REGISTRY_USE_PRELOAD_FILE to 1.

  • Bug Fix: TAllFieldsIterator will now iterate over nested inner fields. This fixes a bug where adding a new property to a user defined struct that's used in an array property on a Blueprint will corrupt the array values.

  • Bug Fix: Fixed up analytics WeakPtr reference by using Pin.

  • Bug Fix: Fixed Tickable objects from sometimes failing to register when re-allocated with the same address as previously destroyed ones.

  • Bug Fix: Added Ensure that FParse::Value returns a string with a correct length when used with an input string which length is greater than 4096.

  • Bug Fix: Fixed FPackageReader to copy the editor only filtering flag from the underlying reader archive to the owning package reader. It can be set by the summary reading code and affect how future serialization occurs.

  • Bug Fix: Fixed type conversions between Percentages and Multipliers.

  • Bug Fix: Fixed cooked builds using async archives, if we fail to load the package file summary then advance the async archive's load state out of "waiting for header" so that the failure can be processed gracefully and not trigger a check.

  • Bug Fix: Fixed StaticFindObject to search for any package with a package name that is only a substring of the full package name.

  • Bug Fix: Fixed a rare thread hang that could occur when reading from signed pakfiles from multiple threads.

  • Bug Fix: Fixed operator precedence and associativity in basic math expression evaluator.

  • Bug Fix: FReferenceFinder will no longer use multithreading until all native classes have been registered in order to avoid asserts when assembling token streams for classes that haven't had it assembled yet.

  • Bug Fix: Fixed FFieldPath::ToString from not removing nativized BP temp package prefix.

  • Bug Fix: Fixed a wrong printf conversion specifier for int64 type.

  • Bug Fix: Fixed final window size computation when only the window height is specified.

  • Bug Fix: Fixed global fstructuredarchive insertion operator not closing the adapter after use, added slot insertion overloads for TEnumAsByte, and enum class types.

  • Bug Fix: Fixed FAsciiSet::Skip skipping wide characters, Optimized Skip speeds, simplified ParsePropertyToken, and added some unit tests.

  • Bug Fix: Fixed issue with non-ASCII directory names.

  • Bug Fix: Added missing AddReferencedObjects functions to FDelegateProperty and FMulticalDelegateProperty.

  • Bug Fix: IncrementalPurgeGarbage will now lock the Garbage Collector guard only once to avoid too many locks.

  • Bug Fix: Made FPageAllocator a singleton to control global initialization/destruction order. Avoids a potential startup crash in monolithic builds.

  • Bug Fix: FFieldPaths should no longer re-resolve themselves each time a Blueprint is destroyed and only re-resolve if the Blueprint that owns the property they resolve is destroyed / or recompiled.

  • Bug Fix: Fixed Garbage Collector skipping some generated class references because they were incorrectly marked as CLASS_Native.

  • Bug Fix: Fixed a rare case of a compressed IO read re-using a cached buffer that it shouldn't have.

  • Bug Fix: Fixed StaticFindObject to handle nested sub-objects when searching for any package without a package pointer.

  • Bug Fix: Added ensure to fail the loading of an async package correctly when the summary load fails.

  • Bug Fix: FieldPath property's ImportText will now properly support full path names including the field type as well as delimited strings.

  • Bug Fix: UStructs with AddStructReferencedObjects are now correctly marked as containing object references, even if it contains no UPROPERTY object references

  • Bug Fix: Fixed memory stomping occurring when a long command line is used.

  • Bug Fix: When cooking, references to editor-only FProperties will be nulled out.

  • Bug Fix: Fixed wrong return type of rarely used ExportTextPathToObjectPath overload.

  • Bug Fix: FKismetCompilerContext::ValidateVariableNames will now look through both UFields and FProperties when looking for conflicting names.

  • Bug Fix: FFieldPaths will no longer attempt to resolve themselves to new fields after the original field they resolved to has been destroyed.

  • Bug Fix: FReferencerFinder will now properly find GGCObjectReferencer as one of the referencing objects.

  • Bug Fix: When converting UProperties to FProperties, the engine will rename the old property so that it doesn't collide with potentially valid objects of different type.

  • Bug Fix: Fix incorrect default value being applied for the skipiostore parameter in UAT

  • Bug Fix: Fixed memory stomping occurring when a long command line is used. Modified FGenericCrashContext to perform safe string copies which caused TLazySingleton to crash due to static memory being overloaded.

  • Bug Fix: Fixed code for c++17 compilation. std::binary_function, std::unary_function and register keyword have all been deprecated.

  • Bug Fix: Added ensure to UAnimBlueprintGeneratedClass::EvaluateGraphExposedInputs' ValueHandlerNodeProperties so they now properly resolve against their class which can be in a renamed package when loading.

  • Bug Fix: TFieldPaths will now always try and use the provided struct when resolving themselves and update its path with the resolved package if it's different to the existing serialized value.

  • BugFix: The command line '-handleensurepercent=' now works correctly.

  • Bug Fix: Changed TArray version of TMap::GetKeys to reset supplied array before adding keys as the function did not work correctly if used to accumulate keys over multiple maps.

  • New: Updated API in FAxisViewportInt32 and FAxisViewportDouble. All functions from FAxisViewportInt32 and FAxisViewportDouble classes that change positions now return true if the position was changed.

  • New: Exposed a more customizable EnforceScrollLimits, in addition to UpdatePosWithinLimits.

  • New: Converted StaticConstructObject_Internal to use a parameter block.

  • New: TMap::GetKeys now resets the TArray passed into it.

  • New: Moved DeveloperSettings into its own module so it can be used outside of Engine. When inheriting from UDeveloperSettings, you will need to add DeveloperSettings as a module dependency.

  • New: Made the string builder types more generic. The string builder type hierarchy has been simplified to TStringBuilderBase and TStringBuilderWithBuffer.The append operators have been simplified to append anything convertible to a string view.

  • New: Changed TStringView to be usable where CharType must be deduced Both FString and TStringView can now be constructed and assigned from any contiguous container of the same character type. This allows FString to be constructed and assigned from FStringBuilderBase and TStringBuilder.

  • New: Added GridSnap and Floor as a templated function.

  • New: Added Emplace functions to SparseArray.New: Made internals of LoadFileToStringArray[WithPredicate] to support 64-bit sized files (still returns a 32-bit TArray of 32-bit FString lines).

  • New: Added Game and EditorOnly dependencies to the AssetRegistry. The information for which imports and soft package references are editor-only is calculated during SavePackage, and requires resaving packages to use; until packages are resaved, all of their dependencies are assumed to be used in-game. The interface of dependencies in the asset registry changed to support reporting the extra information for each dependency: EAssetRegistryDependencyType was split into EDependencyCategory and EDependencyProperty.

  • New: Added an option to view full reference chains (ignoring non-GC objects). Just add "full" to the argument list.

  • New: Custom versions can now register a validation function that can flag an asset as unloadable.

  • New: Added the IsValidPath function to FPackageName. This function checks for a valid root. FindOrLoadAssetsByPath (in EngineUtils) now uses IsValidPath to be able to load the content of roots. This was not possible before as IsValidLongPackageName on a root is always false.

  • New: Added FindDisplayNameTextByValue and FindAuthoredNameStringByValue functions to UEnum. These are like their Get equivalents, but return whether a value was found or not.

  • New: Updated ApplyBefore and ApplyAfter to TTuple. These functions use Invoke instead of a direct call to the callable object so that member function pointers can be used instead. Also removed TMemberFunctionCaller from the delegate system, which was doing the job that Invoke now does.

  • New: Added TDelegate and TMulticastDelegate syntax, similar to TFunction, to be used instead of the DECLARE_DELEGATE and DECLARE_MULTICAST_DELEGATE macros.

  • New: Added the Get function to TTuple to enable developers to get a tuple element by its type rather than by its index.

  • New: Updated AsConst to work the same as std::as_const. The overload for pointers is deprecated because it caused arrays to decay to pointers.

  • New: Added a check for VS2019 redist, and to trigger the prereq installer if it isn't found.

  • New: Moved AssetRegistry structs into CoreUObject - AssetData, AssetBundleData, ARFilter, and AssetDataTagMap were moved into CoreUObject. This will enable us to remove the link requirement that all functions in these structs are inlined.

  • New: Moved all AssetRegistry headers into AssetRegistry subdirectory to match include style in the rest of the engine. Includes using the invalid include path AssetRegistry/Public/ will need to immediately change to AssetRegistry.

  • New: Added "Render" thread group (trace events) also to the "RHIThread" and to the "RTHeartBeat" rendering threads.

  • New: Added support for the %hs format in FGenericWidePlatformString::GetVarArgs.

  • New: Added a TTupleIndex trait for getting the index of a type in a tuple, and a TTupleElement trait for getting the type at a given index.

  • New: Changed TTuple::Get() to work like std::get<>, which behaves differently from struct member access when elements have rvalue reference types and are extended to allow volatile tuple access.

  • New: Added a ::type typedef to TEnableIf and ::value static members to TAnd, TOr and TNot for compatibility with the standard library.

  • New: Added policy support to delegates, allowing them to take a user policy to configure behavior and state. Added .natvis support for multicast delegates.

  • New: Added IoStoreUtilities: Compression support.

  • New: Promoted the prototype RingBuffer class into Core\Public\Container, this is the recommended container for a single-threaded queue, dequeue, circular buffer, or ring buffer.

  • New: The following minor additions have been added to the TaskGraph interface:

    • FFunctionGraphTask supports functors that take the completion graph event as a parameter.

    • A shortcut for FTaskGraphInterface::GetWaitUntilTaskCompletes()->FGraphEvent::Wait().

  • New: Captured and logged the call stack of a crash inside CrashReportClientEditor.exe. The log is emitted with the Editor analytics to help diagnose crash in the crash reporter.

  • New: Memory-mapped bulk data in IoDispatcher.

  • New: Made the Algo:: Sort algorithms take rvalue refs so that they can be passed temporary TArrayViews.

  • New: Added an option for potentially increased performance when getting UTC time via FDateTime::UtcNow when PlatformUtcNow is slow. This can be enabled with 'bUseEstimatedUtcNow' located in the TargetRules.

  • New: TMap::StableSortByValue now works when your value contains a TUniquePtr.

  • New: Enabled the unhandled exception filter on Windows for games. This captures crashes in non-engine threads and from Windows Kernel callback.

  • New: Added a version of CreateOptionalDefaultSubobject which allows specification of the type to create by default.

  • New: Added a version of TMap::GetKeys that takes a TSet instead of TArray to populate.

  • New: Vectorized several FQuat operations and improved numerical stability of FQuat::GetRotationAxis().

  • New: Added .natvis visualizers for FVector, FQuat, FRotator and FTransform.

  • New: Implemented new class FEventRef - an RAII-style alternative to FEvent which gets or returns an FEvent instance from or to the pool automatically. The class definition is placed into Event.h to be close to FEvent so Users can see that there's an alternative to FEvent. Implementation is placed in ThreadingBase.cpp where FEvent and FScopedEvent implementations are.

  • New: Allowed TTuple to be constructed and assigned from tuples with different types, as long as all the destination element types are constructible or assignable from the source types.

  • New: Added Tie function for destructuring TTuple return types into individual variables, like std::tie().

  • New: Added a ForwardAsBase function which allows the perfect forwarding of a reference as a base type.

  • New: ReadLibraryImportsFromMemory was reading past the end of the Imports table. This could result in invalid symbols added to the ImportNames table which was increasing the engine start time.

  • New: Added new code comment inside TUniquePtr; containing advice for when its use inside UObjects causes a compile error.

  • New: Added First function and Last function to TPageArray.

  • New: Added a new compile error when binding a delegate with a const object pointer and non-const function.

  • New: Added a new TVariablePagedArray implementation with fixed-size pages, but a page may have unused items either at the beginning or at the end of it's items array.

  • New: Added FPlatformProcess::Yield method.

  • New: Changed the definition of LLM_ALLOW_ASSETS_TAGS to allow activation without modifying the header.

  • New: Added Move operations to TAttribute.

  • New: Made trace channel names tolerant to ending 's' or 'S.

  • New: Added new BuildPatchErrorUtils to add patching error utilities.

  • New: Added support for passing "abscrashreportclientlog" and "nullrhi" command line arguments to crash reporter monitor.

  • New: Added a TPimplPtr type which can be used as a substitute for TUniquePtr of an incomplete type; without forcing the outer class to define all of its special member functions in the .cpp file where the type is fully defined.

  • New: Added a TInvokeResult trait for getting the return type of a callable with given argument types.

  • New: Added templatized InitializeDependency to subsystems. Also modified InitializeDependency to return the subsystem.

  • New: Extended TValueOrError with TryGet functions, perfect forwarding of arguments, and more efficient storage.

  • New: Fixed PLATFORM_CAN_ASYNC_PRELOAD_FILES code path in FPreLoadFile to correctly handle files that are not available when the read request is executed.

  • New: Created a new trace event "Diagnostic.Session2". This event includes improved formatting that utilizes string type fields and handles the new event in the DiagnosticsSessionAnalyzer.

  • New: Enabled the unhandled exception filter on Windows for all applications. This is to capture crashes in non-engine threads, additionally, this captures some crashes from Windows callback that are not going through the main thread except blocks.

  • New: Added CreateStandardFileName, implemented by MakeStandardFilename, and optimized both to be approximately 30% faster than the original MakeStandardFileName.

  • New: Added Ensure when getting the correct case for the project path during engine startup on the Windows platform. This no longer resolves directory junctions at the same time as it can cause problems for p4 operations. This is done using the slow 'FindFirstFile' approach on EVERY SEGMENT of the project file path.

  • New: Enabled CONTAINER_INITIAL_ALLOC_ZERO_SLACK, this provides cross-platform memory saving functionality which saves up to 96MB on consoles.

  • New: Added Ensure that the project directory is updated after the first time that the project file path is set.

  • New: Added support for passing strings in execcmds, enclosed in single quotes.

  • New: Added Silence warnings regarding the possible loss of precision converting from integer to floating-point types.

  • New: Removed unnecessary conversion to float in FTimecode::FromFrameNumber to minimize loss of precision in FThreadHeartBeatClock::Seconds for long-running titles

  • New: FGenericPlatformMath::FRand now truncates Rand to 24 bits or RAND_MAX, whichever is smaller. This prevents values closer to 1.0 being higher probability due to loss of precision.

  • New: Added TArrayView64 by adding a SizeType parameter to TArrayView.

  • New: Added Ensure to no longer resolve directory junctions when also getting the correct case for the project path during engine startup on Windows.

  • New: Fixed an infinite recursion error when calling Add in TDiscardableKeyValueCache.

  • New: Added csvExecCmds command line option to run exec commands on particular CSV frames. E.g: -csvexeccmds="500:listtextures,1000:listtextures". This can be useful when doing deterministic benchmarking.

  • New: Added the command line option '-d3d12instrumented' to control the use of the instrumented d3d driver.

  • New: Added a new CSV tool for binary support. Use the conversion tool 'CsvConvert' to convert CSVs to a packed binary representation (csv.bin), which is smaller and faster to parse. All CSV tools will seamlessly read .csv.bin files.

  • New: Added a version of FPaths::ChangeExtension to FPathViews that uses FStringView as the input type rather than FString.

  • New: Removed identical duplicate types from PS4UE4.natvis that existed and matched in UE4.natvis.

  • New: Added a fallback so that '-mempro' and '-memprollmtag' will work if the command line wasn't initialized when FMemProProfiler::Init when it was first called,

  • New: Fixed a bug where fatal UE_LOG messages could potentially return and continue execution if several threads were issuing fatal log messages at the same time.

  • New: Added Ensure to no longer resolve directory junctions when also getting the correct case for the project path during engine startup on Windows. This is done using the slow 'FindFirstFile' approach on EVERY SEGMENT of the project file path.

  • New: Added two new arguments to PerformanceReportTool for bulk query support '-spreadsheetfriendly' which outputs a single quote before non-numeric entries in summary tables and '-noSummaryMinMax': which makes disables min/max columns for each stat in a condensed summary.

    • Fixed a bug with duplicate header entries in email summary tables.

    • Added a support for reading .csv.cache files. These contain metadata and stat names, so they are faster to read than the full CSV when filtering with '-metadatafilter'.

    • Allowed specifying a condensed summary table type, with '-condensedSummaryTable '.

    • Made the tool robust to accommodate zero-length CSVs.

  • New: FString now supports construction from an FStringView with an additional memory slack in its internal buffer.

  • New: Mempro tag tracking improvements:

  • Added support for tracking multiple LLM tags, for example, mempro.llmtag "chaos,chaostrimesh"

  • New: Added support for enabling mempro and specifying tags without the need for execcmds. This can be done with -mempro and -memprotags= respectively.

  • New: Added a cooker parameter (-DevelopmentAssetRegistryPlatformOverride) which allows DLC cooks to override the platform name used to find and load the development asset registry. Allows different platforms to use a single registry where that makes sense. Guard a loop that accesses asset registry data for cases where that data doesn't exist.

  • New: Added FScopedMemory, which will scope out the difference in Physical and Virtual memory in addition to capturing other threads allocating.

  • New: Added GetTypeHash() support to TWeakObjectPtr properties.

  • New: Refactored stage time only encryption config to be "explicit" groups that can take normal assets and external non-UAsset based files for encryption.

  • New: Removed comments from *.ini files when staging.

  • New: Reduced the constant memory cost of keeping FProperty related references from 32 to 8 bytes per UStruct.

  • New: Added additional asserts when failing to remove UObjects from hash tables due to a rare crash in Garbage Collector.

  • New: Creating new UObjects while Collecting Garbage will now result in an assert.

  • New: Added a missing constructor definition of FAutoConsoleVariableRef when NO_CVARS is defined.

  • New: Fixed a spelling error located in assertion.

  • New: Added the name of the slowest unit test in warning for >2s smoke test run time.

  • New: Only inject encryption key asset metadata into the cooked asset registry for platforms that actually require it.

  • New: Various engine init optimizations and new string conversion paths:

    • Added some core string conversion paths, added FString::Append and += overloads to avoid pointless temporaries when appending c strings and various other string types.

    • Added UTF32 <-> TCHAR string conversion macros.

    • Optimized QuotedString parsing, and property parsing.

    • Added PackageName optimizations and SoftObjectPath optimizations.

  • New: Added logic to change how background generation of distance fields works in the editor, Instead of creating a new thread pool for the distance field tasks the editor will now use GLargeThreadPool when available. This reduces thread spam in profilers and reduces overhead on machines with a large number of available logical processors.

  • New: Removed unnecessary target dependencies for ShaderCompileWorker on Linux.

  • New: Folded FSynchronizedArchiveState into FArchiveState to reduce complexity and restore private FArchiveState inheritance.

  • New: Disabled STATS in UHT.

  • New: Core will now be aware of multiple CPU groups to make better use of high-core systems. Reimplemented FWindowsPlatformMisc::NumberOfCores and FWindowsPlatformMisc::NumberOfCoresIncludingHyperthreads in terms of GetLogicalProcessorInformationEx.

  • New: Added in-game console key for Swedish keyboard layout.

  • New: Avoided pointless FString temporaries when appending c strings.

  • Added Append and += overloads compatible with C strings, char arrays, string views, and string builder as well as FString.

  • New: Added some core string conversion paths.

  • New: Added FPlane::IsValid, FPlane::GetOrigin, and FPlane::GetNormal.

  • New: Added FVector::XAxis, YAxis, and ZAxis constants.

  • New: Added .uptnl to the list of extensions that must exist in pak files, and won't trigger a lower level platform file call.

  • New: Refactored sandbox file system creation so it gets funneled via a factory function, to support multiple implementations.

  • New: Optimized Garbage Collection, Core Redirect, and SavePackage related code in UHT since they contribute greatly to the overall build time.

  • New: BMP writing is now supported in shipping config.

  • New: Converted UEdGraph::Serialize over to a structured archive format.

  • New: Parsed int64 value with basic math expression without losing precision. Added the option to only parse FText to number parsing only if the parsed number is inside the limit of the desired type and the option to clamp that value to the limit of the desired type.

  • New: PluginManager now takes into account the default editor target config param when trying to decide which editor target to use.

  • New: Moved the hardcoded list of ini suffixes in the staging system out into lists in the deployment context so that projects can choose to override them.

  • New: Added a PreModifyDeploymentContext callback to the project params struct which will be invoked after the deployment context is created, but before any files are processed by the staging system.

  • New: Fixed staging chunk assignment from failing when there are case mismatches between paths in the staging manifest and the pak chunk lists.

  • New: Added ELogVerbosity to FDebug::DumpStackTraceToLog.

  • New: Added Windows SetProcPriority implementation.

  • New: Added FArchive error propagation to all proxies.

  • New: Changed how FFieldPaths are internally stored and serialized. Now instead of storing the full path from the outermost UPackage to the innermost FProperty, FFieldPaths will store the owner's UStruct reference and a short path to its property or inner property of its property. The same applies to serialization: both the owner UStruct reference and only the short path will be serialized. Serializing the owner reference will enable proper handling of any owner struct package renames as well as greatly increase the initial field resolution performance.

  • New: Added CanUseUnversionedPropertySerializationForServerOnly setting to disable UPS for dedicated servers.

  • New: Fixed a path comparison in LaunchEngineLoop.

  • New: Added a bAllowShrinking parameter to TArray::RemoveSwap().

  • New: Published UE_NODISCARD and UE_NORETURN.

  • Improvement: Improved TSet and TMap .natvis to skip invalid entries.

  • Improvement: Optimized TArray::RemoveSwap() and TArray::RemoveAllSwap() to shrink once at the end of the operation, rather than each time it removes an element.

  • Improvement: Improved delegate system comments and added pointer from DelegateCombinations.h to the proper Delegate.h header that should be included instead.

  • Improvement: Improved ResavePackage commandlet reporting.

  • Improvement: Optimized TSet::Empty to avoid a pathological case where the hash size would be large, without many elements populated in the hash set.

  • Improvement: Implemented FString equality optimizations that checks length before touching data and incurring cache misses.

  • Improvement: Optimized code in XmlFileParser.

  • Improvement: Optimized QuotedString parsing and added UTF32 <-> TCHAR string conversion macros.

  • Improvement: Added Property parsing optimizations.

  • Improvement: Optimized PackageName.

  • Improvement: Optimized SoftObjectPath.

  • Improvement: Fixed and Optimized TBitArray. Initialized unused TBitArray bits, switch to faster unsigned operator%, and don't shrink past initial allocation size operator<, == and GetTypedHash would access unused bits in the last word.

  • Improvement: Removed redundant ToLower calls which caused slowdowns when launching console while using -stompmalloc.

  • Improvement: Refactored FindField into FindUField and FindFProperty to avoid confusion caused by the fact that FindField will no longer return FProperties.

  • Improvement: Optimized TRobinHoodHashMap by changing a costly check to a checkSlow.

  • Improvement: Significantly improved MarkObjectsAsUnreachable phase of Garbage Collection performance in scenarios where there are many root objects.

  • Improvement: TBitArray fixes and optimizations. Initialize unused TBitArray bits, switch to use a faster unsigned operator% and don't shrink past initial allocation size operator<, == and GetTypedHash will access unused bits in the last word.

  • Deprecated: Deprecated TracingProfiler.

  • Deprecated: Deprecated GRenderThreadId and GRenderingThread global vars as preparation for removing the rendering thread.


  • Deprecated: Deprecated GRHIThreadId and GRHIThread_InternalUseOnly as preparation for removing the RHI thread.

  • Deprecated: Added a comment to use std::atomic instead of `TAtomic'.

  • Deprecated: Removed FSubobjectPtr and TSubobjectPtrDeprecated.

    • Removed deprecated FObjectInitializer functions 'CreateAbstractDefaultSubobject' and 'CreateDefaultSubobject' with a bAbstract parameter.

    • Removed deprecated FCoreUObjectDelegates StringAssetReferenceLoaded, StringAssetReferenceSaving, and RedirectorFollowed. Removed deprecated private_subobject define.

    • Removed unused EPropertyFlags::CPF_SubobjectReference.

  • Deprecated: EPowerSavingEligibilityFGraphEvent::SetGatherThreadForDontCompleteUntilFCompletonList.

  • Deprecated: Deprecated GAudioThread and GAudioThreadId in preparation for removing named threads. This allows to remove them completely in the next version and to modify IsAudioThreadRunning and IsInAudioThread functions to work correctly even without the audio thread.

  • Deprecated: Deprecated the PROJECTION and PROJECTION_MEMBER macros, replacing them with UE_PROJECTION and UE_PROJECTION_MEMBER.

  • Deprecated: Deprecated AddAtLowestFreeIndex in favor of EmplaceAtLowestFreeIndex.

  • Deprecated: Added deprecated support for Cast and CastChecked functions for FProperties to minimize compilation errors when upgrading to the new engine version

  • Deprecated: The existing StaticConstructObject_Internal has been deprecated in favor of a version that takes a parameter struct.

  • Removed: Removed legacy file profiling wrappers.

  • Removed: Removed AddFrameRenderPrerequisite and AdvanceFrameRenderPrerequisite.


  • Crash Fix: Fixed a crash that was occurring when cooking a scene containing a runtime-generated static mesh.

  • Bug Fix: Fixed cooking without a project.

  • Bug Fix: Corrected the name of 'GetContentDirecctoryForDLC' and implemented it in terms of "GetBaseDirectoryForDLC" so that it doesn't throw an assert when building DLC without plugins.

  • Bug Fix: Fixed MapsToCook to match its documented behavior. Maps in MapsToCook will no longer be added to cook when there are maps specified on the command line using -Map or -MapIniSection.

  • Bug Fix: Fixed a bug where a substring could be replaced multiple times when path remapping is done when using COTF server.

  • Bug Fix: Fixed a bug to ensure the DDC graph used when launching a command-line cook from the editor is the same one used in the editor. While UAT will accept this argument as part of the 'Run' command, the editor/launcher does not supply this argument in those scenarios for now.

  • Bug Fix: Fixed duplicated property comment in cooker settings.

  • Bug Fix: Fixed bug where recursive directory traversal would not reach plugin or platform extension directories when using the cook on the fly server.

  • Optimization: Optimized FindTargetPlatform during cooking.

  • Optimization: Optimized Skip VerifyEDLCookInfo when cooking DLC.

  • Bug Fix: Added a warning to resave static meshes that invalidate physics when loaded. Meshes that generate the new warning need to be resaved to suppress the warning and ensure deterministic cooking. The warning text is, "Mesh {MeshName} is recomputing physics on load. It must be resaved before it will cook deterministically. Please resave {MeshPath}."

  • Bug Fix: Removed duplicated warnings when cooking.

  • Bug Fix: Fixed a bug where platform-specific raytracing data is incorrectly stripped during a cook.

  • Bug Fix: Fixed a non-deterministic cook issue with hierarchical precompiled Level Sequence data.

  • New: Cooker LoadQueue CookOnTheFlyServer now has an additional state for UE::Cook::FPackageData - EPackageState::Load. When in the Load state, FPackageData are contained in the new FPackageDataQueue LoadQueue. When processing requests, the load dependencies of FPackageData are read from the asset registry, and dependencies are inserted into the LoadQueue ahead of the requested package.

  • New: Added a diagnostic during cooking that shows the number of open file handles.

  • Added hooks for PlatformFileTrace on Mac.

  • Added tracking of open file handles in FPlatformFileTrace.

  • New: Cooker LoadQueue Preloading. Divide LoadQueue into LoadPrepareQueue and LoadReadyQueue; Packages in the LoadPrepareQueue are waiting for FPreloadableFile archives to be asynchronously opened for their Package; these archives are passed into the linker for use when loading the package.

  • New: UCookOnTheFlyServer - Refactor PackagesPendingSave into a SaveQueue.

  • New: Replaced Regex of COOKTIMER macros to all have UE_ prefix.

  • New: Changed LoadTimer & CookTimer to use a metadata field to record the package name instead of creating new scopes for the package name.

  • New: Marked save/load custom trace events as NoSync.

  • New: Included StaticSwitch and StaticMaskComponent to the cached data set and leveraged it from the UpdateParameterSet.

  • New: Added Cook insights instrumentation.

  • New: Changed DLC Mount point to be '//' rather than '/Game/' when cooking DLC.

  • New: Added a new method to the AssetManager ModifyDLCCook, which preserves the current behavior of scanning the path for all assets, however, this can be overridden for custom game DLC cooking logic.

  • New: Fixed cooking non-determinism issue related to ChildActorComponent.

  • New: Added command-line options for DisableUnsolicitedPackages and NoDefaultMaps to the Cook Commandlet.

  • New: New setting ProjectSettings -> Project -> Packaging -> Test directories to not search. This setting is similar to DirectoriesToNeverCook, except that it applies to all commandlets that enumerate assets, including the DerivedDataCacheCommandlet which populates DDC from all files on disk. This is useful for test assets or incomplete assets that are known to give errors on load.

  • New: Added an option to not populate the entire asset registry when cooking for DLC

  • Improvement: Avoided having native packages look up on disk by considering them "fully loaded" without checking if a file already exists on disk for them.

  • Improvement: Improvements to PostLoad and Serialize profiling instrumentation in the LoadTimes channel for use during a cook.

  • Improvement: Avoided scanning and sending superfluous files under the Plugins directory server during initialization.

  • Avoided requesting the same package as a .uasset and as a .umap by allowing the server to return a different file than the one that was requested.

  • Improvement: Optimizations and bug fixes to improve Cook On The Fly server iteration times.

    • Avoided performing both FileExists and GetTimeStamp operations on the same file in IPlatformFileSandboxWrapper.

    • Added Ensure for *.uasset files that are not excluded from the cached files list sent by network filesystem connection.

    • Avoided having the network file system server do two passes recursively iterating over directories to get file timestamps.

    • Fixed the network file system to handle looking for packages with FindPackageFileWithoutExtension as a .uasset file first, and then as a .umap file. If the target file already exists in the local cache as a *.umap file, then the filesystem will not ask the COTF server to cook the map again.

  • Improvement: Avoided calling UpdateStaticDrawListsForMaterials in the FMaterialUpdateContext destructor at cook time if there's no renderer that needs to be updated.

  • Improvement: Optimized cook time in large project cooks due to repeated calls to UMaterial::UpdateCachedExpressionData.

  • Improvement: Optimized large cached project cooks, by using material cached data when remapping override values to the parameters they're overriding.

  • Improvement: Avoided calling SerializeInlineShaderMaps during a save if the archive save pass is non-persistent, is an object reference collector pass, or should skip bulk data.

  • Improvement: Avoided excessive realloc and memcpy overhead when regenerating procedural foliage.

  • Deprecated: Deprecated the -DiffCookedPackage command-line argument with a warning in the log when used.

  • Deprecated: Deprecated the -dumpsavestate and -dumpsavestatebyarchetype command line support with a warning in the log when used. Please note that the aforementioned commands will be removed in a future version.

Memory Profiler

  • Bug Fix: LowLevelMemTracker fixes.

  • Bug Fix: Fixed memory leak in FLLMArray Add, a critical section to prevent simultaneous calls to UpdateStatsPerFrame from multiple threads.

  • Bug Fix: Fixed console variable usage to work on threads other than the game thread.

  • Bug Fix: Fixed use of physical memory rather than virtual memory on Windows.

  • Bug Fix: Disabled ShouldReduceThreads; it is currently used by FGenericPlatformMisc::UseRenderThread, which is defunct and crashes if it returns false.

  • Bug Fix: Fixed calculation of total memory in TrackFree which was using (int64)(-(uint32)), and getting additions of large uint32 instead of subtraction of small uint32. Fix missing critical section, header, and parent tag handling in LLM_ALLOW_ASSETS_TAGS.

  • Bug Fix: Changed Bump LLMMap in LowLevelMemoryUtils to handle a 64-bit number of allocations. When running on a large project, Cook Margin Capacity was causing the cook time to become arbitrarily slow.

  • New: Added FullClassName option to "obj list" command. If present, this will output the full pathname of each class rather than the short name.

  • New: Added FMallocFrameProfiler class to get callstack of allocation/deallocation of the same pointers in the same frame.

Network Profiler

  • Crash Fix: Network Profiler will no longer cause a crash when it's enabled before a map is loaded.

  • Bug Fix: Resized cut-off UI elements of Network Profiler.

  • Bug Fix: Fixed the "check all connections" checkbox in the networking profiler which had stopped working.

  • Bug Fix: Fixed an issue in the networking profiler where profiles with fewer than 30 frames of data could not be loaded.


  • Crash Fix: Fixed a crash after removing a property from a struct while being used in a Blueprint that's also open in the Editor.

  • Bug Fix: Fixed some bad logic for calculating when padding is needed in Pak files.

  • Bug Fix: Fixed UnrealPak patch generation crash when the crypto.json file for the source data isn't explicitly specified. Core

  • Bug Fix: Fixed Crash Report Client dealing with crashes that occur very early in the process lifetime.

  • Bug Fix: Fixed async purge phase to finish with the same multithreading settings before switching multithreading off for the exit purge to prevent an assert.

  • Bug Fix: Added missing UDelegateProperty deprecation macros.

  • Bug Fix: Fixed classes that have potential thread-safety issues with their destructors when they are not destroyed asynchronously by Garbage Collection.

  • Bug Fix: Fixed disregard for the Garbage Collector pool, it no longer needs to be enabled for Garbage Collector clustering to be enabled.

  • Bug Fix: Fixed modifications to the command line using environment variables to be correctly used in PreInitPreStartupScreen.

  • Bug Fix: Enabled SEH on Clang on Windows.

  • Bug Fix: Removed the requirement for AddStructReferencedObjects to be const. AddStructReferencedObjects should not be const because GaC will attempt to null references to pending kill objects when calling this function.

  • Bug Fix: Fixed Project-specific tags from being collected When LLM tags were summarized per frame.

  • Bug Fix: Disabled permanent object pool when disregard for Garbage Collector pool is disabled due to permanent object pool objects becoming marked as unreachable and potentially becoming destroyed.

  • Bug Fix: Fixed Crash Report Client from needing full access to the process on Windows.

  • Bug Fix: Soft Object Pointers will no longer return pending kill objects in PIE.

  • Bug Fix: Fixed issue with plugin stack traces not resolving correctly in logs. This manifested as "UnknownFunction" entries in the logged stack trace.

  • Bug Fix: Fixed issue where CrashReportClientEditor would crash while exiting due to the "request exit flag" not being set.

  • Bug Fix: When defining AddStructReferencedObjects for Garbage Collector exposed structs, GC will now continue to process other UPROPERTY exposed UObject references instead of only calling AddStructReferencedObjects on that struct.

  • Bug Fix: Imported FFieldPathProperty from the text.

  • Bug Fix: Toggling TraceLog CPU channel could result in incorrect timing data. Due to mismatching begin/end events and batches that weren't flushed incorrect scopes would frequently be displayed in UnrealInsights when toggling the CPU channel on and off.

  • Bug Fix: Added Ensure for getting the correct case of project path during engine startup on the Windows platform.

  • Bug Fix: Fixed buffer overrun and static buffer reuse in crash context.

  • Bug Fix: No longer load pak verification data if pak verification is turned off, this leads to a slight reduction in memory footprint.

  • Bug Fix: Fixed a small bug in which pak verification data was being loaded, when pak verification was turned off. This is always in memory so represents a small memory gain.

  • Bug Fix: Fixed some bad logic for calculating when padding is needed in Pak files.

  • New: Moved environment command-line parsing earlier. This allows setting up for example log output using environment variables in automated scenarios.

  • New: Added Ensure fix for getting the correct case of the project path during engine startup on Windows platforms. The case will no longer resolve directory junctions at the same time as doing so can cause problems for p4 operations.

  • New: Added Ensure to the project directory so that is updated after the first time the project file path is set.

  • New: Added Support for "-ddc=default" syntax. It functions the same as omitting the "-ddc" argument, but useful for CI environments.

  • New: Refactored TFastReferenceCollector template arguments to use enum options instead of multiple bool flags.

  • New: TFastReferenceCollector now supports traversing weak pointer properties when collecting references to UObjects.

  • New: Added a callback to allow custom property types (from plugins etc) to be converted from UProperties to their respective FProperty types.

  • New: Added support for additional properties to TraceLog channels.

  • New: Cooker File IO improvements:

    • No longer check the End-of-File tag unless working in a Windows uncooked build with DO_GUARD_SLOW enabled.

    • Avoid emptying the file content buffer in FArchiveFileReaderGeneric when performing a seek but staying within our current buffer window.

    • Avoid emptying the file content buffer in FArchiveFileReaderGeneric when performing a seek outside the buffer window then a seek back into our buffer window without any read in between.

  • New: Added more debug info to ensure triggered by invalid object path when setting Soft Object Path.

  • New: Introduced additional UE_LOG statements in SavePackage.cpp.

  • New: Refactored ContainsObjectReference and ContainsWeakObjectReference so that the latter is implemented in terms of the former.

  • New: TraceLog channels now use refcounting to track enabled state. In order to easier manage enabled channels and initialization, Trace::FChannel now uses reference counting. Negative values mean the channel is disabled.

  • Improvement: Optimized Pak file indices by computing the PathHashIndex in Unrealpak rather than using strings at runtime. This removes the need to shrink the string indices for performance, which was triggering a bug due to unsynchronized multithreaded access.

  • Improvement: Garbage Collector will now use the token stream instead of serialization for TMap and TSet properties.

  • Improvement: Flipped the logic for UObject::IsDestructionThreadSafe. It will now be whitelisting classes instead of blacklisting resulting in memory and performance optimizations for async destruction of UObjects.

  • Improvement: Optimized internal Garbage Collector functions by removing inline in order to optimize compile times.

  • Deprecated: Deprecated CreatePackage(Outer, Name) and replaced it with CreatePackage(Name).


  • Crash Fix: Fixed a crash that occurred when importing variant data from some DeltaGen scenes.

  • Crash Fix: Fixed a crash when parsing UsdGeomPointInstancersin USD where the prototype is a reference to another primitive.

  • Crash Fix: Fixed a Datasmith Addin crash on export of Line and Curve entities with Revit.

  • Crash Fix: Fixed a crash that occurred when adding new USD layers via the USD Stage Editor window, and fixed meshes that were unnecessarily rebuilding when adding empty layers via the USD Stage Editor window.

  • Crash Fix: Fixed a crash from changing the framerate of the AUsdStageActor's imported LevelSequence after opening a USD stage.

  • Crash Fix: Fixed a crash that occurred when trying to import meshes from Cinema 4D scenes that have more than 7 UV channels.

  • Crash Fix: Crash caused by Set Convex Collision Dataprep node was fixed.

  • Bug Fix: Fixed USD PointInstancers that did not update their spawned HISM components when their prototypes were updated and the file was reloaded via the USD Stage Editor window.

  • Crash Fix: Fixed a crash that occurred when reloading a USD stage and a PointInstancers prototype path could not resolve.

  • Crash Fix: Fixed a crash when adding empty existing USD layers as references in the USD Stage Editor window.

  • Crash Fix: Fixed a crash caused by parsing USD SkelRoot meshes with interleaved triangles and quads.

  • Bug Fix: Fixed USD stage not animating when going into PIE in some scenarios.

  • Crash Fix: Fixed a crash when unchecking prim payloads on the USD Stage Editor window.

  • Crash Fix: Fixed a crash when importing a USD prim that doesn't have enough displayColors.

  • Crash Fix: Fixed a crash when importing a USD SkelRoot mesh that does not have joint weights.

  • Crash Fix: Datasmith no longer crashes when parsing VRED variant files with invalid transform data.

  • Crash Fix: Closing the USD stage or switching variants via the USD Stage Editor window no longer leads to a crash.

  • Crash Fix: Fixed crashes related to undoing a change of the metersPerUnit field on the USD Stage Editor window.

  • Crash Fix: Fixed a crash after clicking Execute button in a Dataprep asset instance.

  • Crash Fix: For OpenNurbs importer, a potential crash if the scale vector was non-uniform was fixed.

  • Bug Fix: Fixed the displacement scale for MDL files.

  • Bug Fix: Fixed an incorrect export time field in a Datasmith scene when imported from Revit.

  • Bug Fix: Fixed metersPerUnit display not resetting when closing the USD stage.

  • Bug Fix: Now shows original import options when reimporting USD assets.

  • Bug Fix: Fixed Variant Manager variants with unspecified dependencies being marked as invalid dependencies for others; fixed Variant Manager variant dependencies not being updated when the target variant has been removed.

  • Bug Fix: Fixed the blend shape and animation bugs that occurred when the same SkelRoot was referenced multiple times in the same USD stage.

  • Bug Fix: FBX Exporter now supports material instances.

  • Bug Fix: Fixed an issue where Cinema 4D objects would always use display color materials even when set to off.

  • Bug Fix: Components name collision is now better handled when importing through Datasmith.

  • Bug Fix: Corrected a wrong Normals orientation on wall entities exported from Revit Datasmith.

  • Bug Fix: Dataprep Merge and Proxy Mesh Operators no longer leave empty mesh actors in the hierarchy.

  • Bug Fix: Volumes from Boolean operations are now removed by the IFC importer.

  • Bug Fix: Datasmith now supports Opacity Mask Clip Value.

  • Bug Fix: SkeletalMesh now outputs logs with the mesh name when there is a compute tangent error.

  • Bug Fix: The Dataprep Disable/Enable function now populates the undo stack.

  • Bug Fix: The Reimport workflow for FBX from Import to Level now updates in place.

  • Bug Fix: For PLM XML, the ProductRevisions and ProductViews actors are no longer created if not present in the original file.

  • Bug Fix: Fixed the Selected Option property where Switch Actors were not capturable via the Variant Manager window.

  • Bug Fix: Fixed an issue where, in some cases, the Corona default light units conversion wasn't correct, making the lights too bright in Unreal.

  • Bug Fix: Incorrect location of spawned actors using Spawn Actors At Location no longer happens.

  • Bug Fix: Scene hierarchy from a Revit Datasmith export no longer has duplicates.

  • Bug Fix: Fixed a section length rounding error for LevelSequences imported from USD for optimized builds.

  • Bug Fix: Fixed animations that were not resetting properly when reloading the USD stage via the USD Stage Editor window.

  • Bug Fix: Dataprep no longer creates assets that cannot be moved to dataprep subfolders.

  • Bug Fix: Revit Structural Steel Connections are now exported with Datasmith.

  • Bug Fix: Incorrect names on subcomponents imported with Datasmith integrated from Dev-Enterprise no longer occur.

  • Bug Fix: Fixed the behavior of AUsdStageActor when going into and out of PlayInEditor sessions, and fixed the stage not closing when switching maps with the USDStage window closed.

  • Bug Fix: Fixed a behavior of AUsdStageActor when undoing and redoing in the editor, along with the USD Stage Editor window not updating when switching maps.

  • Bug Fix: Fixed the parent SwitchActor option switching, clearing the chosen choices of child SwitchActors; fixed child SwitchActors being able to set children as visible when they themselves are unselected.

  • Bug Fix: You can now hide USD mesh prims with the USD Stage Editor window in some circumstances; invisible meshes sometimes contributing to collapsed parent meshes when importing from USD has also been fixed.

  • Bug Fix: Fixed skeletal meshes disappearing when toggling the visibility of SkelRoot meshes in the USD Stage Editor window.

  • Bug Fix: The DataPrep Output to Folder now does a sanitize check on the name of the folder.

  • Bug Fix: Illegal characters in a texture name will now survive a Datasmith export when integrated from Dev-Enterprise.

  • Bug Fix: Fixed incorrect CineCamera transforms and parameters when importing from USD files.

  • Bug Fix: Entities in Revit exporter Datasmith scenes no longer have offsets on their meshes.

  • Bug Fix: Fixed incorrect camera transforms when opening or importing stages with Z as the up-axis.

  • Bug Fix: Fixed an issue where escaping out of renaming a prim with the USD Stage Editor window sometimes left an empty row on the prim hierarchy view; fixed updates to USD Stage Editor prim hierarchy view resetting item collapsed states; when creating prims with the USD Stage Editor window, no longer allows names that would lead to USD errors.

  • Bug Fix: It is now possible to drag and drop actors onto empty Variant Manager actor lists.

  • Bug Fix: Fixed some USD scenes from being opened purely as components of the AUsdStageActor.

  • Bug Fix: Fixed importers incorrectly traversing into USD PointInstancers when generating meshes.

  • Bug Fix: Fixed additional static mesh and components from being generated when collapsed USD prims update under some circumstances.

  • Bug Fix: Stabilized behavior of AUsdStageActor during some complex editor interactions such as undoing deletes, undoing stage changes, and map changes.

  • Bug Fix: Fixed exported CineCamera parameters when exporting levels to USD.

  • Bug Fix: Fixed an error when exporting level to USD due to incorrect CineCamera property names; improved name sanitizer when exporting USD levels.

  • Bug Fix: Fixed an issue where the PurposesToImport import option was not being saved to a config file between USD imports.

  • Bug Fix: Fixed an issue where imported USD assets were not being updated in some circumstances when reimported.

  • Bug Fix: Fixed a USD error message when trying to import AnimQuery objects of SkelRoots that do not have any SkelAnimations.

  • Bug Fix: Fixed an issue when importing a USD stage after opening it via the USD Stage Editor window.

  • Bug Fix: UE4 materials are no longer ignored when importing from an existing USD stage.

  • Bug Fix: USD PointInstancer prims no longer import with extra actors.

  • Bug Fix: Fixed mesh with partial material assignment not receiving DisplayColor materials on unassigned faces when importing USD scenes.

  • Bug Fix: Fixed USD SkelRoots not generating DisplayColor materials when imported.

  • Bug Fix: Added support for importing all USD interpolation types for displayColor and displayOpacity for SkelRoots.

  • Bug Fix: Fixed displayOpacity USD materials not being created when importing unless there's also a displayColor.

  • Bug Fix: Fixed Normals being unnecessarily discarded and recomputed in some scenarios when importing Cinema 4D scenes.

  • Bug Fix: Imported actor and component visibility now import correctly from VRED scenes.

  • Bug Fix: Improved support for parsing USD primvars as UV sets.

  • Bug Fix: Fixed the File > Reload option on USD Stage Editor window not re-reading the USD file in some scenarios.

  • Bug Fix: Fixed GeomBindTransform not being applied to imported blend shapes when importing USD SkelRoot scenes.

  • Bug Fix: Wrong Normals orientation on wall entities exported from Revit Datasmith Integrated from Dev-Enterprise no longer occurs.

  • Bug Fix: Renamed Scale to metersPerUnit on the USD Stage Editor window.

  • Bug Fix: Fixed mismatching frame rates on imported LevelSequence when the parent USD layer is not animated but the child layer is.

  • Bug Fix: Fixed USD message log messages that never cleared on sequential imports.

  • Bug Fix: Fixed displayColor interpolation support for varying mode in USD scenes.

  • Bug Fix: In the USD Stage Editor window, fixed hiding UsdGeomMesh prims that are part of SkelRoots but were having no effect.

  • Bug Fix: Fixed USD blend shapes desyncing with SkeletalMesh in some scenarios.

  • Bug Fix: Old assets no longer show up in content folders when importing USD scenes from the USD Stage Editor window.

  • Bug Fix: Fixed AUsdStageActor not loading USD stage on startup if loaded from a sub-level.

  • Bug Fix: Fixed the USD Stage Editor window not refreshing when the StageActor was destroyed.

  • Bug Fix: Fixed a behavior when opening, closing and reloading USD stages if the AUsdStageActor is in a sublevel.

  • Bug Fix: Fixed undoing an Action > Import in the USD Stage Editor window removing the dirty flag from imported assets.

  • Bug Fix: Fixed a warning when creating an import package with an invalid name when importing USD scenes.

  • Bug Fix: Fixed an issue where assets were not being generated if parsing a custom, user-defined schema when opening a USD stage, or during USD import.

  • Crash Fix: The following crashes were fixed:

    • The USD plugin no longer crashes when opening USD stages (both via USD Stage Editor as well as importing) with generated static meshes containing more than 255 material slots if the ray-tracing plugin is enabled.

    • It no longer crashes on every second reimport when reimporting USD scenes.

    • A crash that happened in some scenarios when importing the same skeletal mesh twice in a row from USD scenes no longer occurs.

    • USD materials destined for Renderman are ignored by our USD importer.

    • Fixed a crash that occurred when closing an open USD stage via the USD Stage Editor window with one of the generated static mesh components selected.

    • Fixed a rare crash when closing the USD Stage Editor window after deleting its AUsdStageActor.

  • Bug Fix: The following bugs were also addressed:

    • Fixed skeletal meshes not updating material assignments whenever the USD stage was reloaded via the USD Stage Editor window.

    • USD skeletal mesh reimports now only consider vertex positions when deciding whether the skeletal mesh was changed on disk.

    • Skeletons now import alongside their skeletal meshes when importing USD scenes in some scenarios.

    • Fixed USD importer and stage editor ignoring higher index UV sets if a lower index UV set wasn't available.

    • Now keeps intended UV set indices when importing or opening USD scenes, as opposed to always packing them sequentially.

    • Improved feedback related to UV set or primvar problems when importing or opening USD scenes.

    • Refresh metersPerUnit display on USD Stage Editor window whenever the stage is reloaded.

    • Fixed undoing USD Stage Editor stage openings, sometimes leading to duplicate components.

    • Fixed SkinnedMeshComponents generated when opening USD scenes not refreshing their render state when undoing or redoing changes.

    • Added basic editor multi-user support for USD Stage Editor (opening/closing stages, manipulation of the AUsdStageActor directly, and undo/redoing those operations).

    • Added support for sharing meshes and using material overrides when importing USD static and skeletal meshes via the USD Stage Editor window or direct import.

    • Fix bugs on USD Stage Editor related USD always converting layer file paths to lower case (especially visible if layers had absolute file paths).

    • Fixed some generated static and skeletal meshes losing their UV sets whenever the USD stage was reloaded via the USD Stage Editor window.

    • Fixed file extensions when browsing for USD files to open or save via the USD Stage Editor window on Mac.

    • Fixed a stack overflow when importing USD stages (or opening via the USD Stage Editor window) if a layer has itself as a sublayer.

    • Fixed the USD Stage Editor window to correctly remember the stage variant state between different openings of the same stage.

    • Fixed undoing a AUsdStageActor deletion with an opened USD stage that sometimes caused a component to pop out of its actor/component hierarchy.

    • On the USD Stage Editor window, visibility buttons for prims that can't be hidden via USD were removed.

    • Minor tweaks were made to the USD Stage Editor window so that column splitters can be used for the variant and variant sets panel.

    • Fixed rounding errors when parsing some types of animation curves imported from USD scenes.

  • Bug Fix: When importing an Alembic file as a Skeletal Mesh, normals will be computed for each of the generated morph targets.

  • Bug Fix: Fixed duplicate objects being spawned when importing Cinema4D scenes with instanced nodes; also fixed animations of instanced nodes not importing correctly from Cinema4D scenes.

  • Bug Fix: Fixed an issue where material instance parameters that were overridden in Unreal were not preserved during a reimport.

  • Bug Fix: Fixed mesh reimport not using tessellation parameters specified at import time.

  • Bug Fix: Improved support for lights with no attenuation when importing Cinema4D scenes.

  • Bug Fix: Fixed multiple LevelSequence bindings when importing Cinema4D scenes with instanced nodes.

  • Bug Fix: Fixed SwitchActor label incrementing twice when dragging and dropping it onto the viewport.

  • Bug Fix: An issue with Materials was fixed where material parameters were not updated when parent master material changed by reimport.

  • Bug Fix: Fixed a reimport issue where new components would be created instead of updating the existing ones in the case where the label of a component had changed since the last import.

  • Bug Fix: Improved support for the standard 3ds Max blend material. Its conversion has been updated to use the newer Datasmith UE Pbr material system.

  • Bug Fix: In MDL, fixed excessive material compilation on import.

  • Bug Fix: Removed a redundant folder creation in MDL.

  • Bug Fix: Dataprep folder import no longer creates an unexpected folder hierarchy.

  • Bug Fix: Fixed incorrect shading on LiDAR Point Cloud assets when extracted from another asset.

  • Bug Fix: Fixed a bug in the DatasmithSDK that would prevent the FDatasmithSceneImpl::Reset() function from fully resetting the scene.

  • Bug Fix: DatasmithFacadeCSharp—In C#, FDatasmithFacadeActors now stay valid after they are added to a scene.

  • Bug Fix: The scene orientation of the OpenNurbs (.3dm) Datasmith importer has been modified to match the orientation of the .FBX scene importer and of the upcoming DatasmithRhinoExporter. Effectively, this translates into a 180° rotation around the Z-axis, between .3dm scenes imported with UE4.25 and those imported with UE4.26.

  • Bug Fix: Fixed a bug in the DatasmithSDK that would prevent the Flatness property for FDatasmithMaterialExpressionFlattenNormal to be properly set.

  • Bug Fix: The failure message when trying to import huge meshes(bigger than 2Gb) has been improved.

  • Bug Fix: Fixed a bug in the DatasmithSDK when exporting an IDatasmithTextureElement with a custom Label, where the label would not be exported to the generated .udatasmith file.

  • Bug Fix: MDL: Removed a misplaced error message.

  • Bug Fix: Fix a bug when reparenting an actor during reimport did not give the proper result.

  • Bug Fix: In Dataprep, an actor nesting for Folder import was fixed.

  • Bug Fix: Fixed color- and contrast-related issues when importing LAS files containing 12-bit components.

  • Bug Fix: Fixed a bug in the DatasmithSDK that would prevent exporting 2 textures with the same file name but different paths. A suffix is now added to the conflicting file name instead of ignoring that texture file.

  • New: PLM XML now retessellates imported geometry without having to reimport it.

  • New: Improved conversion of UVs and transforms for tiling/shift coordinates when importing Rhino files.

  • New: Pivot for files imported from Rhino now set to geometry bounding box center.

  • New: Implemented a new class: UDataprepFilterTransform.

  • New: Added support for normal maps when processing UsdPreviewSurface materials.

  • New: Added support for USD on Mac.

  • New: Added support for USD Lights. The following UsdLux schemas are now supported: UsdLuxDistantLight, UsdLuxDiskLight, UsdLuxRectLight and UsdLuxSphereLight.

  • New: Support now in place for exporting and importing variant data from .udatasmith files.

  • New: Implemented Flip Face operation in Dataprep.

  • New: Implemented a Spawn Actors at Location operation.

  • New: Created a selectable material substitution table.

  • New: Added support for UsdLuxDomeLight as UE SkyLight with a cubemap for USD.

  • New: Implemented the ability to skip a step within an action node in Dataprep.

  • New: Updated the USD SDK to 20.05 with Python 3 support.

  • New: In Dataprep, you can now copy a name from an asset/actor in a content/scene preview.

  • New: Dataprep now has a wizard for custom operation and filter creation.

  • New: Regroup Add New and search bar in operators/filters tab now available in Dataprep.

  • New: Automatically synchronize selection with filter preview.

  • New: You can now implement Reference Filter Transform in Dataprep.

  • New: The USD importer will now reuse identical generated DisplayColor materials when importing USD scenes; support for generating double-sided DisplayColor materials when importing USD scenes has also been enabled.

  • New: Setting thumbnails to the Variant Manager's variant sets is now allowed, along with setting Variant Manager thumbnails at runtime with Texture2D objects. An event was added that is fired whenever Variant Manager thumbnails are updated.

  • New: Exposed access to the Variant Manager's UPropertyValue's prop segments.

  • New: The UI for the Variant Manager was updated to better separate elements.

  • New: Multiple transform animations are now combined into the same LevelSequence when importing animated DeltaGen scenes.

  • New: Some materials are now always set on the base imported mesh when importing Cinema 4D scenes, even if there are multiple overrides.

  • New: Added support for exporting materials to USD as preview surface materials with baked textures.

  • New: The USD importer now imports baked UAnimSequence skeletal animations when importing USD stages with animated SkelRoots.

  • New: Updated the Dataprep operation Spawn Actors At Location to support more asset types.

  • New: Added support for exporting SkeletalMeshes to the USD formats.

  • New: Changed USD Exporter to emit Z-up stages by default.

  • New: Added widgets to control prim kinds and purposes on the USD Stage Editor window; set root prim to Assembly kind by default when creating stages via the USD Stage Editor.

  • New: Fixed multiple bugs that occurred when adding, removing, or renaming prims in the USD Stage Editor window. Now allows adding top-level prims with the USD Stage Editor window.

  • New: Allows setting dependencies between Variant Manager variants.

  • New: Added support for parsing USDZ archives as regular USD scenes.

  • New: Now writes back the visibility of scene components to the USD stage when opened via the AUsdStageActor; fixed prims that sometimes were not hiding when toggled in the USD Stage Editor window.

  • New: Support for:

    • Exporting vertex color and opacity to USD

    • Exporting all static mesh LODs to USD as "LOD" variant sets

    • Exporting to USD multiple material assignments per LOD

  • New: Added support for importing USD Skel blend shapes as Morph Targets.

  • New: Implemented a Set Layer operation.

  • New: Disabled actor importing when importing USD scenes from the Content Browser.

  • New: It is now possible to import Alembic velocities. This is useful when the topology is not constant during an animation since Unreal cannot compute motion vectors without matching vertex pairs between frames. If the velocities are available in the Alembic file, they can be imported, and motion vectors will be deduced from them.

  • New: Removed an icon that showed when moving a node onto itself and replaced the associated message.

  • New: Datasmith now exposes a multi-process CAD import to Python.

  • New: The MDL SDK has been upgraded to 2020.1.

  • New: With Datasmith, you now have the ability to author USD xform animations in Sequencer when using the USD stage.

  • New: Import of folders has been speeded up by making use of multi-core processing.

  • New: Datasmith now supports the thin translucency shading model.

  • New: Improved support for 3ds Max Corona materials when exported through Datasmith. The following materials and maps conversion have been improved: CoronaMtl and CoronaLayeredMtl, CoronaAO, CoronaColor, CoronaNormal and CoronaBitmap.

  • New: Support is now available for display and document color when importing Cinema4D scenes.

  • New: PLM XML now accepts .xml. It also includes minor wording fixes.

  • New: Datasmith importers should now only recompute invalid normals and tangents, and leave valid ones intact, as opposed to discarding them all and recomputing the entire set.

  • New: A Navisworks exporter has been added.

  • New: Individual LiDAR Point Cloud assets no longer have a 2-billion point limit, which allows virtually unlimited amounts of points per asset.

  • New: Added support for importing and exporting point clouds in LAZ format.

  • New: Significantly improved performance (up to 80%) when merging LiDAR Point Cloud assets.

  • New: Added LiDAR Clipping Volume Actor, allowing real-time clipping of LiDAR point clouds.

  • New: It is now possible to calculate the Normal vectors for points, either for the whole cloud or for only a selection. The current model is best suited for urban and human-made surfaces.

  • New: Added support for importing point clouds in E57 format.

  • New: Significantly improved performance (up to 65%) and RAM usage (up to -80%) when exporting Point Cloud assets as LAS.

  • New: Significantly improved performance (up to 50%) and RAM usage (up to -40%) when importing LAS files.

  • New: The DatasmithFacadeCSharp is now Mac-compatible. With it, it is now possible to export Datasmith scenes in C# on Mac.

  • New: Better handling of incorrectly formatted LAS/LAZ files

  • New: Rhino Exporter is now available.

  • New: Datasmith OpenNurbs (.3dm) import now supports importing the Rhino Attribute User Text as metadata.

  • Deprecated: Deprecated the old version of the USD Importer in favor of the new module, USD Stage Importer, that shares code paths with the newer USD Stage Editor window.

  • Deprecated: Removed deprecated async functions from actors and components.

  • New: DatasmithFacadeUEPbrMaterial was added to the DatasmithFacadeCSharp. With it, it is now possible to export material graphs using the DatasmithFacade.

  • API Change: We must now use the FDatasmithFacadeScene.AddMaterial() function instead of the FDatasmithFacadeScene.AddElement() when adding materials to the scene.

  • New: FDatasmithFacadeTexture was added to the DatasmithFacadeCSharp, allowing for better customization of the exported textures.


  • Bug Fix: Fixed incorrect quotation in VSCode configuration files thus breaking IntelliSense.

  • Bug Fix: VSCode - Stopped iterating to parent directories when the root directory is reached, as there can not be any relevant compiler options specified further up than that. Avoids reaching the root of the drive.

  • Bug Fix: Fixed an error that occurred when the ParentDirectory property was used on non-windows paths and it would iterate to the root (index out of bounds exception).

  • Bug Fix: Fixed an issue with converting UnrealTargetPlatform to a string when parsing command-line options. Added a "TypeConverter for UnrealTargetPlatform Added" check to verify if a type converter exists when parsing command-line arguments.

  • Bug Fix: Separated CppStandards into different PCHs to not mix Cpp17 with Cpp14 in the same shared PCH.

  • Bug Fix: Fixed excluded files in VsCode for foreign projects. Hid the .vscode folder as it only contains configuration files for the project itself.

  • Bug Fix: Corrected settings.json generation for single projects (VSCode).

  • Bug Fix: Added a small variance to the time the UGS scheduled sync starts (+/- 10 minutes) to avoid everyone hitting the P4 server at exactly the same time.

  • Bug Fix: Fixed VsCode error failing to find the omnisharp extension.

  • Bug Fix: A display message will now only be issued when NvAPI / AGS isn't available due to RenderDoc being enabled. Reduced the normal path verbosity to Warning from Error.

  • Bug Fix: The UAT script SyncProject can now be used outside of Perforce when syncing a project without syncing the engine.

  • Bug Fix: The RenderDocPlugin should now only prompt to find RenderDoc when not running in Unattended mode.

  • Bug Fix: The editor Perforce plugin will now sync all revisions up to the specified changelist instead of just the specified change.

  • Bug Fix: Because the RenderDoc plugin loads well before DPCVars are loaded, it was not possible to disable RenderDoc during Ray Tracing tests. Support for disabling frame trace captures via cmd line was added as a workaround.

  • Bug Fix: Fixed infinite loops for DMX Blueprint events.

  • Bug Fix: For DMX, the default Protocol Name is no longer None.

  • New: VSCode Intellisense mapping has been reworked, it now creates a C++ configuration per project, with a name that makes it clearer to which target/platform/configuration the Intellisense is mapped.

    • Win64 development is still mapped for each target so run a build for it to make UHT generate the headers in the expected location.

    • The clang cpp file now specifies PCH / defines for each cpp file, which will correct occasional Intellisense errors for certain files.

  • New: Added a Perforce cstat command wrapper to the editor Perforce plugin.

  • New: Exposed AllowShaderWorkers to CVars as well.

  • New: Added the 'Res=1280x720wf' command line argument to simplify setting window resolution.

  • New: The RenderDoc plugin no longer loads when automation is not allowed to take frame traces. Loading the RenderDoc plugin is disallowed when RayTracing tests are being run.

  • New: Optimizations for DDC access on remote/slow drives.

    • Added a new 'ConsiderSlowAt' property to the 'Filesystem' DDC entries in DefaultEngine.ini. If latency to the node is greater than or equal to this value then the node will be marked as slow which disables touching and reduces file stats.

    • Added a new 'PromptIfMissing' property to the 'Filesystem' DDC entries in DefaultEngine.ini. If a path is set but not accessible, the user will be prompted and able to retry if they had to start a VPN or mount a drive.

  • New: Implemented auto mapping of Function Names to Attributes in the DMX Attribute system when parsing a GDTF file.

  • New: Added a "-Info" option for UnrealPak to dump some header information about a pak file.

  • Improvement: Disabled attempting frame trace captures when the cmd line is specified.

  • Improvement: Tweaked job scheduling in ParallelExecutor to make ISPC jobs execute early; ISPC jobs tend to run long so starting them early prevents ISPC from causing the build to take longer than necessary.

  • Improved: Updated DXC to rev. 04a84f0.


  • Bug Fix: AutomationTool: Force the usage of backslashes in the *.exe path that will be set as resource 201 for BootstrapPackagedGame. The usage of slashes resulted in a part of the path being truncated by PathRemoveFileSpec which was preventing the test of local DLLs from succeeding.

  • Bug Fix: The BuildPluginCommand now properly supports non-Test and non-Shipping Game targets. The previous code prevented the DeveloperTool modules from being compiled if there were no Runtime modules in the plugin.

  • Bug Fix: Removed the [STAThread] attribute from the AutomationTool entry point as this was causing issues with some platforms' use of COM APIs.

  • New: Added CSVTools to installed builds.

  • New: Added a callback to the UAT project parameters so a script that uses buildcookrun can choose to modify the deployment context before staging.

  • New: Exposed a function from the staging code which allows remapping staged file paths based on the project remapping configuration.

  • New: Extended cooked target staging so that any programs or editor server targets are forced to Development configs, rather than what the master client/server targets request.

  • New:

    • Missing target receipts are now ignored when staging a DLC plugin. A content-only DLC plugin can now be staged using the previously-built executables from the staging of the original project.

    • Disabled chunking when staging a DLC plugin.

  • New: In UAT, added a staging option to disable the use of existing .pak files from the staging folder of other build targets, when forcing the reuse of another target's cooked data.

  • Improvement: Hardened UAT to not crash when the PATH variable contains a path with invalid characters.


  • Bug Fix: Fixed retry in Linux when linking batch files.

  • Bug Fix: Moved VS Code file exclusions to .ignore to fix large projects.

  • Bug Fix: Fixed a crash in ListThirdPartySoftware.Automation.cs.

  • Bug Fix: Fixed the UnrealBuildTool crashing on launch if the initialization of UnrealTargetPlatform static members variables happens out of order.

  • Bug Fix: Corrected the ConfigHierarchy parsing of negative integers. The value parsing code was not handling the "-" character so config items such as "Value=-1" would fail to parse.

  • Bug Fix: Corrected some inconsistencies with how inlining compile options were applied to the VCToolChain:

    • The CompileEnvironment variable 'bUseInlining' is now correctly applied in all configurations.

    • Enabling 'Edit and Continue' will now disable inlining for all configurations.

  • Bug Fix: Fixed IsHostOnVpn always returning false (so XGE will now be turned off when working on a VPN).

  • New: Build targets are now allowed to use config file attributes.

  • New: Added code in UBT to detect circular dependencies in module references early in the build process. This will display an error message such as: Error : Circular dependency on PhysicsCore.Build.cs detected. Route is Target -> Launch.Build.cs -> Engine.Build.cs -> RenderCore.Build.cs -> RHI.Build.cs -> (Dynamic) -> VulkanRHI.Build.cs -> HeadMountedDisplay.Build.cs -> AugmentedReality.build.cs -> MRMesh.build.cs -> PhysicsCore.Build.cs -> ChaosEngineBridge.Build.cs -> ChaosSolvers.Build.cs -> PhysicsCore.Build.cs. Break this loop by moving dependencies into a separate module or using Private/PublicIncludePathModuleNames to reference declarationsAs part of this change, all current UE4 modules with circular references have been modified to declare them and those dependencies either whitelisted or fixed if the change was straightforward.

  • New: Added an option to UBT project generation to allow users to specify include paths to be omitted from project files. This speeds up parsing, reduces the memory footprint, and allows irrelevant symbols to be excluded from IntelliSense suggestions. Example usage in BuildConfiguration.xml: ThirdParty\WebRTC;ThirdParty\PhysX Example savings - Adding ThirdParty\PhysX = 47% vcproj reduction (28MB -> 15MB) Adding ThirdParty\ = 61% vcproj reduction (28MB -> 11MB)

  • New: Added Thread_UseAllCpuGroups to the UnrealBuildTool config to enable UBT to use both CPU groups on high-core systems such as 64-core ThreadRippers.

  • New: Performance improvements to SN-DBS integration in Unreal Build Tool:

    • Switched to the json interface and removed local task execution, allowing all task scheduling to be handled by SN-DBS.

    • A full engine rebuild demonstrated an improvement of ~40% vs the previous implementation on a network with 4 worker agents.

  • New: Added a minor fix for the bCreateHotPatchableImage property setter which ignored the requested value.

  • New: Exposed a function to clear plugin and directory caches. If new plugins are created by the owning UAT script, then they can be ignored because they weren't there when the directory/plugin availability information was cached.

  • New: When generating visual studio project files, projects with multiple editor targets will now use the default editor target config setting, if it exists, to determine which editor target should be added to the main project file. All others will generate separate projects inside the VS solution.

  • New: Clang 10 is now the default for Windows Clang configuration.

  • Improvement: Turned off parsing of platform data that fails for disabled plugins during project generation.


  • New: Added a "View in Swarm…" command to the context menu for changelists.


  • Bug Fix: UHT will now correctly parse an implemented interface class function declaration that includes one or more TSet/TMap parameters.

  • Bug Fix: Added a static assert to detect that inherited UStructs are not polymorphic unless basestruct is also polymorphic as this is currently not supported by the reflection system.


  • Crash Fix: Fixed a crash in the P4 Source Control plugin when parsing the history of an asset that was deleted, then added back.

  • Crash Fix: Fixed crash when issuing the Console command stat none.

  • Crash Fix: In multiplayer, you can reload your level in-game.

  • Crash Fix: Fixed a crash that occurred when resetting the layout.

  • Crash Fix: The Level Editor no longer crashes when adding a new level.

  • Crash Fix: Duplicates are filtered out when gathering Source Control states, preventing a crash when syncing Editor data.

  • Crash Fix: Fixed a crash on Undo and Redo actions when the Preview Material source instance is null.

  • Crash Fix: Cancelling a transaction now cancels the entire transaction instead of a part of it.

  • Crash Fix: The tutorial closes when the Editor window is closed.

  • Crash Fix: Updated ObjectTools where we de-referenced an Editor transaction without checking its validity. This caused a crash when using these functions from commandlets.

  • Crash Fix: Fixed an issue where canceling the PIE multiplayer client while loading would cause a crash.

  • Crash Fix: Fixed an issue with scripted toolbar buttons where implementing IsVisible or CheckState functions would cause a crash because no UFunction was allowed.

  • Crash Fix: Fixed a crash when calling CanSelectActor on an actor that is not in a Level.

  • Crash Fix: Fixed an issue where newly-created redirectors would be garbage-collected before being renamed, causing a crash.

  • Crash Fix: Fixed a crash when opening a recent level that had changed to a redirector.

  • Crash Fix: Fixed a crash when trying to restore a package at startup that no longer exists.

  • Crash Fix: Fixed a crash when following tutorials that opened the Modes tab.

  • Crash Fix: Fixed an Editor crash when toggling to full screen after a layout change.

  • Crash Fix: Fixed a crash where SPropertyEditorInteractiveActorPicker was trying to deactivate a mode that was not active.

  • Crash Fix: Fixed a crash when an Asset is deleted inside the Save As dialog.

  • Crash Fix: Fixed an issue where re-importing a SpeedTree that had its original materials removed from the Project caused a crash.

  • Crash Fix: Fixed a crash with the transactional temporary UI stub object.

  • Crash Fix: Fixed a crash when re-importing a Skeletal Mesh with new bones that had animations using that skeleton.

  • Crash Fix: Fixed a crash when re-importing a Skeletal Mesh that failed to re-import.

  • Crash Fix: Fixed an Editor crash during multi-user editing when using the Retopologize Tool.

    • Fixed the file sharing service to gracefully handle the case where the file containing the list of active processes using the service failed to open or save.

    • The service will only delete the expired files after one hour, rather than removing the entire shared folder.

    • Fixed the recovery service being killed on Editor exit.

  • Crash Fix: Fixed crash when syncing out-of-date Assets in the Editor if a dependency package was not found.

  • Crash Fix: Fixed a crash when the frame rate was zero in the animation timeline.

  • Crash Fix: Fixed an issue where the Editor crashed if the package path being passed to Map Load was a redirector, such as the EditorStartupMap.

  • Crash Fix: Fixed an issue where removing a Level from the world would cause a crash if actors in that level were selected inside the Hierarchical Level of Detail (HLOD) Outliner.

  • Crash Fix: Fixed an issue where accessing certain static functions caused a crash due to the EditorStyle module not being loaded first.

  • Crash Fix: Fixed a crash on auto-save when a Hierarchical Level of Detail (HLOD) Actor was manually deleted from the HLOD Outliner.

  • Crash Fix: Fixed a crash when importing an FBX file containing degenerate tangents or invalid meshes.

  • Crash Fix: Fixed a potential crash when force-deleting textures or materials used by BSP geometry in the current Level.

  • Bug Fix: MessageBus: Fixed infinite message sending when sending a direct message to a combination of local and remote recipients.

  • Bug Fix: Fixed initialization for UInstanceStaticMeshComponent after an owning actor Blueprint compilation.

  • Bug Fix: Fixed the mesh paint adapter so it handles larger meshes.

  • Bug Fix: Undo/Redo actions now work after adding a Component to an Actor, when the Component name was scrolled out of the view while still being edited.

  • Bug Fix: - USplineComponent::ClearSplinePoints now updates its SplineMetadata - SplineComponent.

  • Bug Fix: Fixed the text location in HiDPI.

  • Bug Fix: Restored child Editor windows now display their name.

  • Bug Fix: The JSON data table import now respects the Ignore Extra Fields option.

  • Bug Fix: In the Content Browser, the Asset file path is no longer cleared in the Editor after cancelling and closing the browser.

  • Bug Fix: When using Force Delete, the selection change is now detected.

  • Bug Fix: Vertex data statistics now update in Mesh Paint mode.

  • Bug Fix: Painting is no longer permitted on textures with an unknown number of bytes per pixel.

  • Bug Fix: Updated CSV import factory to prevent setting the import path to an empty string when importing text directly

  • Bug Fix: The Play dropdown menu now reflects the correct value for the number of clients.

  • Bug Fix: Fixed several issues with Editor UI interaction when using single-process multiplayer mode, and fixed the client number in the window name to always match the log client number.

  • Bug Fix: Updated Class Viewer to allow unloaded Editor-only classes.

  • Bug Fix: Updated Level Editor floor snapping to properly ignore all Actors in a group selection.

  • Bug Fix: Fixed nodes that were placed in unexpected locations on Material, Blueprint, and Niagara graphs.

  • Bug Fix: Broadcast Camera Moved event when the user jumps to a Bookmark in Editor.

  • Bug Fix: The selected Actor and corresponding Details panel now transfers to the current PIE or SIE instance when starting the session.

  • Bug Fix: Fixed legacy world rename handling, avoiding potentially renaming map build data with the name of an existing build.

  • Bug Fix: In the Perforce plugin, you can now use the command, -P4Passwd cmd , when connecting to Perforce.

  • Bug Fix: Fixed FName and exponential behavior when fixing up Meshes with many duplicate material names.

  • Bug Fix: When using Replace Actor, the mobility of the original Actor is retained.

  • Bug Fix: The Details panel no longer attempts to select separator nodes, which resulted in an invalid selection.

  • Bug Fix: Fixed viewports getting stuck upside down after orbit because of pitch locking.

  • Bug Fix: The Message Log now uses a fixed size font, and duplicate tooltip text was removed.

  • Bug Fix: User configuration is now preserved across package copies. Copying a package no longer causes packs like StarterContent to re-import and overwrite changes.

  • Bug Fix: Disabled editing of data table rows in the composite data table editor since changes are not saved.

  • Bug Fix: The SVN connection log message has been rewritten.

  • Bug Fix: Properties that have subcategories specified for them and have the ShowOnlyInnerProperties metadata flag now display correctly.

  • Bug Fix: World subsystems now initialize after a map rebuild.

  • Bug Fix: When Class Viewer is refreshed, it now scrolls to the selected item.

  • Bug Fix: The Parameters menu size has been clamped to no longer appear larger than the screen, also preventing flickering.

  • Bug Fix: When resetting Transform from the Details panel, the Transform of the rendered instance updates correctly.

  • Bug Fix: When resetting Curve Atlas Row, the row value resets correctly and no longer locks the user out of editing the value.

  • Bug Fix: Fixed PropertyEditor argument names for clarity and consistency.

  • Bug Fix: In the Details panel, the spacing of Float Curve Asset widgets was fixed.

  • Bug Fix: If the index is greater than the default array size, you can now export the last item of an array containing default values.

  • Bug Fix: There is no longer a prompt to save content when the user has bUseSingleProcess turned off, regardless of whether or not their PIE session was occurring in a separate process.

  • Bug Fix: When invoking CodeLite, a path name that includes spaces is now recognized correctly.

  • Bug Fix: PIE session windows now open with the correct Multiplayer Viewport Size setting found in Editor Preferences.

  • Bug Fix: Fixed an issue with Source Control submitting Project files.

  • Bug Fix: Updated Asset Picker to simultaneously show the filtered menu and hide the Search field.

  • Bug Fix: StatsRender no longer overlaps when using a custom LegacyFontSize.

  • Bug Fix: The MeshSimplifier & ProxyLODPlugin plugins were updated. The ProxyLOD plugin no longer generates uninitialized vertices at the end of the vertex buffer.

  • Bug Fix: The Editor analytic now correctly accounts the computer hibernation time as idle time.

  • Bug Fix: Updated Socket Manager to correctly adjust for DPI scaling. It no longer moves to the corner of the screen.

  • Bug Fix: In a VR PIE session, only the first viewport is marked as stereo-capable.

  • Bug Fix: When joining a multi-user session with in-memory change, the notification message has been rewritten for clarity.

  • Bug Fix: Moving an Actor to a World Outliner folder now created the proper transaction.

  • Bug Fix: Allow parsing of complex and localized numbers when emitting change events from SNumericTextBox.

  • Bug Fix: Fixed Level Details that were not using all of the space in its panel.

  • Bug Fix: Class Viewer now retains its selection when losing focus.

  • Bug Fix: Edit conditions now work correctly with fixed-sized C arrays.

  • Bug Fix: Fixed Class Viewer selection of unloaded Blueprint classes.

  • Bug Fix: Added partial Perforce state support for Move and Delete actions and Move and Add actions.

  • Bug Fix: Fixed a grammar mistake in the FBX Scene Import dialog.

  • Bug Fix: Changed Python3 TCHAR to PyApiChar(wchar_t) for platforms where wchar_t is 4 bytes.

  • Bug Fix: Fixed an issue where double-clicking a water mesh would cause a run-time error if the engine was compiled from source.

  • Bug Fix: Editor actions that try to focus a particular tab, like Blueprint debugging, will always work, even if the window is minimized.

  • Bug Fix: Fixed an issue where the Show in Explorer menu was not working properly for plugins in the Content Browser folder tree.

  • Bug Fix: Fixed an issue where displaying multiple instances of the InstancedStaticMeshComponent caused a long UI refresh. Now, if there are more than 512 instances (controlled by CVar r.Editor.MaxNumInstancesDetails), a performance warning displays with a button to show or hide instances per user preference.

  • Bug Fix: Fixed a thread safety issue in Perforce integration.

  • Bug Fix: Fixed the map-built data not being saved when closing a Level due to a save prompt re-entrance guard.

  • Bug Fix: Fixed an issue where changing the preview rendering level to Android and creating or opening a new Level would cause a mismatch between the tool button status and the feature Level.

  • Bug Fix: Fixed an issue where clicking the Clear option for a Streaming Volume was not working correctly.

  • Bug Fix: Fixed an issue where CreateNewStreamingLevel would try to load a streaming level of abstract type, causing an error.

  • Bug Fix: Fixed source control errors during rename of a file open for an add operation.

  • Bug Fix: Fixed the unsafe cast of IAssetTypeActions to FAssetTypeActions_Base

  • Bug Fix: Fixed an issue where opening the Landscape Spline Tool would cause a run-time error if the engine was compiled from source.

  • Bug Fix: Fixed a memory leak in SDetailsView when it was refreshed while not visible.

  • Bug Fix: Fixed an issue where a redirector was being saved as a .uasset instead of a .umap if the file did not exist.

  • Bug Fix: Fixed an issue where users were able to create a new streaming layer with a streaming distance of 0 when distance streaming was enabled.

  • Bug Fix: Fixed a bug where resizing the Content Browser was not updating the hit detection correctly.

  • Bug Fix: Closing a menu now releases the memory taken by the menu widget.

  • Bug Fix: A 1.0 vertices/triangles reduction will now correctly reduce the mesh if the source model has more vertices/triangles than the MaxNumOfVertsPercentage/MaxNumOfTrianglesPercentage value.

  • Bug Fix: Fixed an issue where the ChildActorComponent was not properly previewing in the editor.

  • Bug Fix: Fixed an issue where a column customization passed to the PropertyTable widget was ignored.

  • Bug Fix: Fixed an issue where re-importing a Static Mesh with custom LODs would result in the LODs to have incorrect materials assigned to their sections.

  • Bug Fix: Fixed a crash when moving the mouse during LOD generation. Some UI delegates were not unbound properly.

  • Bug Fix: Fixed Editor Analytics sessions not correctly reporting bIsLowDriveSpace field.

  • Bug Fix: Fixed an issue where importing a Skeletal Mesh with custom LODs and no skinning was resulting in incorrect remapping of the bones.

  • Bug Fix: Fixed an issue to ensure that the Skeletal Mesh source data supports 16 bits of materials to be on par with the render data.

  • Bug Fix: Fixed an issue where screen messages were displaying when GAreScreenMessagesEnabled was set to False.

  • Bug Fix: Fixed an issue where the Mesh Bone Reduction would use a fixed InfluenceIndex, instead of the MAX_TOTAL_INFLUENCES.

  • Bug Fix: Fixed the Editor Analytics so it reports a project name by concatenating UGeneralProjectSettings::ProjectName and FApp::GetProjectName().

  • Bug Fix: Fixed an issue where re-importing a Skeletal Mesh would result in the values of Use High Precision Tangent Basis and Use Full Precision UVs to be reset in the Skeletal Mesh asset.

  • Bug Fix: Fixed an issue where the Editor would check for a pre-existing realtime override on viewports when doing a blanket removal.

  • Bug Fix: Fixed an issue where the Project Creation dialog would display a blank selection for the Starter Content option if the Feature Packs folder was unavailable.

  • Bug Fix: Changed the sharpening method for mask textures so that each color channel is processed separately.

  • Bug Fix: Fixed an issue where Instanced Static Meshes (ISM) were not initializing properly after a Blueprint re-instance.

  • Bug Fix: Fixed an issue where an old reduced Skeletal Mesh asset with a disabled section would not keep the disabled section state after a re-import.

  • Bug Fix: The Actor Picker Mode now gets disabled when the Editor loses focus. This prevents the Unreal Engine tooltip from rendering over the top of other applications.

  • Bug Fix: Fixed an issue in the Static Mesh Importer where it would use the FBX bounding box to test if the mesh was too small to be imported. Now, it correctly multiplies the mesh bounding box by the node global scale transform to test the real bounding box size.

  • Bug Fix: Fixed an issue to prevent a FBX node name clash when not keeping the namespace.

  • Bug Fix: Fixed an issue where using USkeletalMesh::ReleaseResources would use the FlushRenderingCommand in PIE tick.

  • Bug Fix: Fixed an issue where screen warnings were displayed even when bSuppressMapWarnings was set to False.

  • Bug Fix: Fixed an issue where an old package was not properly deleted when renaming a package.

  • Bug Fix: Fixed crash on map load when world legacy rename handling was renaming over other existing maps.

  • Bug Fix: Fixed level streaming volume properties so they can be cleared.

  • Bug Fix: Fixed an issue where the Skeletal Mesh was being rebuilt every time the LOD settings were changed in the Persona Editor.

  • Bug Fix: Fixed source control checkout errors when a package is saved. Errors will no longer appear if the file is already open, or being renamed.

  • Bug Fix: Fixed an issue where the Editor transaction buffer was being cleared when hiding levels.

  • Bug Fix: Fixed an issue with the transaction system in the Editor where intermediate transactions would record incorrect information due to using a different serialization algorithm.

  • Bug Fix: Fixed an issue where the message dialog would appear after a FBX import if no import error was found.

  • Bug Fix: Fixed an issue where the last item of an array would not export if it contained default values and the index was greater than the default array size.

  • Bug Fix: Fixed an issue where Actors with Editor-only Static Mesh components or components with no Static Meshes assigned were being included in the Hierarchical Level of Detail (HLOD) generation.

  • Bug Fix: Fixed issue causing some actors with multiple static mesh components to be excluded from the Hierarchical Level of Detail (HLOD) generation.

  • Bug Fix: Fixed an issue where selecting a spline point in one viewport and manipulating that point in another would result in the entire spline component being transformed, instead of the selected spline point.

  • Bug Fix: Added a fix to ensure that the Editor style module is loaded before calling its static functions from MeshPaintMode.

  • Bug Fix: Fixed an issue that caused invalid material baking in Hierarchical Level of Detail (HLOD) meshes when using the option 'Reuse Mesh Lightmap UVs' on mirrored (negative scale) meshes.

  • Bug Fix: Fixed incorrect DPI scaling of the selection box inside the LiDAR Point Cloud asset editor.

  • Bug Fix: Fixed an issue that occurred when attempting to convert a procedural mesh component without materials to a static mesh. If no material is assigned, the new static mesh will now use the default material.

  • Bug Fix: Fixed an issue where newly created Hierarchical Level of Detail (HLOD) packages that were only present in memory, did not appear in the Save All dialog.

  • Bug Fix: Fixed an issue in the Hierarchical Level of Detail (HLOD) volumes caused by overlapping meshes with offsets from their origins.

  • Bug Fix: Removed unneeded UV sets generated for Hierarchical Level of Detail (HLOD) meshes.

  • Bug Fix: Fixed an issue where a code-less project would fail to compile after adding a feature pack.

  • Bug Fix: Fixed multiple UV remapping issues in merged meshes created by the Hierarchical Level of Detail (HLOD) system.

  • Bug Fix: Added the Hierarchical Level of Detail (HLOD) results to the Message Log user interface.

  • Bug Fix: When adding the first C++ class to a source-less project, the internal UBT target name is now correctly set to the default Editor target name for the project.

  • New: Removed cast to SceneComponent when drawing component visualizer HUDs in the Blueprint editor. Actor component visualizers can also draw to the HUD.

  • New: Added BLUTILITY_API to UEditorUtilityWidgetBlueprint.

  • New: Loaded and on-disk gather functions for external actors are now split.

  • New: When requesting a PIE session, an open PIE transaction is now cancelled and the user notified, instead of preventing the PIE session entirely.

  • New: Added list of real-time overrides for level viewports. Previous APIs were deprecated or renamed to better indicate that a list of overrides is keyed to a system name. A system name is now required to ensure the caller removes the override they actually want to remove. This solved the problem where various systems added or removed real-time overrides in interlocked ways, especially when starting or stopping a PIE session.

  • New: Broadcast OnActorMoved for all Move and Snap Editor actions.

  • New: Added Package class filters similar to transaction class filters in multiplayer mode. This allows the Editor to filter package save from an asset type and/or a folder path. When a package is filtered out, the package event is not sent out to the server and the file is locally persisted instantly.

  • New: On Windows, handled WM_ENDSESSION message to detect the user logging off the system, calling the core delegate OnUserLoginChangedEvent to notify the event.

  • New: Pasting properties in a Details panel now retains the existing item expansion state, when possible.

  • New: Added the Rendering Hardware Interface (RHI) to the Editor analytics summary session.

  • New: Made an improvement to avoid memcopies in MergeFlattenedMaterials.

  • New: Level Play Settings now include Logical Resolution and Content Scale for device profiles.

  • New: User-defined filters are now allowed in the Open Blueprint Class dropdown menu using View Options.

  • New: When duplicating levels for PIE, Actors are duplicated instead of loaded from disk.

  • New: Class Viewer filters match with cpp-prefixed Search text.

  • New: Added Editor Utility version of Tool Menus for Blueprints in the Editor.

  • New: When all items are filtered from the Details panel, a message displays indicating that there are active filters.

  • New: Improved Scale to Fit Zoom mode in Texture Editor.

  • New: Added the display of native component names in the Simple Construction Script tooltip.

  • New: Added Mesh CSG operations (union, intersect, subtract, and a self-union to resolve self-intersections) to the modeling tools.

  • New: Code templates can now be easily added to Plugins using the UClassTemplateEditorSubsystem. Class template .h/.cpp files can be added to the plugin's Content/Templates subdirectory. By implementing a child class of UPluginClassTemplate in a plugin's Editor module, developers can override the default code UClass generation of their given class provided by the Class Generation Wizard.

  • New: Added the ability to bundle commands in the Keyboard Shortcuts menu.

  • New: Added a context menu when there is no valid selection that allows you to select all Actors or place an Actor.

  • New: The DisplaceMeshTool was updated. Multiple layers of Perlin noise can be combined. For each layer, the user can specify the frequency and amplitude. A new option was added to apply the offset only to vertices with normals pointing in a given direction.

  • New: Category expansion state in the Details panel is now restored after clearing the Search bar.

  • New: FMouseDeltaTracker can be exported from a DLL.

  • New: Always Center Window to Screen checkbox is now disabled by default.

  • New: The last known size of the PIE window is saved.

  • New: Added procedural animation support to the Data Charts plugin. This allows growing and collapsing data charts based on user events.

  • New: Added the bAvoidRelabelOnPasteSelected option to avoid relabeling Actors when pasting them.

  • New: Made all linked instancing context pointers pass as constant.

  • New: PIE sessions that launch a new standalone window no longer double render debug safe zones and all PIE options are more consistent when handling r.DebugSafeZone.XXXX cvars.

  • New: The following fields were added to Editor analytics:

    • bIsUserLoggingOut detects when the Editor closes because the user logged out.

    • bIsCrcExeMissing detects if the user compiled CRC.

    • SessionTickCount detects if the Editor ticked.

    • UserInteractionCount detects if the user interacted with the Editor.

    • MonitorTimestamp gets the approximate time of crash of CrashReportClientEditor.

  • New: Loading an Editor layout keeps the displayed asset sub-editors open. If PIE or SIE is open, the Editor displays a warning to prevent loss of work, and if the user accepts, it will close PIE and load the desired layout.

  • New: Added a Blueprint Editor option for short tooltips.

  • New: In Editor Preferences, added Minimum Orthographic Zoom option to the Level Editor - Viewport settings.

  • New: Added Title Property meta support to arrays of Instanced UObjects.

  • New: Common pin action menu items in the Graph Editor were moved to the Base Graph Editor.

  • New: In the Graph Editor, the Tab key opens the context menu to create a node at the current mouse position.

  • New: Details panel dropdown menus for Enums and other items now display a Search field if there are more than 20 items. This threshold can be changed for a custom property dropdown menu using the new FPropertyComboBoxArgs structure.

  • New: Files created by the Editor for a new C++ class can be put into subfolders.

  • New: Mouse panning was added to the Texture Editor.

  • New: Added spline point fast selection buttons to the Spline component Details panel.

  • New: Added an optional background Brush setting for all Graph Editors.

  • New: Replace references now considered subclasses of DataTable to be compatible, including CompositeDataTable.

  • New: Added the option to make BoundsCopyComponent usable outside of RuntimeVirtualTextureVolume and made it Editor-only.

  • New: GeometryProcessing library updates:

    • Added copy Boolean improvements from Main.

    • Added a catch out-of-range search tolerance in MergeCoincidentMeshEdges.

    • Added TMeshSimplification::SimplifyToMinimalPlanar, which simplifies flat areas of the mesh only.

    • Enabled the GeometryProcessing plugin for Runtime use.

  • New: Made the spline point details show up first in the Details panel of a Spline component.

  • New: We now allow a SaveConfig to not update the class default object.

  • New: Added a maximum number of debug strings per actor for AddDebugText in the HUD to avoid long frames when possessing the player after having ejected from it in PIE.

  • New: The Gameplay tags are now saved to a separate configuration file to improve performance of the main Editor configuration file.

  • New: Made the UDP Messaging Module add and remove static endpoint functions thread-safe.

  • New: Made the FBX Scene Importer accessible in Python.

  • New: You can now call SetLODGroup directly in Blueprint and Python to set a static mesh LOD Group.

  • New: You can now set all material properties directly in Blueprint when importing a material.

  • New: The Place Actors panel now allows filtering by the native class name as well. For example, PointLight is now a valid search term for the Point Light item.

  • New: Added the export flag to UK2Node_GetSubsystem.

  • New: Added the ability to import and re-import custom LODs directly in Blueprint and Python by adding functionality to EditorStaticMeshLibrary and EditorSkeletalMeshLibrary.

  • New: Added an option to downscale textures without Mips to allow for texture compression.

    • Accepts values between 1.0 and 8.0.

    • Can be overridden per-platform, for a specific texture or texture group.

    • Downscaling will keep texture size divisible by 4 so they can still be compressed

  • New: Added the new console command stat framecounter to see the overlay of the GFrameCounter that increments for every frame.

  • New: Added improvements to the Editor analytics.

    • Added WasDebuggerIgnored Editor summary event analytic fields.

    • Updated the save frequency on Windows from 1 minute to 30 seconds.

  • New: SpeedTree assets can now be imported using automated imports.

  • New: Updated the tooltip and display name for the Editor preference LogTimestampMode to make it clear that it affects the Output Log Window, and not the log file itself.

  • New: Added a delegate that allows developers to add widgets to individual property rows in the details panel via C++.

  • New: Added improvements to the Editor analytics

    • Added the filtered Editor command line to the Editor summary analytic event.

    • Added the engine tick count to the Editor summary analytic event.

    • Added the engine last tick timestamp to the Editor summary analytic event.

    • Added the Editor death timestamp as captured by CRC to the Editor summary analytic event.

  • New: Made the Static Mesh reduction options available directly in Blueprint and Python.

  • New: Users are now able to set the AssetImportData source file directly in Blueprints and Python, in addition to C++.

  • New: Added a Max Vertices/Triangle option to the skeletal mesh reduction options in addition to the current Percent Vertices/Triangle. This allows the user to enter a percentage while still keeping a budget limit.

  • New: Reduced the memory used when building textures.

    • Reduced the maximum memory usage when importing 16k PNG textures from 12 638 MB to 8 885 MB (Delta from before the import).

    • Allowed the function ITextureCompressorModule::GenerateMipChain to reuse the BaseMip when possible instead of generating another intermediate texture of the same size as the BaseMip.

    • When compressing the texture, the compressed texture is moved to the output instead of being copied.

    • Added some moves instead of copies in the CompressImage function of FTextureFormatUnCompressed.

    • Avoided an unnecessary copy in the CompressImage function of FTextureFormatDXT.

  • New: Added Editor settings to avoid Actor relabel on paste.

  • New: Added GRHIName to the Editor Analytics summary report.

  • New: The DumpPrimitives command creates a CSV file of visible primitives in the Logs folder.

  • New: Added a Voxel Solidify tool to the Mesh Modeling Toolset that turns mesh inputs into solid meshes by running marching cubes on the fast winding number of the mesh. In addition, added an option to pre-process other voxel tool inputs with a solidify pass to make them work more easily on bad inputs.

  • New: Added option to focus the viewport on the selection when inside the LiDAR Point Cloud Asset Editor.

  • New: The meta flag GetOptions now handles TArray as well. In addition, added support for multiple selected items.

  • New: Minor update to Editor target selection on launch to account for the possibility of default targets living in the engine.

  • New: Improved the built-in menu searching so it now filters options with more consistency. In addition, the search box now allows for actions such as copying and pasting as well.

  • New: Added a TArray64 overload to FImageUtils::ImageResize for working with pixels already in linear space.

  • New: Made the multibox search filter reset on gaining focus.

  • New: Added a new hyperlink to the Project root folder that appears when the Project has completed the zipping process. This notification now appears for a longer period of time to give the user more time to click on the hyperlink.

  • New: Replaced the Wiki option in the Editor Help menu with Online Learning.

  • New: Added new spline component options for selected spline points: Snap To Actor, Align to Actor and Align Perpendicular to Actor.

  • New: Hierarchical Level of Detail (HLOD) actors can now be saved to the HLOD packages.

    • Added a Save LOD Actors To HLOD Packages project option, which will cause all properties necessary to rebuild LODActors from scratch to be saved in the _HLOD packages.

    • When loading a level in the editor, the LODActors from the level are destroyed and new (transient) actors are spawned from the content of those packages. This extra processing isn't performed in cooked builds as LOD actors are recreated one last time during cooking.

    • The HLOD rebuild commandlet will avoid submitting the level itself and will now only update its associated _HLOD packages.

  • New: Added an option to create transient actors in EditorLevelLibrary.

  • New: Updated disaster recovery icons.

  • New: Projects now use the default editor target configuration setting, if specified, to determine the name of the editor target file for startup re-compilation purposes.

  • New: Added hotkeys to reset spline point tangents in the spline component. With a spline point selected, pressing T will reset the tangent to the default unclamped value, while pressing Shift-T will reset the tangent to the default clamped value.

  • New: Added Snap To Last Selected Axis options to the spline component. In addition, modified the option Snap All to Selected Axis to set the spline point to Auto so tangents are automatically adjusted.

  • New: Added post-process calibration materials for display calibration. Materials are set in Project Settings with show flags for visualizing materials full-screen when calibrating.

  • New: Added spline component functions SetScaleAtSplinePoint and SetRotationAtSplinePoint.

  • New: Added the concept of EditorUtilityTasks. These tasks are long running operations that can be queued to execute as soon as the previous task finishes.

  • You can create and customize your own tasks by extending the base class and can run a task by simply calling RunTask .

  • New: Introducing a new optional plugin called Asset Search. Its job is to index different asset types and store an indexed set of searchable data in a local SQLite database.

  • This plugin complements the Content Browser search by adding the ability to search for tags and phrases that appear on any asset in the project. In addition, it can be extended to support new asset types in your project or plugin.

  • New: Splines: Changed Alt-drag behavior when dragging off spline endpoints. The attached segment will be split if the drag direction is within 60 degrees of the segment rather than always creating a new point.

  • New: Splines: Added Editor Preferences for spline hit proxies to adjust point size, tangent handle size, line thickness and tangent scale.

  • New: Added a configuration value to determine if the asset registry scanner should gather data on cooked packages that it didn't find an asset export for. Defaults to TRUE to match existing behavior.

  • New: Added the failed assert error message that terminated the Editor to the Editor session summary analytic event.

  • New: The ResavePackages commandlet can now customize its garbage collection frequency via the command line GCFREQ=??? where ??? is how many packages should be resaved before a garbage collection is run.

  • New: Point selection within the LiDAR Asset Editor can now be inverted.

  • New: During advanced copy, don't reparent and recompile a Blueprint unless the parent changes, and don't reparent any Blueprints in the restricted list.

  • New: Improved performance of tangent generation when building Static Meshes after import, or when modified in the Static Mesh Editor.

  • New: Added Tangent Color property to spline components.

  • Improvement: Increased write performance for the .ini configuration files.

  • Improvement: Loading an Editor layout now leaves the open Asset sub-editor open. If either PIE or SIE is open, the editor will warn the user and once accepted, it will automatically close PIE or SIE and load the desired layout. This alert notifies the user of potential loss of work.

  • Improvement: A Project user can set their own default layouts for a selected Project. Each Project can have its own DefaultEditorLayout.ini file, which opens the first time a Project is opened and overrides the default engine layout found in Engine/Config/BaseEditorLayout.ini.

  • Deprecated: Deprecated the duplicated IBookmarkTypeTools functions that were inside FEditorModeManager.

  • Deprecated: The SnapGrid macro definition. Going forward, use the UEditorStyleSettings::GridSnapSize config.

  • New: The property Collision Accuracy has been renamed to Max Collision Error to better reflect its intent. Going forward, references to ULidarPointCloud::CollisionAccuracy should be updated to use ULidarPointCloud::MaxCollisionError instead.

Content Browser

  • Bug Fix: Fixed it so object properties marked AssetRegistrySearchable — such as DataAsset native class — properly show in the content browser.

  • Bug Fix: Initialized asset view search options in content browser so that they don't need to be toggled in the active session to take effect.

  • Bug Fix: Changed SizeMap to use the standard FText::AsMemory function.

  • Bug Fix: Fixed a bug when reloading unsaved packages.

  • Bug Fix: Added a fix to prevent Delete Assets Dialog from compiling every Blueprint when you open the Replace References drop down.

  • Bug Fix: Fixed the Skeletal Mesh assets vanishing thumbnails, caused by incorrect bounds calculation of empty Chaos Cloth simulations.

  • Bug Fix: Fixed an issue where the Content Browser was not showing the newly created asset after merging LiDAR Point Clouds.

  • New: Added support for extensible data sources for the Content Browser:

    • UContentBrowserDataSource is the common implementation of a "do nothing" data source for the Content Browser. You can derive from this type to create new data sources for the Content Browser, overriding any required functionality and validation logic.

    • See UContentBrowserAssetDataSource and UContentBrowserClassDataSource as an example.

  • New: The function CopyFilePathsToClipboard in ContentBrowserUtils now returns the absolute path of an asset, instead of the relative path.

  • Improvement: Improved the experience of renaming a read-only asset when SCC is disabled.


  • Bug Fix: Fixed a rare desync between GPU/CPU when Foliage was erased completely and then painted again.

  • Bug Fix: Fixed a crash in HISM.

  • Bug Fix: Reminded UE to make sure to BuildTree non-async when in a Serialize call with Ar.IsSaving() cases Cleanup HISM Duplication/PostEditImport/Serialization.

  • Bug Fix: Grass Maps updated during Tick are no longer dirtying packages. Instead, they mark themselves as dirty/need rebuilt. The new map warning will display "GRASS MAPS NEED TO BE REBUILT" whenever grass maps are outdated. We've added a new "Build Grass Maps" command to the Build menu options.

  • Bug Fix: Fixed an issue where foliage instances snapping was dirtying/invalidating foliage component's lighting cache even when result didn't change.

  • Bug Fix: Fixed an issue where foliage Erase Mode radio button remains highlighted even after releasing Ctrl and Shift keys.

  • Bug Fix: Fixed a bug with foliage that was writing to both a Runtime Virtual Texture and the main pass. Previously hierarchical and distance culling were getting disabled in the main pass.

  • Bug Fix: Fixed landscape grass not updating in edit layers mode when landscape material doesn't have any paint layers.

  • Bug Fix: Fixed Grass Align to Surface normal computation when using Halton sequence placement.

  • Bug Fix: Fixed an issue when removing null entries in AInstancedFoliageActor::CleanupDeletedFoliageType that never worked properly.

  • Bug Fix: Made sure we EndTransactions on ExitMode. Also wrapped most Begin/EndTransactions inside scopes.

  • Bug Fix: UE now deletes null entries from the types before rebuilding foliage actors.

  • Bug Fix: Fixed an issue where UpateGrass discarded components were processing in the next loop.

  • New: Added CustomDepthStencilWriteMask support to foliage.

  • New: Fixed foliage non-deterministic cooking by removing unused UProceduralFoliageSpawner::bNeedsSimulation that can change depending on the cooking order.

  • New: Added support discarding Foliage types independently from density scaling.

  • Improvement: Improved performance when adding multiple instances to InstancedStaticMeshComponent.


  • Bug Fix: Fixed Landscape Grass Scale to not be applied when min and max are the same value.

  • Bug Fix: Fixed crash when applying spline component to landscape without a proper edit layer (when Edit Layers is enabled).

  • Bug Fix: Fixed a crash when copying offset regions.

  • Bug Fix: Reimported tiled Landscape Layer Weightmaps now have the same behavior as Import (no more forcing a normalization of layer weightmaps).

  • Bug Fix: Addressed a crash when entering Landscape Mode with Mirror Tool enabled and mirror point set to 0,0 but without any landscape.

  • Bug Fix: Resolved a crash when importing sublevels with landscape layers.

  • Bug Fix: Fixed a crash when using the smooth tool in landscape mode.

  • Bug Fix: Addressed a crash when importing sublevels with landscape layers.

  • Bug Fix: Resolved a crash when creating a new Landscape with Edit Layers enabled.

  • Bug Fix: Fixed Landscape rotation not being considered in ULandscapeComponent::GetLayerWeightAtLocation.

  • Bug Fix: Fixed a bug with ForeignWorld not being updated properly on SplineControlPoints.

  • Bug Fix: Fixed Undo/Redo of Clear/FillLayer which was filling MaterialInstanceConstantMap with mismatching Key/MI.

  • Bug Fix: Fixed ULandscapeSplineControlPoint not updating its body instance when changing mesh collision preset.

  • Bug Fix: Fixed a crash using landscape add component tool.

  • Bug Fix: Addressed a crash from unbound shader parameters when using RVT and tessellation together in a landscape material.

  • Bug Fix: Fixed a bad index buffer generation on mobile landscape. Vertex Key generation was not unique for a 255*255 grid. Removed it along with its use as a TMap key and replaced it with a simpler array lookup.

  • Bug Fix: Fixed crash using GetLandscapeMaterial node in BP.

  • Bug Fix: Fixed not thread-safe Landscape CVar code.

  • Bug Fix: Fixed a bug preventing the edit layer brush from applying when one of its resources is not ready. Editing layer brush resources may now include all types of objects but only handles UTexture2D (texture resource needs to be streamed in) and UMaterialInterface (material shader needs to be compiled). UE will now display user notification after the brush fails to apply for more than 3 seconds.

  • Bug Fix: Fixed a crash with grass scattering when virtual texturing is not enabled. We use the fixed grid vertex factory for both the grass and virtual texturing now.

  • Bug Fix: Fixed crash when importing Landscape layers in the New Landscape Tool.

  • Bug Fix: Fixed an issue with grass components trying to be detached while not attached after undoing a location change.

  • Bug Fix: Fixed a crash when Resizing a Landscape with Edit Layers.

  • Bug Fix: Fixed an occasional crash when creating a new landscape with edit layers.

  • Bug Fix: Fixed a crash when opening an old map with Chaos.

  • Bug Fix: Fixed landscape grass placement shader to correctly calculate SvPosition. This fixes landscape grass placement materials which use AbsoluteWorldPosition.

  • Bug Fix: Fixed LandscapeExportHeightmapToRenderTarget to take exported components' overall extent into consideration. Added option to export or not all landscape proxies when LandscapeExportHeightmapToRenderTarget is used with Landscape Actor.

  • Bug Fix: Fixed an infinite loop when undoing a landscape change.

  • Bug Fix: Fixed crash when creating a landscape from scratch with edit layers enabled.

  • Bug Fix: Fixed an issue with Runtime Virtual Texture updates to landscape paintings when working with landscape streaming proxies. Before the fix if no Runtime Virtual Texture targets were set in the main landscape actor (but were only set in the landscape streaming proxies) then the virtual texture wouldn't immediately update on landscape painting.

  • Bug Fix: Fixed an issue preventing stored reimport weightmap paths per tile when importing a tiled landscape.

  • Bug Fix: Fixed an issue causing problems when going in and out of landscape (and in manage tab).

  • Bug Fix: Fixed a crash in Landscape Mode when a paint layer gets its Layer Info assigned but no Edit Layer is selected. Also made sure to always have a valid Edit Layer selection.

  • Bug Fix: Fixed an issue with landscape shadows still rendering when the landscape show flag is disabled. To help with this we exposed shadow settings on the landscape proxy.

  • Bug Fix: Replaced temporary toolbar Landscape Resize icon with new one.

  • Bug Fix: Fixed a crash with landscape grass mesh when there are more mips than the landscape currently has.

  • Bug Fix: Fixed crash after moving Landscape Actor to another Level.

  • Bug Fix: Fixed crash when Resizing a Landscape with Edit Layers.

  • Bug Fix: Fixed warnings about invalid material for landscape thumbnail renders.

  • Bug Fix: Fixed crash in Landscape Mode when a paint layer gets its Layer Info assigned but no Edit Layer is selected. Also made sure to always have a valid Edit Layer selection.

  • Bug Fix: Fixed an issue with the Resize Landscape Tool not showing up in the manage landscape toolbar. We've also replaced the temporary toolbar Landscape Resize icon with a new one.

  • Bug Fix: Fixed crash in Landscape Edit Layer mode that occured when Landscape Material changes are applied without Landscape properly updating/creating the necessary rendering resources.

  • Bug Fix: Fixed an issue causing the landscape max draw distance from updating correctly in landscape components when set on the owning landscape proxy.

  • Bug Fix: Fixed an issue preventing the landscape cached heightfield from being cleared when the landscape is changed.

  • Bug Fix: Fixed Landscape LOD selection for stereo rendering.

  • Bug Fix: Fixed SimpleCollisions from being incorrect on Landscape when the specified Simple Collision mip level is greater than Collision mip level.

  • Bug Fix: Fixed non-determinism in the generation of Runtime Virtual Texture low mips. This is done by forcing textures to stream before each tile render.

  • Bug Fix: Fixed an issue preventing all split screen views from using view 0 for landscape LOD calculation. This fixes bugs where landscape components would be rendered with the wrong scale in the second view.

  • Bug Fix: Fixed Landscape Edit Layers warning text to be read-only.

  • Bug Fix: Fixed a crash when attempting to re-import weightmaps with Landscape Edit Layers disabled.

  • Bug Fix: Fixed a memory leak of FViewInfo objects in Runtime Virtual Texture rendering.

  • Bug Fix: UE now accounts for StaticMeshLODDistanceScale when calculating landscape shadow LOD. This fixes bugs where offscreen landscape components could render shadows at a scale too large or too small.

  • Bug Fix: Fixed bug where user was able to select actors while in the Landscape Edit Mode.

  • Bug Fix: Fixed an issue where resetting sub-levels in the World Composition window where new position and old position overlap would cause visual defects.

  • Bug Fix: Fixed crash when loading a map with a BP landscape brush that is not compiling.

  • Bug Fix: Fixed grass.MaxCreatePerFrame.

  • Bug Fix: Fixed landscape visibility mask material warning when using the landscape base material for holes.

  • Bug Fix: Fixed a crash when using the smooth tool in landscape mode.

  • Bug Fix: Fixed Landscape rotation not being taken into account in ULandscapeComponent::GetLayerWeightAtLocation (Procedural Foliage).

  • Bug Fix: Fixed a crash in ULandscapeMaterialInstanceConstant::UpdateCachedTextureStreaming.

  • Bug Fix: Fixed a crash when importing sublevels with landscape layers.

  • Bug Fix: Fixed a crash when importing sublevels with landscape layers.

  • Bug Fix: Fixed Landscape Grass Scale not being applied when min and max are the same value.

  • Bug Fix: Fixed a regression with Landscape Collision when the whole LandscapeComponent is painted as a hole.

  • Bug Fix: Fixed Undo/Redo of Clear/FillLayer which was filling MaterialInstanceConstantMap with mismatching Key/MI.

  • Bug Fix: Fixed ForeignWorld not being updated properly on SplineControlPoints.

  • Bug Fix: Fixed a crash occurring when copying offset regions.

  • Bug Fix: Fixed an issue where UpdateCachedTextureStreaming compound TexelFactor every load/save.

  • Bug Fix: UE will now allow the landscape editor to continue gracefully if the CDO alpha texture doesn't contain any source data. This can happen when the editor is loading cooked data.

  • Bug Fix: Fixed a bug allowing edition of landscape proxy properties that are shared with the parent landscape properties.

  • Bug Fix: Within a Landscape, UE will now use Equal() (with error tolerance) when testing whether a spline component transform should be updated.

  • Bug Fix: Fixed a crash when loading a cooked landscape in the editor.

  • New: Added experimental version 0.1 of the Virtual Heightfield Mesh plugin. The plugin is a mesh renderer for heightfields where the source data is a runtime virtual texture containing height values. It is intended as an alternative final rendering technique for very large landscapes

  • New: Added support for adaptive virtual texture added. This allows the support of larger runtime virtual texture resolutions. The new limit is 1GiTexel x 1GiTexel.

  • New: Added the UVirtualTextureBuilder asset type for building virtual textures. The URuntimeVirtualTexture low mips have been moved out of the URuntimeVirtualTexture asset and into this. The streaming mips build is now set up from the Runtime Virtual Texture Volume Actor. This allows multiple streaming mips to be built against a single URuntimeVirtualTexture for cases where the URuntimeVirtualTexture is reused in different levels.

  • New: Added a continuous update flag to Runtime Virtual Texture assets. This allows Runtime Virtual Textures to be marked to have a random small number of pages updated each frame. This can help in cases where Runtime Virtual Textures contain stale data due to late texture streaming etc.

  • New: Added the concept of virtual texture scalability groups to allow varying scalability settings for different Virtual Texture assets and components.

  • New: Changed the naming for the Runtime Virtual Texture setting: "Virtual Texture Pass Type" to "Draw in Main Pass". The enumerated option names have also changed to try to make the usage more clear.

  • New: Rewrote the Runtime Virtual Texture Volume SetBounds logic so that all relevant primitives are considered in the bounds calculation, not just the selected alignment actor.

  • New: UE now provides additional information in message dialogs when import using the landscape copy gizmo fails.

  • New: Added custom stencil write mask support for landscape. We've also added full custom depth stencil support for landscape spline.

  • New: Primitives that write to a Runtime Virtual Texture but are hidden in the main pass are now shown in the Editor when selected. To support this we've added a Show Flag that makes all such primitives visible in Editor mode even when non-selected. They remain hidden in game mode.

  • New: UE will now show a progress bar when reimporting tiled Landscape.

  • New: The transform for a Runtime Virtual Texture volume is now based around a corner of the bounding volume instead of around the center. This makes it more consistent with other actor types and simplifies any transform maths. Legacy data is fixed up on load.

  • New: World Composition layer creation menu now creates the layer on Enter keypress.

  • New: Exposed Blueprint function on RuntiveVirtualTextureComponent to invalidate VT pages within given world bounds.

  • New: Sped up landscape tessellation PIE load.

  • New: Landscape edit layers are now supported when importing/reimporting a World Composition Landscape.

  • New: Added Texture LOD Group setting to Runtime Virtual Texture assets. We;ve also added a Virtual Texture Tile Size Bias and Tile Count Bias to the Texture LOD settings. This allows us to apply Tile settings per platform and use smaller tile sizes on platforms with less processing power.

  • New: World Composition: Added Fit View to Selection command bound to F key.

  • New: Added a new material expression for landscape that outputs a physical material. This can optionally be used to generate the dominant physical material for each point on a landscape. When setup in a landscape material it overrides the standard layer based physical materials. The aim is to allow greater logical control over physical material placement on the landscape.

  • New: Made Landscape actors not placeable.

  • New: Made BP brushes use their actor factory upon spawning, if applicable. Default-named the spawned BP actor according to the landscape they're added to.

  • New: Exposed Material Overrides to Grass Variety.

  • New: Made GetAllParameterInfo virtual, so UMaterialExpressionLandscapeLayerBlend can be subclassed.

  • New: ALandscape::LandscapeLayers is no longer 'TextExportTransient'.

  • Improvement: Made Landscape actors not placeable.

  • Improvement: Fixed invalid foliage instance tooltip incorrect spelling.

  • Improvement: Made GetAllParameterInfo virtual, so UMaterialExpressionLandscapeLayerBlend can be subclassed.

  • Improvement: Released an update to not reset the landscape actor locked status when it's selected.

  • Improvement: Improved support for Runtime Virtual Texture components in PIE. This fixes issues where Runtime Virtual Texture did not respond to streamed in changes in PIE.

  • Deprecated: Removed redundant bEnable flag on runtime virtual texture assets. A better alternative is to use the visibility of the associated runtime virtual texture volume.

Material Editor

  • Bug Fix: The material editor no longer crashes when attempting to select a curve row parameter from a curve atlas when the atlas references invalid curves.

  • Bug Fix: Fixed Virtual Texture warning messages.

  • Bug Fix: Resolved a bad reference to structure variables.

  • Bug Fix: Fixed various items concerning opening material layers created by prior engine versions. Also released fixes for linking derived material layers to parent layers.

  • Bug Fix: Addressed key transient material parameter overrides on the MPI, rather than parameter index. This fixes material parameters getting scrambled while editing material.

  • Bug Fix: Updated virtual textures on any relevant material parameter value change while in the material editor.

  • Bug Fix: Fixed a crash on undo/redo when the preview material source instance is null.

  • Bug Fix: Updated UE to not perform project setting based validation on engine visualization materials during DDC warming.

  • Bug Fix: Fixed unnecessary recompilation of shaders when changing texture compression.

  • Bug Fix: Fixed a problem where material could display incorrect parameter values when parameters are added/removed in the material editor.

  • Bug Fix: Fixed material baking cache not invalidating cached material when changes are made to instance constants.

  • New: Added SmoothStep, Step, and InverseLerp material expressions.

  • New: Added function to material editing library to get a list of textures used by a material

  • New: Added editor scripting functions for iterating through expressions in a material.

  • New: Shader compile log messages now appear during shader compile instead of after all shaders compiled.

  • New: Added thresholdWithRange Material Function. This allows the artist to define a threshold value and a range value to falloff linearly towards. There is a bool to do a one sided falloff or to falloff on both sides.

  • New: You can now sort Material Parameter Collection entries alphabetically: material editor + Blueprint node.

  • New: UE will now ensure that overridden material parameter values are preserved, when override is disabled.

  • New: Custom HLSL nodes now support outputs of type FMaterialAttributes, and multiple outputs.

  • New: Engine functions: Added simple functions to convert between km and cm for sky work.

  • New: Engine Functions: Added Material functions to convert between degrees/radians.

  • Improvement: Made MID asset editor read-only.

Media Framework

  • Bug Fix: Released a fix to compute pipeline use by PS5MediaPlayer to improve performance. Also improved stability when using more then one player at once.

  • New: Added APIs to check on current aspect ratio and image orientation of UMediaTexture.

  • New: Added media player timing mode that simply displays the latest video frame without any timing.

  • New: Added AVEncoder module's documentation (in code).


  • Bug Fix: Fixed Python int/long -> float/double conversion forcing unsigned.

  • Bug Fix: Fixed potential null pointer access during Python shutdown.

  • Bug Fix: Instructed UE to Invoke sys.excepthook when generating Python errors in UE4.

  • Bug Fix: Fixed documentation link for editor python scripting plugin.

  • Bug Fix: Fixed the automated FBX re-import to show the dialog under certain situations.

  • Bug Fix: Fixed Python defined UFunctions with a return type failing to pass data for some arguments.

  • New: Added a call_method method to unreal.Object to let you call functions via Unreal reflection.

    • This can be useful to let you call functions that haven't had Python glue generated for them, such as functions defined with a Blueprint class.

  • New: Added unreal.new_object as a way to create an object instance from a UClass* in Python without having access to its glue type.

  • New: Exposed source control sync functionality for files and directories.

  • New: Added support for showing Python files in the Content Browser.

    • This is disabled by default, and can be enabled by setting "Enable Content Browser Integration" to true in your Editor Python plugin preferences.

    • When enabled, this will show Python files in the Content Browser, and add an option to let you run them (either via the context menu, or by pressing "space" on an item).

  • New: Added debugpy_unreal.py utility to help debug the embedded Python interpreter using VS Code.

  • Improvement: Switched to Python 3.7.7 by default. If you need to continue to use Python 2.7.14, then you'll have to use a source build of UE4 and either:

    • Edit PythonScriptPlugin.Build.cs and PythonScriptPluginPreload.Build.cs to use "Python" rather than "Python3" in their dependency lists.

    • Set your UE_PYTHON_DIR environment variable to point to a custom Python installation.

  • Improvement: Exposed UEditorLevelUtils::AddLevelToWorld to scripting.

  • Improvement: Exposed ReloadPackages to editor scripting.

  • Improvement: Changed Python objects to being transactional by default.


  • Bug Fix: Movie Pipeline: Fixed a bug causing cinematic shot section restore to not work properly when multiple segments map to the same shot section.

  • Bug Fix: Fixed a bug causing auto-easing computation of blending camera cuts when sections are completely underlapped.

  • Bug Fix: UE no longer notifies the game of camera cuts when using camera cut blending and there's no actual cut.

  • Bug Fix: Updated Sequencer to only autoscrub if in scrubbing state to fix double evaluations when autoscroll is enabled during playing.

  • Bug Fix: Performed an update to use camera component directly (if possible) to compute from/to transform when previewing camera cut blends.

  • Bug Fix: Fixed a bug to stop performing camera cut blending when the blend is finished. This fixes some interpolation problems that create jitter during cinematics with fast-moving cameras.

  • Bug Fix: Fixed renaming of MoviePipeline Master Config not correctly updating name.

  • Bug Fix: Sequencer no longer counts the root node when counting the number of items to be displayed in the tree.

  • Bug Fix: UE will now highlight the default filter option when opening the filter dialog in CurveEditor.

  • Bug Fix: Fixed several bugs related muting/soling tracks which have been renamed or moved.

  • Bug Fix: Fixed default MoviePipeline presets not being visible in Preset Importer.

  • Bug Fix: UE will no longer set viewports to realtime if they're already running PIE.

  • Bug Fix: Fixed exported audio cutting out if movie rendering window loses focus.

  • Bug Fix: When rendering a movie, UE will now detect if there is no more disk space.

  • Bug Fix: UE will now skip processing of render passes in MoviePipeline that are not enabled.

  • Bug Fix: Added duration/wave support for dialogue player so that a sound cue with dialogue is added with the correct duration.

  • Bug Fix: Live Link will now discard recording samples if outside of the section start frame.

  • Bug Fix: In Take Recorder, renamed NewTake to ClearPendingTake.

  • Bug Fix: Fixed FCPXML Import/Export so that it uses the in frame as the start frame offset if the original start frame offset doesn't exist in the lognote.

  • Bug Fix: Fixed FCPXML Import/Export so that it supports same named shots and retrieves the lognote correctly from the logging info node given the master clip id.

  • Bug Fix: Will now focus on endpoint when creating a new binding or setting the event endpoint.

  • Bug Fix: When importing FCPXML, if the corresponding level sequence isn't found, UE will now skip past it. It will then set the correct in/out frames, and continue importing the rest of the sequence.

  • Bug Fix: The local time is now set to loop so the evaluation is automatically set to Play To, rather than Jump To when autoscrolling. This enables a swepts evaluation when autoscrolling.

  • Bug Fix: Fixed last tick game time seconds from being set to 0 which ends up stopping sequence playback immediately.

  • Bug Fix: Fixed subframe end playback range conditions so that playback that ends on a subframe will now fire events that lie between the last whole frame and playback end. Previously, the last valid time would be based on DurationFrames, which is display rate and would get rounded to a frame number in SetFrameRate(). The fix is introduced in DurationSubFrames which contains the subframe.

  • Removed: Removed unnecessary cast to ULevelSequence in selection synchronization. This allows derived classes to participate in the synchronization of selection in the editor with the Sequencer tree.

  • Bug Fix: Fixed issues with sequencer style definitions in SlateEditorStyle.

  • Bug Fix: Fixed missing blend-out handle on camera cut track when there's only one section.

  • Bug Fix: Made filters menu more consistent. Enable/Disable All operates on all level filters and group node filters as well. Now it doesn't close menu after clicking on group filter submenus

  • Bug Fix: Sequencer now only shows easing handles for sections that actually support manual easing.

  • Bug Fix: Fixed a crash in curve editor when widgets inexplicably disappear.

  • Bug Fix: Fixed an issue with modifying sequences when opening. OnNodePathChanged does not need to mark the sequence dirty.

  • Bug Fix: Fixed camera cut track giving control to the incorrect camera in some hierarchical use-cases.

  • Bug Fix: Renderpass is now inserted before the shot frame in file format string to fix import of image sequences exported by MoviePipeline.

  • Bug Fix: Fixed bugs with starting/stopping controlled shake source shakes.

  • Bug Fix: UE no longer displays thumbnails over blending areas of the camera cut track.

  • Bug Fix: UE no longer lets silent mode computations linger around after silent mode has ended.

  • Removed: Removed auto-exposure and shutter angle overrides from Movie Render Queue. The active camera is now respected in both cases.

  • Bug Fix: Warm-up frames can now optionally be rendered in the Movie Render Queue. This allows gpu particles to warm up correctly.

  • Bug Fix: Fixed large values in the console variable setting not applying correctly when the target cvar type was an int.

  • Bug Fix: Fixed an issue where jobs would not use the latest values from a preset if the preset had been modified after the job was created.

  • Bug Fix: Fixed a dependency with MovieSceneTracks.build.cs editor.

  • Bug Fix: Fixed an issue with the invalid key handles state after calling FRichCurve::SetKeys.

  • Bug Fix: MoviePipeline: If a movie render is interrupted, UE will now log it as an error as the render did not complete.

  • Bug Fix: Fixed a crash when copying a geometry cache track.

  • Bug Fix: Fixed a crash unregistering camera shake previewing view modifiers when there's no editor.

  • Bug Fix: UE will no longer make cyclic inclusions with template sequences. This fixes a possible loop with template sequence track editor.

  • Bug Fix: Fixed a bug where template sequences aren't correctly run on object bindings.

  • Bug Fix: Camera cut track blending is now handled by a parent sequence's camera cut track, and support blend times dilated by sub-sequence play-rates.

  • Bug Fix: Fixed a crash where creating a level sequence could spawn an actor in a world that's being torn-down.

  • Bug Fix: Fixed an issue where calling Set Playback End on a sequence resulted in an incorrect bounds type.

  • Bug Fix: Fixed an issue with Fade track rendering in MoviePipeline.

  • Bug Fix: When exiting a camera cut, UE will now only go back to the previous editor location for blending cuts.

  • Bug Fix: Fixed undo/redo adding a spawnable by setting the spawn flag to transactional.

  • Bug Fix: Control Rig: Fixed a crash when re-compiling BP and removing a transform control that's also open in sequencer.

  • Bug Fix: Movie Pipeline: Mode the restore fixed time step to OnPIEEnded. This was done to fix an issue where the editor plays back faster after rendering.

  • Bug Fix: Added options to selectively save transforms and curves when doing animation sequence baking from Sequencer.

  • Bug Fix: Extended the working range if trying to type in the time outside of it.

  • Bug Fix: Refactored making a unique spawnable name so it can be used when creating a spawnable camera in various places. This ensures that cameras are created with consistent names, Cine Camera Actor (1), Cine Camera Actor (2), Cine Camera Actor (3), etc. Otherwise some names are "CineCamerActor", "Cine Camera Actor", and they aren't numbered in order.

  • Bug Fix: Fixed a crash when trimming animation if length is 0.

  • Bug Fix: Movie Pipeline: Fixed an issue where unconventional aspect ratios would render with the wrong fov.

  • Bug Fix: Fixed subfolders getting muted when their parent folder is muted.

  • Bug Fix: Released a fix for null object binding with control rig when dragging in a control rig to a level sequence that isn't loaded.

  • Bug Fix: If there's multiple transform tracks affecting a given actor, UE will now export with interrogation. Previously, interrogation would only happen for multiple sections on a single transform track.

  • Bug Fix: Fixed Blending Sections in Control Rig.

  • Bug Fix: Fixed bake so that it doesn't attach to the previous parent's parent. The previous idea was flawed because the parent attachment could be animated, so it's more straightforward to just unparent to the root.

  • Bug Fix: Released a fix for importing broken tangents, FBX.

  • Bug Fix: UE will now clear transient flags on spawnable template components. This fixes a bug where adding components to an empty actor would not save those components.

  • Bug Fix: Curve Editor: Fixed an issue with filter window not opening for standalone curves since the tab manager may not exist.

  • Bug Fix: Released a fix changing blending type so that the object is restored to its pre animated state before applying relative/additive. This fixes an object flying away when changing the blend type to relative/additive since it would have been relative/additive to the current animated state.

  • Bug Fix: Expand the section when adding keys through the enter key, otherwise newly created keys wouldn't evaluate.

  • Bug Fix: Fixed sequencer curve editor 'selected node' filter continually expanding.

  • Bug Fix: Control Rig: Provided a fix for Control Rig in Sequencer breaking when Control Rig is compiled in it's Editor.

  • Bug Fix: Fixed default tracks not being added properly for some properties (ie. OuterConeAngle on SpotLights) because the object to be keyed should be the property owner, and not the actor.

  • Bug Fix: Fixed an issue when converting a possessable to spawnable failing when selection changes during the conversion.

  • Bug Fix: Fixed bake transform when the camera is an additive camera offset.

  • Bug Fix: Transform origins no longer apply to components and actors that are attached to other components or actors.

  • Bug Fix: Curve Editor: Fixed a crash when undoing inserting keys. The panel's edit box's CurveIDToKeyProxies becomes stale on undo. Invalidate the curve model ID and relevant key handles on undo.

  • Bug Fix: Sequencer will now set AlwaysTickAndRefreshBones on child skelmesh components when Skeletal Meshes are added to Sequencer.

  • Bug Fix: Fixed copy/paste of spawnables by forcing it to be spawned so that its possessable components can be bound.

  • Bug Fix: Changed GetPlaybackRange so that it returns values in display rate, similar to GetPlaybackStart and GetPlaybackEnd.

  • Bug Fix: When recording an anim sequence live link section, it's source can start at any time during the recording. Because of this UE will now always force tick and check for new sources every frame.

  • Bug Fix: Fixed event endpoints being lost when renaming or duplicating a Level Sequence.

  • Bug Fix: Fixed duplicate object bindings not pasting to original folder.

  • Bug Fix: Cine Camera: Moved the upgrade path to Serialize() so that newly created Blueprint cameras don't have their filmbacks incorrectly upgraded.

  • Bug Fix: Control Rig: Selecting Parent Control will now select single channel child control allowing for thing's like S to key as expected.

  • Bug Fix: CurveEditor: Scaling with Transform Tool no longer reverts on mouse up.

  • Bug Fix: Control Rig will now frame on selected controls. Note if any control is selected UE will focus on them, then if not UE will do actors.

  • Bug Fix: Curve Editor: Fixed the set curve attributes menu (ie. pre and post infinity) to operate on all curves rather than just the selection.

  • Bug Fix: Fixed fbx import through scripting not creating bindings for components. The bug here is that it's not able to import the focal length property because it doesn't create a camera component binding first.

  • Bug Fix: Fixed curve editor tree items not showing up when switching sub sequences.

  • New: Added TakeTrack and TakeSection which contains timecode tracks and a slate property. Take recorder records timecodes for each tick and adds them to the actor's take track section.

  • New: Added Python scripting support for the Movie Render Queue. Added example Python scripting support for rendering movies both in-editor and from the command line. See \Engine\Plugins\MovieScene\MovieRenderPipeline\Content\Python for more details.

  • New: The "-MoviePipeline=" argument has been changed to "-LevelSequence=" to clarify what gets used for (as it only attempts to load a ULevelSequence). See MovieRenderPipelineCommandLine.cpp for examples.

  • New: Added the option to disable TDR (graphic driver timeout) when burning out sequences with MoviePipeline, defaults to on.

  • New: Exposed SetName to set the name of a track binding.

  • New: Added Create Group to the context menu in the group manager. Fixed undo issues not refreshing the groups manager.

  • New: Added RefreshCurrentLevelSequence() which refreshes the UI for the currently loaded level sequence.

  • New: Concerning MoviePipeline, we've blended post processing volume settings to motion blur amount.

  • New: Made calls to OnSectionMoved consistent in dragging operations, calling it for sections being moved and resized, both during interactive dragging and at the end of the operation.

  • New: Added support for toggling markers in a subsequence to be globally visible in other subsequences.

  • New: Added a Timecode clock which sets the sequencer clock to the timecode provider. Renamed the existing Timecode clock to Relative Timecode.

  • New: Added the ability to create bindings in root or local space. Camera cut bindings in a subsequence should be created in local space so that they can resolve when opened on its own. Updated the master sequence example to create a binding in local space.

  • New: Added support for AvidDNx and AppleProRes video codecs. Does not support compositing burn-in data on top of video output.

  • New: Movie Render Queue's Burn-In setting now allows the burn-in to not be composited onto the final image.

  • New: Added access to sequencer selection. GetSelectedSections, SelectSection GetSelectedTracks, SelectTrack GetSelectedFolders, SelectFolder GetSelectedObject, SelectObject EmptySelection.

  • New: You can now use a non-realtime audio mixer to allow generating deterministic audio when rendering movies in PIE.

  • New: Added a warning via Message Log when levels are set to Blueprint Streaming for Movie Renders.

  • New: Added option (shift modifier) to append sections as they are dropped as opposed to stacking them on subsequent rows.

  • New: Exporting fbx through python now spawns spawnables if necessary on export.

  • New: Added ability to create an event repeater section through scripting

  • New: We've exposed Set/GetClockSource and Set/GetEvaluationType.

  • New: Added the ability to record camera cuts/switching.

  • New: We've exposed GetBoundObjects from FSequencer to retrieve the objects bound to the level sequence editor.

  • New: Added numeric type interface to pad take number digits.

  • New: Added veryverbose log for ingested live link frame times. You can enable this by using the console command: log LogLiveLinkSequencer.

  • New: Added the ability for sequences to opt in/out of certain track types. Each track editor can now call Sequence->IsTrackSupported to determine whether it should opt in/out or continue with its default implementation.

  • New: For converting existing track editors in a plugin to be compatible with LevelSequence, implement: virtual bool SupportsSequence(UMovieSceneSequence* InSequence) const override and return true if a sequence is a ULevelSequence.

  • New: Added display showing number of tracks and how many are hidden by filters.

  • New: Added get/set selected channels. Channel selection is defined as a FSequencerChannelProxy which is a section pointer and a channel FName.

  • New: Can now show marked frames in the cinematic viewport.

  • New: Take Recorder: Added option to exclude all properties for a component. For example, you can now do this in BaseEditorSettings.ini to exclude the light component properties from being recorded: (MatchingActorClass=/Script/Engine.Light,ExcludePropertyTracks=((ComponentPath="LightComponent0", PropertyPath="")).

  • New: Concerning Fbx, added import/export integer and string channels.

  • New: Added config to HierarchicalBias. For example, you can set this in EditorPerProjectUserSettings to set the default hierarchical bias for sections to -100: [/Script/MovieScene.MovieSceneSubSection] Parameters=(HierarchicalBias=-100)

  • New: Added options to cancel movie rendering via the movie pipeline executor from blueprint/python scripting.

  • New: Take Recorder: Added option on actor source to toggle whether the parent hierarchy is automatically added for recording if it isn't already. When disabled and recording to possessable, the child will be recorded in local space since it will retain its parent in the level. When disabled and recording to spawnable, the child will be recorded in global space.

  • New: UE now allows opening and navigating curve editor for locked sequences.

  • New: Added the ability to export custom attributes when exporting a skeletal animation track (mapped from an anim sequence).

  • New: Added Node Groups feature, which allows creating groups of sequencer nodes for selection, filtering, and editing.

  • New: UE will now warn users when we automatically insert the {render_pass} tag for them as it will cause the output filename to change names unexpectedly.

  • New: Sequencer Scripting: SetTickResolution now also migrates frame times to the target tick resolution. Added SetTickResolutionDirectly which does not migrate the frame times. Refactor MigrateFrameTime to MovieSceneTimeHelpers

  • New: Added movie pipeline queue subsystem for runtime.

  • New: Added an option to lock previous camera in a blending camera cut.

  • New: UE will no longer unlock cameras when going from a sub-sequence to a parent sequence. This lets artists and designers working in a sub-sequence use the camera from a "sibling" animation sub-sequence.

  • New: Added a new "additive from base" blend type, where values are animated relative to the first value of a section. This is mostly useful for camera animations and camera shakes.

  • New: Added support for hierarchical easing, where an entire sub-sequence can be eased in and out at the beginning and end, as if every single track inside had the same ease-in/out curves.

  • New: Added two tracks for starting and previewing camera shakes on a camera shake source component/actor: a "controlled" track where sections control when the shake starts and stops, and a "trigger" track which is a "fire-and-forget" way to trigger shakes. These cinematic camera shakes can be previewed directly in the editor by playing the sequence.

  • New: Added the ability to match animation sections in Sequencer by specified bones and visualize skeletons on sections to help with matching.

  • New: Movie Pipeline: Implemented the exporting of FCPXML project files, and added metadata tracking for the files output.

  • New: Added a motion trail editor mode for transform tracks, skeletons and control rigs.

  • New: Made ULevelSequenceBurnIn::GetSettingsClass_Implementation() overridable.

  • New: Added a reduce keys tolerance to specify how much keys should be reduced by after recording. Keys tolerance and key interpolation were also added to the section menu.

  • New: Ctrl-Drag dilate will now work with skel anim tracks, geometry cache tracks and geometry collection tracks. In all three we now scale the playrate to do time warping.

  • New: Added Control Rig Created FK Rig that replaces Additive Control Rig and allows one to override or add to existing transforms and curves(morph targets).

  • New: Added Sequence hierarchy navigation. There's now a new picker to show the sequence hierarchy which allows you to pick any subsequence to dive into directly. There's also forward and backwards navigation buttons, and subsequences are now always shown.

  • New: Control Rig: Added the ability to import FBX into a Control Rig, with options for matching, insert/replace, etc.

  • New: Cloth (Chaos) will now update in Editor if the Update Cloth In Editor flag is toggled on a Skel Mesh Component.

  • New: Added an option to disable sections when baking as opposed to deleting.

  • New: Added the ability to copy the contents of a track to another track.

  • New: Movie Pipeline: Added the ability to toggle the selected shots. If the shot being toggled is not selected, only that shot will be toggled.

  • New: Added meta DeterminesOutputType to UFUNCTIONs to eliminate the need to cast the return type in Blueprints.

  • New: Take Recorder: Added support for recording animated attachments.

  • New: Cine Camera: Updated 16:9 Digital Film SensorWidth and SensorHeight to 23.76 x 13.365 to match Arri Alexa.

  • New: Added support for animating properties on decal component materials.

  • New: Control Rig: Added 'default animating rig' to SkeletalMesh, which if specified will create a track with that Control Rig when a Skeletal Mesh Component with that Skeletal Mesh is added to Sequencer.

  • New: Movie Pipeline: Sequencer will now report errors/warnings to the FMessageLog.

  • New: Added support for toggling markers in a subsequence to be globally visible in other subsequences.

  • New: Movie Pipeline: Added warnings when camera cuts start on subframes.

  • New: Movie Pipeline: Renamed friendly name to "Movie Render Queue."

  • New: Sequencer is now more responsive when viewing large data sets.

  • New: Live Link / Rich Curve: Improved save times for take recorder by setting all times and values at once and not auto tangent each key.

  • New: Curve Editor: Changed mode hotkeys to have a modifier. Transform - Ctrl-T, Retime - Ctrl-E, Multi - Ctrl-M. This removes conflicts with w,e,r which are reserved for the viewport transform gizmo. Ctrl-W is used for weighted tangents.

  • New: Added a color gradient for color tracks (material parameter and material tracks). Added a color picker for color keys on double click. A key is added to all channels if it doesn't exist when the color is edited.

  • New: Control Rig: Added bidirectional links using asset user data between sequencer skeletal tracks and anim sequences. Users can now create and open these links either from Sequencer or via Animation Editor via asset and toolbar extenders.

  • New: Take Recorder / Animation: Improved logging by adding time for creating animation asset and saving sequences. With LogAnimation Log and LogTakesCore Log.

  • New: Control Rig: Now supports Baking Animation Onto Control Rigs.

  • New: You can now zoom to fit selected sections and keys. Hotkey 'f'.

  • New: Control Rig: Added Sequencer Support for Int/Enum Control types.

  • Improvement: Movie Render Queue now supports a 'stencil' based layering system to better support unrendered objects.

  • Improvement: Improved usability of dragging and snapping keys in CurveEditor.

  • Improvement: Cine Camera: Updated 16:9 Film SensorWidth and SensorHeight to 24.00 x 13.5.

Static Mesh Editor

  • Bug Fix: The Toolbar is now shown in the Static Mesh Editor Viewport.

  • Bug Fix: Fixed Selection Highlighting in Static Mesh Editor.

  • Bug Fix: Fixed an incorrect calculation of LOD in editor static mesh wireframe and LOD coloration views.

  • Bug Fix: Fixed the "Additional Data" button in the Static Mesh editor, so that the changes are propagated to individual viewports.

  • Bug Fix: Fixed an issue that could cause a large difference in the binary output when saving a mesh multiple times in the editor.


  • Bug Fix: Added a check to make sure legacy mesh paint mode is enabled before going into VR Mode.

  • Bug Fix: Fixed being unable to exit the VR Editor when using Valve Index controllers.

  • Bug Fix: No longer need to remove one element from the menu due to search element changes.

  • Bug Fix: Fixed VR Editor using invalid Valve Index bindings.

World Browser

  • Bug Fix: Fixed an issue where level browser would lose folder information when switching streaming type.

  • Bug Fix: Fixed an issue where expansion state was not being properly retained in trees with >500 items.

  • Bug Fix: World Composition - Fixed a crash when importing a heightmap using the Import Tiled Landscape feature. If the heightmap filename contained invalid characters, the level package would not be created

  • Bug Fix: Released various fixes to WorldBrowser and scripted streaming level creation to avoid crashing when setting an invalid level name. We've also repaired world streaming levels when they point to an invalid level package.

  • Bug Fix: Fixed an issue with Level Details not using all of its panel's space.

  • New: Level Browser now scrolls to current level when using MakeActorLevelCurrent.

Gameplay Framework

  • Crash Fix: Prevented a crash when spawning an Actor into a Sublevel that is not Loaded/Visible.

  • Crash Fix: Fixed a crash when harvesting a subset of components from an actor such that a harvested component is attached to a component that is not being harvested or already exists in the Blueprint.

  • Crash Fix: Fixed a crash when adding a gameplay tag without a valid tag source selection.

  • Crash Fix: Added the path string arg to a message to fix a crash in UGameplayCueManager::VerifyNotifyAssetIsInValidPath.

  • Crash Fix: Fixed an access violation crash in AbilitySystemComponent_Abilities when using a ptr without checking it.

  • Bug Fix: Changed FComponentTypeRegistryData to only clear the 'needs to refresh' flag when a refresh actually happens.

  • Bug Fix: Fixed undo/redo of attached components when attached to an Actor which overrides DefaultAttachComponent.

  • Bug Fix: Fixed players standing on an object with static mobility teleporting when the object gains movable mobility.

  • Bug Fix: Fixed a UPawnMovementComponent::SetUpdatedComponent bug causing PawnOwner to potentially mismatch UpdatedComponent when component is pending kill.

  • Bug Fix: Fixed rotating movement component from not working in standalone.

  • Bug Fix: Child Actors created by nested Child Actor Components now inherit transience if an outer Actor is an editor-only Actor.

  • Bug Fix: Cameras now properly detect when shakes with duration end, and mark them as stopped in the preview panel.

  • Bug Fix: Components that are being harvested to create a new Blueprint will no longer perform collision checks as they are temporarily moved as part of the harvesting process.

  • Bug Fix: Fixed horizontal walking velocity calculation when bMaintainHorizontalVelocity is disabled and we call StepUp.

  • Bug Fix: Fixed Camera aspect ratio bug when computing view matrices.

  • Bug Fix: Fixed JumpCurrentCount discrepancy when JumpMaxCount is greater than 1 and there is a correction in the air.

  • Bug Fix: Fixed memory leak with infinite camera shakes staying around even after their blend out time expired.

  • Bug Fix: Implemented better protection against invalid values in lens and filmback settings.

  • Bug Fix: Fixed incorrect Spline Component comments.

  • Bug Fix: Fixed duplicating and copy/pasting of a root component which would result in an unexpected transform. Fixed pasting a component to the root component of an actor attached to another actor attempting to attach to the root of that other actor instead of its own.

  • Bug Fix: Fixed an issue where MaterialParameterName cache was not marked dirty when applying a UMaterialInstanceConstant.

  • Bug Fix: Added logging message of velocity in projectile when it detects that a bounce has failed because the object is stuck in penetration.

  • Bug Fix: Reset physics state when teleporting a player to their initial location causing large physics velocity and collision along the old path to the new location.

  • Bug Fix: Fixed Regression caused by actor overlaps not properly triggering during initial level load even if bGenerateOverlapEventsDuringLevelStreaming was enabled.

  • Fixed incorrect comments in the header file.

  • Bug Fix: Moved an overlap initialization used within AActor::DispatchBeginPlay to its own function for clarity and for any possible future adjustments.

  • Bug Fix: Added client character movement bit sent to server to indicate that we shouldn't perform a dual move inside a FScopedMovementUpdate.

  • Bug Fix: Disabled the filmback preset dropdown widget on CineCameraActors if the sensor size isn't editable.

  • Bug Fix: Fixed a bug where FieldPathProperties did not clear the old field path info before adding the new info.

  • Bug Fix: Fixed a bug where stacking GEs that did not reset the duration on additional instances of the effect being applied.

  • Bug Fix: Fixed an issue that caused CancelAllAbilities to only cancel non-instanced abilities.

  • Bug Fix: Reverted the DeferredRemove where it was before changes in the TickTaskManager.

  • New: Added OnDataTableChanged callback to FTableRowBase to handle changes to rows that aren't imported, this allows doing game-specific fixups to table rows that are edited by the Data Table editor.

  • New: Added a SetRelativeTransform_Direct helper function to USceneComponent.

  • New: Prevented users from setting single-instance shakes on shake source actors.

  • New: Added a templated version of GetOwner.

  • New: Added optional tag parameters to gameplay ability commit functions.

  • New: Fixed subsystems to work similar to Blueprint libraries in the editor and correctly guess whether they are run from a client or server context in the editor. This is accomplished by using new GetGlobalFunctionCallspace and GetCurrentPlayWorld functions that can be used by any class wanting similar logic.

  • New: Added StartTimeSeconds to PlayMontageAndWait ability task and improved comments.

  • New: Exported GameFramework log categories using ENGINE_API.

  • New: Enhanced Input experimental release - A highly configurable replacement input handler supporting collections of dynamically enabled prioritized button mapping contexts and complex customizable input trigger rules.

  • New: Prevented OnUnpossessed from being called multiple times. Blueprint events ReceivePossess/ReceiveUnPossess will only be called when the pawn was successfully possessed or unpossessed. OnNewPawn delegate is only broadcasted when a new pawn has been successfully possessed and when unpossessing a non null pawn. Calling Possess with a null pawn will unpossess any current one.

  • New: Added some utility functions like CallOrRegister_OnCompletedInitialScan to UAssetManager that allow other systems/plugins to depend on asset manager initialization.

  • New: Fixed FCollisionProfileName detail customization to have a reset to defaults button.

  • New: Added tag container "DynamicAbilityTags" to FGameplayAbilitySpec. These are optional ability tags that are replicated with the spec. They are also captured as source tags by applied gameplay effects.

  • New: GameplayAbility IsLocallyControlled and HasAuthority functions are now callable from Blueprint.

  • New: Moved AGameMode::HasMatchEnded up to AGameModeBase.

  • New: Added New methods for ending camera shakes of a given type that originate from a given source.

  • New: Added a multicast delegate to GameInstance that gets triggered when a pawn gets it's controller assigned.

  • New: Added support for PlayScale, PlaySpace, and UserSpaceRotation for camera shake source components.

  • New: Reverted code to set a parent component that was accidentally removed for runtime builds.

  • New: Visual logger will now only collect and store info about instant GEs if we're currently recording visual logging data.

  • New: Added support for redirectors on gameplay attribute pins in Blueprint nodes.

  • New: Added new functionality for when root motion movement related ability tasks end they will return the movement component's movement mode to the movement mode it was in before the task started.

  • New: A new base class for camera shake, called UCameraShakeBase, has been created. It offers a few basic pieces of logic (managing time, blending, play space, and scaling of shake) to make writing sub-classes easier. All the core engine APIs now take and return this base class. The old camera shake class is now renamed UMatineeCameraShake, since it contains a Matinee camera animation. It will make it easy to deprecate Matinee later. Some backwards compatible core engine APIs have been added that take and return the Matinee shake. This makes it possible to have core redirectors in place and not break existing content.

  • Improvement: AFunctionTest now passes messages around by const FString& instead of copying them.

  • Improvement: Improved many source code comments and cvar messages for commonly used gameplay config options to better explain their functionality.

  • Improvement: CurveTables now strip redundant keys at cook time to optimize loading at runtime.

  • Improvement: Consolidated client-server character movement RPCs to a simple function signature using a new extensible struct, to more easily support custom data in RPC parameters without having to change engine source. This allows for customized serialization that can more efficiently pack the data over the wire, and solves some previous ordering issues with ServerMoveOld being sent as a separate RPC function. See the feature docs for more details.

  • Deprecated: Deprecated UWorld::BeginTearingDownEvent in favor of FWorldDelegates::OnWorldBeginTearDown.

Learning Resources

Code Examples

  • New: We have set up a folder, instructions, and documentation for GitHub community members to contribute code snippets.


  • Crash Fix: Fixed a crash in LocalizationCommandletExecution caused by closing the process read and write pipes too early.

  • Bug Fix: Published a fix to stop watching a String Table CSV file when the String Table that loaded it is unregistered.

  • Bug Fix: Updated the localization source code gatherer so that it now reports warnings for localization macros that span multiple lines.

    • Previously the source code gatherer would not collect these since it runs line-by-line and would often ignore them.

  • Bug Fix: Fixed an issue where localization meta-data values with new lines would break the PO file.

  • Bug Fix: Enabled non-EDL archives to load Enabled String Table asset references when EDL is active.

  • Bug Fix: Added support for C++11 raw strings to the localization source code gatherer.

  • New: Added an alternative PO export mode that allows key stabilization to work correctly with Crowdin.

    • This uses the X-Crowdin-SourceKey tag to let Crowdin correctly track a piece of text over time. Crowdin is great for this as it uses a combination of msgctxt and msgid to find the text. The mode then puts the msgctxt into the msgid field and tells Crowdin to use msgstr as the source string.

    • The downside of this is that PO files no longer know which source string UE used to make a specific translation. Because of this UE4 is no longer able to tell whether a particular translation is "stale" when importing it from a PO file.

  • New: Added a way to get the language and locale, that the text localization manager will be requesting during initialization.

  • New: Added a data validator to ensure that localized assets conform to the rules needed to use them at runtime.

  • New: Enabled the AddToolbarExtender for use with StringTableEditor…

  • Improvement: Improved FText::IdenticalTo so it can now perform a deep comparison of the text history (comparing generated texts, like a format result). It can also now perform a lexical comparison of invariant text instances as well. This allows it to quickly compare two cases that would have previously failed the same check due to having different text data instances.


  • Bug Fix: Addressed an issue affecting level visibility changes received during seamless travel. These are now queued up and executed when the server has completed the travel to avoid issues with clients loading faster than the server.

  • Bug Fix: Fixed a crash where UE would not check NextIndex if valid in APlayerController::GetNextViewablePlayer.

  • Bug Fix: Fixed crash when cleaning up the world on seamless travel.

  • Bug Fix: SceneComponent - Fixed bug where UE might remove locally attached from AttachedChildren array if replicated AttachedChildren are not at once resolvable. This would call OnRep_AttachedChildren multiple times without receiving the array from the server.

  • Bug Fix: Added a check to prevent Actors pending kill from sending RPCs.

  • Bug Fix: Fixed an issue that would snap the Replicated Relative Location to zero. This was happening when UE attached the Component using snap-to-location and it changed the transform before replicating the attachment.

  • Bug Fix: Fixed an issue that caused initial lag statistics to be incorrect.

  • Bug Fix: Fixed a divide-by-zero compile error in ReadFixedCompressedFloat which occurred when instantiated with certain template parameters.

  • Bug Fix: Fixed replication bug causing re-used channels to permanently fail replication by moving closing of acknowledged channel closures to the end of ReceivedPacket. This restores the old behavior allowing channels to process incoming bunches before closing the channel.

    • The new behavior is closer to how it worked when we were sending explicit ack-bunches.

  • Bug Fix: Removed the ApplyStackingLogicPostApplyAsSource function from FActiveGameplayEffectsContainer because the system never called it. We also made the destructor of FActiveGameplayEffectsContainer non-virtual, since adding a VTABLE to a struct if not present in the base breaks reflection.

  • Bug Fix: Prevented calling PreReplicate and comparing properties multiple times for actors during multicast RPCs.

  • Bug Fix: Added a sanity check to prevent child net connections from creating channels.

  • Bug Fix: Fixed a potential underflow crash in the DTLS packet handler.

  • Bug Fix: Made sure we track property changes in Push Model due to mapping or unmapping network objects. This is only necessary for Client-Side Demo Recording.

  • Bug Fix: Prioritized FObjectKey in PushModel tracking instead of just UniqueId. This will guarantee uniqueness across Garbage Collections to prevent potential collisions.

  • Bug Fix: Fixed an issue where if UE added a replicated subobject to an actor that has already had its spawn acked, UE would prevent the actor from ever going dormant.

  • Bug Fix: Stopped NetSerializeStructs from using Property Identical checks on shadow state. Shadow State is not GC safe and this can cause crashes in rare circumstances.

  • Bug Fix: Fixed up a wrongly formatted log message in FObjectReplicator::StartReplicating and made it more descriptive.

  • Bug Fix: If SetReplicates is called on an already replicating Actor, we force property comparisons to capture the role change.

  • Bug Fix: Fixed "attempted to use an out of date NetDriver" log spam that could occur when a client attempted to connect to a new server.

  • Bug Fix: Fixed a regression in UEnum Net Serialization for max values.

  • New: In Networking Insights, specifying -NetTrace=[Verbosity] on the command line now implicitly enables the "net"-trace channel.

  • New: Added CSV Profiler events that can track when a Connection's Actor (or its Pawn) are stuck on network loads for a long time.

  • New: Added the choice to use the control channel for replicating destroyed static actors, rather than having each create its own channel.

  • New: Prioritized RemoveSwap over Remove when removing actors from actor rep lists in the Replication Graph to slightly improve speed.

  • New: Added a way to set certificate lifetime in the DTLS packet handler.

  • New: Made StatelessHandshakeComponent ENGINE_API.

  • New: Changed Fast Array Limits to configurable CVar. Added a log on the server when we know we have exceeded these limits.

  • Improvement: Exposed network dormancy types to Blueprint.

  • Improvement: Increased the default NetDriver bandwidth limit to roughly 100 KB/second. This will help alleviate latency users would experience when reaching the old limit. This new limit is still well within the ability of modern internet connections.

  • Improvement: Added a more explicit warning when UE replicates channel names as full strings and that causes overflows in bunch headers.

  • Improvement: The NotifyStreamingLevelUnload log from net drivers is now in the verbose category, reducing spam when LogNet is set to "log" verbosity.


  • Bug Fix: Fixed a rare crash when restoring startup actors during replay scrubbing where the actor's level was invalid.

  • Bug Fix: Fixed local replay streamer error on scrub if data did not decrypt properly.

  • Bug Fix: Changed how UE adds some actors to the network object list in replays to reduce the overall size of the list during recording.

  • Bug Fix: Fixed a rare replay bug where dynamic arrays would not be resized properly during playback.

  • Bug Fix: Fixed local replay streamer not raising an error properly when not decompressing or decrypt a chunk of streaming data.

  • Bug Fix: Fixed level script actor names in streaming levels that UE incorrectly mapped to the wrong game instance when using Play-In-Editor replays.

  • Bug Fix: Added better logging for replay header flags during playback. Fixed delta checkpoint loads skipping the last packet in each checkpoint.

  • Bug Fix: Modified serialization of class net cache exports in replays to be properly unique when two classes share a name but have different paths.

  • Bug Fix: Fixed a rare replay crash that could occur if two net export classes had the same name but different paths.

  • New: Added the ability for the replication graphs to record without using a demo net driver. We also added a replay subsystem as an interface for both recording methods. We've also added support for when a dormant channel closes when recording. Lastly, we deprecated most public variables of UDemoNetDriver.

Replication Graph

  • New: Added a call to ShouldReplicateActor in the replication graph when adding a new actor to mirror the functionality of the network object list.

  • Deprecated: Deprecated the GraphConnection's ConnectionId and renamed it to ConnectionOrderNum. We did this to prevent users from thinking the ID persists across the lifetime of the object. In fact, it's only unique during a single tick of the RepGraph and will change during a session as clients join and disconnect.

Socket Subsystem

  • New: Added option to TcpListener that allows to make the socket non-reusable.


  • Bug Fix: Fixed a crash when destroying an online session on iOS.

  • Bug Fix: Fixed a bug preventing UE from adding secondary players to platform sessions.

  • Bug Fix: Fixed a bug preventing platform sessions from clearing in Social Party's replicated data that have no members when we are promoted.

  • Bug Fix: Modified Party Platform Session Monitor to only do a FindSessionById and to not retry on failed session finds. This fixes repeated failed session finds happening on a timer.

  • New: Added optional iOS 13+ support to the WebAuth plugin, which adds the required protocols to handle view support.

  • New: Added directive to force account picker on login in defined platforms.

  • New: Updated IVoiceChatUser instances created with the IVoiceChat::CreateUser API so they are now released with the IVoiceChat::ReleaseUser API. These were previously released by calling "delete" on them.

  • New: Added ::Exec() function to SocialToolkit. SocialManager now attempts to call Exec on all its SocialToolkit instances (after attempting SocialDebug instances)

  • Improvement: Upgraded Android BillingApiV2 to version 3.0.0 to better support in-app purchases.

  • Improvement: Leaderboards now test interface refactor to admit more parameters when querying leaderboards.

  • Improvement: Improved NvEnc and Amf in the AVEncoder module so that they now use the unwrapped DX Device. This fixes pixelstreaming/highlight recording for both NvEnc and Amf when used in together with the EOS SDK. This is necessary because the EOS SDK hijacks the D3D11CreateDevice.

  • Deprecated: IOnlineStore is deprecated, please use IOnlineStoreV2 and IOnlinePurchase instead.

  • Deprecated: Removed deprecated iOS 11 SDK calls from WebAuth, as UE supports iOS 12+ by default.

  • Deprecated: The IVoiceChat interface (and therefore the VivoxVoiceChat implementation plugin) has migrated from using human readable display names as the device selector, to using unique device ids. This fixes issues where a user with multiple, identically named devices could not differentiate between them. New "Get" methods return a structure containing both the human readable display name, and the unique id, and new "Set" methods take the unique id.

Deprecated methods, and the relevant new method to use instead: GetAvailableInputDevices -> GetAvailableInputDeviceInfos GetAvailableOutputDevices -> GetAvailableOutputDeviceInfos SetInputDevice -> SetInputDeviceId SetOutputDevice -> SetOutputDeviceId GetInputDevice -> GetInputDeviceInfo GetOutputDevice -> GetOutputDeviceInfo GetDefaultInputDevice -> GetDefaultInputDeviceInfo GetDefaultOutputDevice -> GetDefaultOutputDeviceInfo

Deprecated APIs have been replaced with helper methods that adhere to the old contract, to aid migration.

  • Deprecated: Removed unused dead code from the PixelStreaming plugin

  • Deprecated: Changed OSS iOS instances of playerID to use gamePlayerID for iOS 12.4+. This is important because Apple no longer supports playerID in GameKit and for certain iOS revisions this may fail to give a result if used. The replacement gamePlayerID will not give you an id based on the older global playerID but an entirely new value. Be aware that if you have data that relies on the old playerID system you will need to track and migrate this data to the new gamePlayerID upon first successful login.


  • Bug Fix: Updated IHttpRequest to use a thread safe shared pointer. This should help fix crashes caused by the system creating requests on threads other than the game thread.

  • Bug Fix: Added a http check in curlhttpRequest to avoid Download Image BP to fail when using a local file instead of a web URL.

  • Bug Fix: JsonSerializer now properly serializes an array of json values instead of treating it as a json object.

  • New: Added move-aware SetContent API to IHttpRequest to avoid copying the payload. This is especially helpful when passing large payloads to the HTTP system.

  • New: Added support for path parameters to the HTTP Server. You can now add routes with path parameters by providing them in the path like so: "/route/object/:objectid"

  • Deprecated: Changed instances of SecTrustEvaluate (which Apple deprecated) to instead use SecTrustEvaluateError when building for iOS 12+, tvOS 12+, and macOS 10.14+.

Online Subsystem

  • Bug Fix: The ToString function now reports the correct version number in all localizations.

  • Bug Fix: Fixed some race conditions and instances of not getting marked as complete in Online Subsystem GDK's async tasks.

  • New: Added Operations Support System (OSS) to support "Sign in with Apple" on iOS.

  • New: Provided a way to pass an obfuscated user id when purchasing using OnlineSubsystemGooglePlay. Google uses this as part of their anti-fraud efforts.

  • New: Added MaxSpectators session setting.

  • New: Moved parsing logic of ReadOnlineSubsystemConfigPairs into a public function ParseOnlineSubsystemConfigPairs.

  • New: Implemented FindSessionById in TestSessionInterface.

  • New: Added IOnlineSession::StartMatchmaking with per-user settings. Not implemented on most platforms.

  • New: OnlineSubsytemGDK has been added to help support new Microsoft GDK platforms.

  • Improvement: Changed iOS instances of playerID to use teamPlayerID instead for iOS 12.4+. This should make it easier to find the right players.

  • Improvement: Moved MAX_LOCAL_PLAYERS definitions to platform extensions to OnlineSubsystem.

  • Improvement: Modified FOnlineEventParms to use FString instead of FName.

  • Improvement: Added new implementation of QueryPresence that takes multiple ids.


  • New: Added error message handling to Matchmaking websocket clients for both client and Dedicated Servers.

  • New: Added flag from client settings to mcp ticket to signify legacy controls were forced to be changed to new control mappings.


  • Bug Fix: Added a Tick function in XmppModule to call ProcessPendingRemovals to clean closed xmpp connections.


  • Bug Fix: Hosted mode toolkits can now display in the level editor for modes which are not part of the toolbar, such as Paper2D.

  • Bug Fix: Fixed a bug that caused old assets not to appear in the SpriteEditor if they were unloaded.

  • New: Exposed the GetSpriteColor function for UPaperFlipbookComponent.


  • Crash Fix: Attempting to generate a levelset from an empty triangle mesh no long causes Editor to crash.

  • Crash Fix: Updating shape bounds with invalid geometry no longer crashes Editor.

  • Crash Fix: Running scene queries against clustered objects no longer crashes Editor.

  • Crash Fix: Converting a static mesh with null materials into a Geometry Collection no longer causes Editor to crash.

  • Crash Fix: Chaos Niagara interface binding to events for non-active editor solvers no longer causes Editor to crash.

  • Bug Fix: Unculled fields no longer incorrectly apply dynamic parameters to inactive geometry collection particles.

  • Bug Fix: Holes are now properly supported in Chaos landscapes and navigation meshes.

  • Bug Fix: Geometry collection collision filters now correctly filter down from the component settings.

  • Bug Fix: GC scene proxy initialization for RHIs that do not support no-overwrite locking now function properly.

  • Bug Fix: Skipping navigation generation for geometry collection components when they have no available rest collection now works properly.

  • Bug Fix: Disabled particles now function correctly. They no longer get pushed into spatial acceleration structures, fixed cluster particles, and global objects or skip collision resolution while slowing down other queries.

  • Bug Fix: Geometry Collection non-threadsafe collection on DDC cook now functions correctly.

  • Bug Fix: Cluster implicits and initial cluster transforms now function correctly.

  • Bug Fix: Underlying Cull Field now correctly reports the type so the operator nodes can work properly with culled data sets.

  • Bug Fix: Resolved several LiDAR-related line tracing issues.

  • Bug Fix: External strains no longer incorrectly always trigger breaks in geometry collections.

  • Bug Fix: Geometry Collection non-threadsafe code in connectivity graph generation now functions correctly.

  • Bug Fix: Update Body Scale now correctly handles tri-meshes that were created from an externally owned mesh.

  • Bug Fix: Geometry Collection cluster transforms are now correct after changing leaf node transformations for fractured pieces.

  • Removed: Collision particles for Chaos unions and re-enabling child collisions for unions passing through the child simplicials.

  • Bug Fix: Cluster unions are no longer incorrectly filtered out of collision detection due to internally created clusters not having valid collision filter data.

  • Bug Fix: Phantom collisions in Chaos now function correctly. They no longer remove dynamic particles from a disabled active particle list and no longer force a dirty state on every Geometry Collection particle during Physics State Push.

  • Bug Fix: Material face remapping now works correctly when cleaning Chaos triangle meshes.

  • Improvement: Physics Material is now part of the Physics Core module so you can use it outside of the Engine.

  • New: Using physical materials now requires Physics Core as a module dependency.

  • New: Geometry collection now uses Unreal physical materials rather than the obsolete Chaos physical materials.

  • New: Landscapes that are re-topologized now have a new Chaos mesh collider.

  • New: Added an Experimental Chaos Caching plugin to manage and record and playback physical simulations. Currently implemented for static mesh and geometry collection components.

  • New: Heightfields in Chaos level-set collisions now can use the PhiWithNormal setting.

  • New: Reimplemented analytic solver floor for custom Chaos solver actors.

  • New: Implemented basic network replication for geometry conditions to correct the client. The replication can cause differing results with stacked objects since the client can run simulations between updates without prediction.

  • New: Chaos Solver Actor is now refactored and solver properties are now their own object. Additionally, the enable/disable is now replaced with the ability to "pause" a solver. A paused solver ticks at Dt=0 and still runs through the advance to update other systems, such as spatial acceleration.

  • New: Implemented Levelset sweep and overlap functionality.

  • New: Added Levelset overlap implementation

  • Improvement: Optimized Collision Detection through replacing expensive thread-safe queues with a pre-allocated cache that does not require synchronization and improved collision detection and gather to be move-aware and avoid repeated copies of contact data.

  • Improvement: Contact graph generation in Chaos is now optimized.

  • Improvement: Chaos field command types now use reduced evaluated sample sets.

  • Improvement: Scene queries for children of internal clusters are now enabled in Chaos.

  • Improvement: Volume levelset approximations are now closer to the actual value; however, it is not completely accurate at this time.

  • Improvement: Geometry collection collisions now default to implicit-implicit to match the default collision Box type.

  • Improvement: Union group generation in Chaos clustering no longer submits breaking events when releasing from a static cluster when building internal clusters.

  • Improvement: Added pre-skinned bounds for Geometry Collection render proxies.

  • Deprecated: The APEX Destruction plugin is now deprecated.


  • Crash Fix: Restoring the cloth LOD index after undoing Remove Cloth to prevent simulation no longer crashes Editor.

  • Bug Fix: Resolved an error that occurred when deleting a duplicated SimpleCloth asset.

  • Bug Fix: Resolved an error when loading 4.24 cloth assets that displayed the message, "Attempting to replace an object that hasn't been fully loaded: ClothConfigNv object."

  • Bug Fix: Fixed an empty cloth configuration migration issue when reloading 4.24 assets that were caused by a deprecated config property having its UObject name recycled.

  • Bug Fix: Changing buffer buckets now size correctly when using 65k cloth.

  • New: The Clothing Simulation Factory property in the Skeletal Mesh Component will automatically change at run time to the first available factory that is compatible with the included cloth assets. This allows to run Chaos Cloth simulation on levels setup with the ClothingSimulationNv when PhysX is disabled, and vice-versa.

  • New: A warning message now appears in the Mesh Editor viewport when the Chaos Cloth simulation lost impulses due to running slow or being teleported

  • New: Cloth diagnostic and profiling functions are now part of the Clothing Simulation Interactor in Chaos Cloth, which means they can be called in Blueprints. This feature is not compatible with PhysX.

  • Improvement: Mesh-to-mesh skinning now supports multiple influence triangles. This change allows the use of multiple low-res/sim triangles to influence a high-res mesh vertex, and you no longer need to bind mesh vertices with barycentric weighting.

  • Deprecated: Removed the uninitialized member bEnableClothLOD_DEPRECATED from the Skeletal Mesh section serialization.

Collision Detection

  • Bug Fix: In the Details panel, the "Reset to Default" buttons on the mesh collision preset "Object Response" channel now functions correctly.

  • Bug Fix: The Reset to Defaults button now works correctly on "Object Response" channel rows in the collision property details.

  • Crash Fix: On Create Physics State function of the Landscape Heightfield Collision Component no longer causes Editor to crash.

  • Improvement: Updated an asset warning for the Cook Collision Data function in the Landscape Heightfield Collision Component.

  • Improvement: Clustering contact rejection now considers the velocity along with the collision rather than the impulse of the collision.


  • Bug Fix: Resolved an issue with Linux with the SegFault in source filtering and notification manager when closing QAGame Clear Regional Lists at the pre-exit instead of during the global dtor.

  • New: Building with a -gbd-index with Clang v9 or above now cuts symbol loading time by more than half (45 seconds to 17 seconds).

  • New: Added the No Relative Mouse Mode command-line option to support remote VNC.

  • New: Lld linker is now supported with Clang v9 and above.

Rigid Bodies

  • New: You can now Reset Geometry Collections to empty (pre-fracture state) through the Reset button on the Fracture Mode toolbar. Reset only works with assets that are generated from the Geometry Collection.


  • Bug Fix: Check if the platform's ini name is valid (not empty) before trying to load the target platform module. If the platform's ini name is empty and it drops down to using [IniName]+TargetPlatform it will try to recursively load TargetPlatform. This can happen in cases where the AllDesktopTargetPlatform module is not available.

  • Bug Fix: When using the HLSL Cross Compiler, the Shader Compiler Workers (SCW) no longer use more memory than was available on the PC. SCWs are now recycled after each job. You can also now enable the ability to restrict the SCW count based on the memory on non-build machines.

  • Bug Fix: Fixed an uninitialized variable in FShaderPipelineCache that was causing stable cache load failures on some computers.

  • Bug Fix: Released a fix for a console command not properly allocating the right amount for the string. This resolves a potential buffer overrun crash.

  • Bug Fix: Added a fix for PSO Cache not properly setting the mask when no cache is present but game mask usage is enabled.

  • Bug Fix: Fixed an issue concerning invalid PSO masks when the GameMask is disabled by default.

  • Bug Fix: Fixed the + issue on AdditionalRestrictedFolders in DataDrivenPlatformInfo.ini once and for all.

  • New: If an appropriately named platform directory exists under Platforms, it is assumed the project supports the named platform.

  • New: The ISPC compiler was updated to version 1.13.

  • New: CountLeadingZeros and FloorLog2 were optimized.

  • New: Editor Preview Rendering Level platforms are now extensible using DataDrivenPlatform.ini.

  • New: Made the per-platform properties evaluate to the current Preview Rendering Level in the editor.

  • New: Added platform extensions support for installed builds BuildGraph changes:

    • now accepts a semicolon-delimited list of includes to process.

    • This allows a list of includes to be determined dynamically.

    • Pass DataDrivenPlatformInfo names to BuildGraph scripts.

  • New: Made modifications to allow support for multiple build distribution backends. From now on, adding support for a new build distribution backend like XGE can be done by writing a new plugin. To support this we also renamed all classes/structs involved in generic tasks to remove XGE from the name, and we wrapped XGEControllerModule into a plugin. Additionally we exposed methods in Shader Core to figure out the real path from virtual paths for shaders, and added a method so each target platform can define their compiler dependencies.

  • New: Optimized the Expand command of ShaderPipelineCacheTools commandlet so that it takes less time to finish and uses less memory.

  • New: Added support for data sets larger than 2 GB to the ShaderPipelineCacheTools commandlet.

  • New: Enabled all categories in persistent storage manager and set all quota to unlimited. Access to containers in persistent storage manager is not thread-safe. This makes sure all files can still be written to persistent storage without any extra restriction, but analytics will still be able to collect usage information for each category.

  • New: Added a CVar per console to allow gamepad control of the cursor without requiring a mouse. These include: GSonyAllowGamepadControlOfCursor, GSwitchAllowGamepadControlOfCursor, and GXboxOneAllowGamepadControlOfCursor.

  • New: Changed the verbosity of detailed material info printed to the login ShaderPipelineCacheTools commandlet to not spam the log unnecessarily.

  • New: Improved platform extension plugin name error to indicate the proper fix depending on what is wrong.

  • New: UE no longer scans for .uplugin files for platform extensions where there is no support for the platform compiled into the editor. This helps with build machines that don't have NDAd platform support that makes precompiled binaries, but users sync those platforms so they have the .uplugin locally. We've also added a FDataDrivenPlatformInfoRegistry::HasCompiledSupportForPlatform() function that can be used in other places to detect if a platform has been compiled or not.

  • Improvement: Platform extension changes:

    • Now uses <Option> to expose a command-line option enabling the platform.

    • This restores original command line args to existing platforms.

    • Test that platform is enabled in each of the macros defined so that the base script doesn't need knowledge of what platforms are enabled.

  • Improvement: Performed a big code reorganization for PlatformExtensions (Engine/Platforms/…) and Restricted (for instance, Engine/Restricted/NotForLicensees/… and Engine/Restricted/NotForLIcensees/Platforms/…). This is to prepare a cleaner p4 permissions structure in UE5. Projects can also have a Platforms directory to put platform specific files into, but it is not required you re-layout your directories to match.

  • Deprecated: Removed deprecated GetUniqueDeviceId() from UE4. GetDeviceId() now returns an empty string on un-implemented platforms, instead of falling back to GetUniqueDeviceId(). This would end up returning a constant MD5 hash of an empty string on platforms that don't implement GetMacAddress(). GetHashedMacAddressString() will now return an empty string if the MAC address is not implemented on the platform.

  • Removed: Deleted fake XXX platform extension.

All Mobile

  • Bug Fix: Changed IntelISPCTexComp to use 6x6 for ASTC normalmap compression.


  • Bug Fix: Fix to create video track info if unable to run media extractor (usually network streams),

  • Bug Fix: Corrected calculation of OBB per file cost.

  • Bug Fix: Fixed a crash in AndroidMovieStreamer if no PAK files to search. We also fixed the same issue in AndroidMediaPlayer.

  • Bug Fix: Addressed a handle exception that can occur when attempting to clear keyboard focus after having used autocomplete.

  • Bug Fix: Disabled --gc-sections on link if not compiling with -ffunction-sections and -fdata-sections for Android.

  • Bug Fix: Ensured android java restarts only happen from the UIThread. Fixes possible race conditions in which startActivity could create the new activity in the same process as the outgoing activity and then exiting process.

  • Bug Fix: Fixed a bug when GameThread will be displayed as Thread-2 and UI Thread will be displayed as "MainThread-UE4" in Android Studio.

  • Bug Fix: Added support for Android SDK Cmake for building PhysX for Android.

  • Bug Fix: Fixed incorrectly configured GL shader programs when an evicted binary program is restored from the BSS cache.

  • Bug Fix: Disabled autofill manager in GameActivity to prevent Android 10 crash.

  • Bug Fix: Performed an update to correctly track OpenGL resources in ELLTracker::Platform.

  • Bug Fix: Disabled WRITE_EXTERNAL_STORAGE permission if not needed (shipping and externalfilesdir enabled).

  • Bug Fix: Linking a compute shader will now print an error message only in Debug Android builds.

  • Bug Fix: Fixed random memory corruption when using BP arrays on Android armv7 platform.

  • Bug Fix: Enabled universal APK by default for Android. Bundles still need to be enabled for this to take effect.

  • Bug Fix: Fixed an issue where enabling Vulkan validation layers would cause a crash on Android devices

  • Bug Fix: Fixed an app crash when exporting a texture through 'Export to Disk' BP node on Android.

  • Bug Fix: Fixed inverted scene captures with Android GLES RHI. The "Disable Flip Copy GLES" option added in 4.25 introduced this regression as the flag was being treated opposite to what was intended. The 4.26 behavior is now the same as 4.24.

  • Bug Fix: Fixed crash that could occur when invalid memory is encountered during stack walk.

  • Bug Fix: Released a fix for an Android build issue where gradle was being run even if the apk was up to date due to some incorrect file paths.

  • Bug Fix: Changed android physical memory usage reporting on Android 10+ to use VmRSS. This is due to getProcessMemoryInfo only updating once every five minutes with Android 10.

  • New: UE will now report an error if x64 or x86 is the only platform and in binary build.

  • New: Added Android Vulkan frame pacer to support switching native display refresh rates.

  • New: Added the a.SupportNonVSyncMultipleFrameRates console variable to support CPU-based frame pacing to target frame rates that are not a multiple of any available vsync rates.

  • New: Added Android Platform support to query available screen refresh rates, and to set the current screen refresh rate.

  • New: Updated Network Changed Manager to provide network connection type. The Network Changed Manager is the best place to know what kind of connection type we have. This change introduces a Network Transport Type enum provided in the On Network Available callback of the Network Connectivity Client. The callback is called any time the transport type changes.

  • New: Added more UPL plugin injection points for Android Activity and Application.

  • New: Exposed memory warning state received from Google's MemoryAdvice library to CSV profiler as an integer value. This graph can be found under Android Memory section in your CSV report. This library might not be reliable on certain devices and it's output should be used as a guideline, not a hard rule. The warning state integer can have 3 states:

    • 0 (OK)

    • 1 (Approaching memory limit)

    • 2 (Critical, application can be OOM killed any time).

  • New: Added support for Texture2D arrays in OpenGL.

  • New: Exposed Android CPU Temperature (STAT_CPUTemp) and Thermal Status (STAT_CPU_ThermalStatus) to Unreal Insight and CSV profiler. In Unreal Insights these stats can be found under STATGROUP_AndroidCPU. In CSV reports these stats can be found under "Android Thermals".

  • New: Cleaned up OpenGL ES implementation and based it on ES3.1 spec. NDK minimum version is set to 21 (link against libGLESv3.so).

  • New: Added option for up to 2 overflow OBB files if Patch OBB enabled.

  • New: Added GL RHI support for creating VB/IBs WithoutNativeResources and switching of VB/IB underlying resources. Required for mesh lod streaming support.

  • Improvement: LibPNG has been updated to version 1.6.37.

  • Improvement: FreeType 2 for Android has been updated to version 2.10.4.

  • Improvement: libsndfile has been updated to version 0.1.9.

  • Improvement: Shader models that are not compatible with Mobile feature levels will now fallback to a default shader model and display a warning in the console log. In the Defaults for your material, you can set the Shading Model to From Material Expression to add a Shading Model pin to the output node. You can then use a Feature Level switch to control the Shading Model.


  • Bug Fix: Fixed a crash in FIOSInputInterface::SendControllerEvents due to a call to UIInterfaceOrientation from the game thread

  • Bug Fix: Removed FullHDR as a reflection capture format on iOS. This prevented full hdr data from being stored in cooked data then discarded after load, which was causing memory spikes on load.

  • Bug Fix: Adjusted compression on iOS to fallback to a supported format instead of leaving texture uncompressed when compression is set to a BC7 format.

  • Bug Fix: Fixed an iOS GPU crash when PostProcess material uses a custom stencil while project sets r.CustomDepth=1.

  • Bug Fix: Fixed an issue where AnimSequence assets in DLC packages could not be correctly loaded on iOS.

  • Bug Fix: Fixed an iOS GPU crash when doing scene captures with MSAA enabled.

  • Bug Fix: Fixed a number of minor issues to enable the use of the Address Sanitizer with iOS.

  • Bug Fix: Added a fix for UObject invocation on non-game thread which could cause a race condition or crash.

  • Bug Fix: Added a device profile for TVOS that inherits AppleTV settings.

  • Bug Fix: [IOS] Added a check if the bundle exists before trying to copy manifests. This prevents an error being displayed in the log before staging.

  • New: Added a batch file in Engine\Extras\iTunes that will set the required file permissions to allow Unreal Engine to communicate with iTunes installed from the Windows Store.

  • New: Added code to hide the white bar indicating where to swipe the Home gesture on iPhone X and later devices.

  • New: Added Multi User support on tvOS.

  • New: Removed iOS 6 to 11 references, made iOS 12 minimum support iOS version, and added iOS14.

  • New: Removed ios 11 support and set ios 12 as default in webauth.

  • New: Fixed deprecated behavior of Menu button on iOS and tvOS.

  • New: Modified how provisioning profiles are selected for signing of IPAs on iOS. Newer profiles are now checked first by sorting the complete profile list into descending order based on creation date. This addresses the issue where people can recreate a profile (for example, by adding a new device or changing entitlements), reimport it, and still have the old profile be selected because the older file was returned first by EnumerateFiles.

  • New: Added device profile detection support for iPhone 12, iPad Air 4 and iPad 8 devices. Mapping of the iOS hardware string (such as "iPhone13,4") to a specific device profile is now performed using regular expressions in the [IOSDeviceMappings] section of BaseDeviceProfiles.ini for easier updating.

  • New: Added a setting to the ARKit plugin that allows projects to choose whether they may only be installed on ARKit-compatible devices. The setting is True by default (requiring AR capable devices) which is the existing behavior, and because apps can remove hardware requirements like this in updates but not add them.

  • New: Removed arm64 references as they're now the only supported architecture on iOS

  • New: Added support for the Metal Compiler Tools for Windows, and modified the hash key to be based on the compiler version instead of the Xcode version.

  • New: Attempting to bind a memoryless texture is now a hard failure.

  • New: We've moved all code into the .text segment on ARM.

  • New: Changed the memory statistics to use the OS jetsam values for determining total memory available.

  • New: Removed internal argument buffer emulation. This saves about 1.7MB on average under heavy load.

  • New: We now triple-buffer dynamic and volatile allocations. This pushes all transfer buffers (for platforms that use a staging buffer to blit into private buffers) into a short-lived frame allocator pool.

  • New: Memory usage is now obtained via usage of IOS 13 API, os_proc_available_memory(). This provides more accurate accounting of the memory left until being jetsamed.

  • New: Addied iPad Pro 2020 device profiles (12.9 and 11).

  • New: We now allow the use of presentAfterMinimumDuration Metal API to smooth out the framerate on IOS.

  • New: [IOS] We've rebuilt IPhonePackager with new code to support Apple Development and Distribution certificates.

  • New: [IOS] Added support for Apple Development and Distribution certificates.

  • Improvement: Performed code cleaning and an overall refactor of ios14 and tvos14 input interface requirements (glyphs and current controller feature).

  • Removed: The Apsalar plugin has been removed. It had been relying on a deprecated SDK and APIs and had been non-functional for some time.


  • Bug Fix: Implemented GetWindowUnderCursor for Unix Platform.

  • Bug Fix: Updated README.md for Linux build.

  • Bug Fix: Fixed SegFault in source filtering and notification manager when closing QAGame Clear RegionalLists at pre-exit instead of during global dtor when many objects / modules have been freed. Call RemoveAll on FilterCollection->GetSourceFilters updated in PreExit instead of global dtor when many objects / modules have been shut down.

  • Bug Fix: For Unix, fixed FUnixPlatformMemory::GetStats() that always returned 0 when memory was over 10.24gigs.

  • Bug Fix: UE no longer hard codes c14 in LinuxToolchain as the default c standard.

  • Bug Fix: Added SP_OPENGL_SM4_REMOVED to IsDeprecatedShaderPlatform(). This fixes assert when getting shader stats (called from FShaderCookerStats::Initialize).

  • Bug Fix: Added error messagebox when vkGetPhysicalDeviceSurfaceSupportKHR fails (no present support).

  • Bug Fix: For Linux Vulkan, fixed amdgpu mesa crash where drawinstance call is outside render pass enabling shader complexity view.

  • Bug Fix: Update translucent rendering fix to use BeginRenderingTranslucency.

  • Bug Fix: Honor UE4's Mono-build environment using Build.sh.

  • Bug Fix: Fixed BC6H/BC7 texture formats not being available for Linux.

  • Bug Fix: Fixed submenus closing causing main context to close.

  • Bug Fix: Fixed focus issue where Windows with never activate policy were being set to active.

  • New: Updated Linux SDL2.0.10 to SDL2-2.0.13-13784. Also we removed Epic opengl and emscriptem changes. Source snapshot for SDL 2.0 (Updated Wed Apr 29, 2020) https://www.libsdl.org/hg.php.

  • New: Enabled ssse3 by default for Linux x86.

  • New: Build ShaderConductor for Linux Script now uses v16 Clang 9.0.1, and works around incorrect llvm-tblgen location. This also adds declspec guid -fms-extensions for build error.

  • New: Updated Linux SDL2.0.10 build files to SDL2-2.0.13-13784.

  • New: Added support for multithreading in forked processes. Use -PostForkThreading when SupportsMultithreading() is false to allow multithreading in forked processes. Forked processes do not inherit threads from the master, so this keeps the master process in single thread mode but transforms the RunnableThreads into real threads on the forked version. Use FForkProcessHelper::CreateForkableThread to use this feature. ForkableThreads will behave correctly according to the environment they are called in (singlethread, multi thread, forkable). SyncEvents created in -PostForkThreading environments are real events on the master process (Win, Unix platform only).

  • New: Added TaskGraph.ForkedProcessMaxWorkerThreads cvar to directly control the number of worker threads spawned on forked processes that enable multithreading.

  • New: TaskGraph can now be multithreaded on a forked server with -PostForkThreading. To do this the TaskGraph needs to be shut down and recreated entirely by the forked process for the switch to occur. The functionality can be disabled via "TaskGraph.EnableForkedMultithreading 0" if needed.

  • New: Linux AArch64 libs for FreeType2 v2.10.0, ICU 64.1, and HarfBuzz 2.4.0 now include BuildForLinuxAArch64.sh cross compilation scripts. This also adds LinuxAArch64 back to installed engine builds.

  • New: Added bGdbIndexSection bool to LinuxToolChain.

  • New: Changed default linux directory permissions to 775 from 755 to make working with them easier.

  • New: You can now use msbuild in mono for Linux when using an installed copy and mono >= 5.0.

  • New: Linux directory watcher optimizations and fixes for cases where we're running with "virtual" layers in the platform file (i.e. pak files).

  • New: Added a skip linux UE4_DO_ROOT_PRIVILEGE_CHECK check for programs.

  • New: Updated to new LLVM V17 Clang 10.0.1 toolchain.

  • New: Moved to using llvm-objcopy for objcopy and strip.

  • New: Installed Linux builds now assume a bundled toolchain.


  • Bug Fix: Fixed build for Xcode 12.1.

  • Bug Fix: Updated Mac Chromium Framework binary with a version that fixes a crash on macOS 10.15 Catalina. This was caused due to CEF's use of TSM API outside of the main thread.

  • Bug Fix: Fixed flickering decals in mobile preview.

  • Bug Fix: Changed Mac toolchain to use relative paths where possible when linking. This solves the "Argument list too long" error during linking.

  • Bug Fix: Released a fix for a Metal validation failure. In MetalStateCache, make sure that the color attachment's slice is always set to 0 for 3D textures, as they don't support rendering to multiple slices.

  • New: Updated third party binaries required to support the majority of Mac client targets targeting Apple Silicon.

    • Remember that Steam SDK does not have an ARM64 slice and will not link to an ARM64 or fat target.

  • New: The minimum macOS version required has been rolled forward to Mojave 10.14.

  • New: Removed internal argument buffer emulation.

  • New: Updated FMacPlatformProcess::GetDllHandle() to accommodate macOS 11 Big Sur.

  • New: Enabled Metal RHI runtime virtual texture support.

  • New: Fixed an error adding Android tools to path in the SetupAndroid.command shell script.

  • New: Added support on Mac and Linux for user-defined .unrealrc files that allow developers to specify environment variables for UBT and UAT scripts. .unrealrc files in the home and the workspace directory will be applied before the editor, UnrealBuildTool, UnrealAutomation tool, etc are run.

  • New: -Wno-range-loop-analysis is now set when building iOS / Mac with Clang 12.0.0 or higher (Xcode 12.00). This should prevent warnings when ranged loops use copies and not references. Note that all instances have been fixed up, the warning is disabled as these issues are easily introduced but only Clang on Apple platforms currently warns about them.

  • New: Removed VR support for Mac. No longer supported and not compatible with current/future Mac updates.

  • New: Improved the GPUBenchmark accuracy on Mac.

  • New: Enabled MacClient target platform on windows.

Steam OS

  • Bug Fix: Changed the desc status for hidden in the Steam achievements query.


  • Bug Fix: Fixed a bug where Windows Mixed Reality hand joint transforms were always returning an invalid radius.

  • Bug Fix: Fixed a bug where the VR Mode Vive touchpad was not scrolling smoothly.


  • Bug Fix: Fixed FWindowsPlatformProcess::GetPerFrameProcessorUsage to work with more logical cores.

  • Bug Fix: Fixed handling of UNC paths on Windows.

  • Bug Fix: Fixed a bug in ShaderPipelineCache commandlet that was making it generate too many PSO permutations on D3D12

  • New: Clang builds on Windows now build with the -mssse3 flag to match Visual Studio 2019 SSE support.

  • New: Made FD3D12GPUFence available externally.

  • New: Changed the File|Package menu for Windows to only show 32 or 64-bit options, based on the bTarget32Bit Windows project setting. It now won't cook with Win64 but run with Win32.

  • New: Made ProjectLauncher/UnrealFrontend/LaunchOn respect the Target32Bit windows project setting.


  • Crash Fix: Fixed a crash that occurred when resizing a UTextureRenderTarget2D with autogenerate mips enabled.

  • Crash Fix: Corrected a startup crash that occurred when -disable-platform-chunk-install was enabled

  • Crash Fix: Implemented a fix for a rare crash, which happens for users with multiple adapters, where not all of them support ALLOW_TEARING.

  • Crash Fix: Vulkan: Fixed the handling of FRHITextureReference. This corrected a crash which occurred when importing UDIM textures.

  • Crash Fix: Corrected a crash that would occur if a game started up in a specific mode, and clicked in another window. This would cause DXGI_ERROR_INVALID_CALL, which would cause the engine to halt.

  • Crash Fix: Fixed a crash on certain platforms when running with "-onethread" caused by incorrect reference counting in FSlate3DRendering.

  • Crash Fix: Fixed a crash in the Hierarchical Instanced Static Mesh of Mesh with MinLOD set to 1 or higher.

  • Crash Fix: Fixed a potential crash in Sky Light when attempting to dispatch CDF compute shaders before the shader map was ready.

  • Crash Fix: 64bit math is now used for calculations when building large streaming virtual textures, which prevents crashes from 32 bit overflow errors when building the textures; out of memory errors during texture compression for 64K textures remain possible.

  • Crash Fix: Fixed a crash that occurred during ClearUAV in OpenGL ES due to the UnrealFormat being set incorrectly in the constructor of the FOpenGLStructuredBufferUnorderedAccessView.

  • Crash Fix: Fixed a crash on macOS when setting the budget too high.

  • Crash Fix: Fixed a crash when a texture was not null but the internal referenced texture was. This was handled individually by some RHIs but now it is managed at a high level.

  • Crash Fix: There will no longer be an attempt to add shader virtual paths if shader compilation was disabled on the command line. This avoids some crashes in editor builds that don't have a shader source.

  • Bug Fix: Fixed cloud interaction with opaques being biased by back and forth deviceZ/linear depth transform. Also unified the code and tested translucent rendering and intersection when using Translucent.ScreenPercentage < 100.

  • Bug Fix: Now uses the same reflection environment shader permutation for deferred reflections as for SSR. Fixes deferred reflections on clear coat materials.

  • Bug Fix: Fixed leaking frametempmemory in Vulkan.

  • Bug Fix: For the Pixel Streaming Signaling Web Server, add an error code for the disconnect player event.

  • Bug Fix: The DeviceRemovedReason is now logged to verify the device has not been hung.

  • Bug Fix: Vulkan textures created with TexCreate_CPUReadback are now created as buffers. This allows for support for mip levels on hardware that does not expose this feature. Added basic Transitions to LandscapeEditoLayers, so it passes validation.

  • Bug Fix: Fixed an issue with resource barriers being nonsense. Corrects an issue with subsurface scattering not working correctly on AMD.

  • Bug Fix: Added fixes to RendererScene.cpp.

    • Fixed sublevel loading.

    • Fixed a crash bug in the shadow generation code.

    • Added a missing FMemMark in FAsyncCreateLightPrimitiveInteractionsTask.

  • Bug Fix: Fixed deferred reflection reflection capture compositing on ray miss.

  • Bug Fix: Fixed an issue in DX11 RenderTarget binding. When Pixel Shaders write to a variable number of render targets within a pass and use UAVs, they end up overwriting bound RTVs. This caused issues with Objects -not- writing in the subsurface gbuffer, but binding a UAV for Virtual Texture feedback. This would leave the subsurface gbuffer unbound.

  • Bug Fix: Fixed the mGPU visibility mask when initializing FD3D12ResourceAllocator and FD3D12FastAllocator.

  • Bug Fix: Vulkan: fixed Uniform buffer allocations being released too early during the first few frames.

  • Bug Fix: Vulkan: Fixed leaking Pipeline and RenderPass objects, which occurred when multiple threads were creating objects with the same hash. Corrects a Vulkan validation error VUID-vkDestroyDevice-device-00378. The Renderpass fix was reapplied to work post barrier refactor.

  • Bug Fix: Fixed a bug with HDR UI composition where the render target was not being cleared if there were no slate render batches, leaving stale data when there are no UI elements on screen. This caused a black screen in ShooterGame.

  • Bug Fix: Vulkan UAVs now all get identity swizzle, as this is the only thing supported. This fixes a validation error.

  • Bug Fix: Fixed per-vertex lighting in forward shading when separate ratio is not 100.

  • Bug Fix: Fixed the issue causing the PVS-Studio Warning: CanvasRenderTarget Pointer Utilization Before Being Verified Against NullPtr.

  • Bug Fix: Added a dummy back buffer texture which is used to bind the current back buffer on the RenderThread.

    • On the RHI thread the actual current back buffer texture is retrieved from the viewport.

    • Removed the independent RenderThread and RHIThread back buffer index which might not be incremented in sync causing DXGI errors and lost device issues.

    • The expected back buffer index is still used to inform the mGPU what GPU will be used for the present, this is kept in sync when the present will be skipped.

  • Bug Fix: Re-enabled the GetDynamicMeshElements path in FInstancedStaticMeshSceneProxy for test and submission builds which was previously incorrectly disabled. This fixes a bug which prevented instanced Static Meshes with dynamic relevance from rendering.

  • Bug Fix: Fixed an issue with the D3D12 Query heap with a dangling resource on outstanding queries after a heap resize, and fixed the outstanding open query count to track if it's from the current active heap.

  • Bug Fix: Rendering editor selection for mesh batches without a PrimitiveSceneProxy is now prevented.

  • Bug Fix: Fixed a potential race condition when trying to render data that was not ready yet.

  • Bug Fix: Added an EndFrame and BeginFrame when performing garbage collection on slow running tasks (using the increment frame fence value which can currently be used to track internal resource lifetime). This corrects the out of memory error on D3D12 when exporting animations and other long running tasks.

  • Bug Fix: Fixed Vector Field debug visualizations.

  • Bug Fix: Fixed painted vertex loading in the Editor's -game mode.

  • Bug Fix: Fixed buffer visualization for the Overview rendering mode.

  • Bug Fix: Fixed an issue with transparent/translucent materials when forward shading is enabled and r.SeparateTranslucencyScreenPercentage is not 100.

  • Bug Fix: Fixed arrow perspective scaling when its origin is behind the view camera.

  • Bug Fix: Updated the RenderDoc plugin to support executables from RenderDoc 1.0 or higher.

  • Bug Fix: DirectX RHIs now fully supports MSAA textures.

  • Bug Fix: Fixed the UStreamableRenderAsset::IsTextureFullyStreamed not taking into account LOD Bias

  • Bug Fix: The loading of resolutions added by Dynamic Super Resolution now operates correctly.

  • Bug Fix: Pre-exposure for debug visualization modes now works correctly…

  • Bug Fix: Fixed issues with ByteAddressBuffers not calculating the correct offsets and sizes.

  • Bug Fix: Fixed MSAA on Vulkan.

  • Bug Fix: The overlay menu button will now transition on click from + to x when the menu is opened / closed.

  • Bug Fix: Fixed potential race condition when trying to render data that was not ready yet.

  • Bug Fix: Corrected a malfunction caused by Pixel Streaming always assuming a physical mouse would be attached, even when running on a cloud machine or in Windows session 0 with no physical mouse. The bPixelStreamerMouseAlwaysAttached setting can override this behavior.

  • Bug Fix: Fixed pre-exposure for convolution bloom in scenes with physical light ranges.

  • Bug Fix: Fixed the pipeline cache file GUID reporting in OpenPipelineFileCache.

  • Bug Fix: Fixed CleanUpWorld to release resources when closing an editor window. This prevents leaking of two things: RenderTargets, which are referenced in uniform buffers, and particle buffers from FXSystems.

  • Bug Fix: Delayed deletion of all buffer objects. This fixes a rare GPU corruption issue that occurred when buffer memory was reused.

  • Bug Fix: GeometryCacheSceneProxy now correctly marks lighting channel view relevance.

  • Bug Fix: Fixed the HLSLcc shader compilation by correcting ensure logic in ir_visitor_status visit_enter. Previously, the ensure logic may have triggered incorrectly, this has been remedied.

  • Bug Fix: Fixed the stat drawcount command for D3D12.

  • Bug Fix: Fixed a typo, the initial layout transition wasn't actually using the intended layout type

  • Bug Fix: Removed a redundant editor primitives mesh pass.

  • Bug Fix: Fixed an issue where custom depth meshes were using stale GPUScene data.

  • Bug Fix: Fixed issues with the clear coat shading model, in order of severity:

    • Removed energy normalization on the diffuse contribution.

    • Removed dependence on negative NoL and NoV when computing transmission.

    • Modified SphereSinAlpha to account for top-coat and bottom-coat roughness when using spherical area lights.

    • Eliminated the glossy contribution of bottom-coat for clear coat dielectric materials (noting that IOR ratio (Eta) approaches 1.0).

  • Bug Fix: Fixed an issue with indexbuffer and vertexbuffer views being created incorrectly when using WHOLE_SIZE.

  • Bug Fix: Corrected a Vulkan validation error when the VkBufferViewCreateInfo range does not equal VK_WHOLE_SIZE.

  • Bug Fix: The CommandBuffer reset now happens on reallocation instead of on-demand when updating fence. This fixes an issue where the VkCommandBufferPool was accessed from two threads.

  • Bug Fix: Fixed issues with sampler initialization for a Texture2DArray assets.

  • Bug Fix: Added missing Vulkan pixel formats.

  • Bug Fix: Fixed two validation issues in Vulkan caused by the Track Editor Thumbnail.

  • Bug Fix: Added a heuristic PSO cache sanitization (based on hardcoded knowledge).

  • Bug Fix: Fixed an issue with InOutMask for vertex shaders missing bits when there are arrays in Vertex Input semantics. Fixes the following validation error: UNASSIGNED-CoreValidation-Shader-InputNotProduced: Vertex shader consumes input at location 6 but not provided #review-14610138

  • Bug Fix: Fixed Vulkan command buffers being freed without waiting for them to finish first.

  • Bug Fix: Fixed an issue with automatic resource transition based on bindings, but binding to several slots.

  • Bug Fix: Fixed a Vulkan validation error for depth attachments (which can't have swizzling).

  • Bug Fix: Fixed an issue with bloom application in splitscreen. PostProcessTonemap.usf now properly accounts for a restricted ViewRect on the bloom input texture.

  • Bug Fix: Fixed out-of-bounds access in CalcSkyLightPdf and PdfSkyLightOcclusionRay due to both sides of the ternary operator always being evaluated in HLSL.

  • Bug Fix: Changed the PSO cache file to be smaller and easier to patch by removing redundant GUIDs.

  • Bug Fix: Fixed a GPU memory corruption in D3D12 that could happen when a FD3D12FastAllocatorPage is used from the RHI thread but then recycled from FD3D12FastAllocator::Allocate on the Render thread. The wrong fence value could end up being used to detect when it's safe to re-use the page. Occasionally this could result in pending vertex or index buffer uploads being overwritten by the CPU before they are consumed by the GPU, leading to severe visual artifacts.

  • Bug Fix: Fixed broken occlusion for planar reflections.

  • Bug Fix: Made sure the parent directory is created for the PSO cache file.

  • New: Made PSO hashes consistent across sessions so the specific PSO from a crash log can be identified for debugging.

  • New: The -d3ddebug status is now always indicated in the log.

  • New: Dumping shader debug info only on compilation errors or warnings is now supported. Valid settings for r.DumpShaderDebugInfo are now 0-3

    • 0 - Don't dump (unchanged).

    • 1 - Always dump (unchanged).

    • 2 - Dump on error (i.e. compilation failure).

    • 3 - Dump on generated errors or warnings.

  • New: Added two-sided foliage material to the path tracer, and applied energy conservation to the throughput. Currently, this uses diffuse transmission instead of rough transmission.

  • New: Added a reflection pass switch node. This is useful to tweak visuals for less volumetric clouds details according to the sample count in reflection capture, for instance for the sake of performance.

  • New: The barrier command list build and execute command list are now performed via a task to offload the RHI Thread:

    • Use a special fence which has a pending fence value while the task is running which can be used to get the 'correct' future fence value used for resource deletion and such.

    • Multiple places in the code now need to force the execute task to wait in order to make sure that the execute command list has happened on the device.

  • New: Refactored Global view heap code to use a global heap from which blocks can be allocated at fixed block sizes.

    • Block size can be controlled via D3D12.GlobalViewHeapBlockSize console variable (2000 default).

    • The fallback to the threadlocal heap is now really a very rare case and should be considered invalid (still supported as is, no changes done for that heap).

  • New: New pools depending on creation flags can now be created on the fly.

  • New: Added support for single-state resources (can be any state - even UAV and internal tracking is disabled for those resources).

  • New: Apply pow 2.2 on Roughness (the same as done by the BufferVisualization/Roughness engine material graph).

  • New: Added support for Intel hardware with non-local memory.

  • New: Added DX11 support for EnumAdapterByGpuPreference; this allows for OS-assisted selection of GPU use preferences.

    • Use -gpupreference=1 to set a preference for minimum power use

    • Use -gpupreference=2 to set a preference for highest performance.

    • The default value is 2.

    • Any other value causes the feature to fallback to the older code.

    • Also upgraded DXGI to the latest version.

  • New: Now allows optional per-vertex offset pre/post skinning to be applied to Skeletal Meshes. This is a temporary solution for applying correctives to animations.

  • New: Added tracking code to help debug memory leaks from Vulkan objects. Disabled by default. Use r.vulkan.dumpmemory to dump when enabled.

  • New: Refactored the scene texture uniform buffer to use RDG resources.

  • New: Added the -noexceptionhandler command line parameter. This allows the use of JIT debugging.

  • New: Applied D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX to the index buffer and texture.

  • New: Added support for VK_KHR_image_format_list, VK_KHR_shader_atomic_int64 and VK_KHR_driver_properties support for Linux; added gpu crash extension support on Linux for AMD and NVIDIA.

  • New: Moved GPixelFormats from the RenderCore to RHI module.

  • New: Replaced the compile time GD3DCheckForTypedUAVs toggle in D3DShaderCompiler.cpp with a console variable (r.D3D.CheckedForTypedUAVs) so the restriction on using typed UAV loads can be lifted if a project's minimum spec. is higher than the Windows 7 D3D11.0 feature level.

  • New: Added the PreExposure value to HDR visualization.

  • New: Added support for ATI1 texture format being interpreted as BC4

  • New: Optimization of excluding Separate Translucency Pass when no translucent objects are rendered.

  • New: For Pixel Streaming, the -PixelStreamingHideCursor command line option will make the cursor invisible in UE4. This should be used when you want the cursor to be shown only by the web-browser.

  • New: Added support for NV Aftermath on Vulkan via -gpucrashdebugging, and corrected AMD_buffer_marker not being enabled.

  • New: Updated Vulkan headers to

  • New: Text3D: Added support for Arabic cursive writing.

  • New: Swapped the Bcrypt node module to the native .js version, and added npm console commands to ease usage.

  • New: Added support for BUF_Shared on D3D11

  • New: Ported custom depth/stencil rendering to RDG.

  • New: Ported Screen Space Ambient Occlusion and Ground Truth Ambient Occlusion to Render Graph.

  • New: Added the '-ForceAsyncCompute' command line option to force the D3D12 RHI to think the GPU is optimal for Async Compute.

  • New: Implemented DRED 1.2 support. Changed the DRED log to only show command lists that were partially completed (partial log up to the last completed command).

  • New: PixelStreaming: Added the MinBitrate console variable, that makes PixelStreaming ignore the video encoder bitrate recommended by WebRTC if it drops below the MinBitrate value. Can be useful to sacrifice interactivity for better video quality on low-bitrate connections. Disabled by default.

  • New: Added RDG_CSV_STAT_EXCLUSIVE_SCOPE / RDG_CSV_STAT_EXCLUSIVE_SCOPE_CONDITIONAL and cleaned up exclusive CSV tags in the deferred renderer. Added the 'r.RDG.VerboseCSVStats' console variable which toggles verbose CSV stats for the different phases of RDG itself. This restores CSV timings back to their original domains instead of being absorbed into the monolithic RDGBuilder_Execute tag.

  • New: Merged GPU skinning vertex factories for 4 and 8 bone influences into a single factory with branches inside a vertex shader. This reduces the total number of shaders generated for Skeletal Mesh materials.

  • New: Implemented a templated version of IMPLEMENT_VERTEX_FACTORY_TYPE_EX for templated Vertex Factories.

  • New: Updated Vulkan sdk to

  • New: Implemented draw call counters into RDG stat scopes. This fixes missing RHI draw calls for mesh passes in the CSV profiler.

  • New: Integrate AMD QueryVideoMemoryInfo, this time with a fix for pre-GCN hardware.

    • This fix was implemented because when true, IsRHIDeviceAMD can indicate either integrated graphics or a discrete GPU.

    • The budget calculation comes from the OS via IDXGIAdapter3, falling back to the original calculation method if the interface for IDXGIAdapter3 does not exist (e.g. on Win7).

    • This update also includes a fix for old, pre-GCN cards used on Win10.

    • The QueryVideoMemoryInfo call can fail even though the QueryInterface for IDXGIAdapter3 succeeded, in which case, the system also falls back to the original calculation method.

  • New: Changed DX11 RT/UAV hazard detection to use UAV bind information instead of RTV bind information.

  • New: Added support for static samplers for D3D12 shaders compiled with DXC for PC (such as ray tracing shaders).

  • New: Text3D: Added support for creating outline text.

  • New: FRenderQueryPoolRHIRef is no longer used for fencing because it's not thread safe - one query is allocated and freed at a time.

  • New: Added defragging in the Vulkan memory subsystem:

    • Performed a partial defrag in an attempt to free up pages to release.

    • Free Pages are now kept in the Memory Manager, and the actual suballocators are no longer kept around; they are now freed after a while.

    • Added a bucket system for allocations, which covers the bucket system previously used on Android; Desktop platforms now also use buckets of less than two megabytes and less than sixty-four megabytes.

  • New: Reintegrated the new NvAftermath version which supports GPU Crash minidumps which now contains DXGI loading fixes for Win7 support.

  • New: The Global Shader Cook Commandlet now allows you to cook an override shader file that can be hot reloaded while the target is running.

  • Improvement: Cleaned up the Vulkan Memory System:

    • CallStackHandling has been rewritten; the new code defers symbolization (making it much faster), and it is now possible to enable it using a runtime parameter since it's now always enabled in the callstack code.

    • Vulkan memory classes have been merged.

    • All Vulkan allocations now have a meta tag.

    • The command "vulkanmemory stat" shows allocations per meta tag.

    • The command "vulkanmemoryraw stat" shows stats for heaps.

    • The memory dump output now gives a better overview over where memory is being used.

    • Vulkan memory allocations are now defer-deleted by default. Subsystems that don't need this can opt out (Uniform Buffers).

    • All Vulkan allocations now go through FVulkanAllocation. This class is intentionally not reference counted.

    • Some options that used to be hidden in definitions are now console variables so that they can be used and tested on all platforms.

    • The Vulkan memory system now supports an experimental automatic eviction of textures when running low on memory. Only non ray-traced, non UAV textures can be evicted. Currently, once evicted, textures are never promoted back to host.

    • The frame delay for freeing resources is now unified for all platforms (at 3, and no longer 10 for Desktop).

    • The fake memory limit is now controlled using a console variable that can be changed at runtime (in non-shipping builds). It now properly counts only memory on the primary host heap.

    • Corrected an issue with FXSystems which would leak when opening and closing the Material Editor.

  • Improvement: Improved logging when processing and loading the shader pipeline cache.

  • Improvement: Replaced check with a verbose error message in ExpandPSOSC.

  • Improvement: The Vulkan LLM now tracks spare and render target memory.

  • Improvement: Overlapping of draws or dispatches on D3D11 is now enabled by default, and UAV transitions determine when the next draw or dispatch shouldn't overlap the previous due to a UAV hazard (other types of hazards are still handled automatically by the driver in D3D11).

    • The BeginUAVOverlap /EndUAVOverlap functions now only affect the RHI validation layer. UAV validation is disabled between calls to these functions, so they should be used sparingly.

    • New overloads which take a UAV pointer (or array of UAV pointers) can inform the validator that specific UAVs are safe to access concurrently and don't need a transition. These overloads should be used whenever possible to allow the validation layer to still warn about missing transitions on any other UAVs used by the shader.

  • Improvement: Refactored the buddy allocator system for dynamic pool count.

  • Improvement: 2 frames of FrameLag are used before deleting unused buffer allocated pages.

  • Improvement: Removed some log spam for when virtual texture page allocation fails, and added a stat counter to keep track of failure occurrences.

  • Improvement: Corrected the range on the low clamp for basic eye adaptation to account for pre-exposure.

  • Improvement: Optimized the ISM culling structure to avoid transforming them at each frame, and replaced a linked list structure with a more efficient AOS.

  • Improvement: Improved the error message in the shader compiler if a shader uses typed UAV loads but they are disallowed.

  • Improvement: Renamed dxcompiler_sc.dll to dxcompiler.dll, added its .pdb file to help debugging, and ShaderConductor is now built using VS 2019.

  • Improvement: Refactored the DX12 buffer, unifying the buffer core to a single class.

  • Improvement: FReadBuffer now follows the FRWBuffer style and allows data initialization in "Initialize" as well.

  • Improvement: Updates from NVIDIA to the Ansel plugin.

  • Improvement: Performing culling and lighting is now iterated in batches of 32 lights (the previous implementation was limited to 64 lights and lacked a loop to cover the entire light list).

  • Improvement: Improved PSO init management.

  • Deprecated: Tessellation is now Deprecated.

  • Deprecated: Extend Default Luminance Range is now Deprecated

  • Deprecated: Deprecated TexCreate_DisableAutoDefrag as it's no longer used.

  • Deprecated: OpenGL is no longer supported for desktop rendering. If the -opengl command line option is used, an error message will be displayed, and Unreal will fall back to the default RHI for the platform.


  • Crash Fix: Fixed a crash that would occur when adding LODs to a Cascade System while running Play In Editor (PIE).

  • Crash Fix: Fixed a crash in Cascade that would occur when refreshing a dynamic parameter module for a material with no dynamic parameter nodes.

  • Crash Fix: Fixed a crash that could occur when using spawn events with ribbons in Cascade.

  • Bug Fix: Fixed an issue with world time in the Cascade Preview window. This could cause odd issues with some culling features.

  • Bug Fix: Corrected an issue in Cascade SetTemplate calls on running systems.

  • Bug Fix: Fixed an issue where Cascade's High Quality lights would not respect the Spawn Fraction setting of the light module.

  • Bug Fix: Cascade GPU systems no longer submit simulation draw calls when inactive or culled by LOD.


  • Bug Fix: Fixed an issue with a stale view uniform buffer. If "r.DoInitViewsLightingAfterPrepass 1" was enabled then UpdateGlobalDistanceFieldVolume would be called after view UB was created and cached. UpdateGlobalDistanceFieldVolume will modify view UB parameters, but previously there was no code which would re-cache view UB.

  • Bug Fix: Fixed an issue when rendering both Capsule Indirect Shadows and SSAO in the Forward renderer. Previously the SSAO would overwrite the results of the capsule shadows.

  • Bug Fix: Excluded billboards and shapes from light attachment groups.

  • Bug Fix: Fixed the temporal reprojection of the denoiser when using dynamic resolution.

  • Bug Fix: Fixed shading bugs in the path tracer for point and spot lights.

  • Bug Fix: Stopped the shadow fade-out transition at the end of CSM shadows for directional lights when there is static shadowing taking over (as blending is then done in the lighting shader).

  • Bug Fix: Fixed a bug where Spot Lights were treated as Point Lights in the Tiled Deferred shader if Specular Scale was 0.

  • Bug Fix: Fixed incorrect SSR when TemporalAA is turned off. The fix is to ensure the history buffer has the ViewportRect and ReferenceBufferSize filled in when TAA is turned off.

  • Bug Fix: Disabled the anisotropy pass for forward shading in a deferred shading class.

  • New: SunSky Actor Blueprint changes:

    • Activated Realtime capture on the SkyLight component.

    • Removed BP calls to force update SkyLight.

    • Removed an unnecessary call to the parent constructor script (the parent is "actor").

    • Removed the now-unused "UpdateSky" function.

  • New: Added r.SSS.Burley.BilateralFilterKernelFunctionType to the control screen space subsurface bilateral filtering.

  • New: Switched Burley screen space subsurface sampling sequence from Fibonacci to R2 in order to decrease noise.

  • New: Made the last cascade extend to include the near plane if r.SkyAtmosphere.SampleLightShadowmap is set and light is supporting shadows in the atmosphere or on clouds.

  • New: Changed the behaviour of ShadowResolutionScale = 0. For whole scene shadows, it disables the shadow maps and makes it possible to have contact-shadow only.

  • New: Relaxed the clamping of directional light depth ranges for cascaded shadow maps. This extends shadow ranges in large cascades, removing arbitrary shadow clipping, which is required to support shadows in atmosphere.

  • Improvement: Removed the anisotropy project setting and introduced an anisotropy pass if any object uses an anisotropic material.

  • Improvement: Contact shadows improvements.

    • Replaced the ad hoc transmission lightening for contact shadows with a subsurface falloff similar to the shadow maps path. Note that it will not match exactly since with contact shadows the occluder closest to the light is often not known, but the new logic will avoid over-shadowing subsurface transmission.

    • Added a new mesh flag for "cast contact shadows". Previously contact shadows would indiscriminately apply to all objects in the depth buffer. Now they will respect the new flag as much as possible given the information in the GBuffer.

  • Deprecated: Light Propagation Volumes have been deprecated and will be removed in a future release.

  • Deprecated: Atmospheric Fog has been deprecated. Sky Atmosphere should be used in its place.


  • Crash Fix: Fixed a crash that occurred when updating a material function used by a MID currently being edited.

  • Crash Fix: Prevent a crash if UMaterialInterface::GetParameterInfo is given a null LayerFunction, this can happen with a user-created BP.

  • Bug Fix: Fixed cook output stats to properly show savings due to sharing the material code.

  • Bug Fix: Corrected the automatic view bias not being applied to Runtime Virtual Texture samples in a material. This fixes slight blurriness for Runtime Virtual Textures in certain Temporal AA modes.

  • Bug Fix: Fixed an issue with materials not resolving Runtime Virtual Texture material parameters correctly.

  • Bug Fix: Forced UDIM textures to be built with the CLAMP address mode, to avoid seams between UDIM blocks.

  • Bug Fix: Adjusted the layout of UDIM tiles to account for the inverted V-axis when mesh data is imported into UE4.

  • Bug Fix: Virtual textures are now updated whenever a Material Instance parameter changes.

  • Bug Fix: When the r.SeparateTranslucencyScreenPercentage is not equal to 100, it will no longer cause separate translucency to be nearest upscaled instead of bilinearly upscaled.

  • Bug Fix: The Material Pow function now properly handles a Base value of 0. It will in this case return 0.

  • Bug Fix: For API, fixed the PositiveClampedPow to properly work with Base==0. This removes the max instruction but adds a conditional select instead.

  • Bug Fix: Fixed SSS specular when the checkerboard is off.

  • Bug Fix: Corrected the velocity buffer material expression when sampling geometry that is not drawing geometry.

  • Bug Fix: Fixed layer parameters being inherited from one MIC to another MIC.

  • Bug Fix: Fixed the external texture material parameters, used for media textures.

  • Bug Fix: Fixed issues caused by using Property Coloration and Level Coloration on materials with tessellation or world position offsets.

  • Bug Fix: FHashedName converts strings to upper-case before hashing, otherwise the hash depends on what particular case of a given string is first seen.

  • Bug Fix: Change order expressions are now visited while updating cached material expression data, which fixes a problem with getting correct values from parameters duplicated in multiple functions.

  • Bug Fix: Fixed a bug with FHashedName when using FNames with UTF32 TCHARs.

  • Bug Fix: Fixed a material tracking nested function dependency.

  • Bug Fix: Fixed recompileshaders command running on a target with COTF server.

  • Bug Fix: Removed canceled shader map compiled from the ShaderMapsBeingCompiled array, otherwise it was possible for a future compile request to be merged into the now-canceled compile job.

  • Bug Fix: It is no longer assumed that there are as many parent material layers as there are layers for the child.

  • Bug Fix: Introduced FMaterial::MaterialUsesAnisotropy to the MaterialCompilationOutput. This boolean is populated after compilation and saved in the compilation output (cooked & editor builds), and checked by the runtime to decide if anisotropy is used. DDC Key / Deciding whether to compile still uses the more permissive / conservative API HasAnisotropy, which returns true for MaterialAttribute nodes just in case anisotropy is actually used. This ensures all relevant shader variants are actually compiled.

  • New: Changes made to layers in a base material are now propagated to derived MIs.

  • New: Material Layers system is now enabled by default. The Project Setting has been removed.

  • New: Added an optional WorldPosition input to the Runtime Virtual Texture Sample node, allowing manipulation of sample coordinates.

  • New: Added a Blueprint API for setting layer parameters on MID.

  • New: Added a Time input to TimeWithSpeedVariable with the fallback of using the regular Time material expression to make it backwards-compatible.

  • New: Added a runtime virtual texture max mip level to view properties exposed to the material graph. This can be used along with the virtual texture mip level property for mip specific virtual texture generation.

  • New: Added the choice of WRAP or CLAMP texture address modes to the Runtime Virtual Texture Sample material node.

  • New: Added the ability to exempt certain materials from sharing code (to support chunked builds).

  • New: Added Blueprint API for setting layer parameters on dynamic material instances.

  • New: For TextureVariation, submitted a new material function to create texture UVs with variation applied to break up the tiling.

  • New: Replaced FHashedMaterialParameterInfo with FMemoryImageMaterialParameterInfo, which uses FScriptName rather than FHashedName. Names will be patched on load, but thus avoids frequent string hashing at runtime.

  • New: Fixed issues causing material DDC values to be non-deterministic.

    • Shader code within resources is now sorted by hash

    • Debug source code values are now sorted by type, also a mechanism was added to serialize any MemoryLayout described type to string.

    • This makes it easier to inspect material data to find sources of non-determinism.

  • New: Added a new material function for vector based refraction.

  • New: Added Blueprint setters for default custom primitive data.

  • Deprecated: Deprecated the RuntimeVirtualTexture material domain, and added code to auto convert materials with this domain to use an RVT output node.

Mobile Rendering

  • Crash Fix: Fixed a crash in the mobile renderer when the Sky Light cubemap resolution is less than 64.

  • Crash Fix: Fixed a crash related to reflection capture when running DirectX mobile emulation.

  • Bug Fix: Fixed brightness flickering on mobile related to eye adaptation.

  • Bug Fix: Set RGBA8 as a default backbuffer format on mobile devices. This avoids selecting HDR backbuffer formats when the device reports support for it.

  • Bug Fix: Fixed broken MobileSceneCapture when requesting HDR format.

  • Bug Fix: Fix a bug that caused the screen to be brighter on mobile compared to PC if there is a PP material whose blendable location is before tonemapping.

  • Bug Fix: Fixed shader compilation errors for materials that use certain particle properties (ParticleToWorld transform) on mobile.

  • Bug Fix: Fixed an issue where the Indirect Lighting Cache does not work correctly with multiple lighting scenarios on mobile.

  • Bug Fix: PostProcess materials will now correctly handle cases where viewport size does not match render target size on mobile.

  • Bug Fix: iOS and Android will now always use ETC compression for all Virtual Textures, ignoring project texture compression settings. This is done to avoid fragmentation of VT formats.

  • Bug Fix: Added fixes for the desktop renderer on iOS

    • Fixed inf in SingleLayerWaterComposite.

    • Added a flag to check for VertexFetch in Cloth.

    • Fixed tonemapping to use the correct color space on iOS.

  • Bug Fix: Opaque geometry will write 1.0 to the alpha channel when rendering directly to the backbuffer on mobile. This will make it easier to mask out opaque geometry in the final image.

  • Bug Fix: Fixed an issue causing black sky reflections on mobile if the scene has a non-static Sky Light actor.

  • Bug Fix: Fixed cases where toggling sub-levels visibility could lead to an incorrect precomputed Indirect Lighting in the mobile preview.

  • Bug Fix: Fixed a sRGB/Linear space mismatch for Runtime and Streaming virtual textures in the Editor mobile preview.

  • Bug Fix: Added a fix for some mobile GPUs when using Depth Read - Stencil Write.

  • Bug Fix: PostProcess materials with a blendable location set to BeforeTonemapping will now run after separate translucency on mobile.

  • Bug Fix: Fixed a bug causing rendering a black background on Tegra devices (Nexus 9).

  • Bug Fix: Removed the clamping of the light range for the receiver matrix and made it the same as the 'SubjectAndReceiverMatrix'. This fixes a shadow culling bug for mobile.

  • Bug Fix: Removed a flag "D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS" which is not necessary for feature level es31.

  • Bug Fix: Fixed handling of MobileUseHWsRGBEncoding so it is correct in all cases.

  • Bug Fix: Corrected the issue of missing PreIntegratedGF textures in translucency passes

  • Bug Fix: Fixed a RGBM bug where it would not be calculated after the first buildReflectionCaptures

  • Bug Fix: Fixed the Editor GPUScene

  • Bug Fix: Corrected Niagara GPU for A10 and earlier devices.

  • Bug Fix: Corrected a GpuFence bug where RT would delete the Fence object while the RHIT was still using it.

  • Bug Fix: Reflection Capture change, fixed a check when postloading for console.

  • Bug Fix: Fixed the Encoded ReflectionCube when using old MapBuildData. The default is 16 RGBM.

  • Bug Fix: Corrected theEncoded ReflectionCube when old MapBuildData is present. It now defaults to 16 RGBM.

  • Bug Fix: Added a missing flattened material property enum that was overlooked when anisotropy was added.

  • Bug Fix: Made AO decals respect meshes that disable receiving decals.

  • Bug Fix: Handled RT bindings for decals that write or read to the normal Gbuffer.

  • Bug Fix: Corrected the blend state when the normal Gbuffer is not used during decal blending.

  • New: Added support for RHIClearUAVUint and RHIClearUAVFloat to work for TextureUAV on the OpenGL platform.

  • New: Added a '_centroid' parameter for tangentworld interpolation to have better quality and be consistent with PC.

  • New: Ported mobile postprocess to the RDG.

  • New: Implemented using a separate uniform buffer for each dynamic point light so the mesh draw commands can be cached.

  • New: Added support for alpha to coverage for masked material.

  • New: Added support for dynamic spotlight shadows for mobile

  • New: Pixel projected reflection is now supported on the mobile platform forward renderer.

  • New: Added support for Ground Truth Ambient Occlusion (GTAO) on mobile.

  • New: Added support for UMG background blur on the Android OpenGL platform.

  • New: Mali Offline Compiler is now supported for vulkan spir-v.

  • New: Reflection Compression - Android now will use ETC2 by default. The RGBM MaxValue is set to max M value from the cubemap, unless the value is set in the component. HQ Reflection cubemaps are now also compressed.

  • New: Allows depth sampling in the Compute shader on Mobile.

  • New: Added ETC compression support for a Runtime Virtual Textures on mobile (iOS, Android).

  • New: Removed a mobile-specific InverseOpacity shader permutation for translucent materials. This change reduces the total number of shaders generated for mobile platforms.

  • New: Added support for UMG background blur on Android.

  • New: Now no longer show the deprecation message when running Windows OpenGL in mobile emulation (-featureleveles31).

  • New: Added deferred shading path to a mobile renderer (to enable r.Mobile.ShadingPath=1). Only supported on iOS and Android Vulkan, it will fallback to forward shading on Android GL. This is an experimental implementation as some of the mobile rendering features are not supported yet. The deferred shading path allows efficient rendering of multiple dynamic local lights, high quality reflections, and lit decals.

  • New: Added support for static lighting in mobile deferred.

  • New: Added support for Qualcomm Transform in Vulkan.

  • New: Added limited support of Mesh Decals on mobile. Decals are unlit and support only modes that write to SceneColor

  • Improvement: Clamped the roughness to 0.015625 instead of 0.12, in order to improve the specular quality.

  • Improvement: Cleaned up the code of HQReflection and enabled it to work properly with the mobile clear coat. Added support for cube reflection to HQReflection.

  • Improvement: Improved performance for mobile eye adaptation.

  • Improvement: Reductions to LightGridSizeZ and MaxCulledLightsPerCell for Android as a workaround for the 64k texel limit

  • Improvement: Niagara GpuReadback OpenGL optimization.

  • Improvement: Reflection Capture change, the TextureCube is no longer cooked for non mobile rendering platforms.

  • Removed: Removed the mobile legacy shading model.

  • Removed: Removed remaining references to ES2 and AEP.

  • Removed: Removed mobile's separate CSM shader permutations. Shader side CSM calculation is now conditionally performed according to a parameter within the mobile base pass's uniform buffer. This should dramatically reduce the number of PSOs required when shadows are enabled.


  • Crash Fix: Removed an incorrect call to GetSkinWeights that is not required and can potentially crash.

  • Crash Fix: Fix a crash when GetEmitterViewModel returns nullptr.

  • Crash Fix: Corrected a crash in the GPU ticks if the Interface has been garbage collected.

  • Crash Fix: Fixed a crash with Static Mesh streaming where GT would send too few materials to the RT; the GT was reading CurrentFirstLODIdx which is modified on the RT leading to a mismatch on a frame in which they are streamed.

  • Crash Fix: Fixed a crash in GetFilteredSocketTransform that occurred when there were no elements in the array.

  • Crash Fix: Corrected a crash due to no objects being modified in the property notification when fixing CPU access on a NPC.

  • Crash Fix: Fixed a crash that could occur when resetting a function input to its default value.

  • Crash Fix: Fixed a rare crash that would occur if a Niagara System auto-destroys when activated (for instance, from being culled by Scalability options).

  • Crash Fix: Fixed a crash in Niagara that could occur when calling SetAsset on a running component.

  • Crash Fix: Fixed a crash that could occur when deleting a Niagara Event Handler from a running system.

  • Crash Fix: Fixed a bug that could lead to a crash when a variable default value was not initialized.

  • Crash Fix: Fixed a crash that occurred when events spawn particles beyond the CPU max limit.

  • Crash Fix: Fixed a bug where a missing Data Interface implementation caused assets using that Data Interface to crash on load.

  • Crash Fix: Fixed a crash that could occur in Niagara with Mesh Renderers when force reloading the Static Mesh asset from the Content Browser context menu and then changing properties of the Static Mesh in its editor.

  • Crash Fix: Fixed crashes that can occur in some Niagara Blueprint Library functions when passing invalid (nullptr) components.

  • Crash Fix: Fixed an editor crash that would occur when applying vertex painting to a Static Mesh that was being used by a Mesh Renderer in an active Niagara editor.

  • Crash Fix: Adding multiple location events to a script stage will now result in a script compilation error instead of crashing.

  • Crash Fix: Fixed a crash which could occur when resetting a data interface user parameter to default in the details panel when the data interface pointer was null.

  • Crash Fix: Fixed a crash which could occur when merging changes from parent emitters when a simulation stage was added in a child emitter.

  • Crash Fix: Fixed a crash loading into WeapGun_Impacts in Shooter game.

  • Bug Fix: Fixed the DDC getting polluted with NiagaraScript results when rapidly generating compile requests. Ensures that the data cached is associated with the source request rather than the current CompileId of the UNiagaraScript.

  • Bug Fix: Corrected a subtle bug in the "Apply rotation vector" function that occurred when applying rotations which were far off axis. This stabilizes and improves quality on "Mesh Rotation Force" as well as the "Rotation" input on "Initial Mesh Orientation".

  • Bug Fix: Added fixes to the MeshParticleSpace material transform node for Niagara.

  • Bug Fix: Fixed two issues with activation with the Niagara component system life cycle track.

    • When handling the beginning of the section, first deactivate and reset if the system is already active. This is necessary to have the correct reset behavior when the life cycle section starts on the first frame of the sequence and it was already active, or when the sequence is looping.

    • The default behavior of the section evaluation will now activate if it is inactive instead of being 'none.'

  • Bug Fix: Fixed VectorCeil and VectorFloor and added a unit test for them.

  • Bug Fix: Fixed M_AddForce and BP_PaintClouds so that the alpha channel can be correctly painted along with the RGB channels.

  • Bug Fix: Fixed Niagara vector field resources being accessed on the game thread without it being necessarily initialized.

  • Bug Fix: Fixed a bug with Niagara NDC cooking by adding the system name into the hash to prevent collisions between identical systems.

  • Bug Fix: Exposed an attractor position override to Point Attraction Force. This improves the stability of the optional particle killing feature on the point attractor which accounts for fast moving particles in the kill radius check, which better prevents overshoot when the kill radius option is exposed.

  • Bug Fix: Comment boxes can now be edited in the stack overview graph.

  • Bug Fix: Parameter data will now not be reallocated when it is assigned during initialization.

  • Bug Fix: During VectorVM compilation, all rvalues are now evaluated for potential replacements, not just those that are in assignments.

  • Bug Fix: GPU shaders are now included when evaluating the auto compilation in the Niagara editor as changes are made to systems / emitters.

  • Bug Fix: Fixed the following issues with user parameter animation in sequencer. Parameter section boundaries are now infinite by default. User parameters which are animated by Sequencer now show their animated value in the selected actor details view. When adding a new user parameter track, it will default to the current parameter value instead of resetting to 0.

  • Bug Fix: Fixed an issue where emitter initialization would not have system bounds set in time resulting in unnecessary work creating bounds helpers.

  • Bug Fix: Systems with dynamic bounds can now be culled by the property "Max Time Without Render."

  • Bug Fix: Added a fix for a system's MaxDeltaTime not properly getting reset from the values of it's child emitters.

  • Bug Fix: Corrected an issue with VectorVM compilation mishandling the expression: MyVec3.yz = float2(1.0f, 2.0f);

  • Bug Fix: All Niagara engine parameters will now be correctly updated after a component transform change.

  • Bug Fix: Renderers will now always be stripped from cooked builds if their parent emitters aren't valid.

  • Bug Fix: Fixed an issue with RapidIterationParameters being out of date when they are being baked out by the cooker. The generation of the correct values was moved to the pre-compile so that when the translation is triggered the correct values are used.

  • Bug Fix: Added validation (at runtime and at cook time) to ensure there is no mismatch in bindings between RapidIterationParameters and ScriptExecutionParameters.

  • Bug Fix: Make / Break X dynamic inputs have been renamed to more accurately match their actual behavior.

  • Bug Fix: Fixed Sphere location to properly factor component scale and nonuniform scale into its Sphere Normal output.

  • Bug Fix: Fixed an issue with Spawn Per Unit not respecting emitter delay.

  • Bug Fix: Fixed an issue where a parameter couldn't be renamed through the parameters panel if it was created in a "Set Parameters" module.

  • Bug Fix: Fixed an issue with the handling of user override parameters on a component and how it handles booleans.

  • Bug Fix: Fixed a bug where new data interface inputs were always displayed as "invalid" until reset.

  • Bug Fix: Prevented the spawning of Niagara on dedicated servers.

  • Bug Fix: Fixed an issue with world time in some editor viewports. This could cause odd behavior with some culling features.

  • Bug Fix: Fixed PSC deactivating on launch due to LastRenderTime not being up to date.

  • Bug Fix: Fixed the attribute spreadsheet capture to handle Disabled / GPU sims.

  • Bug Fix: When autowiring, all possible pins will now be searched through for the first possible real match rather than just assuming the first pin matching direction will work and failing.

  • Bug Fix: Added a fix for the Niagara matrix multiplication node; make it actually a mul function rather than per-component scaling.

  • Bug Fix: Fixed instance override parameters getting confused when dealing with variables with / without the User prefix. It now uses the UserRedirectionParameterStore to disambiguate User. and when it comes to the InstanceParameterOverrides.

  • Bug Fix: Niagara will no longer block the shader compilation when running -game.

  • Bug Fix: Generate Location Event now caps event send rate at 60fps by default, this is user overridable but should provide stable counts and visuals across platforms now and be less framerate dependent.

  • Bug Fix: Fixed hitches that happen in the UI when editing some emitter and system properties that don't require a system reset.

  • Bug Fix: Made UNiagaraDataInterfaceSpline threadsafe with respect to the Spline data.

  • Bug Fix: NiagaraSystems are now guarded against system update and spawn scripts being mismatched (they need to agree upon the attributes in the dataset). Systems will warn / stay disabled on a mismatch and will force a full rebuild of the shaders in an attempt to fix the shaders.

  • Bug Fix: Fixed an issue with resetting GPU particle counts; particle systems which should allow their particles to finish out their lifetime can now survive the component being deactivated.

  • Bug Fix: Changed the fallback texture used by the VolumeTeture Data Interface to be a volume texture.

  • Bug Fix: Updated the EmitterChangeState module to fix an issue where emitters would only go from Inactive to Complete if the first emitter did too.

  • Bug Fix: Added a fix for NDC with parameters and static switches. This ensures the state of the StaticSwitch node is fully reset when there is no constant resolver so that the state can't leak across compiles / parses.

  • Bug Fix: VectorVM compilation - ir_propagate_non_expression_visitor now properly handles self assignment.

  • Bug Fix: Fixed an issue with emitter inheritance where inherited modules and inputs would not correctly show they were inherited.

  • Bug Fix: Fixed an issue with emitter inheritance where inputs with numeric values which matched the default wouldn't receive updates when the parent values were changed.

  • Bug Fix: Fixed an issue handling Niagara bone sampling when no bones are present.

  • Bug Fix: Added fixes to NiagaraLightRenderer

    • The generation of dynamic data is now skipped if deferred shading is not used.

    • Made it draw relevant so that they will actually render without relying on other renderers.

  • Bug Fix: Fixed ComputeMaxUsedComponents to properly handle different typed attributes in the dataset.

  • Bug Fix: Niagara will now only block for the shader compilation when spawning systems during the automated tests.

  • Bug Fix: Corrected a subtle bug with Jitter Position related to choosing new positions when delay was used.

  • Bug Fix: Fixed Niagara to not block on shader compilation during OnPreGC (happens on editor load).

  • Bug Fix: Fixed an issue with getting random bones on the GPU (Filter Socket / Bone was incorrect)

  • Bug Fix: Fixed the path where direct reads do not write data out to the VM which can lead to NaNs / invalid simulations.

  • Bug Fix: Fixed an uninitialized field in FNiagaraEventGeneratorProperties::MaxEventsPerFrame which was causing non-determinism.

  • Bug Fix: Corrected an issue caused by incorrectly using the first GPU script only to determine whether viewing the uniform buffer was needed or not.

  • Bug Fix: Fixed a dependency issue when sampling Skeletal Mesh data in solo mode; the tick group must be calculated in the same way Niagara does otherwise the Skeletal Mesh data will not be ready for the solo components' tick.

  • Bug Fix: Fixed the component pool.

  • Bug Fix: Fixed an edge condition with GPU emitters and going inactive on the first frame.

  • Bug Fix: Fixed a couple of issues with scaled transforms and bone sampling.

  • Bug Fix: Handled an edge case on world cleanup where ComponentPool has been destroyed before a component that can be returned to the pool.

  • Bug Fix: Handled an edge case where BeginDestroy is called before OnComponentDestroyed which will call DestroyInstance potentially returning to the pool incorrectly.

  • Bug Fix: Fixed a missing increment inside FNCPool::RemoveComponent.

  • Bug Fix: Now use advanced preview settings for background color.

  • Bug Fix: Removed early out as it skipped PostTick which will not clear events resulting in continual spawning.

  • Bug Fix: Fixed an issue with not clearing out LocalFunctionTable when data interfaces are dirty; this fixes an issue where Skeletal Mesh rebinding due to data changes did not choose the correct function since it was picking the old one from the table.

  • Bug Fix: Changed InverseFast -> Inverse to handle zero scaled Skeletal Meshes.

  • Bug Fix: Use of GetSystem is now prevented as it can race with the component; ArrayView is used rather than the constant TArray&.

  • Bug Fix: Handled an issue with incorrect area weighted sampled data when used with GPU systems, this will now result in a warning and uniform sampling being disabled.

  • Bug Fix: Fixed a bug when attempting to read from GPU buffers on the CPU with nullptr access.

  • Bug Fix: Fixed a read-early issue with Skeletal Mesh components that have identical start and end tick groups.

  • Bug Fix: Fixed a tick group ordering issue with physics enabled Skeletal Mesh components as they will have physics results interjecting during TG_EndPhysics.

  • Bug Fix: All emitters are now taken into account, not just those that are running, when working out whether view uniform buffer is required; this fixes an issue where multiple ticks in a single frame could jump between tick groups.

  • Bug Fix: Fixed mesh renderer stats so they don't increment per section.

  • Bug Fix: Fixed having a RenderTarget still bound that will be used as an SRV during Niagara's compute pass.

  • Bug Fix: Fixed races in Volume / Texture data interfaces due to reading from the data set by the RT when determining if the texture was valid.

  • Bug Fix: Fixed an issue that occurred if a GPU emitter was disabled on the first frame and never ticked.

  • Bug Fix: The velocity vector to quat function now correctly rotates meshes along the z axis. This will rotate existing particles that used the initial mesh orientation module's rotate feature.

  • Bug Fix: Fixed an issue with incorrect transform application (and reading from component) in GetFilteredSocketTransform -

  • Bug Fix: Removed the stub GPU implementation of GetFilteredSocketTransform which caused a stack error; the new functions should be used instead

  • Bug Fix: Corrected not applying the rotation on the GPU for gathering bone transforms.

  • Bug Fix: Fixed an issue with Niagara post work where the simulation is marked as dead but there is post work.

  • Bug Fix: Fixed stomping over override parameter data when they are set inside a constructor script.

  • Bug Fix: Corrected Niagara texture references when referencing things like MovieTexture / RenderTargets, etc. where the underlying RHI reference may be swapped out. The TextureReference will be used instead, rather than the TextureRHI.

  • Bug Fix: Fixed the occurrence of NaN/uninitialized values in Niagara GPU sort info.

  • Bug Fix: When setting a texture object, the editor will not stomp over the data if the system is duplicated because the component will be informed that it was overridden.

  • Bug Fix: The last render time will now be updated to the default value when a pooled component is reused.

  • Bug Fix: Fixed an issue where while waiting on the system simulation task, the finalize is executed which completes and removes the instance while attempting to remove the instance

  • Bug Fix: The system will now wait for all simulation to complete before performing a tick group update to avoid potentially accessing simulation data that is still running concurrently.

  • Bug Fix: Fixed dynamic material parameter names so that material function-defined dynamic parameters are also good.

  • Bug Fix: Fixed an issue with FName with case sensitivity in stack overview name changes.

  • Bug Fix: Fixed the UI alignment of the "Socket Name" property.

  • Bug Fix: Improved the "script usage" static switch to work as expected and across GPU scripts.

  • Bug Fix: Reading from CurrentData is now guarded to get the particle count if a fence has not been passed which guarantees that the tick has been processed on the render thread. This fixes an issue where we could deactivate a GPU emitter because the CurrentData is set to 0 instances as the tick was not yet processed.

  • Bug Fix: Fixed a bug where user parameters could not be assigned to Data Interfaces in the stack UI.

  • Bug Fix: Fixed a bug where if two modules use the same Data Interface function on two different Data Interfaces, they would both use the same data interface.

  • Bug Fix: Fixed the stack UI to correctly evaluate the usage constants for static switches.

  • Bug Fix: Fixed a bug where bound default parameters in Niagara modules would not behave correctly.

  • Bug Fix: Fixed graph pin default values being editable even when set to read-only.

  • Bug Fix: SetAsset calls on currently active Niagara Systems will now correctly reset the system with the new asset.

  • Bug Fix: Corrected a bug where local-space, velocity-facing meshes would not be correctly oriented.

  • Bug Fix: Attempting to sample a Volume Texture in a Niagara CPU script now results in a compiler error.

  • Bug Fix: Fixed a bug with local-space Niagara Emitters where Simple Lights would render with a frame old transform.

  • Bug Fix: Fixed an issue with the particle read Data Interface return value when an invalid attribute is used.

  • Bug Fix: Fixed a bug where multiple renderer feedback issues clashed in the stack UI because they were assigned the same unique ID.

  • Bug Fix: Fixed a bug where a Skeletal Mesh Component user variable in a Niagara System set from Blueprint wouldn't get reset on pooled reuse.

  • Bug Fix: Fixed an issue in which pooled Niagara components being invisible.

  • Bug Fix: Fixed a bug where renaming a parameter lost all its metadata.

  • Bug Fix: Fixed the rename tooltip.

  • Bug Fix: Fixed a bug where pasting or resetting a user parameter Data Interface did not propagate to running systems.

  • Bug Fix: Fixed a bug where some Niagara engine parameters were not correctly updated after a component transform change.

  • Bug Fix: Fixed a bug in the Grid2D Data Interface that would allow an attempt to copy to an incompatible format, causing errors.

  • Bug Fix: Fixed a Niagara compile error that would occur when adding a new custom expression to an input in Niagara's module stack.

  • Bug Fix: Fixed a bug that could trigger an ensure when copying a stack value with a data interface in it.

  • Bug Fix: Fixed a bug where non-uniform scaled Niagara meshes would render with different normals than regular Static Meshes with the same scale would, causing them to be lit differently.

  • Bug Fix: Fixed an issue where emitters would enter a state unable to spawn if they ever exceeded their max allocation count.

  • Bug Fix: Fix errors with cooking volume textures that were not created from a 2D initial texture

  • Bug Fix: Fixed a scale bug with the Skeletal Mesh Location module when the Skeletal Mesh Component is scaled.

  • Bug Fix: Fixed a bug where default values of attributes behind static switches could not be set.

  • Bug Fix: Fixed an issue with FX not reactivating when changing scalability settings at runtime.

  • Bug Fix: Fixed an issue with the Vector VM Assembly view in Niagara's Generated Code window.

  • Bug Fix: Fix various bugs and visual issues in Niagara with Instanced Stereo VR enabled.

  • Bug Fix: Added a missing GPU flag to a function signature.

  • New: Added automatic partial write detection code that is enabled by default, which currently looks for InputData methods and ParticleReads on the same emitter; added a separate boolean to disable this in the advanced view for debugging purposes in case other edge cases are found.

  • New: Auto-detect if a simulation stage iterates over particles but does not modify the particle attributes, in which case the particle data will not be written out, saving performance. Added an option to enable partial particle writes on particle simulation stages, for example if a stage only modifies position (does not kill / add particles), data will read / write to the same buffer improving performance.

  • New: Added optional shader permutations generated when using simulation stages, enabled by default this will generate a unique permutation per stage to significantly increase GPU performance.

  • New: Material Instance Dynamic is now created on demand if the Material Parameter Bindings array is set.

  • New: Data Interfaces can define child variables that can be used to bind to these Material Parameter Bindings, like the render target from the DataInterfaceRenderTarget2D.

  • New: Material Parameters can also be bound to the System, Emitter, and User variables. Data Interface function signatures can now specify a usage mask and whether or not they need an exec pin if the function has side effects. This makes it easier to have functions that don't actually return results but write to a data interface internally.

  • New: The GPU simulation has been reworked so that they no longer get bindings from particle scripts, but instead get them from the same source that particle scripts got their data from since GPU scripts are a superset of particle script capabilities.

  • New: Added the ability to drive emitter activation from console variables for finer control than just specifying a platform.

  • New: Optimized SetUserParametersToDefaultValues to prevent creating unnecessary additional data interfaces.

  • New: You can now create a Texture Object variable type to add a texture to a Niagara System for use in simulation or rendering.

  • New: Added functionality to the Skeletal and Static Mesh Data Interfaces to enable explicit specification for how they should source the mesh component, preventing them from falling back to an undesired mesh.

  • New: Added a component renderer that enables you to drive individual components (such as lights and meshes) in the level using Niagara for CPU particles.

  • New: Added curve binding to enable the creation of curves inside Niagara that get baked to a texture to use in Material using the Material Attribute Binding user interface.

  • New: Added a new SubUV Animation module that includes four modes: Linear, Curve, Random, or Infinite. Infinite improves upon the Cascade "SubUV movie" mode with a start frame, end frame, play rate, and a start time offset.

  • New: A marked list can now optionally be used for PostActorWork, which can reduce overhead in certain cases.

    • Use the console variable 'fx.Niagara.WorldManager.UsePostActorMark 0' to disable using the marked list.

  • New: Added a Volume and Render target Data Interfaces and allowed Niagara to push Grid3D data into it.

  • New: Added a new preliminary plugin to convert Cascade Particle Systems to Niagara Assets. It is an experimental plugin that can be enabled and will be improved in later releases.

  • New: Added a Data Interface to play audio from within Niagara for CPU emitters.

  • New: Added a Data Interface to export particles, which works on both CPU and GPU.

  • New: Added a Niagara commandlet to find assets with warmup time / lights / GPU emitters.

  • New: Changed the attribute spreadsheet readback to use a readback manager; this is more reliable as the system is not required to tick in order to execute the readback.

  • New: Added RandomFilteredSocketOrBone functionality.

  • New: Added BP methods to create volume / array textures.

  • New: Now use the Enum string rather than the number in warning messages, makes it clearer to the end user on why the warning is visible.

  • New: Marked FNiagaraUserParameterBinding as NIAGARA_API so it can be used in other modules.

  • New: Niagara is now allowed to spawn new systems async and earlier if the TG has been processed already; this is enabled by default, use the console variable "fx.Niagara.WorldManager.SpawnPerTickGroup 0" to disable this function.

  • New: Added a performance option to allow event-based spawning to be combined into a single spawn. This results in a single execution from 0 to the number of particles rather than several when using the ExecIndex function, which is not recommended to do this.

  • New: Added support for Static Mesh socket sampling.

  • New: Added FNDIInputParam as an easy method to wrap complex data types, and cleaned up some data interfaces to use the new input / output wrappers.

  • New: Added a method to modify which sampling regions are used by the Skeletal Mesh data interface.

  • New: The max number of instances required across all sim passes is now calculated ahead of time. This reduces memory pressure when Sequencer is scrubbing the timeline and forcing many simulation ticks at once as buffers will not grow progressively but instead grow all at once up front.

  • New: Niagara tick behavior is now exposed to Blueprints

  • New: The collision module now supports simulation stages.

  • New: Implemented an export data interface for GPU systems

  • Added a GPU readback manager to allow enqueuing a readback that is not depending on a system tick.

  • New: Added the ability to go beyond a single dispatch dimension.

  • New: Added the ability for dynamic inputs to display custom text when being collapsed, using their child inputs in the format text.

  • New: Added an optional display to show emitter execution order, helpful for debugging dependency issues with events or particle reads.

  • New: The Niagara System no longer waits if it is not deactivating immediately; it won't wait for Activate Reset calls if running asynchronously, allowing them to defer until Finalize instead, which avoids stalling the GameThread.

  • New: Niagara arrays are now allowed to have data modified when running on the CPU; the functions added are Reset / SetNum / SetValue / PushValue / PopValue.

  • New: Added support for upgrading data interface function calls.

  • New: Added support for Skeletal Mesh IsValidBone and BoneCount on the GPU.

  • New: The collision module no longer requires users to specify whether it's a GPU or CPU system.

  • New: - Added fx.Niagara.SetOverridePlatformName as a way to quickly change between which platform Niagara is using; the caveat is that on cooked platforms only the device profiles that are contained within the cook are available.

  • New: Added a Data Interface that enables you to define a platform set and query whether it's currently active.

  • New: Stats on memory usage from data interfaces are now collected.

  • New: Added the option to change the grid format from 32-bit to 16-bit float.

  • New: The collision module's CPU trace channel is now exposed.

  • New: Added optimizations to reduce the cost of system and emitter creation and activation

    • Modified data set accessors into two separate structures so they can be cached on the System / Emitter to avoid map searching each instance, removing the need for various allocated arrays since there is one copy in memory rather than per instance.

    • Enqueuing multiple commands to initialize DataSets for GPU simulations is now avoided, this can be slow when waking task threads.

    • DebugSimName is now cached once in PostLoad to avoid per-instance memory usage / performance costs.

    • Removed various stat markers as they were measuring chunks small enough to introduce confusion / variance in profiling.

    • MaxInstanceCount is now cached inside the UNiagaraEmitter rather than generated with each instance created.

  • New: A number of distance field nodes have been added to allow artists to easily find the global distance field isosurface, its normal, to sphere cast through it, etc.

  • New: Added a function to get simulation stage iteration information, i.e. iteration index, max iterations, normalized iteration index.

  • New: Added minor tweaks to allow cleaner inheritance from NiagaraComponent if necessary:

    • Exported FNiagaraSceneProxy under NIAGARA_API.

    • Made GetViewRelevance public to match the primitive scene proxy API.

    • Removed the final keyword from FNiagaraSceneProxy's inheritance.

  • New: Changed the Niagara SetBoolByFloatComparison to use Static Switches for optimization reasons.

  • New: Extended the comparison operators to include greater than / less than / equal to for both inputs.

  • New: Added a new translator constant that is unique each time the node is translated. This can be used to calculate repeatable randoms.

  • New: Adding a new warning to Particle Attribute Reader Data Interfaces to notify end users when persistent IDs must be set in order to function properly.

  • New: An error message will now show if users attempt to reference the global distance field without it being enabled in the project.

  • New: Added the ability for the Sprite Renderer to be particle-less, if needed.

  • New: Added the ability for Data Interfaces to say they need execution pins and ensure that those functions don't get compiled out. This should clean up any write-only Data Interface functions that had to have a single parameter wired into the map previously, even if it wasn't really used.

  • New: Added a collapsed state text to dynamic input scripts. This formatted text is displayed in the stack UI when the node is collapsed. The text supports formatting placeholders for the function inputs, for example "myfunc({0}, {1})" will be converted to "myfunc(1.23, Particles.Position)".

  • New: Removed "Is It Optimized Out" warnings in data interfaces as they are often benign and not necessary.

  • New: Added the Stack Context namespace to allow more reusable modules across different stacks. This also enables Data Interfaces to be used as iteration sources in Sim Stages to act like particles namespace and created named attributes on GridCollection2D

  • New: Added support for the Previous namespace modifier, which stores off the values from the previous script execution for use in a simulation.

  • New: Changed script visibility to an enum to allow for soft deprecation of assets.

  • New: Added two styles to the particle count display to reflect the different emitter states (normal, isolated, disabled). Also enabled showing particle count by default.

  • New: Sorted Niagara function input menus and added submenus for more clarity.

  • New: Niagara systems can now be spawned from pools to reduce CPU overhead of spawning and activation. These pools can now be optionally "primed" with a set number of initial instances. This prevents slow spawning and activation times when first spawning these systems and instead transfers this cost to load time.

  • New: Changed the color of the vector field visualization from white to red.

  • New: Added a shader compile error if using sim stages with the CPU.

  • New: Added a shader compile error if using events with the GPU.

  • New: It is now possible for Systems and Data Interfaces to ignore their dependencies, allowing them to potentially tick earlier in the frame, using the bRequireCurrentFrameData flag. When this option is disabled, the previous frame's data is used and the simulation is issued early. This greatly reduces overhead and allows the game thread to run faster, but comes at a tradeoff if the dependencies might leave gaps or other visual artifacts.

  • New: Niagara particles will now properly support custom depth writes, lighting channels, disabling rendering in the main pass, and volumetric translucent shadows.

  • New: Added a new static switch constant for the script context (system, emitter, particle).

  • New: Added a couple of new features to Niagara's Mesh Renderer:

    • "Locked Axis" enables combining the various facing modes with locking an axis to a specific direction.

    • "Camera Offset Binding" allows mesh particles to be pushed toward or away from the camera.

  • New: Added support for dragging Niagara assets into Blueprint graphs.

  • New: Added an option to switch between relative and absolute scale in Anim Notifys.

  • New: Niagara Emitters will no longer complete if no valid Static Mesh can be resolved. Instead, sampling the Static Mesh will result in sampling the Niagara System's location.

  • New: Changed the light renderer enabled binding to not be guarded behind a checkbox but always be evaluated (similar to other light values like radius or exponent).

  • New: Added a few new features to Niagara's Mesh Renderer:

    • The "Renderer Visibility" option allows particles to exclude themselves from certain Mesh Renderers.

    • "Distance Culling" disables rendering of meshes at a given distance from the camera.

    • "Enable Frustum Culling" culls individual sprites and mesh particles from rendering when they are not in view for performance optimization.

  • New: Added copy/paste support for stack entries in the user parameter default panel.

  • New: The Static Mesh Data Interface is now allowed to use the physics velocity rather than calculating it via the component transform.

  • New: GPU Simulation setup is now off to worker threads.

  • New: Local space mesh particle systems now support camera offset.

  • New: It is now indicated to the user when using the Camera Query Data Interface in a CPU emitter.

  • New: Changed the visibility of the ribbon renderer bindings to no longer be advanced.

  • New: Niagara Emitters will no longer complete if no valid Skeletal Mesh can be resolved. Instead, sampling the Skeletal Mesh will result in sampling the Niagara System's location.

  • New: Add a "Pivot Offset" feature to Niagara's Mesh Renderer and an ability to choose which space the offset should be in (Mesh, Local, or World).

  • New: Fixed the thumbnail generator to correctly crop the image to a quadratic size before scaling it down.

  • New: Extended the "copy metadata" action to static switches.

  • New: Niagara Renderers can now be optionally enabled / disabled for specific platforms.

  • New: Altering how default effect types are handled as existing behavior was confusing to users. Previously, Systems with no Effect Type set would use the project default Effect Type automatically. Now, setting no Effect Type does what you'd expect but new Systems are given the project default Effect Type on creation.

  • New: Hide the appended numbers after dynamic inputs to reduce stack visual noise.

  • New: Added a new Data Interface allowing Niagara modules to query the current platform.

  • New: A new Dynamic Input which returns one of the component axes of your mesh orientation as a vector.

  • New: Added a "Preview Mesh" fallback option to Static Mesh Data Interfaces in Niagara that will not be included in cooked builds for viewing in the editor. This saves memory over using the "Default Mesh" if it will never be used in game.

  • New: ParticleToWorld and WorldToParticle can now be initialized (using the local matrix) for the local vertex factory, allowing better debug visualization.

  • New: "Solve Forces and Velocity" and "Calculate Accurate Velocity" now use the new Particles.Previous.Position paradigm instead of the manual cached off attributes, as .Previous is now an intrinsic characteristic of attributes when accessing a previous frame value.

  • New: Added support for copying and pasting parameter metadata in Niagara script editors.

  • New: Tweaked the HLSL shader generation for GPU particle simulations to reduce the burden on the HLSL compiler, and added preprocessor directives to limit the scope of FSimulationContext for simulations using shader stages. This reduced compilation time by 20x for serial compilation, and by about 10x for regular usage in the editor.

  • New: Added a new property called "Apply Owner Scale to Attributes". This allows users to decide which attributes to scale via the owner scale of the Niagara actor placed in the world.

  • New: Changed FNiagaraVariableBase to include an index to a type definition (in the type registry) instead of the definition itself. Reduces the size of FNiagaraVariableBase from 24 to 12 bytes (cuts about 5% of the memory cost of UNiagaraScripts), and significantly reduces the number of object references that gets processed by garbage collection.

  • New: A new Initialize Particle module has been implemented into all default templates. Common behaviors such as randomness, uniform vs nonuniform sprite / mesh size, mass initialization, sprite UV flipping, and more, are now in plain english dropdowns to reduce clicks and simplify setting defaults for common behaviors. A "direct set" mode is included on all attributes so the previous behaviors are always easily accessible if desired.

  • New: Refactored ribbon texture UV options to be easier to use and added options to override the U and V range values per particle. However, you may find some instances that need additional adjustments after these changes.

  • New: Performance improvements for the creation of uniform buffers for GPU compute scripts (different buffers are shared between the emitters and stages)

  • New: Added the ability to drag and drop parameters from the system editor parameters panel into a scratch pad script graph or script asset graph.

  • New: Refactored how significance is handled. It is now handled by helper classes called Significance Handlers. The effect type can select which handler to use from the list of any available ones. Currently, the selectable options are Distance, Age, and None.

  • New: "Calculate Kinetic And Potential Energy" now has a remapping option when outputting the total energy. This sets a max cap on the energy amount and then outputs a normalized total energy. This is useful for driving 0-1 attribute values based on energy in physical behaviors.

  • New: The Particle Attribute Reader now has two official modules, "Spawn Particles From Other Emitter" and "Sample Particles From Other Emitter". The spawn module replaces existing spawn modules in the child emitter, and the sampling module initializes sampled attributes in the spawn script. Together these allow for GPU-based lead / follow emitters where one emitter provides attributes to another emitter for sampling, and there is an example of these in action in the new "Niagara_Advanced" hallway in the Content Examples.

  • New: Added Set Mode for accurate value painting.

  • New: Since it is impossible to set a reference to a world within the system editor, made all the properties referencing AActors or UActorComponent derived classes disabled in the system editor.

  • New: Added a new metadata field to a Niagara type to indicate it is internal, and shouldn't really be visible to users (currently, this is limited to the half precision floats).

  • New: Changed the code generation for GPUComputeShaders to pull out the simulation code so that it's no longer duplicated in the spawn and update branches. This causes both compile times and instruction counts to drop significantly (about 50% savings in both cases).

  • New: Added a new module to cull individual emitters based on their significance. It enables you to have an expensive emitter on only the number of most significant instances of a System in the scene. It can also be used to set up a lower quality fallback emitter for all other instances. It works using a new engine constant passed in and named "Engine.System.SignificanceIndex."

  • New: The Niagara datasets are now trimmed, removing attributes that are never read by the VM (or special data interfaces). This reduces VM operations and should reduce memory consumption and work.

    • Trimming is disabled by default but can be enabled on the system level with an advanced flag.

    • Individual attributes can be added in an emitter's advanced properties for forced preservation.

    • ParticleRead and Export data interfaces will force an emitter to not trim their attributes.

    • Custom HLSL nodes / expressions are parsed for attributes to keep.

  • New: Made it possible to disable emitters from a console variable.

  • New: The internal structs of particle scripts are now prevented from being defined in system scripts, which dramatically improves compile times (2x faster).

  • New: Added a new dynamic input to return individual worldspace mesh orientation axis vectors from the Particles.MeshOrientation quat.

  • New: Removed the constraint on allowing access to engine.deltatime and engine.invdeltatime in particle spawn scripts.

  • New: Removed NiagaraEmitters and NiagaraScripts from dedicated servers. NiagaraSystems remain, but are light weight, and allow a consistent interface for Blueprints.

  • New: Added a "Scale UVs by Center" function when working with texture samplers

  • New: Added a "World Position to Screen UV" function when working with the new Gbuffer data interface.

  • New: Added the ability to add parameters to a "Set Parameters" module by dragging and dropping from the parameters panel directly into the module in the system overview.

  • New: Added an optional property to NiagaraParameterCollections to allow a MaterialParameterCollection to drive values in Niagara. Parameters will get automatically created when a MPC is assigned, and the backing parameter store will be updated as changes are made to the MPC.

  • New: The "Normalized Exec Index" functions and dynamic inputs now have a boolean input which makes the normalized result inclusive or exclusive. Exclusive does not return 1 and is useful when driving a periodic function such as sine.

  • New: Added Array data interfaces, which have two new dynamic inputs for "Select float/vector from array". There are now three array sampling modes: direct, random, and interpolate. Interpolate will interpolate through the entries in the array based on an interpolation factor, and has an optional input to normalize the interpolation.

  • New: Added an Official Module for the "Export Particle Data" Data Interface. This allows particles to export their data to Blueprint or gameplay code.The functions work on both CPU and GPU. The GPU is done via a readback and can be up to 3 frames latent depending on the platform.

  • New: Return Particle ID attributes now have an optional input to extract info from another Niagara ID, such as RibbonID.

  • New: You can now access generic GBuffer frames within Niagara using a Data Interface.

  • Improvement: On the Skeletal Mesh Data Interface, the array element name for "Specific Bones" and "Specific Sockets" have been renamed to "Filtered Bones" and "Filtered Sockets."

  • Improvement: Cleaned up parameters being passed to various RT Data Interface calls, i.e. Pre / Post Stage, to ensure that all parameters are set correctly to the functions that are called.

  • Improvement: Moved NiagaraComponentSettings into its own file.

  • Improvement: Extended NiagaraComponentSettings to allow forcing which systems use the component pool.

  • Improvement: We've standardized how data is pushed to the render thread for GPU simulations, you may need to make some modifications to match it.

  • Improvement: Improved performance and compilation speed in Sim Stages.

  • Improvement: Made batching of System instances more common by reducing the need to go solo if using data interfaces as user variables.

  • Improvement: Preview meshes will now only show inside editor / preview windows, not inside PIE as it can be confusing when it is not visible inside a cooked build.

  • Improvement: Improved messaging for missing bones / sockets, sent in a single line to improve reception by various toolings.

  • Improvement: Renamed RandomFilteredSocketBone to RandomFilteredSocket.

  • Improvement: Optimized FNiagaraParameterStoreToDataSetBinding::Init by avoiding double map lookups in some cases.

  • Improvement: Moved the emitter dependency order calculation to the system from per system instance; now calculated on PostLoad, it may be possible to serialize for cooked platforms.

  • Improvement: Reorganized the Niagara sim stages RasterizeParticlesGrid2D minor module input to aid ease of use.

  • Improvement: Updated the Niagara SetBoolByFloatComparison module to use static switches for optimization reasons.

  • Improvement: Improved the stack UI to include parent/child relationships.

  • Improvement: Significant optimization for Niagara Systems that use Data Interfaces in particular ways.

  • Improvement: Improved CPU collision traces by skipping traces if collision is disabled for a particle.

  • Improvement: Added CPU optimizations for Niagara GPU emitters.

  • Improvement: Added minor CPU optimizations for Niagara Systems using Events.

  • Improvement: Updated the Niagara RasterizeParticlesGrid2D metadata for clarity from an artist's point of view.

  • Improvement: Added optimizations for CPU implementation of Niagara's Particle Attribute Reader Data Interface.

  • Improvement: Added some CPU performance gains when spawning Niagara Systems that are pooled.

  • Improvement: Added a minor optimization for CPU systems using the Skeletal Mesh Data Interface.

  • Improvement: Added updates for static VectorField Data Interface. CPU data is now stored as a half3 (instead of float4) when ISPC is available, and an ISPC kernel has been added to the Niagara Data Interface for sampling. For supported platforms it reduces memory cost (16 bpp -> 6 bpp) and improves sampling time (2x speed increase).

  • Improvement: Updated the sequencer particle trigger track to support triggering Niagara systems.

  • Deprecated: Added a "IsValidField" output to the distance field query function.

  • Deprecated: Removed old, unused collision Data Interface functions.

  • Deprecated: Deprecated data interface export function without exec pin.

  • Deprecated: Updated default values for the torus location module.

  • Deprecated: All "Uniform Ranged X" dynamic inputs have been soft-deprecated and replaced by the new "Random Range X" functions. These are more optimal from an optimization standpoint, and more critically, they now include two modes when used in an update script like Particle Update, "Spawn Only" or "Every Frame."

    • Spawn Only enables a random number to be calculated directly in an update script only once, instead of requiring a random variable to be initialized in spawn and then linked in an update, which is a significant workflow improvement.

    • Every Frame causes random dynamic inputs to revert to their original behavior of being recalculated every frame.

    • When used in Emitter Update, these functions also expose a new option to "Recalculate Each Loop", which returns new random numbers only on loop boundaries.


  • Bug Fix: Fixed the half resolution SSR rendering path.

  • Bug Fix: Reenabled and fixed dedicated memory allocations (used by NVIDIA cards). Allocations can never be reused as they are tied to the image.

  • Bug Fix: Fixed ref counting in FRenderTargetPool::FreeUnusedResource so that it frees resources correctly.

  • New: Sorted reflection material gather rays now use RAY_FLAG_FORCE_OPAQUE.

  • New: Added DEFINE_GPU_DRAWCALL_STAT to get the draw call count per specific category; DEFINE_GPU_DRAWCALL_STAT macro is now used instead of DEFINE_GPU_STAT to also get the draw call count in CSV for a specific pass. SCOPED_GPU_STAT will then output the CSV time for the GPU pass and the number of draw calls of this GPU pass in the CSV Draw Call category.

  • New: Added a batched RT material gather pipeline using batched / parallelized API. This saves ~50% of the RHI thread critical path time.

  • New: Symbols from RT PSOs are no longer exported. This slightly improves large PSO linking performance by avoiding some of the string deduplication cost in d3d12.dll.

  • New: Enabled r.Streaming.UseAsyncRequestsForDDC by default. This enables async DDC requests by default to prevent stalling the editor when the shared DDC network is slow.

  • New: Shader creation during drawing has been multi-threaded for the RHIs where this is thread-safe. This can be controlled with r.MeshDrawCommands.AllowOnDemandShaderCreation.

  • New: Redundant resource residency management is now skipped when the same SBT or RT scenes are used on the same command list repeatedly.

  • Improvement: Optimization of CREATE_NOT_ZEROED to reduce hitches on Windows 10 build 2004 and later.

  • Removed: Removed unused vertex input streams in c++ that should already have been removed.

Post Processing

  • Bug Fix: Fixed TAAU for DOF sampling outside the input viewport

  • Bug Fix: Corrected SignFastInt in FastMath.ush

  • Bug Fix: Fixed DOF sampling outside the viewport when using TAAU and SP > 100.

  • Bug Fix: Reduced DOF tiling artifacts when fast gathering foreground on foreground transition coc range by computing output opacity based on kernel size.

  • Bug Fix: Fixed the IF_PP handling of BloomMethod.

  • Bug Fix: Fixed bug due to incorrect subrects in Basic Eye Adaptation Compute Shader.

  • Bug Fix: Corrected white light appearing on cubes when disabling post processing.

  • Bug Fix: There is now a check that there must be correct viewport information after processing a frame while not in 'real time'.

  • New: Added information about the depth velocity in the velocity buffer.

  • New: Color Correct Regions. A new plugin module that allows users to add color correction to regions in 3D Scenes. Based on the concept of Color Correct Volumes and optimized to support many Regions in one level.

  • New: Added a new step in the pipeline for view extensions to be able to access the rendering stages before Postprocessing. Users can subscribe to different stages of Postprocessing via the ISceneViewExtension. This adds more flexibility to postprocessing including giving an ability to do color correction before a tone map is applied.

  • New: Added interfaces to enable Temporal Anti-Aliasing GPU passes to be replaced by a plugin. No backward compatibility on this interface is guaranteed between major releases.

  • New: The Filmic Tone Curve portion of the tonemapper can now be individually disabled via ShowFlag.ToneCurve or by setting the ToneCurveAmount (in PostProcess->ColorGrading->Misc) to zero. NOTE: Typical use cases that require the tone curve to be disabled may also require ExpandGamut to be set to zero (the default is 1.0).

  • New: Added more flexibility to Post Processing via Scene View Extensions. This is required to support OCIO conversion after the tone map.

  • New: Added a Context that a Scene View Extension (SVE) can use to determine if it should be active or not, in addition to the FViewport pointer, for use when there is no FViewport, or when applying a SVE on a particular view that shares a FViewport. This provides a way to have an arbitrary Context that corresponds to the rendering entity, and a mechanism to provide the SVE lambdas that can find and parse the custom context. The SVE can then decide if it should be active for the current frame and context, or simply use default normal behavior. This does not change the normal behavior, and only adds an option for renderers to provide a context.

  • New: Added more flexibility to Post Processing via Scene View Extensions. This is required to support OCIO conversion after the tone map.

  • New: Added a new step in the pipeline for view extensions to be able to access rendering stages before PostProcessing.

  • New: Major Updates to Ground Truth Ambient Occlusion code.

    • Added the ability to set more than 1 angle per pixel. Having 1 angle is problematic due to the projection of the per pixel normals on the view direction.

    • Improved the fall off function to band less

    • Changed the dither pattern to be based on Interleaved gradient noise. This also reduces banding.

    • Added a PPV value to control the temporal blending rate.

    • Fixed a bug regarding running at full resolution.

  • New: Added support for Open Color IO (OCIO) in the Viewport and Movie Render Pipeline.

    • OCIO in the Viewport enables users to modify the Viewport's color output and add OCIO color conversion after the tone map, which disables the tone curve and gamma. To do this, create a new Open Color IO Settings Asset and assign it to the viewport using the OCIO Configuration menu in the View. Once assigned, you should select a source colorspace to convert from and a target colorspace to convert to.

    • OCIO in the Movie Render Pipeline enables users to add a custom color configuration to the Movie Render Pipeline. It allows for control over tone curve and OCIO color conversion settings. Similarly to the Viewport OCIO Configuration menu, you need to add a new OCIO Configuration Asset and then select a source colorspace and target color space.

Ray Tracing

  • Crash Fix: Corrected a crash in ray tracing when the value of the skin cache is null.

  • Crash Fix: Fixed a crash caused when ray tracing shadows is the only active ray tracing effect and r.RayTracing.Shadows is set to 0 while leaving GRayTracingShadows set to 1, resulting in the RenderRayTracingShadow function being called when it should not.

  • Crash Fix: Fixed a crash when turning off all ray tracing effects during run-time.

  • Crash Fix: Fixed a crash calling SetupRayTracingCullClusters when RT was disabled.

  • Crash Fix: Fixed a crash that occurred when enabling r.RayTracing.ExcludeDecals because ray tracing instances are skipped but VisibleRayTracingMeshCommands have already been registered.

  • CrashFix: Fixed a crash caused by RT Niagara ribbons with zero polygons.

  • Crash Fix: Fixed a crash that occurred when initializing foliage structures with RT enabled.

  • Crash Fix: Fixed a crash on startup when attempting to load a RT shader while run-time RT support is compiled out.

  • Bug Fix: Fixed a possible deadlock in RTPSO compilation tasks on machines with low CPU core counts. RTPSO compilation tasks used to run on high priority threads and would internally create additional tasks and immediately wait on them. The inner tasks also use high priority, but they may never get to run as WaitUntilTasksComplete does not execute anything itself and all HP threads already run the outer tasks. The solution is to make the outer tasks run at normal priority (or lower), so that inner tasks will always get to run on other task threads.

  • Bug Fix: GPU copies are now used to fill the ray tracing IES light profile texture atlas. This corrects the handling of pre-tiled source profile textures.

  • Bug Fix: Fixed a potential assert when rendering ISM with ray tracing enabled if the ISM proxy had no instances.

  • Bug Fix: Added a UAV barrier at the end of each BLAS build batch. This fixes a GPU bug when running with ray tracing due to build and update commands overlapping on the GPU and corrupting memory.

  • Bug Fix: Landscape grass is now visible in ray tracing. Grass does not have per instance indices so previously it was filtered out.

  • Bug Fix: Fixed a potential race condition accessing data that is being destroyed from another thread when ray tracing Skeletal Meshes.

  • Bug Fix: Fixed Ray Tracing Post Process Volume settings cannot be edited/interpolated by Sequencer.

  • Bug Fix: Fixed GRayTracingPlaformMask initialization, which could be incorrectly enabled in editor builds and lead to unwanted ray tracing shader compilation. The console variable r.RayTracing is checked in TTargetPlatformBase and it should always be taken into account, regardless of per-platform settings.

  • Bug Fix: Fixed missing transition barriers for ray tracing resources that are bound directly and not through uniform buffers.

  • Bug Fix: Added an explicit shader parameter to differentiate direct vs indirect dispatch in RayTracingDynamicGeometryConverterCS. Fixed the handling of MinVertexIndex.

  • Bug Fix: Fixed raytraced Niagara Meshes on the GPU with multiple sections.

  • New: Added ray-traced reflections to single-layer water.

  • New: Added ray-traced transmission support for subsurface material.

  • New: Ray tracing reflection rays are not traced from pixels that have an unlit shader model.

  • New: Added a console variable to disable WPO evaluation for Static Meshes in ray tracing

  • New: Rendering reflections is now skipped in ray tracing debug or path tracing view modes.

  • New: Ray Tracing Final Gather GI improvements:

    • Added optional neighbor sample stealing (and consistent stratification within the filtering neighborhood): r.RayTracing.GlobalIllumination.FinalGather.FilterWidth (default = 0)

    • Added optional gather point multi-sampling to improve per-frame convergence: r.RayTracing.GlobalIllumination.FinalGather.Iterations (default = 1)

    • Now uses reprojection on the temporal gather point history.

  • New: Added LightingChannelMask support to path tracing and ray tracing global illumination passes.

  • New: Added options to turn off the compilation of ray tracing material closest-hit shaders or any-hit shaders. The values are read-only and must match between cook-time and run-time. New console variables added:

    • r.RayTracing.CompileMaterialCHS (default 1)

    • r.RayTracing.CompileMaterialAHS (default 1)

  • New: Created large fixed-sized ray tracing view descriptor heaps instead of creating worst-case heaps for the current frame.

    • The initial heap size is set by r.D3D12.RayTracingViewDescriptorHeapSize (default = 250k).

    • This avoids the pathological performance issue when new meshes are progressively added to a large ray tracing scene. The previous allocation scheme resulted in ever-larger heaps being created as the scene grew, which caused significant CPU spikes (200-300 ms). The new scheme reuses the same heaps that are pre-sized to be large enough.

    • If an overflow is detected, the heap size will be doubled for the next frame, but the current frame will have some number of placeholder shaders bound to the ray tracing scene and will not be rendered correctly as a result.

  • New: Added support for parallel AddMeshBatch processes for DynamicRT meshes.

  • New: Shadow rays in RTGI are shortened by default to avoid hitting the sky sphere, which makes it possible to get desired sky reflections without affecting GI.

  • New: Ray tracing debug visualization modes are now consistent with GBuffer visualizations.

  • New: The RT debug show flags are now hidden in the editor menu, since the corresponding functionality is exposed via the view modes menu instead.

  • New: Ray tracing global illumination is now enabled on two-sided foliage.

  • New: Optimized the command list generation for the dynamic geometry RT update.

    • A shared vertex buffer is now used for the compute output (managed by the collector); the vertex buffer offset is now required in the compute shader and the acceleration segment data.

    • Commands are now sorted by shader and then by vertex buffer to reduce command list creation overhead.

    • The FShaderBindingState is used to reduce incidence of binding the same uniform buffers repeatedly.

    • The loose parameter data is now stored in the FMeshPassProcessorRenderState instead of setting it twice.

  • New: Added solid-angle sampling to RT spherical lights.

  • New: The Indirect Lighting Intensity factor is now respected when computing RT global illumination.

  • New: Added a console variable to control if RT BLAS compaction should be automatically performed after build

    • r.D3D12.RayTracing.AllowCompaction 0 / 1 (default)

    • Compaction is still enabled by default, but the console variable can be used to easily A/B test memory usage, GPU time, etc.

    • The value is read-only at runtime, as it requires all acceleration structures to be re-created.

  • New: Added ray tracing specific ambient occlusion parameters in the Post Process volume.

    • Intensity: a scalar factor applied to the ambient occlusion score.

    • Radius: adjusts the world-space radius of occlusion rays.

  • New: Implemented the DXR 1.1 PSO addition API. Ray tracingPSOs can now be grown/extended through AddToStateObject on a supported Windows version and driver. A compatible base pipeline is automatically selected from the pipeline cache based on how recently and frequently it was used, unless it is explicitly provided by the user.

  • New: Implemented a roughness bias for experimental ray-traced reflections. This can improve reflection performance in certain scenes by forcing ray directions to be more coherent. Additionally, this allows globally controlling RT reflection appearance without content modification.

    • The drawback of this technique is that it is not physically based and can produce surprising / inconsistent visual results and so it must be used with care.

    • The feature can be enabled using r.RayTracing.Reflections.ExperimentalDeferred.SmoothBias (default = 0). Only surface roughness below this value will be biased towards zero.

  • New: Added transmission to the RT global illumination pass. This feature does not yet have a global override control to systemically disable the effect.

  • New: Added console variables to globally control RT shadows for different light types. All light types are enabled by default and are still controlled by r.RayTracing.Shadows as well as per-light settings. The new console variables are intended for global easy overrides, allowing fine grained control over quality vs performance in games, without content changes. New console variables:

    • r.RayTracing.Shadows.Lights.Directional

    • r.RayTracing.Shadows.Lights.Point

    • r.RayTracing.Shadows.Lights.Spot

    • r.RayTracing.Shadows.Lights.Rect

  • New: Added support for ray-traced, subsurface shadows. This emulates raster, subsurface shadows by casting a secondary ray from the point-of-view of the light source. A homogenous volume is extruded from the furthest occluder to the shading point. The density of this volume is proportional to the shading model's opacity.

  • New: Implemented a roughness threshold for skipping any-hit shader invocation in the experimental RT reflection shader.

  • New: Added a shadow source angle factor for ray-traced shadows from directional lights. This allows artists to vary the penumbra shape without changing the light shape.

  • New: The cloth shading mode is now supportedl in the ray-traced reflections pass.

  • New: Implemented basic support for masked materials in the experimental ray-traced reflection shader.

  • New: Moved ray tracing vertex and index buffer tracking from SBT to the scene. This saves 2/3 of the time spent in FD3D12RayTracingScene::FindOrCreateShaderTable.

  • New: FD3D12CommandContext::RHISetRayTracingHitGroups is now able to internally parallelize the work to improve RHI thread critical path time. The maximum number of worker threads is limited to 5 (RHIT + 4 task threads). Each thread gets a dedicated descriptor cache as well as separate referenced resource tracking sets to avoid contention.

  • Improvement: A single-state resource is now used in Ray Tracing buffer allocation to speed up allocation time.

  • Improvement: Only allow tone mapping on radiance, indirect irradiance, and primary rays debug ray tracing view modes.

  • Removed: Translucent objects no longer cast ray traced shadows, which more closely matches the default behavior of dynamic shadows.


  • Bug Fix: Fixed artifacts that occurred when computing underwater ray tracing reflections.

  • New: Added ColorScaleBehindWaterInput to the SingleLayerWater Shading Model. This can be used to add custom colorization effects such as caustics or custom surface shadows to the scene behind the SingleLayerWater surface.

  • New: The Water Plugin has been released as Experimental.


  • Bug Fix: MoviePipeline: Fixed an issue where having multiple shots pointed to the same inner movie scene would restore incorrectly, causing the inner Playback Range to slip further and further with each successive use of the sequence within a single render.

  • Bug Fix: Update source control helpers to properly resolve file paths for RevertFiles and RevertUnchangedFiles

  • Bug Fix: Fixed a crash in UATHelperModule where pointers for old notifications could potentially be invalid.

  • Bug Fix: Fixed a LevelStreaming issue that occurred when exchanging the desired level with an already loaded level between request and completion. The pending unload was never processed and the state machine remained in the LoadedNotVisible state indefinitely.

  • Bug Fix: Fixed FWorldTileCollectionModel::GenerateLODLevels not releasing generated assets.

  • Bug Fix: Fixed a crash when a map fails to load from the recently opened levels list.

  • Bug Fix: Fixed LevelStreaming when changing the desired level to an already loaded level between request and completion. The pending unload was never processed and the state machine remained in the LoadedNotVisible state indefinitely.

  • Bug Fix: Removed the clamp in USplineMeshComponent::SetEndTangent

  • Bug Fix: Returned previously renamed public members/methods in FWorldTileModel and UWorldComposition and deprecated them.

  • Bug Fix: The PIE window now correctly adjusts its window position if DPI scaling is in use.

  • Bug Fix: Added the -FrameproEnableContextSwitches command line argument to turn on context switch tracking in Framepro captures.

  • Bug Fix: Fixed a bug that would prevent the user from restoring an imported SkeletalMesh LOD after applying a reduction to it.

  • Bug Fix: Material slot names are no longer lost when merging multiple SkeletalMeshes together.

  • Bug Fix: Reimporting an FBX mesh no longer destroys custom collision meshes added in Unreal.

  • Bug Fix: Fix a bug in the MeshEditing toolbar where material assignments were not preserving shadow and collision settings when creating a new material section.

  • Bug Fix: Fixed an assert that could be fired regarding bad progression values when importing FBX files.

  • Bug Fix: Fixed a bug in FBX import where element names would not be properly parsed as UTF-8.

  • Bug Fix: FBX Import - Fixed a bug when reimporting a SkeletalMesh that would reset all the LOD settings.

  • Bug Fix: Fixed the SkeletalMesh "Bake Out Materials" option overriding Slot Names and Imported Material Names.

  • Bug Fix: Fixed a bug that would prevent a collision mesh from being generated during import if the collision data in the FBX file is invalid.

  • Bug Fix: Fixed the python import option ResetToFbxOnMaterialConflict introduced last release. Now, when enabled the FBX import will properly use the "ResetToFbx" behavior on material conflict.

  • Bug Fix: Fixed a bug that would open a new content browser window when cancelling FBX import with the existing browser window locked.

  • Bug Fix: Fixed an issue with bad texture assignment during FBX import when importing textures with names conflicting with material names.

  • New: Added BuildCMakeLib UAT automation script for building third party libraries that use CMake.

  • New: NetworkInsights/NetTrace - Improved tracing of bunches to capture open / close / sequencenumbers and channelid

  • New: Added FVisualLogExtensionInterface::OnScrubPositionChanged to make it easier to tie the visual logger to other debug systems. Contributed by The Coalition.

  • New: Enabled verbose output for SN-DBS code builds - supported platforms compile cleanly, so verbose output is now enabled by default so any issues will be caught as they arise.

  • New: The materials assigned to UStaticMesh and USkeletalMesh assets are now accessible in Python. The "StaticMaterials" and "Materials" properties are now respectively exposed.

  • New: The FBX SDK used has been updated to the latest 2020.1.1 version.

  • Improvement: Clarified function and parameter names in FWorldTileModel and UWorldComposition.

  • Improvement: Removed (or moved to a runtime toggle) some high-frequency/low-value engine performance counters. This improves performance and stability in some profilers.

  • Improvement: In the FBX Import dialog box, renamed "Auto Generate Collision" to "Generate Missing Collision" for clarity.


  • New: Implemented a new Letter Spacing property for UMG/slate widgets with font attributes (text-based widgets). Due to limitations with the HarfBuzz library and issues with letter spacing for cursive text (e.g., Arabic), Discretionary or complex ligatures are not affected by the letter spacing, such as Arabic and Thai.

  • Improvement: Duplicating or copy/pasting widgets in UMG now behaves similarly with other comparable software applications that use layer and object hierarchies, such as Photoshop and Unity. Duplicated widgets now insert the duplication directly above the selected widget, and duplicated widgets are selected by default. When pasting a panel widget, the widget will appear as a child at the top of the draw order or replace the existing panel if you cannot have more than one panel for that particular widget.


  • Crash Fix: Editor no longer crashes when the Viewport size is set bigger than the maximum texture size allowed.

  • Crash Fix: Editor no longer crashes when rendering Slate from another thread.

  • Crash Fix: Changing to Fullscreen State or resizing the window no longer causes Editor to crash. This was required to support the new flip model, described here: https://devblogs.microsoft.com/directx/dxgi-flip-model/

  • Bug Fix: The Searchable Combo Box no longer incorrectly closes instantly when selecting the box.

  • Bug Fix: The timer handle now sets correctly in the List View Base.

  • Bug Fix: The retainer box no longer incorrectly applies animation render transforms twice.

  • Bug Fix: Memory no longer leaks when using font outlines.

  • Bug Fix: Calls are no longer incorrectly made to Slate Application when in headless mode.

  • Bug Fix: The mouse no longer incorrectly deselects on mouse release when using the Single Toggle selection.

  • Bug Fix: Tooltips now work correctly when receiving OnOpening and OnVisualizeTooltip callbacks.

  • Bug Fix: When right-clicking while dragging a gradient stop, a transaction no longer is incorrectly left open on the SColorGradientEditor.

  • Bug Fix: Rich text blocks now filter data tables correctly by allowed row type.

  • Bug Fix: Multi-select mode now correctly allows multiple selections in the widget tree view.

  • Bug Fix: Resolved an issue where the first item in a list view is skipped by navigation.

  • Bug Fix: Resolved an issue with the Rich TextBlock's Set Text Style by adding a null check.

  • Bug Fix: Register Commander no longer incorrectly attempts to register an unhandled key down event handler on dedicated services. This is because Slate is not initialized.

  • Bug Fix: Using inline text boxes in edit mode now work properly during a drag/drop.

  • Bug Fix: After receiving an element request with no gamma correction, the Slate opengl and d3d references now restore gamma correction values correctly.

  • Bug Fix: When rendering text, frame updates now occur on the game thread. This resolves a potential issue where the font cache is destroyed.

  • Bug Fix: The Invalidation Root now properly handles cases when Process Invalidation is called 2 times in a single frame.

  • Bug Fix: Slate RHI Resource Manager now locks mtex before GC to prevent multithread access to a UObject while processing rendering commands in the loading screen.

  • Bug Fix: Resolved an issue where the Retainer did not properly return the correct Layer ID.

  • Bug Fix: Changed paint calculations in the Retainer Widget to resolve an issue.

  • Bug Fix: We've made a correction to the Slate Global Invalidation mode concerning volatile flags on SWidgets. Previously, flags under an invisible parent that have just been made visible were sometimes ignored in the updating process.

  • Bug Fix: Resolved threading issues with PreLoad Screen.

  • Bug Fix: The Invalidation Panel now updates correctly when used in another panel.

  • Bug Fix: Removed invalid widgets from the fast path. When the FastPathGenerationNumber is incremented on the same frame as when the widget is removed, then the widget would hold a pointer to the invalidation root. That pointer may then because invalid. We've added code to detect that case and added WITH_SLATE_FIND_WIDGET_METADATA to help find the widget.

  • Bug Fix: Resolved an issue with the Slate Debugging Input Event parameter error.

  • Bug Fix: Resolved an issue with the Slate Invalidation Root by adding a test handler to check if the root is destroyed before the persistent Widget data is cleared. If so, the handler fixes the bad memory when the global invalidation flag changes.

  • Bug Fix: To fix a bug, UE will now delay the construction of ConsoleSlateDebugger and move the text construction from ConsoleSlateDebugger to the defined structure that holds the information. To support this we've also added a filter and more info to SWidgetEventLog.

  • Bug Fix: Implicit conversion warnings for Slate Enable Global Invalidation now function correctly.

  • Bug Fix: Made a correction to resize cursor blinking when trying to resize a Window making it very difficult to resize.

  • Bug Fix: We've released a fix to make sure the Retainer uses a valid InvalidationRoot. This should also fix issues in the fast path where the retainer was not updated when invalidated.

  • Bug Fix: Slate Tick is now correctly separated from replicated objects when using ClientRecordAsyncEndOfFrame1to replay recordings. This divides up the initial call to just Platform and Input ticking, which performs message pumping as well as some additional added Slate input tasks.

  • Bug Fix: Released a fix to invalidate the user widget canvas when its slot properties change.

  • Bug Fix: UE will now warn the user when the SRetainerWidget render target size is too big or 0.

  • Bug Fix: When reflowing the UI based on Right To Left, we now also mirror the pivot point about the middle, since everything is going to swap sides.

  • Bug Fix: Addressed a crash occurring when the widget loses focus and UE tries to open a submenu. The issue only occured on Mac because of how the message loop is handled.

  • Bug Fix: Menu anchors should now correctly create the popup window for dropdowns in a World space Widget Component.

  • Bug Fix: When the RHI texture resource is not ready, to keep the texture, transparent black now shows correctly, instead of rendering a white rectangle for a frame or two (which causes the UI to "flash").

  • New: The asset picker now includes Required Asset Tags so you can specify the required key/value pairs necessary to display an asset.

  • New: Added the SLayerImage widget to draw an arbitrary number of images on top of each other.

  • New: VCamCore now has an accessor for the protected Scene Viewport variable in the SEditor Viewport class.

  • New: You can now double-click to disable words in multiline text boxes, such as the Editable Text and Text Box.

  • New: SpinBox now supports double and int64.

  • New: The new Header Row now allows you to select the header you want to generate.

  • New: There are several new updates to the Widget Reflector:

    • Overall widget layout update

    • Ability to save your settings

    • Ability to toggle your column visibility in the menu

    • Widget Snapshot Visualizer includes a clipping zone

    • Added filters for other UMG widgets in the widget tree

  • New: Added the Console Slate Debugger Update, which enables you to determine which widgets have update flags. Other widgets can be updated as a side effect of the updated widgets.

  • New: Added debugging tool for a navigation event in the Widget Reflector.

  • New: Added debugging tool to support drawing debug information on top of Slate Widgets.

  • New: You can now use a Visualizer key input in Demo Mode through the commands Slate.DemoMode.KeyEvent or Slate.DemoMode.MouseEvent. This input is now separate from Widget Reflector.

  • New: Mouse Capture is now compatible with Widget Reflector events.

  • New: Added the Slate Navigation Event Simulator so when offline, the event simulates a navigation event as it would occur in game. The OnNavigation function and other callbacks are not executed. If the widget has special needs for simulation, the Simulated Navigation MetaData can be added to the widget.

  • New: Introduced a way to prevent IO hitches in font loading. You can now use the CVar, Slate.Font.AsyncLazyLoad 1, to force fonts marked as LazyLoad to be loaded on a background thread. Until these fonts show up you'll see your error glyph like, until the font finishes loading, once it does we'll invalidate font layouts forcing recalculation.

  • New: Exposed ListView's EntrySpacing to Blueprints.

  • New: Added the console command SlateDebugger.InvalidationRoot. We've also enabled the option to display how the invalidation roots are updated.

  • New: Added the console command SlateDebugger.Invalidate. We've also enabled the option to display how the widget gets invalidated.

  • New: Added a debug tool to see which widgets are painted. It's useful in a fast path, and can be activated from the console with 'SlateDebugger.Paint.Start'.

  • New: Added Slate.CheckUObjectRenderResources to find UObject resources that are not valid but used by Slate RHI.

  • New: Added a log to record how input events are routed in Slate. This log uses the ConsoleSlateDebugger with the option "InputRoutingModeEnable" enabled.

  • New: Added entry size getters to Tile View.

  • Improvement: The checkbox widget now treats key down events similarly to events and carries over any settings for click/touch/press methods. The touch/press methods are now part of the SCheckbox and are all exposed to the UWidget.

  • Improvement: The Collapse Menu On Parent Focus setting now appears on the SComboBox node, in addition to the SComboButton.

  • Improvement: The MultiLine Editable Text Box now clears focus when pressing the Escape key. This is now consistent with the Editable Text Box behavior.

  • Improvement: You can now use Undo in any editable text field.

  • Improvement: The Rich TextBlock decorator class now uses the overridden default style, when provided.

  • Improvement: The Input Preprocessor mouse movement event call is now part of the Process Mouse Move Event, and is removed from OnMouseMove/OnRawMouseMove. This ensures touch events are always routed through the Input Preprocessor and can be handled appropriately.

  • Improvement: Several major improvements were made to RDP behavior with Editor.

  • Improvement: The Input Event only translates when needed.

  • Improvement: The Universal Search binding is now added to the Widget Blueprint Indexer.

  • Improvement: Changed FWidgetProxy::MarkProxyUpdatedThisFrame from static to class function.

  • Improvement: Added a tint option to the draw quad.

  • Improvement: In Slate, you can now use the window as a dangling pointer with the Pre Load Slate Widget Renderer.

  • Improvement: Fixed some instances of the deprecated EInvalidateWidget to EInvalidateWidgetReason. Moved EWidgetUpdateFlags into its own file. Changed FWidgetProxy::MarkProxyUpdatedThisFrame from static to class function.

  • Improvement: You can now use the Input Routing Mode Enabled to log how input events are routed in Slate.

  • Deprecated: The 'Slate.InvalidationDebugging' console command is not deprecated. Use 'SlateDebugger.Invalidate.Enable' instead.

  • Deprecated: Renamed TranslateMouseCoordinateFor3DChild to TranslateMouseCoordinateForCustomHitTestChild, to more accurately reflect its purpose.


  • Crash Fix: Editor no longer crashes when Widget Renderer's status is nullptr.

  • Crash Fix: Editor no longer crashes when dragging and dropping a named slot element.

  • Crash Fix: Added a null check to the Widget Blueprint Has Latent Actions to prevent Editor from crashing when pasting widget Blueprints from other projects that reference a Blueprint library.

  • Crash Fix: UMG slots now have a check for InSlot>Content to validate the property. This prevents an issue that caused Editor to crash.

  • Bug Fix: WidgetComponent now correctly supports Component only using SWidget.

  • Bug Fix: Widgets now clip correctly.

  • Bug Fix: Widget components with render targets that change colors now re-initialize correctly.

  • Bug Fix: Editor utility widgets no longer incorrectly dirty the level when reinstancing.

  • Bug Fix: When a Widget is renamed, you can now search for any previous variable "get" nodes and adjust the orphan pins correctly.

  • Bug Fix: Widget Components now correctly support using only SWidgets.

  • Bug Fix: Widget Components now re-initialize render target color changes correctly.

  • Bug Fix: UMG slot Details category no longer incorrectly changes position when multiple widgets are selected.

  • Bug Fix: When verifying if the BindWidget properties are bound to the correct Widget, UE will now test on the Widget owner when the Widget is part of a Named Slot. The Widget will appear 2 times because the ForEach is recursive. Also, an inner UserWidget may have a NamedSlot that contains the BindWidget. Keep in mind that BindWidget is part of the inner UserWidget tree but not part of the inner UserWidget class. To help support this, the CompileAllBlueprint commandlet has been changed to only compile a certain type of Blueprint.

  • Bug Fix: The UMG Designer Class Viewer now correctly populates the class tree when a parent Blueprint is loaded without the child Blueprint.

  • Bug Fix: Concerning Slate, added missing UPROPERTY tag on UMG widget.

  • Bug Fix: When renaming, we've added a reason for when the BindWidget is not of the right type.

  • Bug Fix: Abstract & deprecated widgets are now hidden in the UMG Widget palette.

  • Bug Fix: We've changed the Pointer Index to an integer.

  • Bug Fix: Implemented a correction in UMG Designer to prevent a crash due to drag/drop of the named slot element.

  • Bug Fix: Released a fix to prevent a crash in AsyncTaskDowloadImage when using nullrhi.

  • Bug Fix: Released a fix for when Background Blur in UMG is filled with black when UI.CompositeMode is used in HDR.

  • Bug Fix: WidgetInteractionComponent's implementation of OnComponentCreated now calls the parent class' implementation.

  • Bug Fix: Fixed "Replace Binding" incorrectly removing all bindings when all requested widgets are already bound to other tracks.

  • New: You can now use a scaling ruler when using ScaleToFit.

  • New: You can now use Set Animation Current Time to set the current time of the animation without changing the game state (playing, pausing, ect.)

  • New: UMG now has a new navigation simulation and debugging input.

  • New: Added Scale To Fit to the scaling ruler.

  • New: You can now add an unique UMG Designer Extension externally from the designer module.

  • New: The TickMode option on Widget Components improves widget performance by preventing the widget from ticking when the widget is not visible or not set.

  • Bug Fix: You can now correctly select which variable to delete with the "Delete unused variables" command.

  • New: Added a generic Check Box List to display a list of checkboxes with labels associated with your variables.

  • New: Added dialog to confirm that the user wants to delete a widget, when it's used in the graph.

  • New: Exposed WidgetInteractionComponent debug line thickness.

  • New: Added default Widget Blueprint parent class to Project Settings.

  • New: Added events for when interpolation starts and when it updates on the numeric textblock to allow for synchronized sounds or other stuff.

  • New: Added draw function to show the result of the Navigation simulation. UE now displays the result for selected widget or all the widgets if there is no selection.

  • Improvement: The Property Binding now hides by default in the preview widget.

  • Improvement: You can now use a culling rectangle for the appended grid. The owner of the grid may have a different culling rectangle than when it got created.

  • Improvement: Redesigned how templates (archetypes) are generated for widgets, resulting in large memory savings (approximately 60% of total template memory can now be recouped).

  • Deprecated: On Get Menu Content Event is now deprecated. Use the On Get User Menu Content Event instead.

Virtual Production

  • Crash Fix: Fixed a crash when r.D3D11.UseAllowTearing was changed after viewport creation and then was Resized. This was happening when using Multi-User with -ConcertAutoConnect and Oculus VR plugin was enabled, because auto connection created a notification window, then Oculus VR cleared r.D3D11.UseAllowTearing.

  • Crash Fix: Corrected a crash that occurred when r.D3D11.UseAllowTearing was changed after viewport creation and then got resized. This was happening when using Multi-User with -ConcertAutoConnect and Oculus VR plugin was enabled because auto connection would create a notification window and then Oculus VR would clear r.D3D11.UseAllowTearing.

  • Crash Fix: Fixed an AudioCaptureTimecodeProvider crash due to stack overflow when calling GetFrameRate().

  • Crash Fix: Fixed the editor crashing when stopping the WebControl server.

  • Crash Fix: Fixed a crash in nDisplay when DisplayClusterRootActor sits in the sublevel and this sublevel is not last in the list.

  • Crash Fix: Fixed a crash for when nDisplay was used with instanced stereo enabled.

  • Crash Fix: Fix crash when in VR and Multi-User, where other machines may crash when one starts VR Mode. This was happening because success of GetTransformAndForwardVector was not being checked, hence uninitialized location values were being sent in the Multi-User/Concert event to the other clients, and eventually cause NaN values in the bounds of laser spline mesh components of the VR presence actor.

  • Crash Fix: Fixed a crash when hot reloading level in -game by correctly resolving the world package.

  • Crash Fix: Fixed a possible crash where frame rate is bad in timecode synchronizer.

  • Crash Fix: MoviePipeline now skips null shots in the Executor Job to avoid crashing when trying to check if they match our target shot.

  • Crash Fix: Fixed an nDisplay crash that occurred when it was launched in windowed mode with a window size larger than the main display size.

  • Crash Fix: Fixed a crash that was preventing sequences to be saved at nDisplay cluster nodes via StartRecording/StopRecording Blueprint commands.

  • Crash Fix: Fixed a crash on nDisplay when adding VR Scouting Actors.

  • Crash Fix: Fixed some nDisplay crashes while working with Multi-User:

    • Crash on LoadLevel

    • Crash on root actor manipulations

  • Crash Fix: Fixed a crash when cluster events are sent to the second PIE session.

  • Crash Fix: Fixed a crash when nDisplay was used with instanced stereo enabled.

  • Crash Fix: Fixed an nDisplay crash when camera component was missing at Pawn in the in-camera VFX workflow.

  • Crash Fix: Fixed an editor crash when an nDisplay cluster event is emitted in PIE.

  • Crash Fix: Fixed various nDisplay crashes that were happening when Multi-User was used.

  • Bug Fix: Fixed a gamma issue in VPFullScreenUserWidget - PostProcess mode (UMG was rendered too dark).

  • Bug Fix: Fixed a missed frame warning that was missing when using genlock from the ref pin.

  • Bug Fix: Fixed a bug to prevent sending negative color values to OpenColorIO transforms.

  • Bug Fix: Fixed a jitter and periodic glitch for nDisplay when requesting screen percentage below 0.5. TAA Upsampling were only working well up to 2x, so if larger ratios are requested it now clamps the primary screen percentage to 0.5 and the secondary screen percentage does the remaining upscaling.

  • Bug Fix: Fixed three of functions in LiveLinkBlueprintLibrary to be static so that they are accessible from Blueprints.

  • Bug Fix: Teleport to bookmark now takes headset offset into account.

  • Bug Fix: Fixed a bug for Multi-GPU in DoCrossGPUTransfers, where it was using view rects without their offsets within the render target.

  • Bug Fix: CCRs: Made sure that Color Correct Regions appear during the search.

  • Bug Fix: AJA has improved format detection to include HDMI, and suggest progressive/interlaced based on request. Also fixed the sync rate calculation based on PsF. Tested using KONA 5, using PsF, interlaced and progressive inputs, with and without WaitForFrame flag, which currently has no effect.

  • Bug Fix: Fixed an issue with CCRs not getting Scene Textures for post processing.

  • Bug Fix: Fixed nDisplay's multi viewports functionality for DX12.

  • Bug Fix: Provided a fix for KONA 5/IO4k sub 30fps 4k issues.

  • Bug Fix: Fixed 3D audio in VR mode, where it was not taking the HMD rotation into account when setting the transform of the audio listener.

  • Bug Fix: Fixed incorrect settings in the RemoteSessionFrameBufferChannel.

  • Bug Fix: : Fixed a missing CloseProc in Switchboard.

  • Bug Fix: Composure preview window will now Suspend when in Simulate.

  • Bug Fix: Fixed the AppleProRes Media Encoder in MoviePipeline using a removed variable.

  • Bug Fix: Fixed queues in MoviePipeline that were losing their ShotInfo when the editor was restarted.

  • Bug Fix: Snapping functionality now automatically turns off when going into VR with the VR scouting plugin enabled, then turns back on when exiting VR. This avoids an issue of not being able to grab items.

  • Bug Fix: Delayed start (and device enumeration) in LiveLinkXR to OnEndFrame so that UpdatePoses can happen beforehand. Without this workaround, default LiveLink presets using LiveLinkXR would not work because it enumerates the devices before the first call to FSteamVRHMD::UpdatePoses() happens (since default presets are set in OnFEngineLoopInitComplete), and without a valid pose the tracker is not enumerated.

  • Bug Fix: Add missing UpdateResidency() calls in ConditionalCompactAccelerationStructure().

  • Bug Fix: Allow AppleARKit and AppleARKitFaceSupport plugins to package in Win64 (in addition to iOS). Without this, users are not able to stream from Live Link Face app into a packaged game in Windows.

  • Bug Fix: Fixed 3D audio in VR mode, where it wasn't taking the HMD rotation into account when setting the transform of the audio listener.

  • Bug Fix: TDM: Genlock status is now set to Synchronizing when the genlock signal is not valid in AJA card.

  • Bug Fix: Fixed zombie UE instances in Switchboard:

    • List of running programs can now detect multiple instances of the same program running on the listener, and so can send the command to kill them and avoid zombies.

    • Resolved cstat_project exception. The issue was that multiple instances of the cstat_project command were being issued, but only the last ID was remembered in the program_name to program_id dict.

    • Improved socket management and disconnect detection.

  • Bug Fix: Removed the dependency of VPCCR on D3D12 RHI because it was breaking compilations on platforms that do not support it.

  • Bug Fix: Fixed a Switchboard bug related to Monitor UI not populating when there are no initial devices. Can now take nDisplay config paths with double quotes. Also ensured config save flag is restored even when exceptions happen.

  • Bug Fix: Allows the Remote Control API to be used in shipping.

  • Bug Fix: Apply Multicast TimeToLive (TTL) to the Unicast socket, which is the one used to send the multicast packets. This does not affect unicast TTL.

  • Bug Fix: nDisplay now avoids a crash in Root Actor PostLoad when there is no World yet. PostLoad is being called without a World, and InitalizeRootActor was crashing. It now checks for the World and returns immediately without initializing. Since PostLoad is being called later when there is a World, initialization is performed then. This was happening in one of the test projects when nDisplay is in a sublevel, even with Always Loaded checked.

  • Bug Fix: Fixed PFM preview Blueprints.

  • Bug Fix: Color Correct Regions were fixed to handle an issue due to the fact that lower Scalability settings for the rendering pipeline were dropping the Alpha channel completely. Therefore, sampling Scene Texture for the Alpha channel was returning 0. Since we are pre-multiplying the output color by alpha, it was giving black color in a region area as a result. Since there was no Alpha channel in Scene texture or in color-correct region render-target texture, the blending pass was producing a black box.

  • Bug Fix: Moved LiveLinkXRSourceFactory out of LiveLinkXREditor so it would work in Runtime.

  • Bug Fix: Fixed high CPU usage due to spinning reading a pipe.

  • Bug Fix: Applied Multicast TimeToLive (TTL) to the Unicast socket, which is the one used to send the multicast packets. This does not affect Unicast TTL.

  • Bug Fix: Fixed rgb-to-yuv conversion shaders for mediacapture (mostly apparent in 720p).

  • Bug Fix: MoviePipeline has a fixed scenario where if one camera cut section in a moviescene was disabled, all subsequent camera cuts in that shot would get disabled.

  • Bug Fix: CCR: Fixed the issue related to how subsurface objects and other types of Materials are propagated further down the post processing pipeline, and processed by CCR incorrectly. In High Effects settings, scene color stored in RGBA texture and shaders can sample alpha correctly. In Lower Effects settings Shaders have to sample a special GBuffer texture containing opacity. Since these materials are processed properly much later in pipeline, Opacity looks more like a stencil than anything.

  • Bug Fix: Fixed a LiveLinkXR bug where OnEndFrame could call a destroyed object.

  • Bug Fix: Vcam was updated to prevent users from recording with a slate that has a space in it.

  • Bug Fix: Fix for VR Scouting ensured that Gaffer Light Level is propagated to Multi-User Clients.

  • Bug Fix: For Vcam, the following have been fixed: map indicators, screenshot info, stats readers, and focus/interact panel bugs.

  • Bug Fix: Fixed the GetAttributeNode pins.

  • Bug Fix: Fixed VProd Measure Tool not updating motion controller texture in context menu on construct.

  • Bug Fix: For Vcam, it now properly views clips recorded from the currently open LevelSequence.

  • Bug Fix: VR Scouting bookmarks are now spawned in the direction of the controller.

  • Bug Fix: Fixed a KONA HDMI RGB input issue.

  • Bug Fix: Fixed an issue where the Stop PIE button was not available after any error during nDisplay initialization.

  • Bug Fix: Updated protocols unit tests.

  • Bug Fix: Fixed the treads and sockets issue for sACN:

    • Removed the thread for each universe.

    • The socket now opens only when the universe is using it.

    • Sockets are cleaned if there are no listeners.

    • The sACN thread listener has been removed.

    • It is now using a gameplay tick for listening changes on the sockets.

  • Bug Fix: Fixed a custom origin component set for PICP and PICP-MPCDI projection policies.

  • Bug Fix: Fixed byte swapping for sACN.

  • Bug Fix: Implemented a fix for VR scouting tools that would not work after closing the VR menu if Undo/Redo was pressed.

  • Bug Fix: The Gaffer Actor is now transacted when modified via the Gaffer tool in VR Scouting

  • Bug Fix: Fixed an issue where nDisplay root actor could not be found if it was located in a sub-level.

  • Bug Fix: The sACN Universe not ticking when slate UI not in focus has been fixed. It now gets replace with core delegate. It blocks the ticking in ThrottleManager

  • Bug Fix: In VR Scouting, the Second Controller was unusable with First Controller submenu. This has been fixed.

  • Bug Fix: Fixed replication of all nDisplay internal real numbers to prevent precision loss.

  • Bug Fix: Switchboard had issues fixed relating to Settings:

    • Plugin Settings now properly clear between config loads and do not contaminate each other.

    • Fixed issues where instance settings variables were sometimes being used instead of class settings variables.

    • All settings are now in collections instead of independent attributes, simplifying parts of the code.

    • Cleaned the settings code, clearly separating plugin from instance-only settings.

    • Removed redundant cascade of resaving of settings every time a setting changes while the Settings Dialog is open.

    • Config paths now accept double quotes (as returned by Windows "Copy As Path").

  • Bug Fix: Switchboard has an improved project build command. Previously, it was not building the project cpp modules.

  • Bug Fix: An issue with Switchboard has been fixed where it was not able to build a non-Perforce project due to a hidden button. This also handles an error message from Perforce cstat instead of showing only the last word in the message.

  • Bug Fix: Fixed a bug in Switchboard where each listener_client could use up to 100% of a core.

  • Bug Fix: In Switchboard, fixed zombie PresentMon:

    • The Flip monitors are now being killed explicitly, not relying on their functionality to terminate when their watched process terminates.

    • Killing processes now send a close signal and allow 2 seconds for the process to close before forcing the termination, giving it an opportunity for proper cleanup.

    • To keep listener responsiveness given the new 2 second timeout, killing processes is now an async task.

  • Bug Fix: Switchboard was not updating the launch button when launch failed. This has been fixed.

  • Bug Fix: Switchboard miscellaneous fixes:

    • Added a CONCERTRETRYAUTOCONNECTONERROR command line option when launching MU.

    • Improved handling of cstat response.

    • Renamed the Workspace Name field to clarify that it is a name and not a path.

    • Fixed device removal notifications, where you can choose whether or not to update the config or not.

    • Added NoVerifyGC as a fixed option when launching nDisplay render nodes.

  • Bug Fix: Switchboard can now distinguish between multiple instances of Unreal opened by the same listener upon reconnection, by matching a caller field with the device.

    • Fixed mishandling of a program start failed delegate.

    • Parses the fullscreen parameter in nDisplay config file and uses it to properly construct the launching command line.

    • Added noxrstereo to nDisplay launch command to avoid conflicts with VR devices (such as Vive Tracker).

    • Added a way to specify ExecCmds.

    • Added DisableAllScreenMessages when launching the nodes to avoid sync issues due to notifications.

    • Re-parses config file before launch to update parameters that are exclusively controlled by it. Otherwise you could, for example, change screen resolution and it would not be updated unless the config file is re-added, losing all overrides and customizations of the nDisplay set of devices.

    • Added a way for Device instance settings to opt out from getting a UI in the Settings Dialog—for example, when these settings are controlled by the config file and not manually by the user.

    • Last column in nDisplay Monitor does not stretch anymore. It is more pleasing this way.

  • New: Switchboard now handles full screen nDisplay window configuration when launching the render nodes.

  • New: For Switchboard:

    • Added support for Maps to nDisplay launches.

    • Added a Default Map option to avoid forcing the map in the command line and instead use project defaults.

    • Moved map setting to configuration, since this is a per-project setting.

    • Map list now updates when map path is changed.

  • New: For Switchboard:

    • Added overrides for cmd line and execcmds for nDisplay nodes.

    • Separated cmd line and execcmds between "unreal" and "ndisplay" devices.

  • New: Miscellaneous improvements for Switchboard:

    • Added -forceres to the nDisplay launch command line when in windowed mode.

  • New: Switchboard can now choose which commands are echoed in the output log of the listener. This is meant to avoid a spam of periodic messages.

  • New: For Switchboard:

    • Added device icons.

    • Improved handling of missing icons.

    • Renamed a specific mobile device to LiveLinkFace.

  • New: Switchboard status now includes the NVIDIA driver version.

  • New: Switchboard now has a taskbar monitoring autohide flag. Also removed one of the build flags that could prevent engine rebuild.

  • New: Switchboard now injects class overrides to avoid needing WindowsEngine.ini in Perforce. It also includes the bUseBorderlessWindow option in DefaultGame.ini.

  • New: Switchboard: Added the ability to read and report NVIDIA Sync Status and the Flip Mode of a process started by Switchboard (i.e. UE) Listener:

    • The task is performed asynchronously.

    • Added a mechanism to run tasks asynchronously based on Async and TFuture.

    • Fixed a bug related to the listener's main loop fps.

    • Added a mechanism to identify equivalent requested tasks so that they can be optionally rejected.

    • Used said mechanism so that repeated get sync status requests can be safely rejected if an equivalent task is already in progress.

    • Python App:

      • Added a mechanism for plugins to add their own UIs into the main window, namely the main toolbar and new plugin tab manager.

      • Using this mechanism, added a custom tab to monitor nDisplay nodes.

      • Added an nDisplay Monitor class to query and parse the new get sync status command and populate the model used by the tableview in the custom tab.

  • New: Switchboard now has detection of compatibility flags in UE4Editor executable. In particular, the Disable Fullscreen Optimization flag is of interest because it can cause tearing in LED walls. Also fixed the missing if PLATFORM_WINDOWS.

  • New: Switchboard Listener now reports its state, namely its running processes, to the Switchboard app upon connection. This is particularly useful when the Switchboard app gets restarted and needs to reconnect.

  • New: VCamCore is a new framework for creating, customizing, and using virtual cameras in Unreal Engine. It can be used in Editor, Play In Editor (PIE), and standalone game modes. It is fully customizable and does not require any special game modes, controllers, or maps. To create a Virtual Camera, add a CineCameraActor to your scene and attach a VCamComponent to it. Add various Modifiers and Output Providers to customize, and for added flexibility, the Composure compositing system can also be integrated.

  • New: Updated the Aja TimecodeProvider and internal library to support reading from a dedicated LTC pin.

  • New: Added a new type of asset—Remote Control Preset—that makes it possible to expose object properties and functions to remote control. It also allows grouping properties from different objects under a single panel.

  • New: For TextureShare, a plugin was added that can be used to share textures and buffers between Unreal Engine and third-party applications.

  • New: Added a LiveLink subject rebroadcast option to rebroadcast any LiveLink subject over a separate LiveLink provider. This allows the subject to be shared with other editors receiving the LiveLink data.

  • New: Added a Composure output option to VPFullScreenUserWidget that allows the widget to render the UMG into a separate render target instead of directly to a viewport. This is intended to primarily be used with the Composure system for compositing UMG layers with other layers.

  • New: For beam rendering:

    • Added more samples for high quality

    • Changed "set initial state" behavior to use defaults and "snap" first DMX packets

    • Tweaked zoom (beam and light)

    • Added support for "Intensity Scale" in PIE

    • Fixed warning from dynamic materials when packaging matrix fixture

    • Tweaked beam culling

    • All lights fixtures are now moveable by default

    • Updated pan/tilt rotation range based on MF feedback

  • New: Added Blueprint and C++ accessors for various parts of the Composure pipeline. Also added a sample Editor Utility Widget Blueprint in the VirtualProduction/VCamCore plugin that uses the new functionality to setup a simple "A over B" composure stack with a single click.

  • New: Sample Blueprints and Assets for VCamCore are now available.

  • New: A new engine plugin is now available under VirtualProduction/LiveLinkXR. This plugin allows you to track any SteamVR-compatible devices and send the transform data out over LiveLink. Supports HMDs, controllers, Vive Trackers, and any other trackable device.

  • New: Removed the timecode frame rate requirement from a Live Link subject.

  • New: Added a smooth-latest mode to the timecode evaluation for Live Link subjects.

  • New: Updated Live Link to support loop playback by using received order dropouts. Also added verbose logs to help debug live streams.

  • New: Added a new StageMonitoring plugin to manage stage machine logging and monitoring.

  • New: Updated the clock offset estimation to be continuous so as to have a more accurate difference on each Live Link sample. That way, EngineTime evaluation mode can be seen as a smooth latest mode.

  • New: Added settings to RemoteControl plugin to auto start web servers on boot.

  • New: The Virtual Camera has been implemented, and GameMode/PlayerController has been deprecated. Please use the new SimpleVirtualCamera and VirtualCamera2 Classes.

  • New: For Concert: A command line option, -CONCERTISHEADLESS, was added to disable notification windows as these windows can interfere with nDisplay sync.

  • New: Added functionality to VPFullScreenUserWidget to optionally specify a viewport instead of always assuming currently selected viewport.

  • New: For nDisplay: Config paths with spaces are now supported. This requires a small change in the command line, where you need a '-' prefix, such as -dc_cfg="path\with spaces\config.cfg" iInstead of: dc_cfg="path\nospaces\config.cfg" If it cannot parse the new form, it will try the old one, so that old custom launchers can still work. The same thing was done with -dc_node and -dc_gpu for consistency.

  • New: Composure can now be included in packaged game builds.

  • New: PresentMon binary and associated license file was added to Switchboard.

  • New: : Added to Switchboard support for the new JSON-based nDisplay config file format.

  • New: LiveLink: Added a flag to disable the LiveLinkComponentController when inside a Sequencer spawnable. This avoids LiveLink interfering with Sequencer when playing back spawnables. Also added a way to explicitly pause the controller from evaluating LiveLink.

  • New: On Cine Camera, there is a change to depth-of-field method from None to Do Not Override to describe what it is actually doing, as it is not overriding post process settings. Also added a new method of Disable, which disables depth of field entirely by overriding post process settings.

  • New: Added native delegates to the OSC server to pass address and port to callbacks.

  • New: ComposureWizard is an example Editor Utility Widget for use with VCamCore that shows how to create a simple composure stack and hook it up to a virtual camera automatically using Blueprints. Starting from an empty map, you can click a couple of buttons and instantly connect via the UnrealRemote 2 app from iOS.

  • New: In OCIO BP wrappers of the Scene View Extensions were added that can be assigned OCIO config and associated with a rendering context.

  • New: Added support for fractional timecode to ARKit face protocol.

  • New: Added WebSocket support to the Web Remote Control API.

  • New: MoviePipeline EXRs now write multiple render passes to a single EXR file instead of separate EXR files.

  • New: MoviePipeline now has metadata support for multi-layered EXR files. Implementation adds metadata for: Camera Focal Length, Focal Distance, FStop, Sensor Height/Width, camera position/rotation, previous camera position/rotation, frame rate, level sequence name, level name, and job date/time (UTC). Additional metadata can be added by implementing additional setting classes.

  • New: In MoviePipeline, added a {version} format string which can be either specifically versioned or can auto-detect the version number. Auto detection looks for the first {version} tag in the output directory, then searches all sibling files and folders for version tags before picking the highest one and incrementing that by one.

  • New: MoviePipeline has refactored the UMoviePipelineDeferredPassBase into a more common base class to allow additional rendering passes.

  • New: TDM has an added way to detect if the Genlock signal is present.

  • New: Added a command line option to tell XRSystem to not override GEngine->StereoRenderingDevice. This is useful when XR-tracking features are desired, but GEngine->StereoRenderingDevice should be implemented by a different system (such as nDisplay). In the absence of this cmd line parameter, everything works as usual.

  • New: Movie Pipeline has initial refactoring to simplify the setup of custom render passes.

  • New: In MoviePipeline, Path Tracer and select other Viewport Lit modes are now supported as output passes for the render pipeline.

  • New: Added Static and Unicast Endpoint configuration to MotionBuilder LiveLink plugin.

  • New: Added support for fractional timecodes to ARKit face protocol.

  • New: UDP Messaging: Fixed UDP Messaging static endpoints that were not properly sent to when the unicast endpoint was forced to a specific interface. Modified the Multi-User Server launching to bind a different port on the unicast endpoint port of the editor. This is set when it transfers its settings to it. Updated the UDP messaging settings tooltip as well as a multi-user launch server button. Now exposes Server Port settings for the Multi-User server unicast endpoint over the passed UDP messaging settings when booting the server from the Editor.

  • New: Exposed settings of UDP Messaging module

  • New: Switchboard has an added -ConcertIsHeadless command line option when launching nodes to avoid notification windows from interfering with nDisplay sync. Also disabled nDisplay logs that were on by default.

  • New: MoviePipeline now has the ability for passes to override show flags based on user settings such as disabling Depth of Field or Motion Blur.

  • New: Letterboxing support was added to Movie Render Queue.

  • New: In MoviePipeline, the separation between Engine Pass and Render Pass was removed. The abstraction layer was providing no benefits in practice, and complicating implementation of additional passes.

  • New: Timecode has converted the BlackMagic Timecode Provider and Custom Timesteps to genlocked versions. This allows the Blackmagic timecode to use genlock to count.

  • New: OCIO viewport display look now has a hook in the viewport View menu to configure a display look. Also added an OCIO display view extension to apply color conversion to viewport being rendered.

  • New: Timecode has an improved robustness for the LinearTimecodeDecoder, in particular, for AudioCaptureTimecodeProvider:

    • Checks for a pattern at end and beginning.

    • Checks for valid timecode value ranges.

    • Checks for valid bit time durations when provided. Also converted to GenlockedTimecodeProvider since LTC is typically genlocked to a master clock or video signal.

  • New: Timed Data Monitor now supports multi-format and timecode counts from Genlock Sync if the timecode provider allows it. Added an abstract class GenlockedTimecodeProvider and GenlockedCustomTimeStep to support this functionality. Added a function that more explicitly fetches the timecode, and can be used to encapsulate certain behavior (like checking genlock). The getters are now meant to not fetch from HW and instead return a cached value—this should not affect existing timecode providers. Also, AJA now defaults to trying to enable multiformat.

  • New: Added a MediaUtils.StartupProfile CVar that can be used to load the specified Media Profile at startup. Because this is usually a hardware-dependent setting (such as per PC), this allows the user to specify it in the -SystemSettings section when launching the project. An example would be in DefaultEngine.ini: [SystemSettingsNode0] MediaUtils.StartupProfile=/Game/MP_Test.MP_Test. You would pass -SystemSettings=SystemSettingsNode0 in the command line.

  • New: Added a Switchboard application that provides a way to control remote machines on a Virtual Production set. It can be used to sync and build Unreal projects on those machines, as well as launch nDisplay nodes.

  • To make launching Switchboard easier, an editor plugin named Switchboard was also added. This plugin can be used to:

    • install Switchboard's dependencies on first launch

    • launch Switchboard

    • launch the Switchboard listener

    • (un)install the Switchboard listener for windows autostart

  • It also adds several project settings that can be used to change how Switchboard and its listener are started. This then offers the opportunity to use a different Python interpreter than the one installed by default.

  • A UE4 program named SwitchboardListener was added to communicate with remote clients. It relays various information and commands between Switchboard and the remote machine. It is meant to be started on the remote host that the user wants to control via Switchboard. The SwitchboardListener can:

    • Start arbitrary applications and track their process

    • (Soft) kill previously started applications and send back their output

    • Send and receive arbitrary files

    • Report GPU sync state

  • New: Updates DXM fixtures assets.

  • New: Implemented a node for casting a fixture patch to a specified fixture type.

  • New: Added a new plugin that allows an exchange of any textures between UE4 and third-party applications; sample projects are provided as well. Also added integrated textures exchange functionality into nDisplay, and multi-GPU render support for nDisplay viewports.

  • New: Initial implementation of nDisplay configuration in-editor preview has been added. This is an early preview, limited by simple and MPCDI projection policies only. It will be finished in the next release.

  • New: Two new fixture types have been added: The first adds key inputs for Delete, Duplicate, Copy, and Paste for Functions and Modes The second adds attribute names next to the function name.

  • New: Users can now upload or download their created fixtures into the GDTF database as GDTF files.

  • New: The in-camera VFX workflow now supports Multi-User editing functionality. Modifying IncameraSettings and IncameraStageSettings no longer crashes the nDisplay cluster.

  • New: A new nDisplay projection policy was added to allow utilization of VIOSO SDK for multi-display setups (DX11, DX12).

  • New: A texture preview interface for Output Graph in "DisplayClusterConfigurator" has been implemented.

  • New: RemoteControlWebInterface provides a web control interface to remote control UE preset.

  • New: nDisplayListener properly sets a working directory for every nDisplay UE4 instance on launch.

  • New: nDisplay now syncs objects that are replicated on TG_PostPhysics tick group.

  • New: GameVice is now integrated with panning and teleport to home for Vcam.

  • New: Duplicated entities (when using Ctrl+W or the Context Menu command) are now added immediately after their original counterparts.

  • New: Vcam VirtualJoystick has been integrated with flight mode animations.

  • New: A master node of a preview config is used automatically by default for nDisplay PIE sessions.

  • New: Added a mode dropdown with the options Multicast, Broadcast, and Unicast.

  • New: Integration of modifier delegates into VCam2UI has been added.

  • New: Switchboard added a -MaxGPUCount setting to support mGPU.

  • New: Added a RenderSync log category to the nDisplayLauncher Log tab and nDisplay core synchronization logic.

  • New: In Switchboard, build progress for each device is now shown:

    • Sync progress also has an indication of progress in the form of stdout line count.

    • Build step is in the tooltip for build percentage.

    • Any program start request from Switchboard can now include a flag to get stdout updates as they happen.

    • Fixed an issue with keep alive while building.

    • Replaced TAtomic with std::atomic due to deprecation warning in source.

    • Fixed an issue when building a path to VPRoles.ini file where double quotes were incorrectly included.

    • Fixed getting the CL for the project instead of the Engine.

  • New: Added support for making Virtual Subjects in Blueprint. Blueprint Virtual Subjects can be created through the Create Advanced Asset dialog under Live Link > Blueprint Virtual Subject.

  • New: Replaced VRPN analog data serialization to text hex format to avoid precision loss.

  • New: In Switchboard, missing command line options for Stage Monitor to work properly with nDisplay have been added: VPRole, StageFriendlyName, and SessionId. It also now has an improved handling of writing strings on int fields in the settings dialog.

  • New: Updated focal length and aperture slider value labels now support GameVice integration.

  • New: Vcam has added MotionAdjustment stabilization delegates.

  • New: You can now use the nDisplay root node as an origin for a simple projection screen when its parent is missing in a config file.

  • New: Two-finger pinch-to-zoom and panning now implemented into VCam Map.

  • Deprecated: The OnProtocolReceived event has a deprecated.


  • Crash Fix: Fixed a crash in Magic Leap when launching project via editor with -game and ZI is enabled and running.

  • Crash Fix: Fixed a crash in the Unreal test framework for HoloLens 2.

  • Crash Fix: Fixed a Vulkan editor crash on dual GPU machines. The lifetime of the strings given to UE via ml_remote.h were maintained by the VkExtensionProperties object sent to UE instead of providing a string view. When a second GPU queried GetVulkanDeviceExtensionsRequired, the original strings were cleared. The first GPU would then receive garbage data when acting upon the char*s it was given. This change allows dual GPU systems to launch the editor with ZI enabled.

  • Crash Fix: VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT support was added for pipeline stage and access mask. This fixes a potential crash on Quest/Quest2 with Vulkan.

  • Crash Fix: Added new texture aliasing APIs for OpenGL. The missing implementation was causing an assertion failure and crash when initializing mobile VR devices using OpenGL.

  • Crash Fix: Fixed an OpenXR crash when entering VR Preview a second time.

  • Crash Fix: Fixed a potential crash caused by null pointer access when cooking ARCore candidate images.

  • Bug Fix: Fixed an HMD-tracked query so it will ignore extra PIE worlds. This fixes problems with local multiplayer PIE and VR. The first player's camera will be VR. Others will not.

  • Bug Fix: Fixed a hologram jitter when not using multiview.

  • Bug Fix: Cleared MRMesh blocks when the world scale is changed.

  • Bug Fix: The USE_LOGGING_IN_SHIPPING macro now works as expected on Lumin.

  • Bug Fix: For HoloLens Remoting, addressed an issue where the first VR Preview against a remoting connection would only show a still image of the scene.

  • Bug Fix: Fixed a critical performance issue—CustomPresent now returns a correct value for the WMR plugin when presenting natively on a device.

  • Bug Fix: HoloLens: Visual Studio 2019 + new forwarders for the interop; updated Nuget libraries - including fix of remoting from game.

  • Bug Fix: Start/Stop QRCode detection from HoloLensARFunctionLibrary now works. Previously, QR would always start, with an unexpected webcam permission dialog at startup.

  • Bug Fix: GetTrackingQuality bugs fixed, and implemented TrackingQualityReason.

  • Bug Fix: Various fixes made for choppy audio, no audio, or random noise when the Magic Leap device went into or came back from standby mode.

  • Bug Fix: Fixed to use single speech recognition when remoting on HoloLens.

  • Bug Fix: HoloLens now uses correct cleanup of MeshUpdateObserver.

  • Bug Fix: The HoloLens third cam is now allocated for the HoloLens device only.

  • Bug Fix: Fixed a bug where apps did not launch on HoloLens devices that were not using developer mode.

  • Bug Fix: Magic Leap no longer exits early if another HMD hijacks the Vulkan initialization. This caused extensions required by MLRemote to never be queried.

  • Bug Fix: Added a debug for HoloLens x64 APEX binaries for use with debug CRT.

  • Bug Fix: HoloLens now explicitly uses only x64 remoting dependency binaries for x64 builds.

  • Bug Fix: Modified Avatar SDK mesh/bone conversion to align with FBX imported files and other SDKs.

  • Bug Fix: Added the functionality required for the Oculus Keyboard Overlay to work.

  • Bug Fix: Fixed the screenshot code to ensure that it grabs a screenshot from the correct window. Previously, it would just try to screenshot the first window to update after F9 was pressed, which, in preview, could have been any editor UI window.

  • Bug Fix: Oculus now ignores the app command APP_CMD_PAUSE if it occurs before APP_CMD_INIT_WINDOW.

  • Bug Fix: Fixed an issue where PokeAHole material was not loading on Android successfully.

  • Bug Fix: Oculus support added for device color specifications and hand tracking.

  • Bug Fix: Fixed the preview window clipping error that was introduced by a fix to backbuffer scaling/window resize handling in Slate. The preferred window size is now used in the UpdateFullscreenState call in the stereo rendering mode.

  • Bug Fix: Fixed an assert on Quest with HISM and mobile multi-view.

  • Bug Fix: Changed to RGBA format to avoid a Universal Bandwidth Compression (UBWC) bug with BGRA formats on mobile stereo devices (which fixes a potentially serious performance regression on these devices).

  • Bug Fix: Because the Microsoft Store requires a unique version number for each update for easier tracking, an auto increment project version has been added for each build. You can opt in to this feature in the HoloLens project settings under Packaging/Auto Increment Version.

  • Bug Fix: Fixed the FRHICustomPresent override where it gave an incorrect return value that caused a critical performance issue on the HoloLens 2 native.

  • Bug Fix: Updated the default minimum Win10 SDK for HoloLens packaging to correct an issue where the SDK < 17763 would fail to package if one of these SDKs were installed (for example, < 16299) on the build machine.

  • Bug Fix: Fixed issues in AugmentedReality implementation for MagicLeap:

    • Reset the worker thread setup for image tracking so it restarts on consecutive VRPreviews.

    • Handled UpdateTrackedGeometry in LuminARTrackedPointResource::UpdateGeometryData so that it would update even if there was not a valid position and orientation to update to. This would sometimes happen after a level transition, and if UpdateTrackedGeometry was not used, the Point might not have a valid ARSystem pointer, which could crash if certain Blueprint functions (GetLocalToWorldTransform, for example) were called at that time.

    • Removed GetTrackableHandleMap from the ARTrackingSystem interface. Instead, a new function, RemoveHandleIf, is now used to set the StoppedTracking state and remove the handle. RemoveHandleIf now takes in a higher-order function that is applied to every stored handle if the geometry type matches. When the applied function returns true, the tracked handle stops tracking and is removed internally. Users of the tracking system can perform additional removal behavior as they see fit via the input function.

  • Bug Fix: Fixed a memory overwrite issue in ARCore.

  • Bug Fix: Corrected volumetric particles that were drawn twice in left eye with instanced stereo.

  • Bug Fix: Fixed a bug where the fragment density map in Vulkan (if you use Vulkan Foveation) is added in the renderpass, but not in the renderpass attached to the graphics pipeline.

  • Bug Fix: The HoloLens world mesh has been fixed to prevent bricks from vanishing and reappearing. The bricks were actually being moved around whenever an update came through that did not change the mesh.

  • Bug Fix: Added an Android Dynamic RHI string for OpenXR render bridge.

  • Bug Fix: This fix forces the backbuffer to 1x1 for standalone VR mobile devices to save memory.

  • Bug Fix: Fixed a black screen issue if using the Mobile Preview when Mobile Multi-View is enabled.

  • Bug Fix: Fixed OpenXR occlusion masks and enabled them on supported runtimes.

  • Bug Fix: Improved frame pipelining in the OpenXR plugin to eliminate hitches.

  • Bug Fix: Headsets going into idle in the OpenXR plugin are now properly handled.

  • Bug Fix: There is now support for Texture2D Arrays with multi-view and MSAA.

  • Bug Fix: Fixed an assertion with certain materials on Magic Leap.

  • Bug Fix: Packaging fix for HoloLens was implemented to make sure to save the manifests for each architecture with unique names so they don't get overwritten. This fixes packaging issues when building from binary engine releases, where the build produces a manifest for the plugin for ARM64, which then would get overwritten by the manifest for x64. This, in turn, would cause another error during packaging, where the plugin was referencing a manifest for the wrong architecture.

  • Bug Fix: Added a delegate to allow external code to get notified when the brick data in UMRMeshComponent is updated. This fixed the problem that there's no easy way to expose the vertex data from UMRMeshComponent in a CPU readable format.

  • Bug Fix: HoloLens now has both x64 and Arm64 targets available.

  • Bug Fix: Fixed a bug where the ARCore camera feed was vertically inverted when mobile HDR was disabled.

  • Bug Fix: Enabled occlusion rendering for ARCore.

  • Bug Fix: Fixed the ARCore/ARKit camera passthrough material. MOBILE_STENCIL_COMPARE_FUNCTION was introduced in the shader code without a sensible default value. Its value was only set by FPostProcessMaterialPS but there were other native codes that also used the same shader code (FGoogleARCoreCameraOverlayPS, TARKitCameraOverlayPS). Now the default value for MOBILE_STENCIL_COMPARE_FUNCTION is set to MOBILE_STENCIL_COMPARE_NEVER, making it backward compatible.

  • Bug Fix: Fixed UARBlueprintLibrary::IsARSupported so that it returns a meaningful value.

  • Bug Fix: HoloLens and Windows Mixed Reality support for Windows Server 2019.

  • Bug Fix: Workaround fix for MRMesh flickering on Vulkan desktop renderer. To fix this, at least for now, enable mesh occlusion when the MRMesh is connected to the MagicLeapTrackerComponent. Since this happens after the MRMeshProxy is created, modify SetEnableMeshOcclusion so that it updates the proxy's value as well.

  • Bug Fix: The MagicLeap ImageTracking now works on consecutive VRPreview launches, and Light estimation works when ARSession is restarted on the device.

  • Bug Fix: No longer attempts to update the depth texture unless scene depth is enabled for ARCore.

  • Bug Fix: Fixed AR overlay occlusion rendering. All the AR passthrough material has POST_PROCESS_MATERIAL defined, but they're actually rendered at the end of the base pass. Since we cannot access SceneColor.A during the base pass, this change added an additional check against POST_PROCESS_AR_PASSTHROUGH when trying to access it.

  • Bug Fix: Add x64 architecture for HoloLens to fix packaging.

  • Bug Fix: No longer renders the depth target to MLGraphics in Zero Iteration. Only reallocate depth target if requested size matches the expected one. This workaround is required because this depth allocation function can receive requests for targets other than the one for eye stereo render (like when using a SceneCaptureComponent).

  • Bug Fix: Fixed a bug where the AR component visualization did not work when the ARActor was spawned locally on the client in a networked session. It is not necessary to set ARActor's owner to the player controller to get its RPC and replication working. In fact, setting the owner as the player controller confuses the networking logic when ARActor is spawned locally on the client. In particular, ServerUpdatePayload_Implementation is no longer triggered on the authoritative client, which breaks the callstack used for triggering visualization update.

  • Bug Fix: Call TriggerOnTrackableAddedDelegates until the AR component is first updated. This ensures that the UMRMeshComponent is created when the user code is triggered by the delegate.

  • Bug Fix: Changed ARKit to use the material-based method for camera image color space conversion and rendering. The material-based code path is enabled by MATERIAL_CAMERAIMAGE_CONVERSION=1 in the Build.cs file. The CIContext based method can still be enabled with MATERIAL_CAMERAIMAGE_CONVERSION=0, but it is mostly kept for testing purposes.

  • Bug Fix: Fixed a Vulkan validation layer error for missed layout transition on Magic Leap.

  • Bug Fix: Converted the ARKit camera texture to the correct rotation:

    • The color space conversion code now also takes the device rotation into account and corrects the output texture rotation automatically. This makes it a lot easier to consume the converted texture in other places of the engine.

    • As a result, you now only need two vertex buffers for rendering the camera overlay, instead of four. The need to rotate the camera image in the Remote Session plugin is also removed.

    • Bonus: fixed a bug in the AppleImageUtils plugin regarding Metal texture image rotation.

  • Bug Fix: Internal GC object is now used to make all the UObject used by FGoogleARCoreDevice GC aware.

  • Bug Fix: Fixed planes not working on consecutive VRPreview runs when using the AugmentedReality interface.

  • Bug Fix: Fixed the compilation on VS2019 without VS2017, and Azure Spatial Anchors on the emulator.

  • Bug Fix: Moved the Azure Spatial Anchors plugin code to a new directory. The Microsoft directory caused build problems for Android, so these plugins moved up into the AR directory. Their names are unchanged.

  • Bug Fix: Azure Spatial Anchors now calls SubmitManifest instead of UpdateManifest.

  • Bug Fix: Issues with OpenXR motion controllers were resolved:

    • If no profiles are bound, aim/grip will bind to the Khronos Simple Controller profile.

    • The SimpleController OpenXRExtensionPlugin replaced by the HandTracking and EyeTracking OpenXR Extension Plugins.

  • New: Azure Spatial Anchor support for ARKit on IOS is now available.

  • New: Azure Spatial Anchor support for ARCore on Android is now available.

  • New: OpenXR Hand Tracking support now available for both motion controller left/right and getting joint transforms via Blueprint.

  • New: Added the spatial anchor ARPins to the OpenXR plugin. This added an interface where an AR anchor implementation can be provided as OpenXRExtensionPlugin. It also makes OpenXRHMD an IARSystemSupport.

  • New: Support was added for selecting between grip and aim poses for controllers in the OpenXR plugin. New motion sources for grip and aim were also added. The default left and right are the same as the grip, with either hand able to use either grip.

  • New: The default OpenXR loader was updated to 1.0.9 to ensure that it works with all prerelease extensions.

  • New: Support was added for querying pose and velocity at time of an action trigger with OpenXR:

    • A custom event can now be bound to receive an OpenXR input action event, along with a timestamp. In the future, the core input system would likely provide a 64-bit timestamp that could be used for this purpose.

    • A HeadMountedDisplayFunctionLibrary function and IMotionController function were also added to get the controller pose and velocity data at a specific time. For some platforms this defaults to a cached value, but when possible it returns more information.

  • New: QR code tracking was added for OpenXR:

    • Interfaces were added for using QR code AR-tracked geometries in OpenXR. This does not add QR support out of the box; Microsoft has a plugin that implements an OpenXR extension, and uses this interface to implement the feature. The user needs that plugin or a similar plugin for the feature to be active.

    • Fixed std:c++17 and other build settings for HoloLens (used in Microsoft's OpenXR plugin).

  • New: Implemented the XR_MSFT_hand_interaction OpenXR extension in a plugin using the Microsoft extension, which allows hand tracking to act like a motion controller, providing grip and aim poses and two gesture-based, button-like inputs, Select and Grip.

  • New: OpenXR now has Eye Tracking support for XR_EXT_eye_gaze_interaction OpenXR extension:

    • This was hooked up for worldscale and trackingtoworldtransform.

    • A few additions to the IOpenXRExtensionPlugin were made to enable extensions that need to set up and consume XrActions.

  • New: OpenXR AR anchor persistence support:

    • Added an interface to IOpenXRExtensionPlugin for ARPin Local Store support.

    • An extension plugin can be created to provide support for storing a pin/anchor to device-supported storage, such as the device or user account.

    • This change does not provide an implementation.

  • New: The HoloLensAR module was moved from the HoloLensAR plugin to the WindowsMixedReality plugin:

    • The module provides AR feature support via Windows Mixed Reality APIs.

    • This removed the dependency of WindowsMixedRealityPlugin on the HoloLensAR plugin, as it was no longer needed.

    • HoloLens Remoting now works with only the WindowsMixedReality plugin enabled. The HoloLensAR plugin is required for HoloLens device packaging with either WindowsMixedReality or OpenXR, but WindowsMixedReality HMDs do not require the HoloLensAR plugin.

    • UE4 code operates mainly at the module level, not the plugin level, so this change is unlikely to require code changes, but it might leave third-party plugins with unnecessary dependencies on the HoloLensAR plugin.

  • New: Adds support for ARTrackedGeometry to OpenXR. This infrastructure supports other OpenXR extension features.

  • New: Support for selecting between grip and aim poses for motion controllers now provides a way to hook up aim and grip to the legacy left EControllerHand so that these motion sources will work even on old content or code.

  • New: Image-tracking integration was refactored to fix a number of issues, and to allow users to select an image target orientation format:

    • FMagicLeapImageTrackerTarget was split into FMagicLeapImageTargetSettings and FMagicLeapImageTargetState.

    • The module/runnable integration was made into an on-request polling API for the image target state and transform. This means that it no longer queries the target state on its own in a tick, but provides a func for someone else to poll (in this case the ImageTrackerComponent). Because of this, the module/runnable also does not fire the target found/lost events. This is now the responsibility of the component itself, so it can manage the sequence of transform updates and delegate broadcasts. This design now fixes the bug where the target found event was fired before the transform of the component was updated.

    • The mutex locks were limited to the minimum possible scope, which fixed some bugs with potential nested mutex lock calls.

    • Some Blueprint function library getters have been marked as BlueprintPure.

    • The MagicLeapAR integration for image tracking was updated in accordance with the rework of the MagicLeapImageTracker module.

    • All image tracker-related code was moved (adding candidate images) into FLuminARImageTracker.

    • Unreliable pose updates in FLuminARImageTracker have been accounted for and corrected.

    • Tracker creation is now delayed until the first candidate image is added when using MagicLeapAR.

    • Fixed a bug in MagicLeapRunnable that caused CompletedTasks to never be reported on non-Lumin platforms. This was causing OnSetImageTarget delegates to never be called, and subsequently, the MagicLeapAR integration to never work for image tracking.

    • The AugmentedReality interface reports orientation for images tracked via ARKit and ARCore with Up (Z) axis as the normal, whereas on Lumin we report the Forward (X) axis as the normal. Added the option for devs to choose which orientation they want their image target transforms to be reported in.

  • New: Content bindings (friendly name and MagicLeapARPin ID combo) are saved and a callback is fired when MagicLeapARPins are found. Save and load game operations are now async in the MagicLeapARPin implementations. Added missing files from previous changelist.

  • New: Added support for ARSession mesh config properties in MagicLeapAR.

  • New: Updated Magic Leap SDK to 0.24.

  • New: Implemented MagicLeapARPin To/From string parsing helpers, which implement how the conversion is expected by the platform.

  • New: Implemented MagicLeapARPin query filters, exposed pin types, fixed actor restoration when using the MagicLeapARPinComponent, and defined functional use cases in the API.

  • New: Added an account for the listen server in MagicLeapSharedWorldGameMode. In a listen server, one of the clients was also the server; that client returned true for IsLocalController(), causing the condition in MagicLeapSharedWorldGameMode::Tick() to fail, which then caused the client to never contribute any PCFs. Since a PlayerController only exists for clients, local or remote, and the GameMode instance only exists on the server, we now do not need to check for anything—authority, role, remote role, or net mode. If it is a PlayerController, we expect PCFs from it.

  • New: Provides the ability to run code analysis on HoloLens builds.

  • New: HoloLens Media Player plugin support is now available.

  • New: Added new privilege types available with Magic Leap SDK 0.24.

  • New: Added a HoloLens Remoting option to listen on a known port for connections.

  • New: Added D3D12 support for HoloLens 2 via OpenXR.

  • New: HoloLens will now only go immersive if bStartInVR is enabled.

  • New: Added a show-and-hide HoloLens system keyboard.

  • New: Added Dynamic Fixed Foveated Rendering on Quest.

  • New: Added Quest 2 support for adding Quest2 device type and manifest generation.

  • New: Updated OVRPlugin to version 1.49.

  • New: Added an interaction profile support to the upcoming HP Reverb G2 controllers for developers who wish to natively target the new button and axis mappings (a,b,x,y buttons/analog grip).

  • New: The Oculus Widget update included disabling mobile shader options to reduce shader permutations, and iteration through ULightComponentBase objects instead of ULightComponent so skylights will also be recommended to be set as static.

  • New: Updated the OVRPlugin to v19 (1.51).

  • New: Upgraded the Oculus plugin to 1.47. This also deprecates some old APIs (deprecated ZED camera device was removed, and Touchpad input was deprecated).

  • New: Updated the Oculus Platform Tools panel.

  • New: Unreal Insights has been enabled for HoloLens.

  • New: Support for OpenXR AR webcam capture support was added.

  • New: Depth composition on HoloLens when using OpenXR is now enabled.

  • New: Updated the HP Motion Controller and SteamVR so they would work with each other: Squeeze Action was renamed to Grip to work with SteamVR mappings, HP Controller was added to the list of devices looking for an x and y button, and the plugin was renamed HPMotionController.

  • New: The AR Pin/Anchor local store was refactored to create a cross platform-compatible API for Anchor Local Store in ARBlueprintLibrary. On the supported platform (currently Windows Mixed Reality and HoloLens) you can save an anchor to the Local Store or load them from it by a string key. This supersedes the old Named Pin system, which saved anchors to the store by pin name, because not all platforms have pin names. Some of the Blueprint API is being automatically transformed by redirect. Other functions that need more content work were deprecated.

  • New: Scene Understanding support in OpenXR AR makes DirectX12 the default for HoloLens OpenXR rendering Expose OnLineTraceTrackedObjects to OpenXRExtensionPlugins.

  • New: Added an OpenXR Hand Tracking extension plugin.

  • New: Added support for Instanced Stereo Rendering to Niagara VFX.

  • New: The OpenXR plugin can now be extended using Extension plugins.

  • New: There is now a unified code path for rendering the passthrough camera on handheld AR platforms:

    • The engine lacked a generic and unified code path for rendering the passthrough camera background, or onto occlusion mesh that users could add to the level. Previously each AR platform had its own way of rendering the passthrough camera, which usually involved different UV setups and custom materials.

    • We have now unified the pattern by using several standard materials in the ARUtilities plugin. These materials reply on the Map AR Passthrough Camera UVs node to map from normalized UV to a suitable one for a particular view/texture size combination.

    • Most of the custom materials from the ARKit, ARCore and remote session plugins have been removed due to the use of standard materials. The custom material expressions are also flagged as deprecated.

    • For rendering the passthrough camera onto a user defined occlusion mesh, there is a helper—UPassthroughMaterialUpdateComponent—that makes things easier. It handles picking the correct passthrough material based on the camera texture type, as well as updating the texture parameter in the tick, both of which are required for ARCore.

  • New: Added support for HoloLens 2 to the OpenXR plugin.

  • New: Integrated the Depth API for ARCore 1.18:

    • The new Depth API can be enabled by using EARSessionTrackingFeature::SceneDepth on the AR Session Config object.

    • The user can query if the feature is supported via IsSessionTrackingFeatureSupported.

    • If supported and enabled, the engine will create a R32F texture, holding the depth map data from ARCore.

    • The data in this texture is the depth of the environment with regard to the camera, in millimeters.

  • New: There's a CVAR controlling debug rendering of the depth map:

    • arcore.DebugOverlayMode=1: shows the raw value of the depth map, in meters.

    • arcore.DebugOverlayMode=2: shows a coloration of the value in the depth map.

    • To access the depth map, users can use GetARTexture from UARBlueprintLibrary.

    • Currently, occlusion rendering is disabled for ARCore as there is a bug about accessing the scene depth in the occlusion material; hopefully this can be fixed in a later change.

  • New: Removed beta tags on WindowsMixedReality and HoloLens plugins; both plugins are now production ready.

  • New: Added support for the hand pointer pose in input simulation

  • New: Basic stats pass for ARCore's frame update code path.

  • New: Replaced custom APIs in the ARCore plugin with a generic interface class for AR dependency and permission handling. Users should now call UARDependencyHandler::GetARDependencyHandler() to get a handler object, with which they can perform several tasks related to dependency and permission management. On platforms that don't support explicit dependency management, a nullptr will be returned.

  • New: Added support for the standard onboarding UX from ARKit 3.0. This feature is enabled by bUseStandardOnboardingUX from the session config object. For devices supporting ARKit 3.0 and above, the ARKit plugin will create a FARKitCoachingOverlay object managing the ARCoachingOverlayView, which is added to the root view of the application. Note that it is not easy for the overlay to show up, and there is no way to configure its sensitivity. The easiest way is to start the session with the camera covered and wait for ~10s.

  • New: Fixed a bug in Windows Mixed Reality when using a SpatialStageFrameOfReference where camera height decreases when tracking is lost. Context: The stage frame of reference is at the floor—used by VR. The stationary frame of reference is at eye-level—used by HoloLens The attached frame of reference is also at eye-level—used for 3DOF fallback. When falling back to 3DOF, the expected transform to use was the last known transform between the tracking coordinate system and the attached coordinate system. However, we were accidentally creating new variables with the same name in a different scope, so an identity transform was being used instead. Since the stationary and attached frames of reference are both at the same height, HoloLens was not affected by this bug, but VR devices with valid stages were.

  • Bug Fixes: Various fixes for Magic Leap hand meshing:

    • Removed explicit caching and resending of the current mesh data. This is not required because MRMesh keeps a local cache of the current data to be rendered. We only need to send new data when we want to update the mesh.

    • Fixed flickering caused by garbage data being used for the bounds in a frustum/bounds visibility check. The data was garbage because it was never supplied. A box is now supplied based on the HMD position and orientation.

    • Fixed the vertex normal calculation for Magic Leap hand meshing (using incorrect normals was crashing on low poly meshes). Generates normals by adding the normal of each triangle that a vertex is part of, then normalizes the result (this is done during tangent generation to remove the need to add a separate iteration over the mesh just to do normalization). If triangle weights should be used for this, multiply the normal by the area of the triangle first. Add a Blueprint callable to set whether to use triangle weights when calculating the vertex normals. False by default, as this is slightly more expensive and doesn't have a huge impact.

    • Note: The order of the cross product in FMagicLeapMeshTracker::GetResult has been intentionally swapped to account for the left handed coordinate system of Unreal. One-sided materials should work on the hands now (a previous change to the hand mesh winding only seemed to work because the normals were not correct at that time).

  • New: Added support for multiple tracked faces with ARKit 3.0:

    • Use UARBlueprintLibrary::GetNumberOfTrackedFacesSupported to query the number of supported tracked faces on the device.

    • Use UARSessionConfig::MaxNumberOfTrackedFaces to specify the number of tracked faces to request. Right now no device supports more than three tracked faces.

    • If multiple faces are tracked, each one will be assigned an unique Live Link subject name, based on UAppleARKitSettings:

      • DefaultFaceTrackingLiveLinkSubjectName: #1:

      • DefaultFaceTrackingLiveLinkSubjectName #2:

      • DefaultFaceTrackingLiveLinkSubjectName-1 #3:

      • DefaultFaceTrackingLiveLinkSubjectName-2

  • New: Support was added for the smoothed scene depth data introduced in iOS 14 beta 5.

  • Deprecated: HoloLens 1 Remoting is now deprecated, and will be removed entirely in UE5.

  • Deprecated: Deleted the deprecated MagicLeapScreens plugin.

  • Deprecated: Deprecated the HoloLens 2 virtual keyboard show/hide methods; these were replaced by some virtual keyboard functionality improvements.

  • Deprecated: GearVR has been deprecated.

  • Deprecated: Oculus Go and 3DoF have been deprecated.

  • Deprecated: Mobile Multi-View Direct is now the default multi-view mode.

  • Deprecated: Deprecated UGoogleARCoreFaceMeshComponent:

    • Improved the implementation of UARFaceComponent so that it has all the functionality of UGoogleARCoreFaceMeshComponent, and deprecated the latter.

    • Fixed a problem where the ARKit face tracking integration did not upload the UV info to UARFaceGeometry.

    • Allowed additional vertex data to be uploaded to UMRMeshComponent via the UpdateMesh API, which is now used for uploading the vertex normal for the face mesh from ARKit/ARCore.

  • Deprecated: Deprecated individual GetAllTrackedXXX APIs in favor of a generic API: GetAllGeometriesByClass.

  • Deprecated: GetUpdatedAugmentedFaces was deprecated in favor of GetAllGeometriesByClass.

  • Deprecated: Removed the BlueprintSpawnableComponent flag from the deprecated ARCore actor components so that they can no longer be used in Blueprints.


  • Crash Fix: Fixed out-of-order destruction crashes with the Oculus Avatar plugin.

  • Bug Fix: Fixed warnings when exiting VR mode.

  • Bug Fix: Added SteamVR Input JSON manifests as part of packaging. This fixes manifests not being packaged on Blueprint-only projects.

  • Bug Fix: Fixed an issue in Oculus for a VAO overwrite issue causing black screen on Quest in OpenGL.

  • Bug Fix: Fixed an out-of-date view uniform buffer for selection rendering post-process (broken selection highlights in VRMode).

  • Bug Fix: Disabled the selection outline for VRMode to avoid rendering artifacts.

  • Bug Fix: Fixed an initial button repeat delay being ignored on the Oculus Touch. Fixed cross and triangle buttons being swapped on PS Move controllers.

  • Bug Fix: More optimal handling of scene capture and reflection capture when in VR Mode (using Grow rather than resize in cases where it makes sense).

  • Bug Fix: Changed the OVRPlugin library linking to explicit from implicit, so the module is not loaded on platforms that do not use it. This avoids linking errors on various versions on Android, as well as some runtime errors—but still works on Quest and desktop.

  • Bug Fix: Removed invalid Valve Index Grip Click and Trackpad Click controller keys.

  • Bug Fix: Fixed incorrect base pose caching in SteamVR Input module.

  • Bug Fix: VR devices are no longer initialized when the project launcher is opened if a project is not loaded.

  • Bug Fix: Warnings have been made more friendly for missing OVR DLLs.

  • Bug Fix: The selected Oculus audio DeviceId now passes to XAudio2. This fixes the case where it passed null, forcing the application to use the Windows default device, which would disable the functionality of allowing a VR headset to choose its preferred audio device.

  • Bug Fix: Fixed a bug in Vulkan Multiview: there was a case where a texture array would get the Depth attribute copied under NumLayers where depth should be 1, and numLayers 2 (for a multiview texture for example).

  • Bug Fix: Fixed SingleEyeLetterboxed mode in Spectator Screen for Oculus. The issue was that Oculus was setting the viewport with RHICmdList.SetViewport(DstRect.Min.X, DstRect.Min.Y, 0.0f, MipViewportWidth, MipViewportHeight, 1.0f); this was incorrect since the 4th and 5th parameters are supposed to be max X and Y (not width and height). This worked in most modes since Min.X and Min.Y are usually 0. In this mode, Min.X was non-zero which exposed the bug.

  • Bug Fix: Fixed the long timeout hitch when calling Enable/Disable HMD for Oculus headsets.

  • Bug Fix: Vulkan Submit for HMDs (which do not use swapchains) was causing assert on negative array index. This has been fixed.

  • Removed: The Oculus Avatars plugin has been removed.

  • New: Added Mobile Multi-View support for Hololens using instancing.

  • New: Added Oculus Quest platform support to OpenXR.


  • Crash Fix: Fixed a crash from the FDMXBuffer shared pointer getting destroyed when used among different threads.

  • Bug Fix: Fixed a double channel component in DMX Fixtures, and added a gobo spin component.

  • Bug Fix: For DMX Fixtures:

    • Resolved an initial state issue

    • Added strobe burst and sine wave effects

    • Matrix beam is now proportional to the matrix

    • Fixed Moving Mirror tilt rotation to always look down

  • Bug Fix: Fixed DMX Fixtures to ensure that texture resource is not null.

  • Bug Fix: DMX: Fixed reimport conflict.

  • Bug Fix: Fixed water fountain BP logic in DMXFixtures.

  • Bug Fix: The DMXFixtures lens is now modulated by intensity and color to avoid "glow in the dark", fixed the color disk to avoid desaturation, recompiled fireworks emitters and PS, set new default attributes for FW/pyro/water/laser, inverted zoom values, fixed color inconsistency between beam and light, and updated disk bake tool to output textures with needed settings

  • Bug Fix: DMXFixtures has had fireworks debug prints removed, and max light distance for beam mesh fixed.

  • Bug Fix: Fixed a DMXFixtures issue with lens effect and black color.

  • Bug Fix: DMXFixtures has a fixed beam scaling issue.

  • Bug Fix: DMXFixtures no longer have interpolation divergence between PIE and standalone.

  • Bug Fix: Upgraded the SendDMX subsystem function with arguments instead of functions.

  • Bug Fix: A DMX fix was made for references to Entities in a duplicated library so that they are no longer lost after restarting the editor.

  • Bug Fix: DMXFixtures has a fix for dynamic occlusion and a tweaked zoom component.

  • Bug Fix: DMX fixtures now return to their default state after Play in Editor.

  • Bug Fix: Fixed building issues with the collision in DMXFixtures, and added a check to make sure dynamic materials exist at init time.

  • Bug Fix: Added beam visibility options on all light fixtures in DMXFixtures, and tweaked the WashLED fixture (the lens is back and disabled pointlight).

  • Bug Fix: Tweaked lens materials in DMXFixtures to get a shiny look. This now supports a normal map. Disable light and beam visibility when lights are off.

  • Bug Fix: Get All Fixtures of Type node now has dropdowns for selecting a DMX Library asset and its Fixture Types. This replaces a previous custom node that was deleted.

  • Bug Fix: A DMX fix handled an issue where Fixture Patches copied into a different library asset with several Parent Types will no longer be pasted with the same Parent Type.

  • Bug Fix: DMX fixes for Controller updates to valid universes when created. Patches on default Universe 1 now display as assigned.

  • Bug Fix: DMX Bug Fix: SNameListPicker selected value on the dropdown menu is no longer incorrect after changing the property it represents through means other than the dropdown itself.

  • Bug Fix: Renamed SendDMX and SendDMXRaw map parameters to clarify their intent.

  • New: For DMX Fixtures, added Laser with DMX, changed the format of few Gobo textures, fixed the format of lavender texture, and resaved all assets.

  • New: Upgraded visuals and optimized performance in DMX Fixtures.

  • New: Streamlined pyro/water/fireworks Blueprints and FX in DMX Fixtures.

  • New: Fixed the matrix Blueprints for DMX Fixtures, and updated the matrix beam.

  • New: For DMX Fixtures:

    • Switched fixtures materials to metallic, updated strobe mesh

    • Set the default intensity of light fixtures to 2000cd (approximately 25000 lumens)

    • Fixed beam falloff since it was too strong

  • New: Updated water fountain for DMX Fixtures, and added a few new components.

  • New: For DMX Fixtures, switched pyro sim to the CPU for now so they show up, updated light intensity in materials, and updated the function category in matrix fixtures.

  • New: Added DMX Fixture Assets.

  • New: DMX now has a custom Sequencer Track for animating Fixture Patch function values.

  • New: DMXEngine, DMXFixtures, DMXProtocol are no longer experimental!

  • New: A DMX Fixture Patch Editor now visualizes its Fixture Patches, and allows for drag and drop for patches.

  • New: You can now use live render target texture data to drive DMX fixtures or low resolution LED panels and devices. Each pixel represents a DMX fixture.

  • New: Refresh Rate for incoming and outcoming DMX has been implemented.

  • New: Added an AddOrCreateUniverse into the IDMXProtocol API.

  • New: DMX now has a DMX Library Take Recorder Source.

  • New: DMX now supports Take Recorder and Sequencer for the new Attribute System.

  • New: FDMXProtocolName and FDMXFixtureCategory Name properties are now exposed to Blueprints.

  • New: The DMX Library asset now has its own category in the Asset Creation menu.

  • New: In the DMX attribute system, a search box was added on SNameListPicker for when the list has more than 15 values.

  • New: For DMX GDTF file import, a function's address span is computed from the actual addresses described on the Offset values of the imported functions. The functions' initial address are kept by computing their address offsets when needed.

  • New: DMX Libraries are now available without loading them explicitly.

  • New: DMX has experimental support for ETC consoles.

  • New: DMX has an initial implementation of the Attribute system for Fixture Functions names that can be easily referenced on Blueprints and other related systems.

  • New: Store DMX Input monitor console Protocol and Universe ID on .ini files.

  • New: There are new tools for collecting data about DMX for profiling and debugging, similar to other stat tools in Unreal Engine such as STAT FPS. These are console commands that display debug information or allow a user to query the currently connected fixtures and controllers.

  • New: DMX now has the correct naming of duplicated and copy-pasted Fixture Patches.

  • New: The DMX Attribute system now has Blueprint nodes that access DMX values through Attributes.

Programming Notes

  • Bug Fix: The AutoDestroy Subsystem will now tick only if the outer object exists and is not marked for destruction.

  • Bug Fix: Fixed usage of SCOPED_NAMED_EVENT and TRACE_CPUPROFILER_EVENT_SCOPE in various places. It avoids scope event names to get additional quotes. Also avoids the overhead of using macros with dynamic string as scope name where not necessary.

  • Bug Fix: Fixed usage of TRACE_CPUPROFILER_EVENT_SCOPE macro (to avoid adding extra quotes to named events).

  • Bug Fix: Fixed a crash due to uninitialized UVChannelData which could occur when adding a new material on a static mesh at runtime.

  • New: Added a Viewport Status subsystem which supports a more extensible API for displaying messages like "LIGHTING NEEDS TO BE REBUILT".

  • New: Added the third-party tool Cruncher Sharp to Engine/Extras/ThirdPartyNotUE.

  • New: Added horizontal drag and drop support for STableRow.

  • New: UHT now supports int64 properties marked as ExposeOnSpawn.

  • New: Implemented a GetDistanceAlongSplineAtSplineInputKey function on the Spline Component.

  • Improvement: Optimized TSet::Empty to avoid the pathological case where the hash size is large but there are not many elements in the hash. This is mainly used when marking and unmarking objects, such as during package saving and other archives tagging objects, but also in several cases all over the engine.

  • Improvement: UWorldSubsystem::GetWorld is now marked as final.

  • Improvement: Decreased the time it takes to discover game projects in the coding environment.

  • Deprecated: In MeshDescription, when accessing mesh attributes, TMeshAttributesView<> has now been deprecated. TMeshAttributesRef<> should be used instead.

Upgrade Notes


  • API Change: Renamed core FBlueprintExceptionTracker to FBlueprintContextTracker, moved it to Script.h, and added access protection for members. Deprecated global core delegate OnScriptExecutionEnd; moved it and entered a new context callback into FBlueprintContextTracker.


  • Upgrade Notes: FMath::Clamp now has UE_NODISCARD; its return value must be used.


  • API Change: Decoupled the timing element of the PlayTo, ScrubTo, and JumpTo families of functions from their core operations. Now, users call SetPlaybackPosition to establish the time (in frames, seconds, or marked frames) at which operations should take place. The user then calls the new PlayTo, ScrubTo, or JumpTo function to perform the appropriate operation.

  • API Change: The UMovieSceneTrack::OnSectionMoved method has gained a parameter struct, which gives information about the section movement.


  • Upgrade Notes: NetworkDriver.cpp has been renamed to NetDriver.cpp to be consistent with class name and coding standards. Any custom code changes to NetworkDriver.cpp must also be moved or merged into NetDriver.cpp.


  • Upgrade Notes: Following a Social Platform Descriptions refactor in FUserPlatform, any user extension of FUserPlatform needs to be updated.

  • Upgrade Notes: Code releasing IVoiceChatUser instances with the delete keyword should instead call IVoiceChat::ReleaseUser.

  • New: HTTP Server Improvements

    • Listeners can be configured on a per-port basis via [HTTPServer.Listeners] config section

    • Fixed issue where HTTPListener::Tick() could be called after the underlying connection has been closed

    • Fixed unnecessary HTTPListener warning re: send buffer size

  • Upgrade Notes: HTTPListener instances now default bind to the loopback ethernet interface; users who wish to listen via an external ethernet interface must explicitly do so via the newly available configuration section [HTTPServer.Listeners]

  • Upgrade Notes: Any code that uses TSharedRef and TSharedPtr will need to be updated to use TSharedRef and TSharedPtr or FHttpRequestRef and FHttpRequestPtr.


  • Upgrade Notes: If the results of a cloth simulation on a SkeletalMeshComponent are used on the game thread for any purpose, you must now set bWaitForParallelClothTask on the USkeletalMeshComponent.


  • Upgrade Notes:Any implementation of NetworkConnectivityClient.Listener will need to update the onNetworkAvailable callback to include the NetworkTransportType, a new Enum added to the NetworkConnectivityClient. Network transport types can be one of the following:

    • Wifi

    • Vpn

    • Ethernet

    • Cellular

    • Bluetooth

    • Unknown (other)

  • Upgrade Notes: The "Disable Flip Copy GLES" flag has reversed its meaning since the previous release due to a bug fix.


  • Upgrade Notes: The new "cast contact shadow" flag defaults to true, so behavior should match previous versions in any cases where meshes have the "cast shadows" flag enabled. If the old behavior where contact shadows are cast for all objects (even if either flag is set to false) is desired, set the CVar "r.ContactShadows.NonShadowCastingIntensity" to 1.

  • Upgrade Notes: The default of r.ViewTextureMipBias.Min is now -2.0 for texture quality when temporally upscaling with a ScreenPercentage greater than 50%. To maintain backward compatibility, projects that use temporal upsampling (r.TemporalAA.Upsampling=1) without overriding this cvar that might affect should set r.ViewTextureMipBias.Min=-1 in DefaultEngine.ini.


  • Upgrade Notes: Blueprints will warn that ConfigSession is deprecated and should be replaced by ConfigSession2.

  • Upgrade Notes: Removed XR's MRMesh hard reference to WireframeMaterial.uexp, which prevents it being pulled into packaged projects that don't use it. Users of MRMesh should set a wireframe material if they want one. We fall back to UMaterial::GetDefaultMaterial(MD_Surface) if nothing sets one.

  • Upgrade Notes: Renamed CreateCloudAnchor to ConstructCloudAnchor to better fit microsoft docs. A redirector will fix up existing content.

Known Issues

For a complete listing of known issues affecting Unreal Engine 4.26, please see the Unreal Engine Public Issue Tracker.

Help shape the future of Unreal Engine documentation! Tell us how we're doing so we can serve you better.
Take our survey