What's New?
Unreal Engine 5.4 brings further improvement to the core UE5 toolset. This release delivers improvements in a wide variety of areas, including Rendering, Worldbuilding, Procedural Content Generation (PCG), Animation and Modeling tools, Virtual Production, Simulation, and more.
This release includes improvements submitted by our community of Unreal Engine developers on GitHub. Thank you to each of these contributors to Unreal Engine 5.4:
AGTomasz, alasher, amuTBKT, aschulz90, AtariDreams, avudnez, batlam987, BenVlodgi, berry0511, BigBirdSDP, BinaerBoy, BioXide, BlueMountainsIO, bovesan, brasky, bstegerESRI, ChetRippo, DannyGoodayle, DanteSSS333, dclyde-brg, DecoyRS, devhyper, disseminate, djbozkosz, djethernet1, DomCurry, dorgonman, DoubleDeez, dpull, DreamSworK, duyaokun, dyanikoglu, EchoRed-3D, erebel55, ericdrobinson, Eyesiah, f3db43f4g443, fahhem, FattyMieo, FlyAndNotDown, foobit, fpwong, gameltb, gaspardpetit, gaurang-ingale, geordiemhall, GregB-WG, Gusten, hcarrikerriot, hellokenlee, hnrqbaggio, hooni7440, igor-kondratiev, ilkeraktug, ill, intvoker, JakubZbikowski, jamespark-unreal, jeremywhite2k, jiaqiaoyou, jkorpian, jorgenpt, juliancao, Jungle178, Kalmalyzer, KaosSpectrum, KarimLUCCIN, karlingen, kdada, kdbn, KeithRare, kissSimple, klukule, KristofMorva, kyoilkim, ldisthebest, LennardF1989, lightbringer, Lithel, lolisia, losjun, LtRandolph, MagForceSeven, MalikuMane, MarcoAltomonteMilestone, MarcusSvensson92, MartinWickhamFB, mastercoms, Maxime, obinot, meglinge, midgen, MihailPreis, Mystfit, najmm01, nchapmantimberline, negril, nickdarnell, originomeg, PhDittmann, phebert74, phisko, PICO-XR, pierricgimmig, projectgheist, Promesis, psketi, RandomInEqualities, Rideron85, RiotJoshuaGlazer, Ronsenval, rqgbx, RVillani, saim80, sapayne, scahp, shchavinskyi, Sigma-Erebus, slonopotamus, splatxman, SRombauts, SungJJinKang, sunluchang, Szmyk, TaaviVarjo, Tanc-ANT, teddemunnik, tehpola, thomasvanta, thraidh, tilongzs, tmcguire-meta, tnam, TroutZhang, Vaei, Victov, vorixo, wouter140, wwKevinS, Xertor, xuelongmu, zenoengine, zgrapher, zhaojunmeng
Character and Animation
Extensibility for Animation Authoring Tools

This feature provides further extensibility within the Blueprint/Python APIs for users to create customizable tools for animation authoring.
- Better Selection Scripting - you can grab selected keyframes and edit the selection of objects within Sequencer.
Layered Control Rigs

We have a new Layered Control Rig system which lets you use all the power of Control Rigs on top of many workflows, without the need to bake the data down to edit the characters, which can be destructive.
Animation Authoring

New Gizmos
This update introduces redesigned gizmos for translation, rotation, and scale that provide a familiar and intuitive interface for posing and animation.
-
An improved look and style.
-
Proper indirect manipulation.
-
An improved arcball.
-
A Parent Space option in Viewport while posing. We previously only had World and Local options available.
Constraints 2.0
We have rewritten much of our constraint system to better handle level sequence workflows.
-
Animated Constraints are now fully stored in the Level Sequence.
-
Improved the evaluation engine to better support more constraint setups without causing cycles.
-
Worked on the UX to improve the tool while using it.
Anim Details 2.0 / Channel Box (mockup)
We overhauled the animation channel box to provide an experience more familiar to users of other popular DCC tools.
Post Retarget Phase

We added a new Retarget Phase that handles a set of operations after the retargeted result from IK Retargeter. These operations are applied in a stack order that aims to resolve retarget problems that are challenging or cannot be fully solved by FK Retarget Chain Maps or Full Body IK Retargeting.
This provides for proper assignment IK bones to match either the source animation or retargeted result, root motion generation on the retargeted animation, and animation curve remapping.
Sequencer Readability
Create a more appealing experience in the cinematic space, to broaden and enhance the wide audience of users, providing the means to create faster, better, and more complex cinematic experiences.
-
Outliner Columns for Track States - The left hand side of the Sequencer Hierarchy Tree now includes new columns for users to see and access the Pin/Mute/Lock/Solo states of tracks with icons.
-
Keyframe Status Indicators - The keyframe icon for animatable properties now changes based on the current keyframe status of the property while working in Sequencer. Users can easily tell if a property is keyed, not keyed, partially keyed, or modified.
-
Sequencer Tree Look and Color Improvements - Provides a major change to the look and color of the Sequencer Tree to make it easier to view the contents within the Sequencer Tree.
Expansion of Animating Materials in Sequencer
We expanded authoring material animations in Sequencer with support for Layered Material Parameters, Overlay Materials, Volumetric Cloud Components, and Custom Primitive Data Support. Materials Slots are now referenced from the Slot Names rather than indices, and can be rebounded within Sequencer on any mesh component update.
This expansion completes providing the means for users to create any material-based animation within Sequencer.
Binding Lifetime Track

In order to determine when an object is bound in Sequencer, there is now a new track for all bindings called the Binding Lifetime track. Users can add additional sections to determine the portions in time in which Sequencer has control over the bounded object.
For in-game cinematics, this helps determine if gameplay or Sequencer has control over a dynamic object, such as the player character.
Modular Control Rig (Experimental)
Modular Control Rig uses the entire framework of Control Rig for building robust animation rigs that are ready to be animated on any skeleton instantly.
Tools to Rig with Modules
-
New Modular Rig asset and editor.
-
New Visual Schematic for immediate feedback in the viewport.
-
Includes a native Library of modules.
Tools to Author Modules:
-
Convert any control rig into a Module instantly.
-
Create connectors and sockets to connect modules together..
-
The new Connector Event automates connections between modules.
-
Add metadata to modules with Get/Set Metadata nodes.
-
Pre/Post Forwards Solve events allow rig logic between modules.
Deformer Graph Libraries (Beta)
Enables deformer graphs to be functionalized. Deformers can be encapsulated into functions and chained together to create new deformation schemes. This greatly simplifies the deformer graph, and allows you to mix and match pre-built deformers from a Deformer Library to create custom deformation schemes for your animation.
-
Loop over deformer nodes.
-
Collapse graphs and create functions.
-
Deformer Function Library (Beta).
- Linear Blend Skinning, DQ Skinning, Bend, Twist, Squash & Stretch, Flare, Twist, and Lattice.
Skeletal Editor (Beta)

Expand Component Editing - Easier editing and selection of per-vertex bones and weights.
-
Component Editor
-
Component Snapping for Bones (vertexes, faces, edges).
-
Additional component selection schemes.
-
Generate PolyGroups and Paint PolyGroups now have Quad mesh display
Animation Insights - Create bones and weights in context to your animation.
-
Transform bones while painting.
-
Propagate bone changes to referenced animations.
Characterization - Further simplify bone and weight creation tools by providing improved starting points and helpful defaults.
- Copy / Paste / Duplicate bones
Control Rig Direct Manipulation

Direct Manipulation enables easier interaction with rig elements directly in the Viewport. This also includes many quality of life improvements to interfacing with the Control Rig editor.
Visually pose rig elements (controls, bones, nulls) in the Viewport and update values in the graph for implemented nodes.
- Select nodes in the graph and use T,R,S hotkeys for immediate interaction in the viewport.
Quality of life improvements around manipulation.
-
Marquee Selection is enabled.
-
You can now swap Control Rigs on the Control Rig AnimBP node.
-
You can attach AnimBP functions to a Control Rig AnimBP node.
-
You can now profile functions.
-
Profile stats display directly in the graph.
-
Profile is now a rolling average of frames for more accurate feedback.
-
Isolate profiling by selecting graph nodes.
-
Metadata nodes are 20% faster
-
Rig Hierarchy uses less memory.
Automatic Animation Retargeting for Bipedal Characters

This workflow will make animation retargeting for common bipedal skeletons more accessible and consistent inside Unreal Engine.
For common bipedal skeletons, Retarget Chain Creation and Full Body IK setup are now fully automated with a click of a button. In the Retargeter, new Pose Alignment tools provide better matching between the Source and Target for Retargeting.
A new simple dialog that combines the automation processes provides for either a quick batch retarget or the generation of the automated assets for additional editing.
Choosers and Proxy Tables (Beta)

Choosers and Proxy Tables offer a framework for selecting animations for playback based on game context, without having to write complex logics. These features are now in Beta with Unreal Engine 5.4.
Motion Matching

Motion Matching becomes Production Ready in Unreal Engine 5.4. It ships with a suite of tools offering animator-centric workflows for gameplay animation. We validated Unreal Engine's Motion Matching on Fortnite Chapter 5, shipping on all platforms thanks to the scalability of the system and running on all 100 player characters as well as the NPCs.
Rendering
Neural Network Engine

There is an increasing demand for neural network applications both in-editor and in-game, and on the CPU as well as on the GPU. The neural network inference engine in UE allows developers to load and efficiently run their pre-trained neural network models. NNE addresses these disparate needs by providing a common API - analogous to the existing RHI layer - which allows easy swapping of backends depending on the particular needs of each application.
Exemplar use cases include tooling, animation, rendering, and physics, where each individual use case may have different needs in terms of platform and model support. There are dozens of different ML backends and it is not practical to implement them all, so we provide extensibility hooks which allow external developers to implement the NNE interface in a plug-in providing their own runtime.
For more information, see Neural Network Engine.
Nanite - Tessellation (Experimental)

Dynamic programmable displacement provides a way to modify Nanite meshes at runtime using a displacement map or procedural material. Unlike World Position Offset which can only operate on the original mesh vertices, Nanite displacement tessellates the mesh at runtime into additional triangles to conform to the detail of the displacement map. Nanite only generates as much triangle detail as required for the current pixel density.
Benefits include:
-
The ability to use lighter source meshes in the authoring pipeline.
-
Material-driven and animated displacement.
-
Creating detailed Nanite landscapes.
For more information, see Nanite Virtualized Geometry.
Nanite - Optimized Shading

Nanite Compute-Based Shading is a long-term project focused on moving Nanite materials from traditional raster shading over to compute shaders for a number of optimization and new-feature opportunities, in addition to making it possible to clean up a lot of complex code required for the raster approach.
The ultimate goal is to fully replace the pixel shader path in its entirety, offering increased performance on both CPU and GPU, improve code maintainability, and also make it possible to implement advanced Nanite material functionality that would not be otherwise possible.
For more information, see Nanite Virtualized Geometry.
Nanite - Spline Mesh

Spline meshes are used for deforming static meshes along the shape of a spline, for example to model roads over landscape terrain. Spline meshes remain a significant missing piece as scenes in UE trend towards using Nanite for more and more scene content, especially for improved Lumen and Virtual Shadow Map performance.
Support for Nanite spline meshes was released as Experimental in UE 5.3. Remaining work includes performance and memory optimizations, preventing cracks, and fixing up areas such as level streaming and transform caching.
For more information, see Nanite Virtualized Geometry.
Orthographic Camera Rendering (Beta)

Orthographic rendering is a very common way to visualize projects in architecture and manufacturing, and is also used in games as a stylistic camera choice. In Unreal 5.4, orthographic rendering has reached Beta status. Most aspects of the deferred render are now supported, but there may be edge cases which have not yet been carefully vetted.
Areas of remaining work to achieve Product Ready status include:
-
AO
-
Decals
-
Volumetrics
For more information, see Orthographic Camera.
Temporal Super Resolution

Temporal Super Resolution is UE's built-in cross-platform upscaling technology. Images render at a portion of the cost of the full resolution by amortizing some of the costly rendering calculations across many frames.
The next version of Unreal will include these changes to TSR:
-
History Resurrection - A new feature on High, Epic, and Cinematic antialiasing scalability. Previously accumulated details can be discarded for different reasons: occlusion, shading changes, going out of screen. If these details show up again on screen, TSR has to reaccumulate those details again, which can result in noise or trail artifacts. History Resurrection keeps old TSR history that has these previously seen details to reproject samples from whenever there is a better match for reprojection than more recent frames.
-
"Has Pixel Animation" Material Flag - A new material option indicating whether a material has animated texture or pattern motion, which would not be represented in the object's motion vectors. The flag allows TSR to disable anti-flickering heuristics which could otherwise create ghosting due to the lack of motion vectors.
-
Visualize TSR show flag: this visualization mode can be used to better understand how TSR is working, and also can help reporting TSR issues to Epic.
For more information, see Temporal Super Resolution
Heterogeneous Volumes - Deferred Rendering (Experimental)

Heterogeneous Volume Rendering provides for integrated rendering of volumetric phenomena such as fire, smoke, and fluids driven by Niagara Fluids or Open VDB files.
In 5.4, our focus was to provide shadow-casting support for Heterogeneous Volumes and integration with existing rendering passes, such as translucent objects.
Much of the remaining work for the deferred renderer includes adding support for global illumination, as well as improvements to features and performance.
For more information, see Heterogenous Volumes and Sparse Volume Textures.
Optimize Shader Cook Time
Cooking is the process of converting assets such as meshes, textures, and materials into platform-specific formats for deployment of packaged games. Cooking materials on a large project can take a very long time, often many hours.
In 5.4, we significantly overhauled how shader compilation work is executed, with both increases to parallelization and a reduction in redundant work. The results of this optimization effort are approximately 30% fewer shaders being compiled, a reduction in game thread work for shader compilation tasks, and significantly faster preprocessing of shaders. All of these factors together result in a significant improvement in project cook times - particularly ones which involve shader invalidations.
RHI - Render Parallelization
Render Thread performance is very often the limiting factor for UE titles. This is because some operations are restricted to this particular thread, even though current platforms and graphics API can do them in parallel. The goal is to improve performance by refactoring the Renderer Hardware Interface (RHI) API to remove these constraints and fully utilize the multithreading capabilities of the target hardware.
We shipped a major refactor of the rendering systems in 5.4 which allows for far greater overlap of work, which in turn permits lower target frame times. In our CitySample testing, the render thread performance is roughly 2x faster in 5.4 as compared to 5.0.
RHI - Bindless Rendering (Experimental)
Bindless resources are a low-level feature related to the management of textures and other types of data buffers in modern Renderer Hardware Interfaces (RHIs) such as DX12, Vulkan, and Metal. Adding support for bindless resources will provide for more flexible GPU programming paradigms and additional features within the renderer, and is also a requirement for full ray tracing support on Vulkan.
For the 5.4 release this feature is supported on the majority of platforms which are SM6-capable. However, given how recently we enabled the feature, it is still considered as experimental, and there may be some bugs to iron out.
Vulkan - Ray Tracing (Experimental)
5.4 marks the experimental release for Vulkan ray tracing features at parity with DX12, including on the Linux platform. This means the full suite of ray-tracing features can now be used, including Hit Lighting mode in Lumen and Path Tracing. As an experimental release, we expect that there will be bugs and other errors - and it should not be relied upon for production.
Programmatic PSO Precaching

We intend for automated PSO gathering and caching to remove all the manual processes for collecting all possible required PSO combinations for a game. The most important state for the PSOs are the shaders themselves, and each combination of these needs to be properly precached to avoid runtime hitches. To that end, the goal for shader precaching is to find and save all possible valid and potentially used shader combinations.
Hardware Ray Tracing

We made substantial Improvements to hardware raytracing (HWRT). These improvements offer speed gains of 2x in the case of primitives and it helps to ship 60hz experiences which use HWRT.
-
GPU instance culling, parallelization for instances and primitives.
-
Additional primitive types.
-
Optimized path tracer with a roughly 15% speed improvement over Release 5.3 and roughly equivalent to Release 5.2 without any reduction in features or need to introduce additional shader permutations.
-
HWRT uses the path tracer light grid and consequently supports very large numbers of lights.
For more information, see Hardware Ray Tracing.
Large World Coordinates on GPU
Large World Coordinates (LWC) in UE introduced support for double-precision transforms and data types, allowing the maximum world size to increase from 21km to 88,000,000km. LWC Rendering Support on the GPU was based on a tiled representation, which has a number of limitations including imprecision and jittering near tile boundaries.
We are refactoring LWC Rendering to support full double-precision representation on the GPU, which will allow large worlds to be rendered more reliably when the camera is far from the origin. Work includes:
-
Changing the extended GPU floating point representation to achieve higher precision where it matters.
-
Creating user facing tools to make life easier to work with materials in LWC.
-
Ensuring that LWC calculations are only emitted where they are actually needed for perf savings.
For more information, see Large World Coordinate Rendering
Developer Iteration
Unreal Zen Storage as Local DDC

In UE 5.4 we are introducing our new Unreal Zen Storage server architecture that will provide improved data conditioning performance and faster editor loading and time to ‘Play In Editor’ (PIE) workflows. Zen replaces the ‘loose file’-based DDC from previous releases to avoid local filesystem performance bottlenecks and provides greater control over cache writes, eviction, and data de-duplication.
Unreal Cloud DDC

An Unreal Derived Data Cache and content-addressable storage solution designed to deploy on self-hosted cloud infrastructure for distributed / hybrid studios and teams. Efficiently share cooked data between team members with active/passive region replication, auto-connect to closest region, and enterprise login & authentication.
Supported and production tested on AWS; including source and docker image.
Instructions are available to deploy on Azure; including source and docker image.
Multi-Process Cook
Multi-process cook is now Production Ready for UE 5.4. Multi-process cook helps reduce the total time it takes you to get a cooked output from a build farm server or on your local workstation by leveraging all available CPU cores and memory resources.
Performance gains may vary, depending on the size of the project and how the data is separated. For best results, we recommend that you test different ‘CookProcessCount’ values depending on the project and available hardware specs.
Unreal Horde - Continuous Integration (Beta)

An out-of-the-box continuous integration solution designed for any Unreal Engine development team. Horde is a horizontally scalable, distributed continuous integration and build platform system hooked into Perforce, and tightly integrated with Unreal Engine developer iteration tools and workflows.
Unreal Build Accelerator (Beta)

Unreal Build Accelerator (UBA) is a local and distributed compilation solution for C++ Compilation used in conjunction with Unreal Build Tool and/or Horde’s Remote Build (compute task) system. Horde is the coordinator to assign helper resources. UBA transmits local data, executes the remote task and returns the results.
In Unreal Engine 5.4 release UBA is in Beta status, and works with C++ compilation jobs on Windows OS. We recommend trying UBA with infrastructure on the same physical or private network. UBA may work across a reachable Virtual or External network or Cloud Compute Instances, but we do not recommend this path for this release.
Native macOS and Linux support, process idle detection, and shader compilation are considered experimental and targeted for a later release
Unreal Zen Storage as Shared DDC (Experimental)

Replace the use of network file shares as DDC storage with the new Unreal Zen Storage server architecture.
This architecture is more latency-tolerant, and optimized for network communications of DDC operations to remote machines, and not for file system operations from the previous system; operations no longer do synchronous IO at the DDC storage level.
Motion Design
Introducing the Unreal Engine Motion Design Mode, a game-changing environment meticulously crafted to empower motion graphics designers with precisely tailored tools. Our thoughtfully designed layout ensures seamless workflow initiation and sustained productivity. Equipped with specialized tools for the 2D canvas and an enhanced world outliner featuring intuitive hierarchies, the Motion Design Mode provides a comprehensive suite including 3D shapes, cloners, effectors, modifiers, animators, and features for non-linear animations. This dedicated mode is engineered to elevate the motion graphics design experience, offering a robust and user-friendly platform for designers to bring their creative visions to life.
Viewport: Rulers and Guides

In the realm of screen design, precision is everything. Ensuring your content lands exactly where intended is a non-negotiable. That's why we're excited to introduce the Motion Design Viewport – a game-changer for motion designers.
Motion Design Viewport Features
2D Grid and Rulers: Navigate your canvas with confidence using the 2D grid and rulers. These visual aids provide a clear reference for precise content placement.
Snapping: Achieve seamless alignments with the snapping feature. Elements effortlessly lock into place, eliminating the frustration of misalignments.
Pan and Zoom: Enhance your view and focus on specific details with the pan and zoom functionality. Get closer to your design for meticulous adjustments.
Canvas Borders Beyond Camera View: Extend your canvas beyond the camera view. This feature allows you to visualize the entirety of your design, ensuring no element goes unnoticed.
Drag and Drop Workflow for 2D Shapes: Simplify your design process with a user-friendly drag-and-drop workflow for 2D shapes. Intuitively build your composition.
Transform Panel for Quick Access: Efficiently manage and adjust elements with the transform panel. Enjoy quick access to essential controls for seamless modifications.
Viewport Background Images or Solid Colors: Customize your design environment with background images or solid colors in the viewport. Tailor the workspace to your preferences.
RGBA - Preview Modes: Preview your design with precision using RGBA modes. Ensure accurate representation and fine-tune your content accordingly.
Cloners and Effectors
Unlocking the potential for dynamic creativity, designers can effortlessly breathe life into shapes and patterns through the intuitive Cloner and Effector system. At the core, Cloners are built on top of Unreal Engines' powerful Niagara particle system. This powerful combination provides a seamless platform for animating designs, enabling designers to experiment with infinite variations effortlessly.
Cloners

Cloner Options
-
Grid
-
Sphere Uniform
-
Sphere Random
-
Circle, Line
-
Mesh
-
Spline
-
Honeycomb
Features
-
Step - Transform position and scale per clone
-
Random - Add Min and Max and Variations
-
Mask - Constrain patterns based on textures
-
Progress - Animate progress across clones
Effectors

Effectors Features
-
Procedurally animate clones within a radius and falloff system.
-
Animate position, scale, rotation
-
Circle, Box, Plane, Unbound shapes
-
Custom Falloffs and easing
- Ease In, Ease Out, Bounce In, Bounce Out, and so on.
-
Magnitude
-
Forces
-
Orientation
-
Vortex
-
Curl Noise
-
Gravity
-
Effector Forces

In design, procedural animation is essential, and our latest update takes it up a notch. Introducing forces for Vortex, Orientation, Noise, and Gravity in our effector system, giving designers the tools to experiment with infinite variations effortlessly. Now, manipulating numerous clones simultaneously becomes a breeze, allowing for quick and cool results that redefine creative possibilities.
Forces
-
Orientation
-
Vortex
-
Curl Noise
-
Gravity
Material Designer
The Material Designer introduces an intuitive and user-friendly layer stack, providing a seamless experience for building complex materials on the fly. Designed for efficiency, it grants users access to familiar blend modes, opacity controls, and masking features. This tool empowers users to swiftly and effortlessly craft intricate materials, making the process both accessible and efficient.
Material Designer Features
-
Dockable UI panels
-
Layer system for stacking textures
-
Designer-friendly blend modes
-
Pan, scale, and rotate textures from common UI
-
Clamping, mirroring
-
Toggling options with no recompiling
-
Creation and export of dynamic materials
-
Keyframable properties
Material Designer FX Layers

In advancing the Material Designer, our goal is to incorporate layer effects, opening up possibilities for features like blur, color correction, and distortion effects. This initiative aims to establish a versatile framework that empowers users to build a myriad of shader effects within the Unreal Engine, enhancing the creative capabilities of our platform.
Filters and FX
-
Blur / Dilate / Erode
-
Color: Hue / Saturation / Luminance
-
Levels
-
Distortion
-
Pixelate
-
Sharpen
Actor Alignment Tools
Designers frequently find themselves adapting graphics to a grid-based system, underscoring the significance of reliable alignment tools. These tools empower designers to achieve precision and consistency in their layouts.
Actor Alignment Tools
-
Align: Left, Center, Right
-
Distribute Left, Center, Right
-
Stack: Align Front, Middle, Back
-
Rotation: Align Rotation to Camera
-
Size: Size content to screen
2D and 3D Primitives

Empowering designers at the core of their creative process involves providing tools for seamlessly incorporating procedural shapes into their designs. This necessitates a versatile set of tools capable of generating a wide array of unique shapes. Designers will appreciate having dynamic tools that enable real-time adjustments directly within the viewport, enhancing their workflow with live and interactive design modifications.
3D Shape:
-
Sphere - Options for Start Latitude, End Longitude, Start Latitude, Latitude Degree, Sides
-
Cylinder - Sides, Top Radius, Angle Degree, Start Degree
-
Cube - Bevel, Bevel Count,
-
Cone - Sides, Top Radius, Angle Degree, Start Degree
-
Torus - Slice, Sides, Inner Size, Angle Degree, Start Degree
-
Cog / Gear - Slice, Sides, Inner Size, Angle Degree, Start Degree
Each shape can have bevels and caps, and have the ability to apply materials to the bevel edges
2D: Shapes:
-
Rectangle - Left Slant, Right Slant, Global Bevel Size, Global Bevel Smoothness, TL, TR, BL, BR
-
Polygon - Points, Inner Size Amount, Bevel, Bevel Smoothness
-
Line, Circle, Star, Arrow and Chevron
Geometry Modifiers

Designers seek the capability to procedurally modify geometry in their designs. The system facilitates the addition of procedural modifiers onto the base geometry for operations such as Booleans. Users can effortlessly enable or disable these modifiers and rearrange their order, empowering the creation of diverse and customized designs. Geometry modifiers are built on top of the Unreal Engine geometry scripting functions meaning the system can be further expanded in the future.
Geometry Modifiers
Extrudes - Extrude a piece of geometry in depth. Designers can scale the UVs across the front caps, back caps, rounding, and sides.
Bevels - Add a bevel to any piece of dynamic geometry.
Booleans - Subtract, add, and combine based on the channel.
Outline / Stroke - Add an outline or a stroke to any 2D shape, of varying width from 0px to 20px or more, as designers require.
Mirror - Flip or mirror a piece of geometry easily with a modifier. Designers can mirror geometry along any axis, X, Y, or Z, while also respecting the pivot.
Patterns - Replicate the geometry in patterns, like a grid, a circle, and so on.
Normals - Recalculate normals.
Deformations:
Bend - Designers can bend or deform a piece of geometry.
Taper - Designers can taper geometry over the length of an object.
SVG Importer
Given the widespread use of programs producing graphic design and branding information in SVG format, designers need to import SVG files. Our SVG importer is designed to seamlessly generate 3D geometry from any SVG file while keeping the material colors intact.
-
SVG Actor
-
Swap SVGs on the Fly
-
Copy & Paste SVG - XML to generate geometry
-
Extrude
-
Bevels
-
Caps
-
UVs
Text 3D Improvements
Robust font features are a fundamental necessity for designers, as they contribute personality and expression to their designs. We seek to simplify the process of searching and testing fonts, enhancing overall design efficiency.
Features
-
Preview fonts without importing
-
Favorite Fonts
-
Font Categories
-
Import Fonts into the project
-
Max Width
-
Max Height
-
Scale Proportionally
-
Dynamic Material
-
Dynamic Gradients
-
Custom Materials
Outliner Enhancements
Empowers designers with the capability to create highly specific hierarchies for grouping items critical to motion graphics workflows. Currently, this feature is a separate tab to the World Outliner. This newfound ability provides designers with much greater control over organizing, displaying, and managing scenes to suit their exact needs. Feedback about this version relative to the World Outliner will help us refine Unreal Engine UX.
Outliner Features
-
Non-alphabetically sorted actors.
-
Easy grouping of actors under null objects.
-
Per-actor visibility states.
-
Layer coloring for organization.
-
Modifier system for geometry, animation, and remote control.
-
Filtering system for easy displaying only needed actors or modifiers.
-
Options to not auto-expand actor hierarchies.
-
Copy and paste modifiers for geometry, animation, and remote control.
-
Moving the pivot and group actors with hotkeys.
-
Batch renaming of actors.
Renaming Tool
Ensuring a streamlined workflow is crucial for designers and other users, including maintaining proper naming conventions in the world outliner. In production, where repetitive elements are abundant, we are introducing a tool to facilitate batch renaming of actors and assets. This tool comes equipped with prefix, suffix, search, and replace functionalities, offering designers an efficient solution for maintaining a clean and organized workspace.
Outliner
-
Actor Rename Selected
-
Actor Rename Selected Class
Content Browser
-
Asset Rename Selected Asset
-
Asset Rename Asset Class
Features
-
Base Rename
-
Prefix - Add, remove, Numerate
-
Suffix - Add, remove, Numerate
-
Search and Replace
Animation Modifier System

Motion graphic artists now have access to powerful features that allow them to effortlessly add procedural animation to nearly any property. This innovative tool opens up endless creative possibilities by enabling artists to seamlessly incorporate dynamic effects such as wiggle, bounce, oscillation, and random animations. Not only does this tool enhance efficiency, it also unleashes a new realm of creative expression, enabling artists to elevate their motion graphics with captivating and dynamic backgrounds.
Animation Modifiers
Target Properties for animation
Add procedural wave functions to drive properties
Animation Functions
Sin, Cosine, Square, Inverted Square, Sawtooth, Triangle, Bounce, Pulse, Perlin
Transition Logic
In live television, the seamless presentation of multiple on-screen elements and their smooth transitions are paramount. Transition logic plays a pivotal role in precisely controlling the entry and exit of elements during live shows. This capability empowers designers to intelligently structure graphic systems, ensuring that each element appears and disappears on the screen exactly as intended, providing a level of precision essential for impactful live broadcasts.
Transition Logic Features:
-
State machine for deciding transitions
-
Add multiple elements to a layer
-
Design transition states
Broadcast Rundown
For broadcast designers, the capability to execute graphics live on air is paramount. The operator uses the Broadcast Rundown, a tool facilitating the live output of levels. This rundown not only enables graphics testing, but also facilitates their live playback through SDI or IP video streams. Our remote control system empowers operators to create multiple pages and variations of content, providing a comprehensive solution for seamless live broadcasting.
Functions
-
Per page - preview and program
-
Change Text, Images, Videos, Properties per page
-
Save pages at the number for easy recall
-
Drag and drop reordering
-
Preview Alpha channel
-
Robust Playlist APIs
-
Filtered views
-
Macros
-
Multiple Channels output
-
Render to Disk using the MRQ
Stagger Animations

To enhance efficiency for designers, we are introducing a feature that streamlines offsetting animations in time. With this tool, users can conveniently select multiple layer bars and effortlessly apply time offsets, facilitating the swift creation of dynamic pop-up animations.
Masking Modifiers

Masking stands as a fundamental feature for designers, especially in the realm of motion graphics where scenes invariably incorporate masking elements. Our aim is to seamlessly blend performance with simplicity, offering various forms of masking based on materials that prioritize speed and efficiency for an optimal design experience.
Opacity: Easily fade out any on-screen element with the opacity control. Integrated seamlessly into the Material Designer, it provides a straightforward way to achieve smooth transitions with native support.
Texture: Simply apply a texture as the source for masking specific portions of a 3D model.
Geometry Mask: Use a source piece of geometry to create masks for well-defined edges, offering a simple yet effective solution for your masking needs. Explore refined design possibilities with this user-friendly tool.
Grid Arrange Modifier

Empowering users with the Grid Arrange modifier, this feature facilitates the even distribution of any actor within the hierarchy. Particularly crucial for text-based layouts using a grid system, this tool allows for dynamic adjustments to the layout to accommodate varying size requirements.
Grid Arrange Features:
-
Horizontal Alignment: (Center by default)
-
Vertical Alignment: (Center by default)
-
Max Horizontal Items: 0 is no maximum, 4 would mean the 5th item appears on the second row
-
Padding: space between items
-
Size (XY): item size
Virtual Production
Multi-Process Inner Frustum

Historically, the inner frustum render for an ICVFX Camera could never make use of mGPU because of both limitations in Unreal Engine/nDisplay's rendering and the fact that at least some resources would have to be shared with the other outer Viewports. With the introduction of SMPTE 2110 support, we can now dedicate an entire nDisplay render node to just the inner frustum, opening the possibility of throwing more of the available hardware at what's seen in camera (that is, two GPUS rather than one). Multi-Process Inner Frustum enables the ability to render the inner frustum at the highest quality.
As new cameras increase in resolution and volumes increase in size, this will allow the system to scale with the needs of these productions.
Depth of Field Estimation


Depth of field is an integral part of film vocabulary and a critical tool for cinematographers to direct the viewer's attention. However, when filming an In-Camera VFX scene in an LED volume, it was impossible to achieve truly accurate depth of field because everything rendered by nDisplay would get the same depth of the field even though technically, some objects in the scene are further from the camera than others.
Depth of Field Estimation solves this by leveraging the fact that within Unreal Engine, we know everything necessary to calculate the "proper" depth of field, that is:
-
Position and orientation of the stage volume in the Unreal Engine scene.
-
Camera position, aperture, lens focal length, and focal distance using LiveLink.
-
Distance between all objects within the Unreal Engine scene.
The result is a newfound ability to have objects in the Unreal Engine scene be defocused based on a calculation that takes into account the information above, as well as the defocus that the lens is already applying based on its real world aperture/lens combination.
Virtual Scouting Toolset (Experimental)

The new Virtual Scouting tools enable linear content creators to view, annotate, and edit their scenes in VR.
We completely reworked the UX for Virtual Scouting to take advantage of the new XR Creative Framework. The tools are easier to use and extending them is now significantly easier for developers.
With it you can:
-
View and Edit levels in VR, in a multi-user editor session.
-
Measure
-
Annotate
-
Capture screenshots and place cameras.
-
Playback Level Sequences.
-
Create local lights.
-
Control environment lights.
This toolset also has support for running in a PIE session and packaging into a runtime executable.
XR Creative Framework
XR Creative Framework provides a development framework for teams to create in-editor XR (VR and In-headset MR) tools, facilitating the creation of bespoke workflows using the latest OpenXR supported HMDs and controllers.
The new Framework forms the basis of an updated set of Virtual Production Scouting tools. These tools serve as an example of how to develop within the XR Creative Framework.
Live Link VCam for Android

Live Link VCam, the companion app to the in-editor Virtual Camera system, is coming to Android. Virtual Camera users with an ARCore compatible Android device can now use the full Virtual Camera on their projects.
Virtual Camera for Mac

Virtual Camera is coming to Mac with full support. Users can now leverage software Pixel Streaming on x86/ARM and hardware acceleration on ARM based M-Series Mac devices.
LiveLink Hub

On stages or setups with multiple instances of UE running in a multi-user editing session - ICVFX, Live Composite, Full CG mocap shoots, and broadcast studios - there is a need to set LiveLink sources per editor session. Sometimes the setup requires each editor session to have a slightly different configuration so the previous LiveLink default preset-on-load workflow falls short.
To enable more complex workflows, we created an external app (similar to the Multi-User Slate server) that monitors running editor sessions, connects to LiveLink sources, visualizes them and rebroadcasts them to each editor session. Editor sessions no longer need to subscribe to LiveLink sources - the app tells each UE instance what LiveLink sources to receive and how to interpret them (preprocessors, axis swaps, role modification).
Initial support targets LiveLink workflows, with DMX, OSC, and device control on the development roadmap.
nDisplay Cine Camera Frustum Fit

Dynamically resize the nDisplay frustums so they fit within the active camera FOV animations. nDisplay Cine Camera Frustum Fit enables nDisplay users from all industries to properly map typical UE content using the Cine Camera to physical displays of arbitrary shapes and configurations.
-
Compute a bounding box around a set of defined Displays.
-
Provide a mechanism to fit and scale the nDisplay frustums into the active or selected UE cine camera frustum.
-
Expose options such as Fill and Fit to properly handle aspect-ratio mismatches.
Simulation and VFX
Niagara Asset Browser
The new Niagara Asset Browser provides users with a means to base their new effects on Niagara Emitters and Niagara Systems in a user-friendly way. It offers browsing content by tag, making it easy to explore various effects.
It provides a less complicated workflow than before:
-
The workflow has a single-page UI instead of a multi-step process.
-
Users can look at all effects at once, which was not previously possible,
-
The Niagara Asset Browser is comparable to the Content Browser, for more intuitive use.
Users can define their own tags for their assets, making it easy to set up groups of content. External content providers, like Marketplace creators, can ship assets with their own tags and tag definitions, organizing content more easily.
Niagara Data Channels (Experimental)

Niagara Data Channels (NDCs) are available for experimentation in 5.4 but we don't advise using them to ship content yet.
NDCs are a method to pass data between Niagara Systems, Niagara, and other parts of UE. One important use case has been to use NDCs to inject events into large shared Niagara systems to enable better performance for features such as impact FX. This is one of the key areas that users may like to experiment with.
Updates in 5.4 include:
-
GetNDCSpawnData: A new function on the NDC Reader Data Interface. It enables particles to retrieve their spawning NDC index and associated data for use in the Read function in the particle script when reading the NDC data.
- This is an alternative and preferred method to overriding the SpawnGroup for the particle. Using it, NDC spawning can be combined into a single spawn event internally which is far faster and allows arbitrary numbers of NDC spawns on the GPU, where previously they were limited to 8 per frame.
-
Emitter.ID: NDC Reader ID functions now take in an Emitter.ID from the caller to choose which emitter to spawn into. This replaces a direct binding set on the DI and means a single System level NDC Reader DI can spawn into many emitters in a Niagara System rather than each emitter needing their own.
-
Improved Blueprint UX: Blueprints now have a single node path for writing entries to NDC that auto populates the pins for the NDC in question.
-
Several UX and QOL improvements.
-
Improved stability and performance.
Learn more by reading the Niagara Data Channels documentation.
Niagara Lightweight Emitters (Experimental)
Lightweight emitters are available to experiment with in 5.4. They are still in development and we recommend against shipping content using them for now.
Our goal is to improve content creation speed and reduce the need to optimize when using lightweight emitters. Users can create lightweight emitters in their systems and mix and match between the different types after enabling the project setting. Lightweight emitters don't need to compile which results in a faster workflow and the amount of emitters in a system will have less impact on performance.
The underlying technology is quite different as there is no particle state, data is only generated when visible, but they should look and feel familiar to a Niagara user. They have a more restricted feature set. A limited number of modules were converted to lightweight and only some renderers are compatible. They are not programmable from content, i.e. you can not create scratchpads / modules / dynamic inputs. Users can extend on the feature set using C++, introducing new modules and templates, however, as they are experimental, breaking API changes might be introduced between releases.
Learn more by reading the Niagara Lightweight Emitters documentation.
Niagara - CPU VectorVM (Experimental)

VectorVM is the Virtual Machine that Niagara uses to execute scripts on the CPU. We rewrote the VectorVM interpreter to get more performance for processing CPU scripts. The original byte code now goes through an optimization pass which includes:
-
Reduces high water mark memory usage by significantly reducing the number of temporary registers required.
-
Dead code removal.
-
Combines many common pairs of operations into single operations.
-
Reformats the byte code for smaller memory usage.
When enabled, the optimizations to the VectorVM should be seamless to the user. When CPU scripts are compiled, the resulting byte code will be optimized and then, if available, the new interpreter will be used.
Users can see significantly faster processing with these improvements to the VectorVM CPU script. The CPU workload has been reduced substantially (some scripts have shown a 4x improvement in cycle count), but practical wins are less significant because the execution has become severely limited by memory throughput. Real world effects have seen a 10% savings in execution time.
Chaos Panel/Pattern Cloth Editor (Beta)
Chaos Cloth for Unreal Engine 5.4 includes the continued development of the Cloth Editor, including an update to Beta status from Experimental.
Changes from 5.3 to 5.4
-
Added a USD import node with fabric support.
-
Added a Default Dataflow template.
-
Added new Dataflow nodes, and updated the Geometry Remesh node.
-
Updated the Selection node and workflow.
-
Added a new Collision system, and updated Self-Collision.
-
Updated Skin Weight Transfer.
-
Added LOD support
-
Exposed the Proxy (Wrap) deformer as a Dataflow node
-
Display Visualization and Debug Updates.
-
Quality of Life Improvements.
Chaos Visual Debugger (Beta)
Chaos Visual Debugger is a new tool and framework that provides for recording and playing back the state of the physics simulation in a given game or application for debugging purposes.
In UE 5.4, Chaos Visual Debugger has two main parts:
-
Debug Data Generation: A system to record the state of the physics simulation.
-
Debug Data Visualization: An Editor tool which has its own editor world, Viewport, Outliner, Details panel, and recording playback controls. Once a trace file is loaded in the tool, the tool offers the ability to play and visualize the state of the simulation frame by frame (and also sub-step, by sub-step), and select objects to see their state at any given frame (or sub-step).
In future versions, the tool will be able to re-simulate from any given recorded frame.
Learn more by reading the Chaos Visual Debugger documentation.
Physics Based Character Movement (Experimental)

Physics Based Character movement is a new Experimental feature we are building into the Mover plugin which provides for two-way physics-based interaction between the character and its environment.
-
The system uses movement modes created in Mover and takes the output movement as a target motion for a physics representation of the character.
-
The character imparts forces on the parts of the physics world it is interacting with, and physics forces and constraints can in turn affect the movement of the character.
-
Multiplayer physics-based motion with rollback and re-simulation is supported using Networked Physics.
Niagara Fluids (Beta)

With 5.4, we bring the following improvements to Niagara Fluids:
-
2D Liquids: Improved surfacing and rendering.
-
2D Gas: FFT-based pressure solver and cubic interpolation.
-
3D Gas/Liquids: High precision boundary conditions with finite volume method.
-
3D Liquids: 2-way coupled simulation with GPU particles.
-
2D Gas: Caching support.
Chaos Destruction
Chaos Destruction is now Production Ready with Unreal Engine 5.4. This release adds the following improvements:
-
Geometry collection performance and memory
-
We significantly reduced memory cost per geometry collection instance.
-
We added many performance optimizations.
-
-
Chaos cache manager
- Recorded tracks now use a simple compression scheme which means smaller cache collection assets on disks and in memory.
-
Geometry collection rendering
- Root Proxy meshes are now supported with and without a custom renderer.
ML Clothing (Beta)
ML Clothing is now Beta in 5.4.
-
Improved the user interface for defining multiple sections on the skeletal mesh.
-
Added a new training mode that learns the morph targets.
-
Improved tools for automatically creating the nearest neighbor dataset.
Learn more by reading the Machine Learning Simulation documentation.
Networked Physics (Beta)
Networked Physics is Beta in 5.4 and offers two key capabilities:
-
Predictive Interpolation (Beta) is a new physics replication model that handles some local prediction of physics while still running in the "interpolation" timeline, providing both responsive and accurate physics replication results, to a certain limit.
-
Physics Resimulation (Experimental) is a solution for when physics replication needs to be even more responsive and predicted than what the Predictive Interpolation solution can handle. This solution also means pawns can be physics-based in a multiplayer game. The new NetworkPhysicsComponent provides for implementation of custom physics pawns to handle the custom inputs and states, as well as taking care of network replication, linking inputs to physics-ticks, applying inputs and states during physics resimulations, decaying and predicting inputs if needed, and much more.
Learn more by reading the Networked Physics documentation.
Worldbuilding
World Partition Runtime Hash with 3D Grid
The new World Partition Runtime Hash solution contains a list of partition objects, which can be of different types and easily expanded for project-specific requirements. Each partition object holds their HLOD layers settings. The runtime hash still supports data layers, one file per actor, and relies on the streaming source components. New world partition levels will default to the runtime hash. An upgrade path from the previous spatial hash is available when selecting the new runtime hash in a level.
The runtime hash uses the Loose Hierarchical Grid partition type, a fully 3D streaming grid where the actors' extents are used to vary the streaming cells bounds to reduce streaming grid level promotion.
HLOD in Editor
As a workflow improvement, generated HLODs, previously only visible during play in editor (PIE) and cooked builds, can now be seen directly within the Editor and updated individually.
You can adjust the HLODs in editor min and max draw distance in the main viewport Show options.
Level Instances Soft Object References
World Partition now supports soft object path references from actors and objects in a parent level to actors and objects inside level instances.
With World Partition, actors inside level instances can get embedded into streaming level cells causing their runtime object paths to be changed as a result. The new Editor Soft Object Path reference to those actors will now resolve and work at runtime.
Server Streaming
World Partition now supports dedicated server streaming, in and out, based on the streaming source position replication. This provides for better server balancing and optimization considering large worlds in multiplayer games.
Sub World Partitions (Experimental)
You can now have multiple sub world partitions within a level enabled through code or blueprint.
Level instance actors, with their level behavior property set to standalone and referencing a streaming enabled world partition level, will be automatically considered as a sub world partition level.
HLODs of sub world partitions are not supported from the parent world and will only appear once the standalone level instance actor is streamed in.
Runtime Data Layer Logic Operator
Previously, the default runtime data layer "OR" logic operator to define the runtime state was hardcoded.
The New Maps Data Layers Logic Operator option in the Project Settings means users can choose between "OR" or "AND" operators for their project's default runtime state logic operator for the runtime data layers in newly-created maps.
This can also be set per-level under the World Settings using the Data Layers Logic Operator option.
Landscape Nanite Automatic Async Build

When editing Landscape with Nanite enabled, the edited tiles' Nanite representation needs to be rebuilt. With UE 5.4, this build operation is automatically and asynchronously processed in the background while keeping the editor responsive, and provides up-to-date Landscape Nanite data on the fly.
For large and GPU memory intensive Nanite Landscapes, we recommend adjusting the amount of Landscape Nanite builds that can trigger in parallel using the following CVAR:
landscape.Nanite.MaxSimultaneousMultithreadBuilds VALUE
Water Scalability

We improved water scalability for very large environments with dynamically tessellated water mesh, and local processing of water information texture at runtime within a defined area around the view location. The water outside this area falls back to static meshes matching the shape of the water body.
The Local Only Tessellation option on the Water Zone actor activates runtime water information texture processing, while you can adjust the sliding window using the Local Tessellation Extent.
Procedural Content Generation (PCG)
Runtime Hierarchical Generation

Runtime Hierarchical Generation maximizes PCG graph execution at runtime by combining user-defined grid size and generation distances per grid, adding PCG Generation Source component(s), and adjusting generation policies for ordering, priorities, and update frequency.
It provides a way to create richer dynamic environments, complex rules to be generated live, and larger procedural worlds as an automatic partitioned runtime execution solution.
Additionally, it can also greatly improve editor-only workflows and iteration by generating only around the camera or any other actor with a PCG Generation Source.
Node Graph UX
UE 5.4 introduces multiple UX improvements when working with the PCG node graph, these include:
-
Named reroutes: Declare a named reroute and use it anywhere in the same graph.
-
Debug object tree: Selecting a debug object is now done through the debug object tree window, it provides a better view over loop iterations and subgraphs, and improves overall navigation between related graphs. It also displays if there are warnings and errors for each debug object. To inspect nodes within a graph, you must select a debug object.
-
Smarter graph refresh: To increase iteration speed when adding unconnected nodes or deleting unused nodes, the graph will not refresh as its compiled output is identical.
-
Multi-data and empty edge display: Edges flowing from node to node in PCG can hold multi-data or be empty. The edge display is now thicker when flowing multi-data and faded when empty. Regular edge thickness represents single data. This can be observed only after execution with a debug object selected.
-
Multi attribute list and Details views: You can now open and lock up to 4 attribute lists and Details views. Ideal for comparing nodes and data.
-
Input and Output pins setup: Pins can be set with a behavior (normal, loop, feedback) and IN/OUT can be removed or edited.
-
Landscape tracking modes: Landscape edit callbacks trigger PCG updates of graphs using Get Landscape Data, and can lead to workflow issues. Within the Project Settings, you can now set the Landscape tracking time delay, disable only in Landscape edit mode, disable landscape tracking completely or disable global refresh entirely.
-
Required pins indicator: Pins now have a required indicator tied to the execution culling. Nodes with unconnected required pins will be automatically culled from the graph execution.
-
Attribute list view copy/paste: You can now select and copy-paste the attribute list view content as comma-separated content into any external application.
-
Multi-Line node titles and less intrusive renaming support: We completely redesigned node titles to provide clear information, and node renaming is now only possible through the right-click menu or by pressing F2.
-
Performance window: We added wall time information to the performance window as well as a search filter box to isolate specific nodes when profiling.
-
Search window: The search window is now recursive and returns nodes within subgraphs.
-
Graph instances from Content Browser: You can create PCG graph instances from existing graphs or other graph instances directly within the Content Browser through the right click menu.
Nodes and Operators
5.4 introduces multiple native PCG elements including:
-
Match and set attributes: Matches an attribute value between two data entries such as point data and an attribute set table. On matched entries, all attributes from the matched data input are copied over. When multiple entries match, a random selection is done or an additional weight attribute can be provided to better control the selection.
-
Get property from object path: It is now possible to get properties from an object path attribute, including arrays, structures and sub-structures within arrays. Each object path resolved will return a flat attribute set table data.
-
Multi switch and select nodes: Select and switch nodes with configurable inputs and outputs selected from an Integer value that can be dynamically set.
-
Runtime quality branch and select: A runtime-only PCG quality level branch and select node that can be expanded with the required levels. The Default input/output will be used for disabled quality level pins. Enabled but unconnected quality level pins will not produce any data for that quality level. Works with dynamic branch culling.
-
Data tag operations: Add, remove, or filter data by tag.
-
Attribute cast nodes: Cast to desired types (Boolean, Double, Float, Integer, Name, Vector, etc.) when possible.
-
Logic nodes : Data Count, Point Count, Filter Data by Attribute or Index, and Get Loop Index.
-
Texture sampler: Provides for easier texture sampling after the Get Texture Data. The Get Texture Data also supports Tex2DArray and CPU texture sampling.
-
Sort points by attribute: Useful to sort points by density, scale, or any attribute. Can be helpful to enforce a specific order before an Attribute Partition node.
-
Native Create Points, Create Points Grid, and Point Neighborhood: Fast native versions of the early Blueprint elements that were heavily used in multiple examples and early adopters logic.
-
Point operations (Duplicate Point, Split Points, Apply Scale to Bounds, Combine Points, Reset Point Center): Multiple new nodes to manipulate point data.
-
Print string: Prints a custom string or attribute value within the log, as well as on screen and/or on the nodes directly. Useful when debugging graphs and for warning users of unsupported tool behavior or data while editing.
-
Visualize attribute: Prints the attribute value directly in the world at the point's location. Custom prefix, point index, attribute name, offset, color, and duration can be configured on the node.
Attribute Set Tables

PCG Attribute Set Tables can be created from graph parameters, Blueprint structures, and arrays through actor property getters or constructed from multiple Attribute Sets within the PCG graph.
This allows for driving more complex logic from exposed parameters such as biomes with their sets of assets.
Multiple attribute operations have been updated to support the concept attribute tables such as Filters, Add, and Copy Attributes. Attribute Set to Points and Points to Attribute Set conversion nodes have also been added.
Feedback Loops

Through the new configurable per-pin Usage option in the PCG graph Input/Output nodes, Loop subgraphs can now have re-entering data for each loop iteration from their Feedback pins.
Outside feedback Input pins, visible on the Loop subgraph node in the parent graph, can be initialized with data for its first iteration while Output feedback pins will return the result of the last iteration.
To further improve with Loops and feedback Loops, we also provided a new Get Loop Index node.
Recursive Subgraphs
A PCG graph can now recursively run itself as a subgraph to create hierarchical logic by passing data from the parent graph execution to its child recursion. The recursion will happen as long as data is provided to the recursive subgraph.
The PCG Biome Core plugin leverages this concept and can be used as an example, each primary point can have its own hierarchy of children all processed through the same recursive subgraph.
Using this functionality requires safeguards done through graph logic to prevent infinite recursion.
Biome Core Plugin (Experimental)

The PCG Biome Core plugin is a data-driven systemic biome generator built entirely using the PCG Framework. It showcases the latest improvements and serves as an advanced example of a world-building tool for productions. It is stand-alone and can be used as-is, as a starting point, or customized.
The Biome Core is a fixed pipeline using asset and biome definitions while designed to be very flexible by dividing key components such as sampling, transforms and filtering into separate problem spaces. Each of these can be completely customized to any project constraints or needs using the PCG Framework.
Once the initial setup is provided, artists and designers can easily define biomes within a world without editing graphs or complex logic.
The PCG Biome Sample plugin is an initial setup example of the PCG Biome Core. It is meant to help understand how to provide the definitions data assets, use the provided classes, and build generators, filters, and transforms graphs.
Native Level To PCG Data Asset
The Level to PCG Data Asset action outputs a PCG Data Asset containing a point data representing all static meshes and instanced static meshes found within the level(s) selected. The transforms, mesh, material, bounds, actor hierarchy, relative transforms and all user set actor tags are written for each point in the exported data. It uses a new mechanic to export to PCG Data Asset and can be extended.
Using the new Load PCG Data Asset node, or dragging and dropping the exported PCG Data Asset into a PCG graph, the contained point data representing the source level visuals can not only serve to spawn but can also modify and manipulate prior spawnings through tag filtering, hierarchy, or any logic. This provides manual artistic control over Assemblies which can then be used and modified procedurally.
The PCG assembly workflow was first showcased in the Electric Dreams GDC Demo and Sample; it is also used in the Lego Fortnite world creation system. This native version replaces the previous Asset Action Utility blueprint with better export and update options, its own PCG Data Asset class, and a specific Load PCG Data Asset node.
Dynamic Attribute Tracking

Dynamic attribute tracking allows graph updates to trigger when external referenced data is modified. This includes data assets, data tables, blueprint exposed variables, graph parameters, graph instance settings, and PCG settings changes, on top of any changes triggered from getters targeting self, parent, actors with specific actors tags, or class and landscape.
Branch Execution Culling

Static and dynamic graph execution branch culling greatly improves performance by removing any unnecessary processing.
The execution culling is applied automatically when using Branch nodes for downstream elements and works with dynamically set branch conditions at runtime.
We also updated PCG Nodes with a required pin indicator. The culling will also apply to any nodes with unconnected required pins while input-less nodes such as getters will always execute. Custom Blueprints elements input pins can also be configured with the required pin option.
Dynamic Subgraphs

Subgraphs nodes can now accept an object path attribute to any existing PCG graph through its Subgraph Override pin. It supports changing the graph dynamically and contextually for execution at any time, from editor to runtime.
When no graph is set within the Subgraph node, the default In and Out pins will be used. If a graph is set, it becomes a template for the subgraph node pins when overridden.
Proxy Node

A proxy node is an indirection to any PCG Settings from an object path attribute set through its Settings Override pin. It supports changing dynamically and contextually which node settings are executed at any time, from editor to runtime.
The Proxy node can be templated using the native element class, the blueprint element class, or a specific setting.
Transient Preview Mode
As an option on the PCG component, the Preview and set Preview on Load editing modes generate transient artifacts and data locally.
Using these modes, you will be able to test changes locally without breaking existing data and decide when the data should be updated. It also prevents contention from multiple users updating shared PCG content by deferring updates to manual or build machine processes when desired while retaining live editing and preview for all users.
PCG Offline Builder
The PCG world partition builder can generate PCG components in a level and save the results. It can be run from the console or from the command line. This process is also suitable for running as an automated job on a build machine.
The process loads the level completely, waits for asynchronous processes to complete such as static mesh builds and others, then schedules generation on matching PCG components. When all generation is complete the process saves the level and exits.
Command line example with arguments:
UnrealEditor.exe ProjectName MapName -Unattended -AllowCommandletRendering -run=WorldPartitionBuilderCommandlet -Builder=PCGWorldPartitionBuilder -IncludeGraphNames=PCG_GraphA;PCG_GraphB
Console command example:
pcg.BuildComponents -IncludeGraphNames=PCG_GraphA;PCG_GraphB
Multi-Data Attribute Ops

All Attribute Operations nodes now support multi-data for all inputs which can persist separate data while applying the same operation to all of them. In previous versions, Attribute Operations were limited to single data which was forcing expensive data merges or creating graph clutter with many duplicated operations.
Water Spline Interop
The PCG Water Interop extra plugin adds a Get Water Spline Data node. Samples on the water spline will be scaled to the width of the river and write water spline specific metadata such as the Depth, WaterVelocityScalar, RiverWidth, and AudioIntensity.
Platform
Mobile Renderer
The mobile renderer in Unreal Engine 5.4 brings several improvements:
-
GPUScene memory and performance optimizations, which improves automatic batching and reduces the number of draw calls.
-
Dynamic lights rendering performance improvements, supporting many local lights.
-
PSO caching on-demand for Android.
Android Platform
Unreal Engine 5.4 brings several new Android platform-specific features:
-
x86_64 architecture binaries shipping in the UE install build from the launcher, simplifying workflows for developers deploying to Android x86_64 targets.
-
Android emulator support (Experimental). This provides a way to run games made with UE from the Android Studio provided emulator.
Lumen on Mobile (Experimental)

Experimental support for Lumen on recent mobile devices using the Desktop Deferred Renderer.
Apple Vision Pro Support (Experimental)

We expect to ship experimental support for Apple Vision Pro’s Full Immersion Style (Full Immersion) in 5.4. With this initial implementation, Unreal Engine supports stereo rendering through Metal and camera transform driven by the head mounted display pose.
Pixel Streaming on Mac

WebRTC Pixel Streaming is currently supported for Windows and Linux. Future development will enable software pixel streaming on x86/ARM Mac devices. Hardware accelerated Pixel Streaming will be available on ARM based M-Series Macs.
Audio
MetaSounds
MetaSounds are now Production Ready in 5.4. Although MetaSounds are still under heavy development with many features and improvements planned, they have been shipped on all titles from Epic Games, many of which were built from the beginning on MetaSounds. We have made a number of performance and memory improvements to achieve this, and plan on doing many more.
-
Builder API improvements
-
The Builder API is a Blueprint scripting API that provides the means for MetaSounds to be procedurally built by games at runtime and by editor tools.
-
They were shipped in UEFN's Patchwork, and feature a number of improvements in 5.4, including live updating of the graph.
-
-
Memory and CPU improvements
-
Operator caching feature (optional feature used to cache operator memory, further reducing CPU hit on compiling MetaSounds).
-
A number of performance and memory improvements across the board.
-
-
Editor workflows improvements
-
Space-bar previewing in Content Browser.
-
Audio-visualizations for spectrum and oscilloscope in the MetaSound editor.
-
A Find tab to search within a MetaSound like a Blueprint.
-
Editor details panel and graph members menu show more information by default.
-
MetaSound Preset icons properly display a preset icon instead of a MetaSound Source icon.
-
Read-only properties in the Details panel can now be copied.
-
Sound Attenuation In-Editor Live-Update
Unreal Engine 5.4 now offers the ability for Sound Attenuation settings to live-update while playing in the editor. This allows updates to the attenuation settings to happen while in the editor without having to play again.
Dynamic Submixes
Submixes are DSP graphs which help you mix multiple sources into a single output. With 5.4, Submixes can now be added and removed from the Submix graph in Blueprint and from plugins. This provides flexible Submix graphs for temporary plugin content or for temporary gameplay content.
Audio Insight (Experimental)
The new Audio Insight plugin enables an editor-tool which provides a way for audio developers to perform analysis and debugging of PIE sessions in real-time.
-
Features source event lists with sortable columns on several source parameters.
-
Features time-plots of relevant audio information (volume, pitch, distance, and so on).
-
Clickable list items to navigate in the editor to find the asset played.
-
Substring-based filtering to allow soloing and muting sources in real time.
-
Audio metering on desired submix view.
-
Global audio metering and analysis.
-
Automatically set audio logging.
-
Customizable layouts.
Audio Insight is Experimental in 5.4, for future version the team is working on:
-
Standalone mode.
-
Connecting with packaged games, including mobile and console.
-
Recording and playing back profile recordings.
-
Tail recordings.
Harmonix Plugin (Experimental)
New in Unreal Engine 5.4, the Harmonix plugin provides a suite of tools and runtime capabilities which can be used to create musical gameplay.
-
Adds support for importing MIDI files.
-
Plays MIDI files in MetaSounds.
-
Routes MIDI event streams to a variety of new MetaSound nodes designed for musical gameplay and musical systems.
-
A new software sampler instrument in MetaSounds.
-
Allows watching MIDI events and clocks from the game thread to synchronize visual effects and beat-match scoring with rendered music.
RAD Audio Codec (Experimental)
RAD's Audio Codec (RAC) is a new multi-platform perceptual audio codec that features better compression ratios, faster decodes and higher qualities than the Bink Audio codec.
Modeling
UV Tools Improvements (Beta)

UV editing is a vital part of the development of efficient assets. We corrected the UV Editor display to properly display the layouts wireframe.
Texel Density: A new texel density tool is now available to set a mesh's UV texel density to a consistent value based on scale and texture values.
Multiple Mesh Display: We updated the 3D preview to facilitate proper placement of multiple meshes when selected.
Modeling Tools (Beta)

The Modeling Mode tools are the foundation for effective development, editing, and quality management of all mesh types. Unreal Engine 5.4 contains some heavily-requested features and improvements.
Bevel: The Bevel tool now supports subdivisions instead of just the single chamfered edge. This facilitates the creation of more complex and production-oriented meshes.
Extrude Edge: This new option is now available inside of the Select tool category, PolyGroup Edit tool, and Triangle Edit tool.
Harvest Instance: The new Harvest Instances tool creates new HISM or ISM from selected actors, speeding the process of creation.
Delete PolyGroup Edge: Deletion of a PolyGroup edge facilitates faster topology edits on complex meshes. The deletion is performing a similar function to merging PolyGroups, but provides for a larger variety of topology changes with fewer interactions.
Modeling Workflows (Beta)
Modeling workflows require efficient interactions and feedback. The selection, transformation, snapping, and display of all mesh elements is critical to effective asset and world building.
Mesh Element Display: The mesh elements workflow we introduced in 5.3 now has an improved display of the unselected and selected elements. This provides artists with proper feedback about available elements for selection.
Element Transform: The transformation gizmo now has additional functionality to support the object axis for mesh element selections.
Create Shape: The shape tools now have an option to generate new shapes at the origin facilitating quick creation of meshes without the need to place and then reposition.
To learn more about Modeling Mode, including workflows and tools, see Getting Started with Modeling Mode.
Geometry Scripting (Beta)
Geometry Scripting is an Unreal Engine plugin containing a set of Function Libraries that generate and edit mesh geometry using Blueprints and Python. Geometry scripting functionality continues to expand with additional functions.
TransferBoneWeightsFromMesh: Transfer bone weights from the source Dynamic Mesh to the target Dynamic Mesh using the Inpaint method which is more robust than the Closest Point Method. The target mesh is usually a mesh without any previous weights (that is, converted from a StaticMesh).
GetRootBoneName, GetBoneChildren, GetAllBoneInfo, GetBoneInfo are additional nodes for gathering bone information.
BlurMeshVertexColors is a new node similar to the AttribBlur node in Houdini.
Collision Shapes: We added new functions for directly manipulating Collision Shapes, exposing the Collision Merge algorithm and related functionality.
-
GetSimpleCollisionFromComponent
-
SetSimpleCollisionOfDynamicMeshComponent
-
GetSimpleCollisionFromStaticMesh
-
SetSimpleCollisionOfStaticMesh
-
GetSimpleCollisionShapeCount
-
AppendSimpleCollisionShapes
-
MergeSimpleCollisionShapes
-
TransformSimpleCollisionShapes
-
CombineSimpleCollision
-
ApproximateConvexHullsWithSimplerCollisionShapes
-
SimplifyConvexHulls
-
AppendSphereCovering
-
StaticMeshHasCustomizedCollision
Point Sets: We added new functions for working with point sets:
-
KMeansClusterToIDs
-
KMeansClusterToArrays
-
TransformsToPoints
-
FlattenPoints
-
UnflattenPoints
-
MakeBoundingBoxFromPoints
-
GetPointsFromIndexList
-
DownsamplePoints
-
OffsetTransforms.
Splines: We improved USplineComponent sampling with new methods on the component that support sampling custom ranges:
-
ConvertSplineToPolyLineWithDistances
-
ConvertSplineToPolyline_InDistanceRange
-
ConvertSplineToPolyline_InTimeRange SampleSplineToTransforms and ConvertSplineToPolyPath now support custom ranges as well. For closed splines, these ranges can wrap around, making it easy to sweep sections smoothly around a loop.
CopyMeshFromComponent now supports copying meshes from Geometry Collection Components and Instanced Static Mesh Components.
AppendTriangulatedPolygon3D is a new function for triangulating polygons with 3D vertices.
Dynamic Mesh: We improved the Dynamic Mesh Component class which used meshes generated by Geometry Script. It now has better control and default behavior for Tangents, and supports standard Vertex Color and Collision Shape rendering using the 'Show' flags in the editor viewport.
To learn more, see Introduction to Geometry Scripting.
Texturing Tools (Experimental)
Textures are a primary component when creating experiences in Unreal Engine. They are used in materials, UI, landscape, and model development.
The experimental Texture Graph Editor uses node-focused design. The editor has a browsable node palette that contains a range of nodes for generating and modifying textures. The Texture Graph Editor can use existing textures, materials, or material functions, along with math nodes and texture subgraphs. Users can combine texture graphs with blueprint and editor utility widgets to create custom tools to optimize common workflows.
Content Pipeline
Interchange Framework UX

Interchange Framework provides users with easier ways to create, extend, and parameterize import, re-import, and soon export, workflows.
Interchange simplifies editing and storing import settings, creation of custom settings adapted to use cases, and even extending the import process with creators or pipeline managers' own custom import behaviors.
We updated Interchange's UI/UX to ease artists and content creators interactions with the import dialog:
-
Introduced filters to reduce the clutter in the settings dialog window.
-
Added a preview mode to get insights on the import process.
-
Added the conflict view mode for parity with legacy options.
FBX Import Customization (Beta)
Using the Interchange Framework, FBX import is becoming more customizable.
This feature enables artists, content creators, and pipeline managers to finely tune import behavior for the FBX file format.
In 5.4 the import of FBX assets is considered complete, while scene import still requires UI changes. However, the two features are still deactivated by default.
USD Specification Coverage
USD is a versatile scene description file format with a growing adoption across the 3D industry. It is used by content creators and artists to transfer 3D content, especially scene description, between DCCs. Originally used in the media entertainment industry, its use is now spreading to games and other industries like automotive, architecture, and so on.
The expansion of UE coverage of USD standard specification broadens content creators’ supported use cases and provides them with a smoother experience when importing scenes from their DCCs into UE.
In 5.4, we extended the specification coverage to support:
-
Collisions: UsdPhysicsCollisionAPI, UsdPhysicsMeshCollisionAPI
-
usdVol schema: OpenVDB assets only
-
Primitive mesh schemas: UsdGeomCube, UsdGeomSphere, and so on.
-
Static mesh subdivision: Subdivision scheme attribute with OpenSubdiv
-
Draw modes: UsdGeomModelAPI schema
-
Prim metadata
-
primvars:normals
USD Export Extensions

Expanding the range of UE features that can be exported broadens content creators’ supported use cases and provides them with a smoother experience.
In 5.4, we extended the export features to cover
-
Baked PCG
-
Geometry cache
-
Nested skeletal data
-
Prim metadata
glTF Export/Import Roundtrip

glTF is a common 3D model file format that is used as an interchange format in the 3D ecosystem as well as a publishing format for the web and XR applications. In some industries, especially the web, it is the main working format for content creators and artists.
The extensive coverage of glTF features enables content creators to have a smooth and lossless exchange of models with their DCCs or publishing applications.
Artists and content creators can work as part of a bigger ecosystem using the glTF interchange format. It enables them to import models from online libraries into UE or to publish their UE scenes into a web-ready format.
In 5.4, most commonly used glTF extensions are now supported in UE. In details the focus is on:
-
Closed the round trip gap: We aligned the exporter to support the same extensions as the importer.
-
Added material extension for export:
-
KHR_materials_transmission (Thin translucency)
-
KHR_materials_sheen
-
KHR_materials_specular
-
KHR_materials_ior
-
-
Added extensions for import:
-
KHR_materials_iridescence
-
KHR_draco_mesh_compression
-
MaterialX - Substrate & OpenPBR (Experimental)

We extended MaterialX import to support creation of Substrate materials and translation of OpenPBR based shaders. OpenPBR Surface description was initiated by Autodesk and Adobe as a successor to Autodesk Standard Surface and Adobe Standard Material.
Substrate support provides artists a way to get a more realistic representation of their MaterialX shaders. Support of OpenPBR provides artists with access to a growing industry standard inside their projects.
Artists importing MaterialX with Substrate enabled will now get materials using a better Substrate representation and not a wrapper of the legacy Material onto Substrate. OpenPBR imports work with Legacy and Substrate Materials but provide better material representation with Substrate.
Please note that Substrate Materials is still an Experimental feature.
Framework
Mover (Experimental)

The Mover plugin (a.k.a. Character Mover 2.0) is a massive improvement to the existing character movement functionality in UE. It is a very large endeavor that has numerous touchpoints in the codebase, ranging from physics to animation to networking.
The main features of this effort are:
-
Support for all actor types, not only characters.
-
Helps gameplay programmers to focus on movement, less on the complexities of networking.
-
Improves extensibility and customization through modularity, while empowering non-engineers to craft their own movement.
-
Expands gameplay possibilities by discarding rigid requirements and improving interactions with physics-simulated objects.
-
Supports a generalized rollback networking model that other systems can also use.
Gameplay Interactions Plugin (Experimental)
The Gameplay Interactions plugin provides a way for you to use State Trees and Smart Objects together along with Contextual Anim Scene (among others) to create a complete and flexible interaction system between actors, allowing state trees to handle both the logic of the objects and the actors using them.
External State Tree Sub-Tree (Experimental)
External subtree support for state trees is similar to the Sub-Tree feature we introduced previously, but actually defined as a separate file which can then be re-used in multiple different trees instead of being limited to the current one. This empowers content creators to compose state trees out of multiple pre-existing chunks, allowing modular behaviors that can end up being closer to what could previously be achieved only by using behavior trees.
Learn more by reading the External State Tree Quick Start documentation.
Large World Coordinates Networking Support (Beta)
Large world coordinates are now officially supported by UE's network technology, providing a way for you to create large worlds in a multiplayer environment without having to worry about hitting networking related limitations.
GAS Debugging Improvements
We improved a lot of the debugging tools that can be used with the Gameplay Ability System (GAS) so you have a lot more built-in debugging opportunities while using this great framework.
Data-Only Blueprint Merging (Beta)
While we introduced data assets merging in 5.3, we are now introducing the possibility of merging Data-Only Blueprints (as opposed to full Blueprint graphs, which are still unsupported). This should allow developers everywhere to have much better insight in diffing and merging their BP data assets.
Windows GameInput API (Beta)

Microsoft recently released their new GameInput API for Windows and this provides a way for us to add more "out of the box" connectivity support for controllers on the Windows platform.
This includes PlayStation controllers, without special first party license requirements (SDK access). The first Experimental version will include support for :
-
Xbox controllers
-
PS4/5 controllers
-
Racing Wheels
-
Flight sticks
-
Arcade sticks
Yes, this also means native support for classic USB plastic instruments in UE, enabling using these peripherals in your own games (and inside Fortnite Festival!)
Iris Replication (Beta)
Unreal Engine 5.4 brings workflow improvements, as well quality of life features we introduced to the plugin, which should make using it and debugging a lot more accessible in any network environment.
Navmesh Generation for Large Worlds (Experimental)
While shipping Lego Fortnite, we had to optimize the different systems inside of our navigation tools to have better support for much larger and dynamic worlds. As such, we have made lots of improvements to the runtime generation debugging tools available.
We also made better tools for Invokers and made navmesh resolutions better, so you can tweak your game's performance by introducing these concepts and hopefully be able to generate the navmesh, when, where, and how you need to. Now, navmesh generation becomes less of a bottleneck with large open worlds with huge amounts of AIs present!
Finally we introduced even more fixes for navlinks generation, with better world partition and OFPA support.
Editor
Python Framework Upgrade to 3.11.x

We upgraded the Python Framework to 3.11.x to align with the recommendation provided by the VFX Reference Platform. The purpose of this upgrade is to minimize incompatibilities between different software packages used by the industry.
Multi User Actor Replication

Replicate actors in real time over Multi-User Editing. For those cases where distinct transactions are not enough, users can now curate a list of actors from the world and the properties on them that they want replicate in real-time.
Multi User Remote Function Call
Multi User Remote function call provides a way for one client to call for the execution of pre-defined C++ and Blueprint functions on another client over Multi-User Editing.
Editor Accessibility: Application Scale (Experimental)

Users can now use the Application Scale setting under Editor Preferences > General - Appearance > User Interface to adjust the size of UI elements in the Editor.
Setting the value above 1.0 will increase the size of text and UI controls, proportionately, making labels and values easier to read.
Setting the value below 1.0 will decrease the size of text and UI controls, which means more content can fit on the screen.
UI Systems
Slate PostBuffer (Experimental)

UI Developers can now sample the scene with UI Materials more efficiently, and apply arbitrary FX such as full-screen desaturations and color shifts. This was not feasible previously due to SceneColor not being exposed for UI Materials. In this experimental release, only a scene Blur FX is available, but more effects will be added in future releases.
Learn more by reading the Slate PostBuffer documentation.
You can also explore a sample of Slate PostBuffer by downloading the Content Example project from the Unreal Engine marketplace, and then looking at the UI_SlatePostBuffer map.
UMG Viewmodel (Beta)
The UMG Viewmodel plugin, based on the MVVM (Model-View-Viewmodel) pattern, empowers designers to work independently from programmers, and to be able to make structural changes to Widgets without code changes.
In this release, we extended the limits of what UI designers and developers can do with the following features:
-
Binding to events: Create a binding that executes when an event is fired.
-
Static Viewmodel: Initialize values of an instance of a Viewmodel directly in UMG.
-
Show Blueprint graph: See the associated Blueprint graph for a binding.
-
Diagnostics: More precise information provided in validation and error logging.
Media
Medio IO Realtime MIP Generation

We have now exposed the ability to generate mipmap chains for Media Tracks in real-time for improved rendering and video image stability. We added the following:
-
A Media Track setting that enables real time mipmap chain generation.
-
A Media Plate Actor checkbox that exposes the above setting under the mipmap section.
Media IO EXR Latlong Pole Mips Offset
Virtual Production users on LED stages are experiencing increased tiles requests at the poles when playing large latlong tiled EXR files. This typically happens on ceiling nDisplay nodes where the IO requirements can jump past the hardware capabilities causing stalls or playback stutters. We are now providing an optimized system accessible through the Media Plate Actor to automatically increase the MIP levels requested and cap the Media Plate bandwidth EXR tiles requests.
-
We added a Media Plate Actor option called Adaptive Pole Mip Offset to automatically adjust MIP offset to keep IO requests constant.
- This works only with tiled EXR in the Sphere configuration.
Media IO Minimize TSR/TAA Artifacts

Video playback and Material based animations exhibit visual artifacts such as smudging when used with TSR and TAA. Even though the visual degradation can be improved with real-time MIPS and increased screen percentage, it is not enough to produce the desired image fidelity. Media IO Minimize TSR/TAA Artifacts minimizes the experienced artifacts caused by the temporal algorithm and the lack of motion vectors. This benefits users from all industries using video playback or streamed content of any kind.
-
Minimizes TSR and other TAA-caused artifacts (temporal algorithms).
-
Provides a temporal pass-through for specially-tagged geometry such as playback plates.
Production Rendering Pipeline
Render Layers

To better connect Unreal Engine within studio pipelines, Movie Render Queue now has the ability to easily generate Render Layers as high-quality elements for post compositing. Shots can be broken down into multiple layers to do things like separate foreground characters from the background environment, providing more control over the final image and facilitating the integration with live action plate footage. Render Layers are supported for both the Path Tracer and Deferred Renderer.
Movie Render Graph
To help studios scale their Unreal Engine rendering usage to larger and larger projects, Movie Render Queue now uses a new node-based architecture to manage render settings. Movie Render Graph provides artists and supervisors the fundamental building blocks that define a render along with data flow and logic nodes to build out graphs that are as simple or complex as necessary to address the needs of both small and large teams.
Artists can set up graphs to render a single shot, or design graphs to scale out across complex multi-shot workflows. A strong and intuitive inheritance scheme means productions can construct hierarchical render settings at any level, whether show, sequence, or shot. The graph system also puts pipeline capabilities front and center with convenient, developer-friendly entry points for pre- and post-scripting and automation.
Protocols
DMX Control Console

Effectively drive and control large quantities of fixtures and faders using the DMX Control Console. Designed to simplify DMX debugging and to give you quick control of a set of fixtures, which can be virtual or physical. Auto-generate and populate faders based on your library and patch selection. Users from Live and Virtual Production industries can use these faders to generate and send DMX data to physical devices.
-
Asset based infrastructure for better UI controls and UE consistency.
-
Multi-select and Patch grouping.
-
Multiple Patch selection no longer displays multiple fixture groups, instead displaying just one, similar to the Details panel behavior.
-
Use folder nesting of Patches inside groups to expose a given set of faders.
-
Search channel history now remembers what a user has searched for before so they don't need to retype it constantly.
-
Search templates for quick search of specific channels. Since all the possible channels of a given Patch are already known, users can now pick from them instead of using an arbitrarily search.
-
Saving & Reloading Cues to recall presets of fader states.
-
Control Widgets for more powerful and intuitive control knobs and widgets.
DMX Pixel Mapping

DMX and Pixel Mapping features are now often used in larger complex setups which require the ability to effectively drive and pixel map large numbers of fixture patches. To further simplify the Pixel Mapper UX and to help support Live/Virtual Production users, we made the following improvements:
-
Grid system for pixel grid accuracy: You can now snap Patches to a grid. The grid can be of arbitrary resolution (width and height) regardless of the input texture.
-
Patch color scheme is now taken from the DMX Library: This is now consistent with Control Console and Library.
-
Exposing the Patch highlight size for extra clarity.
-
Patch rotation and horizontal/vertical flip support for increased flexibility.
-
Font size scalability so that we can better read Patch information.
-
High precision internal buffers for downscale, blur, and pixel mapping processing.
-
Linearity flag support for input textures.
DMX Data Conflict Monitoring

Previously, Users could be unaware of potential DMX data collisions because there was no centralized UI to view and identify such conflicts. Now, DMX Data Conflict Monitoring implements a UI panel or window that exposes all currently-sending DMX subsystem instances, like the Control Console , Pixel Mappers, or Blueprints. This benefits all industries and users using DMX, especially those using combinations of tools with the Pixel Mapper and Control Console.
-
Centralized UI panel or window to expose and centralize all concurrent DMX sending subsystem instances. For example, active instances of Control Console, Pixel Mapping or Blueprint.
-
Highlight collisions and conflicts on a per-patch basis.
Platform SDK Upgrades

-
Windows
-
Visual Studio 2022 v17.4 or newer
-
Windows SDK 10.0.18362 or newer
-
LLVM clang
-
Minimum: 15.0.0
-
Preferred: 16.0.6
-
-
.NET 4.6.2 Targeting Pack
-
.NET 6.0
-
-
IDE Version the Build farm compiles against
-
Visual Studio: Visual Studio 2022 17.8 14.38.33130 toolchain and Windows 10 SDK (10.0.18362.0)
-
Xcode: Xcode 14.2
-
-
GDK
-
Minimum Windows SDK: 10.0.19041.0
-
GDK: October 2023 Update 3
-
Latest recovery version
-
Supported IDE: Visual Studio 2022
-
-
Linux
- Native Linux Development
* Recommended OS: Ubuntu 22.04 or CentOS 7
* Compiler: clang 16.0.6
- Cross-Compile Toolchain: v22 clang-6.0.6-based (CentOS 7)
-
macOS
-
Recommended
-
Latest macOS 13 Ventura
-
Latest Xcode 14.1 or newer
-
-
Minimum
-
macOS 13 Ventura
-
Xcode 14.1
-
-
-
EOSSDK
- 1.16.3 binaries with 1.16.2 headers
-
Steam
- 1.57
-
iOS / tvOS / iPadOS
-
Recommended
-
Latest macOS 13 Ventura
-
Latest Xcode 14 Sonoma
-
-
Minimum
-
macOS 13 Ventura
-
Xcode 14.1
-
-
Supported Target SDK versions: iOS 15 or later
-
Graphics API: Metal 2.4 and Metal 3.0
-
-
Android
-
Android Studio Flamingo 2022.2.1 Patch 2 May 24, 2023
-
Android NDK r25b
-
Android SDK
-
Recommended: SDK 33
-
Minimum for compiling UE: SDK 30
-
Minimum target SDK for running on device: SDK 26
-
* AGDE v23.1.82+ required if you are using AGDE debugging.
-
Build-tools: 33.0.1
-
Java runtime: OpenJDK 17.0.6 2023-01-17
-
-
Switch
-
SDK 16.2.3
-
Minimum Firmware Version: 17.0.0-7.0
-
Nintendo Dev Interface 2.5.5
-
Supported IDE: Visual Studio 2022
-
-
PS4
-
Orbis SDK 11.508.011
-
System software 11.508.011
-
Supported IDE: Visual Studio 2022
-
-
PS5
-
Prospero SDK 9.00.00.40
-
System Software 9.00.00.45
-
Supported IDE: Visual Studio 2022
-
-
ARCore
- 1.37
-
ARKit
- 4.0
-
OpenXR
- 1.0.27
Release Notes
Animation
API Change:
- FSkeletalMeshObject::MinDesiredLODLevel is no longer clamped to the highest loaded LOD, so when mesh streaming is enabled MinDesiredLODLevel may reference a LOD that is not streamed in.
- ILODSyncInterface now makes a distinction between the LOD requested for streaming (if mesh streaming is enabled) and the LOD requested for rendering. SetSyncLOD and GetCurrentSyncLOD have been deprecated in favor of Get/SetForceStreamedLOD and Get/SetForceRenderedLOD.
New:
-
Added a function to UDNAAsset that allows it to be copied at runtime. This is needed for systems that dynamically generate meshes at runtime, such as Mutable.
-
Control Rig: Added key reduction/optimize for bool, int, enum channels when baking to control rig
-
Lowered the angle threshold for flagging bad BlendSpace triangulation from 4 to 1 degree, to reduce the chance of bogus warnings.
-
Add an option to enable/disable each BlendSpace sample when using "analyse all"
-
PerformanceCaptureCore plugin** This experimental plugin add two new actor components and two new actor classes to replace animation blueprint workflows for motion capture:
- Performer Component: Should be added to skeletal meshes that bone-for-bone match an active LiveLink subject. The Performer Component let's you choose a skeletal mesh (defaults to the one closest to the root component) and a LiveLink subject. The component overrides the animinstance on the chosen skeletal mesh and ensures it is driven by the LiveLink Data.
- Retarget Component: Should be added to an actor with a skeletal mesh. Allows the user to choose a source and a target skeletal mesh component (the source can be part of an external actor) and an IKretarget asset to copy animation between the source and target.
- CapturePerformer Actor: A skeletal mesh actor containing the Performer Component functionality.
- CaptureCharacter Actor: A skeletal mesh actor contain the Retarget component functionality and BP scripting API to control the retargeting properties.
-
Motion Extractor Modifier: Added space enum to allow calculating motion relative to another bone.
-
Improving packing on SkeletalMeshComponent which should get a 16 byte gain. This will cause SkeletalMeshComponentBudgeted to drop to the 4080 bin for all platforms other than Switch, getting 288 bytes back for each.
-
The LOD Sync Component now behaves correctly when mesh streaming is enabled
-
Converting from static mesh to skeletal mesh now allows setting the target path, swapping out suffix/prefix, and give a choice of where to place the root bone.
-
Add ForceNextTickThisFrame function to AnimationBudgetAllocator.
-
Improved memory usage estimation for cooking animation clips
-
Provide alternative orientation calculation method for BlendSpace analysis. This avoids problems when the pointing bone is not restricted to an "upright" orientation.
Bug Fix:
-
The default deformer setting is now retained when re-importing a skeletal mesh.
-
Fixed not being able to set the preview mesh for a multi-selection of animation assets in the sequence browser.
-
Fixed buttons in the BlendSpace details from disappearing when searching.
-
Added a new setting "Build Half Edge Buffers" to Skeletal Mesh Editor. It allows half edge data to be cooked with the Skeletal mesh asset such that deformer graphs using half edge data interface still work once the assets are cooked
-
Fix to get blending of control rig poses working when a sequence has multiple control rigs
-
Changed some calls to GetValueOnAnyThread from GetValueOnGameThread as RigVM can also be used in jobs
-
Fixed an issue in the skeletal mesh or skeleton editors where transforming bones or resetting them back to a default pose wasn't undoing properly.
-
Fix to AnimationBudgeAllocator that keeps tick rates consistent between tick prerequisites.
-
Fixed an issue where editing per-platform settings on the skeletal mesh details would sometimes leave the platform name as "None" instead of the actual platform name.
Deprecated:
-
Add OverrideMinLOD and deprecate SetMinLOD in SkinnedMeshComponent. - SetMinLOD requires bOverrideMinLod to be true for it to function, so adding a function that sets MinLOD and bOverrideMinLod to true.
-
Control Rig: Deprecated interaction rig as it's no longer used.
Gameplay
New:
-
blendstack support for automatic transitions in state machine
-
Find and replace feature for ChooserTable property references
-
Allocate temporary memory for chooser evaluation on the stack
-
Rewind Debugger track view improvements - Striped background - Track names in tooltips - Synchronized hover state - Object tracks now display lifetime with SEventTimelineView
-
Fix for rewind debugger scrubbing crash
-
Added icons for Proxy Tables and Proxy Assets
-
ChooserPlayer anim graph node
-
Drag/Drop Assets to add to ChooserTable
-
Add toolbar toggle buttons for auto Eject/Record features in Rewind Debugger
-
Fix for choosers and proxy assets that return classes (such as for selecting an Anim Class)
-
Added FootstepAnimEventsModifier to the AnimationModifierLibrary. Used to generate sync markers and notifies for any number of specified bones.
-
Property binding optimizations for choosers
-
ChooserTable Editor multi select and edit support
-
Add support for overriding PlayRate from within blend stack subgraph
-
Fix ChooserTable crash on asset reload
-
Improvements to anim node property tracing and display in the animation blueprint editor: - Trace selected animation for ChooserPlayer node. - Make debug bubbles in rewind debugger show all traced node properties, except Name. - Make sequence player nodes display the current sequence in the debug bubble. - Trace assets, such as Sequence or BlendSpace with the Key: Asset, and enable display of the Asset column in the AnimGraph rewind debugger details.
-
Anim Node Reference Tag support for nodes inside BlendStack subgraphs
-
Separating BlendStack from PoseSearch into its own plugin
-
Move camera shake-related headers into sub-directories, move legacy headers into separate directory
-
Support for nested Chooser Tables in the same file
-
Fix for end of lifetime tracing on linked anim graphs
-
"Any" setting for Chooser Enum Column
-
Fix settings in rewind debugger not saving
-
Enable visual logger rewind debugger integration
-
Optimizations for ChooserTable and Proxy property access
-
add multi-output support to proxy table lookups
-
Chooser Debugging with Rewind Debugger
-
Rewind Debugger Track Type filtering
-
Fallback result for chooser tables
-
Refactor chooser evaluation context to avoid memory allocations at runtime
-
Added support for filtering notifies originating from a blend stack.
-
Improve handling of Child AnimationBluprints in Rewind Debugger
-
Rename camera shake API parameter structs to make room for new ones
-
Auto eject on pause feature for Rewind Debugger
-
Clamp montage playback when stopping at end of section
Bug Fix:
-
Fix crash in proxy table editor when selecting the row after the last row
-
Fixed Rewind Debugger crash which could happen if starting PIE before opening the Rewind Debugger when auto-record is enabled
-
Fixed for stack overflows in rewind debugger related to animation setups with large numbers of curves
-
Properly build the duration of the composite shake
-
Add support for bitfield bool properties in chooser property access
-
Crash fix in ChooserTableEditor when deleting rows
-
Fixed warnings when opening assets from rewind debugger, and made animation assets scrub to the correct frame when opening via double click
-
Fix bug with property binding widget where it won't display anything if the only bindable properties are children of a UObject function
-
Fix for cooker crash with User Defined Structs in Instanced Struct data in Choosers/Proxy Tables
-
Make Rewind Debugger links to nodes in the AnimationBlueprint, from the AnimGraph track details, attach debugging to the correct instance when they open
-
rewind debugger optimizations - fix bugs causing treeview to refresh repeatedly, make curves tracks not update unless they are expanded
-
Fix native proxy table bindings not working
-
Fix crash when changing struct binding in Proxy Table Struct outputs
Movie Render Queue
New:
-
Exposed all OpenEXR compression formats to movie render queue outputs.
-
Exposed OpenColorIO CPU transform support in the movie render graph.
Bug Fix:
-
Movie Render Pipeline: Fixed selected shots not getting enabled in the queue when right clicking in Sequencer to Render Shot
-
Fix to allow MRQ to render water.
-
Updated the audio renderer to ensure the audio is correct when more than one temporal sample is used.
Rigging
New:
-
Deformer Graph: Changed the location of the checkbox for atomic operations and read access from "Set Resource" node to the Output Bindings on a kernel node. This allows a kernel to read from/perform atomic operation on its outputs whose type is int.
-
Added the ability to remove curves in the Curve Expression animation blueprint nodes. This can be done either by using the
undef()
operator on the right-hand side of the expression, or by just prefixing the curve name with-
(e.g.-CurveName
) and omitting the rest of the assignment expression. -
Deformer Graph: Added support for automatically caching results of kernels whose output won't change. These kernels are marked in green color. Only kernels in the Update Graph are considered.
-
Added a project setting, r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences, that allows you to enable Unlimited Bone Influences in a project without compiling extra shader permutations for GPU skinning. This saves runtime memory, disk space and shader compilation time. When the setting is enabled, any mesh LODs using Unlimited Bone Influences that don't have a deformer assigned will use the DeformerGraph plugin's default deformer. This ensures that UBI meshes are always rendered with a deformer, and therefore the GPU skinning permutations for UBI aren't needed. This change also adds a per-LOD setting that allows users to disable mesh deformers on a LOD, which could be useful for controlling performance, e.g. disabling an expensive deformer on lower LODs. Some changes to functions on USkinnedMeshComponent lay the foundations for having different deformers on different LODs as well.
-
Added support for direct link between data interfaces in Deformer Graph
-
Control Rig: Allow runtime changes to control rig class in AnimBP. The Animation Blueprint node now offers functionality to change the control rig class used at runtime.
-
Control Rig: Command to load all control rigs. With the command line command ""ControlRig.LoadAllAssets" all assets in the current project can be loaded - helping with finding issues in assets.
-
Control Rig: Support for marquee selection in the viewport
-
Control Rig: Allow full compilation in PIE. Rigs can now be recompiled during PIE - which makes it easier to iterate on characters as they are in pose in the game.
-
The Base LOD parameter is now exposed on LOD setting data assets.
-
ControlRig Virtual Machine (RigVM) has been refactored to make it stateless and optimized to decrease the cost of creating instances (all instances of the same graph now share the VM). Also, the internal memory backing system has been changed to use instanced structs.
-
RigVM: Ray Math Functions. We've added "Intersect Ray", "Intersect Plane", a ray "GetAt" and "Transform Ray" nodes
-
RigVM: Enable profiling in release mode
-
Users can now convert a sub graph node into a reusable function that can be used in other deformer graph assets if its access specifier is set to public.
-
Moved some functions from RigVMBlueprint to the RigVMClientHost, so these are available for different users of the system through the client host interface
-
Added built-in Deformer Graph functions for Linear Blend Skinning and Dual Quaternion Skinning
-
Control Rig: Added editor only AssetUserData array to ActorComponent, SkeeletalMesh, Skeleton and RigVMHost. These will add editor only dependencies to the referenced data.
-
The Skeletal Mesh Modeling Toolkit plugin now includes all the same polygroup manipulation tools as the static modeling toolset.
-
Control Rig: Our standard function library is now exposed to UEFN #virtualized
-
ControlRig: added Parent constraint math Node
-
An arbitrary number of single-channel / alpha vertex maps can now be imported via FBX onto skeletal meshes.
-
Added built-in Deformer Graph functions for non-linear deformation including Bend, Squash&Stretch, Twist and Flare.
-
Added built-in Deformer Graph Function for Lattice Deformation.
-
Deformer Graph: Added support for math expression when setting the execution domain of a kernel
-
Added a new Control Rig node, Curve Exists, to check whether a curve actually exists on a skeletal mesh without evaluating it.
-
Fix Control Display actor always shows hidden controls
-
Control Rig: Added Pre and Post forward solve events which will be executed immediately before and after the forward solve. These events are useful when rig modules need to execute before and after a child module has been processed.
-
Disabled creation of deformer instances for dedicated server
-
Added support for loop nodes in Deformer Graph
-
Control Rig: Direct manipulation on nodes. Right clicking on nodes now allows user to interact with values on pins like vectors or transform directly. Node developers can also offer custom functionality, like for example with the Aim nodes.
Bug Fix:
-
Bind RigVMHost type so blueprint created callback can be called on control rigs
-
[Modular Control Rig]- Content only. Fix extra nulls that were showing up when someone uses the chain module causing clutter in the outliner.
-
Fix an issue with duplicated vertex data interface providing invalid data for mesh with more than 1 material section.
-
Get animation attributes working with control rig component
-
Fixed ControlRig VM hash calculation runtime cost by moving the hashing to compile time. The hash function cost has also been significatively reduced.
-
Fix Skeleton Data Interface node in Deformer Graph not working when the skeletal mesh is using unlimited bone weights
-
Fixed shader compilation error when connecting a parameter pin to a resource pin on a custom compute kernel node in Deformer Graph. This type of connection is now supported
-
Fix Deformer Graph editor crash when clearing preview mesh while the transform manipulator is shown in the viewport
-
Fix for ControlRig silently losing pin connections to UUserStruct members, when a member of the struct is renamed while being used by the rig
-
[Modular Control Rig]- Fix leg module to let user change the shape of the controls. Fixed a few other very small issues in the arms, legs, piston, addControls modules.
-
Fixed ControlRig VM compiler generating duplicated properties by reusing operands in inline functions.
-
Fixed assertion when editing a user defined struct used by a deformer graph before the deformer graph is opened/loaded in editor
-
Fixed a multithreading issue at Control Rig function registry, in order to avoid a deadlock when a VM is initializing in a thread while a different worker thread registers a function.
-
Fixed Skeletal Mesh Editor's LODInfo section not displaying new vertex attributes added via Add Weight Map Layer in Skeletal Mesh Editing Tools
Runtime
New:
- Changing the default animation curve compression codec to use ACL.
- This reduces the compressed memory footprint, and it improves decompression performance.
-
Runtime switching override physics assets on rigid body animation node using function library
-
Introduced new flag to ignore the RBAN LOD threshold CVAR and force use the one locally set on the anim graph node.
-
Exposed LOD threshold as a pin for the pose driver node
-
Blend Stack: Added per-sample graph support
-
Added support for skeleton compatibility in combination with blend profiles / masks.
-
Added the ability to add comments to curves on animations
-
Improved tooltip on CompatibleSkeletons in USkeleton
-
Added OnMontageBlendedIn callback to animation instance
-
New: Changed p.RigidBodyNode CVar from using TAutoConsoleVariable
to using a bool FAutoConsoleVariableRef instead. This avoids unnecessary calls to CVarEnableRigidBodyNodeServer.GetValueOnAnyThread(); instead, it uses the bool variable bEnableRigidBodyNode. -
Add possibility to expose the LOD thresholds as pins for the following nodes: Control Rig Rig Logic Skeletal Control Base (RBAN)
- Anim notify and sync marker workflow changes
- Skeletons are no longer dirtied when adding notifies and sync markers from animation timelines.
- Removing notifies and sync markers from the skeleton now does only that. To remove from animations, use the find/replace tab
-
Added the option to toggle the request forward behavior that is used by the in Inertialization Anim Node, and removed the request forwarding from DeadBlending Anim Node.
-
Respect bExposeNotifiesUICommands option in NotifyPanel in the skeleton and animation sequence editors
-
Only process a sequence once when adding multiple keys # jira UE-193618
-
Made Dead Blending Anim Node store pose and bone data sparsely according to which bones are present in the CompactPose.
-
Expose anim graph IsActive to anim node functions
- Updated the ACLPlugin to latest develop branch
- Source git commit: 5091b840185542fbe1cde5643c9c60448ae631fc
- This reduces the compressed memory footprint and improves visual fidelity.
-
Use UToolMenu for AnimNotifyTrack ContextMenu. This allows users to customize the menu and apply permissions.
-
New layers added to an anim layer interface will now start on a shared group by default, making them share instance at runtime, for better default performance.
-
Added support to rename blend masks and blend profiles in the skeleton editor
-
Added a new visibility-based tick option to the skinned mesh component that forces ticking montages and refresh bones when a montage is being played.
- Added the ability to run find replace on mirror data tables for an existing table. This functionality is useful if you have new bones or have changed your find / replace expressions for the table.
Bug Fix:
-
Fixed new anim state machine transition nodes not appearing when the graph is far from the origin
-
Switched to using FLazyName for control rig built in types
-
Fix function renames not applying to property access nodes and compilation crashes post-rename
-
Fix montages not being marked dirty when (e.g.) adding curve comments or changing curve colors
-
Fix notifies not being displayed in context menus under certain circumstances
-
Fix an infinite loop caused by requesting a start time outside the range of the animation by exactly the input DeltaTime
-
Fix for issue where anim streamable couldn't be created directly from anim sequence asset #changelist validated #virtualized
-
Fix budgeted meshes that are placed in levels not getting registered when playing as client
-
Fixed animation sequence editor details not showing the the list of bone animation tracks
-
Several improvements to reduce the likelihood of running into stack overflows when evaluating large AnimBPs.
-
Fix crashes when "call function" nodes are root-wards from a layered blend per bone node
-
Creating a montage directly from a sequence now respects the sequence framerate
-
Fixed not advancing sync markers properly if two or more markers are to be passed in a single tick.
-
Added curve debugger back to the skeleton editor
-
Fix URO-interpolated curves 'flickering'
-
Disabled MinKeysForResampling when resampling is not selected in anim compression settings
-
Fix to prevent anim montages from continuing to play animations past the end of the the last section.
-
Fix crashes around creating and deleting pose assets
-
Animation editor preview scene OnAnimChange delegate will now be called with the correct animation asset being set in the scene (or null ptr if preview is getting closed)
-
Removed curve compression codec instance GUID since it causes cook determinism issues and isn't otherwise required.
-
Fix animation attribute registration issues with attributes defined as user-defined structs
-
Fixed branching point notifies anim montages on load that were saved with a null LinkedMontage ptr
-
Added edit condition to disable anim per-track compression adaptive error settings when the features are not enabled
-
Add missing nullptr check on animation blueprint editor preview instance
-
Fixed an use after destruction issue at AssetEditorModeManager, if the PreviewScene has been already destroyed when the World cleanup takes place
-
Fixed crashes refreshing animation timelines
-
Fixed issue with Dead Blending Anim Node creating NaNs when encountering negative scales, and also made it so that the the LinearlyInterpolateScales flag causes scalar velocities to be calculated linearly. This allows for full support of negative scales when this option is enabled.
-
Switched missing bones ensure to be a logged error
-
Fix ensures and crashes when interacting with the Motion Matching node
-
Fix animation compression not dispatching when the curve codec is changed and the animation has no bone data
-
Fixed stack offset in AddErrorIfFalse to correctly report file & line that the error was emitted on
-
Newly-spawned anim instances now call BeginPlay overide points when they are spawned 'late'
-
Support pose watch when debugging parent or linked anim blueprints. Also prevent toggling pose watch from child anim bps
-
Fix crashes when creating property bags with identical layouts from multiple threads
-
Fixed crash setting a preview animation blueprint
-
Fixed recording of anim notify states in looping montage sections
-
Fixed custom property node delegate registation from the ALT to allow for async loading
-
Animation debug draw items now flush in both post update and post evaluate
-
Fix anim BP node orphan pins not getting removed on disconnection
-
Update compatible skeleton mappings when a ref skeleton is updated.
-
Update FRetargetingScope to ensure raw transforms have compatible skeletons applied
-
Fix crash initializing rigid body nodes for skeletal mesh components with no mesh assigned
-
RandomPlayer anim graph node now calls PreloadRequiredAssets.
-
Fix crash showing debug information for a blend space evaluator with no blendspace
-
Skeleton Mesh Linkup map has been refactored, in order to avoid leaving dead data in the LinkUpTable.
-
Allow Sockets to be added to Virtual Bones. Enable other functionality for Virtual Bones.
-
Moved LocalBlendCSBoneTransforms to use a TArrayView
-
Fix ACF_IntervalFixed32NoW codec format for translation/scale when used with linear key reduction
-
Fixed an issue with AnimSequences generating cook indeterminism due to curve names sorting.
-
Added AnimDrawDebugCapsule to AnimInstanceProxy for debug drawing purposes
-
Fixed crash reverting Skeletal Mesh unsaved changes while the asset is opened in the editor
-
Optimize common case of single full-weight entry in a blend list
-
Fix ensure when removing a notify track
-
Disable 'Add Socket' action in skeleton tree when a bone is not selected
-
Ensure that both notify and notify state properties are copied when copy/pasting
-
Fix recording/display of pose attribute debug info
-
Remove invalid ensures. Compatible skeletons means we can no longer guarantee that all bones within the pose asset exist in the skeleton.
-
GetLinkedAnimLayerInstanceByClass now optionally checks for Child class.
-
Expose bind pose scale to compression codecs. Update the ACLPlugin to use the bind pose scale.
-
Fix mesh space additive remapping to use the correct rotation fixup.
-
Optimized the opening of notifies/sync marker widget
-
Ensure that bones missing from an anim sequence still follow their parent when the sequence is a mesh-space additive just like they would if the bones were present in the sequence but not animated.
-
Fix to give smoother interpolation when evaluation frames are skipped. This is similar to the calculation used in the budget allocator.
-
Optimized various low-level parts of the anim blueprint runtime
-
Fix for crash when validating auto rule based transitions. Also reinstated some warnings as info
-
Fix error caused by unknown edit condition in twist corrective node
-
Fix incorrect BuildUnsorted overload being picked when compiling EngineTests
-
Fixed an assert being hit while ticking a montage with sync markers due to its position being modified outside of its asset player.
-
Fix curve debugger not working correctly with pose watches when connected to an external instance
- Fix edge cases around re-importing meshes with bones inserted into the hierarchy
- This adds a CVar (a.Skeleton.AllowIncompatibleSkeletalMeshMerge) to enable the addition of bones into the middle of skeleton hierarchies via import.
-
Fix for debug draw on blendspace player nodes when debugging parent anim bps
-
Fixed curve filtering option on DeadBlending on Anim Node.
-
Fixed issue when BlendProfiles and BlendModes were used in combination on DeadBlending Anim Node. Added bone filter to Inertialization node. Memory improvements to Inertialization node and some cleanup/deprecation of old code.
-
Fix unfixable warnings when variables referenced in in anim graph node pin bindings are removed
-
Fix for potential crash when retrieving anim attribute values
-
Prevent crash when attempting to create animation asset with invalid mesh/skeleton
-
Fix crash opening binding menus in state tree
-
RigVM: Fix pin-resolution behavior with already-resolved float and double pins
-
Fix issue where screen size property isn't correctly hidden in skel mesh details customization when driving LOD settings from data asset
-
Fixed blend spaces not syncing properly when using inertial blends. *Fixed blend spaces not syncing when using "Transition Leader" and "Transition Follower" sync group roles.
-
Fix blend list optimization to correctly check weight of single active pose
-
Fix node bindings not being present for nodes that are drag-dropped
-
Fix pasted 'anim getter' nodes introducing hidden references to their source anim BP
-
Fixed the animation editor renaming of float curves, that was returning error due to an issue in the name check.
-
Fix FMessageStack::HasMessage to properly account for popped messages
-
Fix bug with CurveSource node where it would affect curves not present in the curve source asset
-
Expose a native way to get the 'main' anim instance in a thread safe way, negating the need to nest property accesses to acheive the same effect
-
Exposed AddAnimNotifies publicly in FAnimInstanceProxy
-
Correctly use the key reduction thresholds in "Remove Trivial Keys" animation compression
-
Fixed accumulation of attributes not working properly when evaluating a pose from a slot node using time blend profiles and additive poses.
-
Fix crash when unlinking a linked anim layer that nests a linked anim graph
-
Fix debugging watched pins in child anim BPs
-
Fixed per-track compression to not allow selection of invalid scale formats
-
Fix for an issue where WheelController anim node wasn't updating upstream nodes in the anim graph
-
Fixed inertial blends originating from a BlendBy anim node not working with sync groups.
-
Fix "weighted moving average" mode in modify curve node
-
Fixed a crash when reloading a skeletal mesh while an animation sequence is open, due to a stored raw pointer in the PersonaToolkit
-
Fix montage preview of non-default tracks not firing notifies
-
Tweaked skeleton tree bone weight tooltip to better reflect the weighting of a bone
-
Add support for blendspace graph nodes to FBlendProfileCustomization::GetSkeletonFromOuter
-
Fix an invalid memory read when ACF_None is used as a rotation format in various animation codecs
-
Added clamping to the UI for "Remove Every Second Key" anim compression's Min Keys property
-
Fix GC crash with Sequencer anim instance proxies
- Assets (i.e. not umaps) with external packages now save correctly when saving from the content browser
Sequencer
New:
-
Sequencer- Allow materials to be referenced by material slot name rather than just by index. This prevents breaking resolution of material parameter tracks when materials indices get reordered within a mesh, as long as the slot names remain consistent. For now, we try to match by slot name first, and then by index if we cannot find a material by its slot name (or one doesn't exist in the binding for backwards compatibility). We also provide ways to refresh/fixup this binding in case material slot names or indices change. * Adding the ability to reference the OverlayMaterial in MeshComponents, and animate parameters in it, or change which material is assigned to the overlay material property using a material switcher track.
-
Sequencer: Add the ability to animate layer and function material parameters in Sequencer.
-
Sequencer: Tree View UX - Alternating rows have different tints, parents have different tints, make sure top level rows also report as a parent row, rows that have keys or sections selected also report as highlighted
-
Sequencer: UX changes for Playback Controls - new icons, info button, current time indicator.
-
Sequencer: Sequencer and Curve Editor Key Selection in BP/Python
-
Sequencer: Animation Mode: When reopening level sequence restore tween/tool states, recreate control rig as needed, and restore selection.
-
Sequencer- Added a track for animating custom primitive data on PrimitiveComponents. Custom primitive data is an alternative way of driving material parameters. It allows you to map any of 36 numbered float parameters on a PrimitiveComponent to one or more material parameters across multiple meshes and materials. You can apportion between 1-4 slots in a row to handle anything from scalar to color parameters. Previously these could only be set via code or blueprint, but now these can be animated in Sequencer.
-
Sequencer: Constraints: Animated constraints live in the level sequence
-
Add shared state structure for sequence hierarchies, with new "playback capabilities" container This lets external code (like level sequence actors or UMG widgets) specify what a given sequence instance can provide in terms of contextual information or logic. This is a first step towards removing the necessity for IMovieScenePlayer in core sequencer evaluation code.
-
Add grouping system to help with the common pattern of multiple contributors being grouped when animated the same target
-
Take Recorder: Add tokens (ie. day, month, take, actor) for animation asset and audio asset directories. Also, added tooltip information for what tokens can be used
-
In TakeRecorder, the audio device list is now more robust to devices going offline. A menu item has been added for refreshing device list.
-
Sequencer: Added Conform to Range in the right click menu of the timeline to conform the start/end range to the subsequence range.
-
Sequencer: Added a new interface that allows any UObject to implement an interface (either in C++ or BP) to receive events when Sequencer binds/unbounds that object. To get the events requires the sequence add a Binding Lifetime track to the binding. If the BindingLifetime track remains infinite in length, then the events will fire at the beginning and end of sequence playback respectively. If the binding lifetime track has a finite range, then the events will fire when entering/exiting the binding lifetime section.
-
Sequencer: Added SetCompletionModeOverride and GetCompletionModeOverride on the SequencePlayer.
-
Sequencer: Control Rig: Avoid issues with running PIE with the editor with Control Rig. Instead of sharing the same Control Rig in all worlds if there is a new game world we use a new instance of the control rig and set up/evalute that one in evaluation.
-
Curve Editor: Show first and last key's tangent handle on both sides. This is useful for example, if you have pre and post infinity set to cycle, you can manipulate the last key's leave tangent so that it's smooth to the first key's arrive tangent.
-
Fix curve editor stacked view mode not displaying single channel curves
-
Fix Curve Editor Curve Name node updating
-
Sequencer: Change bRestoreState boolean option on FMovieSceneSequencePlaybackSettings to an enumeration named FinishCompletionStateOverride with 3 values (Default, ForceKeepState, ForceRestoreState) with ForceRestoreState being the equivalent option to setting bRestoreState to true. bRestoreState was used to force PreAnimatedState to be cached for all items globally and then restored when the Sequence is stopped or is finished. When set to false, no such override occurred, and completion mode was determined per track section by the settings on each track section. We now have a 3rd option- ForceKeepState. If FinishCompletionStateOverride is set to ForceKeepState, then when the sequence is stopped or completed, we do not restore any state, regardless of track section settings- all state active when the sequence ends is persisted.This is done by discarding any preanimated state metadata and storage, preventing it from being used to restore state.
-
Sequencer: Constraints working with snapper.
-
Sequencer: Added the ability to move all the selected marks either by dragging or by nudging (ctrl-arrow keys)
-
Sequencer: Parse takes by asset name rather than shot display name. This allows you to rename the shot label and the takes which are name based, will stay intact. This also fixed a bug where when you change takes, the shot label doesn't come along with it.
-
Add logging and checks to diagnose unknown crashes around sequence instance creation
-
Convert slomo track to use the ECS evaluation
-
Add cached expansion state values to the curve editor tree so expansion state is restored when selection changes instead of defaulting automatically to a closed state. There are just saved per session, not in any asset.
-
Optimized reinitialization of double blender accumulation buffers
-
Sequencer: Make MoveSection virtual so that sections can implement how they want to be moved
-
Added suppressible dialog to prompt user to use audio clock source when audio is added to a sequence.
-
Upgrade camera shake tracks to use the ECS evaluation
-
Sequencer: Added support for component visibility in editor. There is existing support for the actor's temporarily hidden in editor property. This adds support for the component's visible in editor property.
-
Sequencer: Added missing BlueprintType to MovieSceneFolder so that they are exposed to Blueprints
-
Curve Editor: Show arrive tangent if previous key is cubic. This allows the arrive tangent of a constant key to be visible and manipulatable.
-
Sequencer: Anim Details: Per animator feedback we only select curves on the section to key section when there are multiple sections.
-
Make material systems use the new grouping system and benefit from hierarchical bias
-
Improve cinematic preview of camera shakes
-
Sequencer: New Auto/Smart auto with no overshoot. Set's Sequencer.AutoTangentNew 2 as default revert this value to "1" to go to previous behavior.
-
Sequencer: Linked Anim Instances. Delete links if we can't resolve(by loading) the object referenced.
-
Curve Editor: Changed Curve Editor tool time properties so that they display based on the user preferences (ie. frames, seconds, timecode).
-
Sequencer: Add pre/post cycles to integer and bool channels. Integer supports all but linear, bool supports constant(default), cycle and oscillate
-
Sequencer: Allow resizing subsequence track and template sequence track row heights
-
Sequencer: New Tween Tools for Blend Relative, Blend To Ease, and Smooth/Rough
-
Sequencer- Add a new 'SequencerAnimationOverride' interface for blueprint Anim Instances. This allows custom anim blueprints to either: a) Allow Sequencer to swap out their anim instance during playback (swapping it back after). This is similar to checking the 'Force Custom Mode' checkbox on a Skeletal Animation track section, but at the blueprint level without having to change anything in Sequencer. b) Provide a list of valid Anim Slot names for the Sequencer Skeletal Animation track section UI to choose from. When provided by a blueprint with the interface, a valid slot will always be chosen when creating new skeletal animation sections.
-
Sequencer: Control Rig: Fix setting zero value so it doesn't always add and uses default interoplation
-
Add option for choosing whether the camera cut track restores the original (pre-animated) viewport position on unlock.
-
Make the camera shake previewer aware of the world in which it should run shakes
-
Sequencer: Added a shortcut for Focus Playback Time, which focuses the view range on the current playback time without changing zoom level.
-
Movie Render Queue: Panoramic Renderer now respects the camera rotation by default. The original behavior can be restored in the Panoramic Render Pass's settings.
-
Add a Native Finished delegate for Movie Scene Sequence Player
-
Sequencer: Add support for animating material parameters on volumetric cloud component materials.
-
Upgrade visibility track to ECS evaluation
-
Movie Render Queue: Enabled the maximize button on the PIE window to allow increasing the size of the image preview.
-
Sequencer: Added FBX Export options for baking - Bake None, Bake Transforms, Bake Channels, Bake All.
-
Support multiple sequences for the dynamic binding BP extension.
-
Sequencer: Control Rig: Add priority order for Control Rig External Nodes. Allow for multiple Control Rigs on same binding.
-
Sequencer: Added GetNextKey/GetPreviousKey functions which are exposed to SequencerOutlinerScriptingObject. Also, GetNextKey/GetPreviousKey now operate within the the sequence's time bounds (which can be restricted to the selection range).
-
Sequencer: Pose Library: Blend float/vector2d controls.
-
Sequencer: NLA: Split Sections will inherit root motion matched location.
-
Control Rig: Control rig track order set by python/bp and set default to 100. Allow for multiple Control Rigs over same bound object.
-
Add option to disable auto-arranging of camera cut sections
-
Sequencer: Allow dropping actors that haven't been possessed into folders in Sequencer
-
Sequencer: Add shortcuts for Clear Global Marked Frames and Show Marked Frames Globally
-
Sequencer: Allow MovieSceneByteProperty tracks to find UEnums nested in structs in order to properly show the UI for animating these enums.
-
Sequencer: Added SetLoopMode/GetLoopMode to LevelSequenceEditorBlueprintLibrary.
Bug Fix:
-
Sequencer: reset director blueprints in UMG when stopping an animation
-
Sequencer: Control Rig: Fix crash with adding CR to anim bp instances due to skeleton not existing in initialization.
-
Don't call CleanTaggedGarbage twice on systems that happen to belong to multiple phases.
-
Curve Editor: Fixed the Transform tool not working with the Scale Center option.
-
Sequencer: Fixed PasteBindings not returning the actual pasted bindings.
-
Sequencer: When baking, check that the bake data is valid. The bake operation bakes from start to end frame inclusive. In the case of a spawnable in a subsequence, the spawnable won't exist for the end frame, so there is no bake data, in which case we use the default transform.
-
Sequencer: Fixed dragging multiple sections on different rows.
-
Sequencer: Fix leaking pre animated state for tracks set to keep state. Looping sequences with spawnables in subscenes could cause memory to continually get allocated in pre animated storage for each time spawnables were created. This was occurring for sections that were set to 'Keep State'. Even though states were not being cached, memory was being allocated in the cache tied to the object keys because 'MakeEntry' was being called. This memory was not even required as we weren't ever caching into it or restoring state. To fix this, logic has been reorganized in the CachePreAnimatedState functions to check whether we are meant to be tracking state before creating entries.
-
Sequencer: Fixed show Selected Nodes Only not always showing the selected actors if the bound object's name wasn't the same as the binding name.
-
Sequencer: Fix issue with possessable tracks that map to spawnables. If the spawnable despawns/spawns, the possessable track was not getting correctly invalidated, and so was failing to reconnect after the spawnable respawns. In addition, update the label color logic so that if a possessable references a spawnable, and the spawnable is despawned that we show a 'gray' color instead of red, just like we do for regular spawnable tracks.
-
Movie Render Queue: Fixed an issue where canceling a job would report as a successful job for some callbacks.
-
Sequencer: Fix memory stomp that was leading to crash on undo/redo of Control Rig Constraint Bake.
-
Sequencer: Fixed shot name being erroneously carried over when switching takes and creating new takes.
-
Fixed an issue in TakeRecorder where an unavailable audio input devices was not properly handled.
-
Curve Editor: Fixed jittery movement when manipulating keys.
-
Fix false positive assert from firing when an incorrect name is given to property bindings.
-
Sequencer: Control Rig: Masked controls may not key correctly since wrong control/mask index was being used. Also fix old CIS warning from Marc.
-
Fix a bug where, in some special circumstances, Sequencer would not cache the correct initial material parameter value
-
Stable sort sequencer outliner children to avoid weird reordering issues
-
Only set last known position on client-side initialization, to solve bug with replicated sequence that doesn't start at 0.
-
Speculative fix for crash during level sequence actor teardown.
-
Be more lenient in editor about invalid dynamic binding resolvers
-
Sequencer- Improve performance of searching for items in large sequences by keeping the Spawnables, Possessables, and ObjectBindings arrays sorted by FGuid and using BinarySearch where searching is necessary. Testing was performed on adds and searches in these arrays to ensure improvement (to searches). Adds are a bit more expensive, but should be alright in the vast majority of use cases. Iimprovement could be made if necessary to bulk additions by adding bulk operation functionality.
-
Don't run sequence updates when a client late-joins a level with stopped sequences
-
Sequencer: Fixed Ctrl+B not browsing to asset when Sequencer is open.
-
Seqencer: Add Evaluate to Integer channel
-
Sequencer: NLA: Fix match with next not working with blend options.
-
Sequencer: Control Rig: Remove auto compensation with space switching when we modify a channel, can lead to inaccuracies.
-
Sequencer: clear cache of UMG widget director instances when invalidating cached data.
-
Re-add FBX import/export menu entries to template sequences
-
Fix splitting/trimming of looping sub-sections
-
Resolve desired camera cut view target before checking if it's the same as the current one. This fixes some bugs when blending back to gameplay.
-
Better handle incorrect/unresolved camera bindings in the camera cut track
-
Anim: Return playing montage if there is one already playing. This fixes a bug where if a montage is playing when Sequencer starts, it doesn't return to that montage when Sequencer ends.
-
Sequencer: Import from Animation Root now imports keys relative to the current Sequencer time.
-
Fixed cleanup of invalid bindings by moving this logic from PostInitProperties to PostLoad
-
Movie Render Queue: Fixed an issue where MoviePipeline.h shadowed GetPipelineState which causes the MoviePipelinePIEExecutor to call the base implementation (which always returns uninitialized).
-
Sequencer: Fixed sequence getting marked dirty when closing a blueprint
-
Sequencer: Fix Exclude Default Property Tracks array so that it can include properties on components multiple times. CameraComponent.FocusSettings.ManualFocusDistance, CameraComponent.CurrentAperture.
-
Null check before synchronizing level editor selection.
-
Sequencer: Fixed sequence getting marked dirty when destroying a spawned object.
-
Sequencer: Constraints getting removed if we compensate out of a sequence boundary so need ot re-evaluate to make sure it's set up.
-
Sequencer: Fixed hierarchical easing channels being destroyed when still in use
-
Take Recorder: Fixed crash when using invalid character in the Animation subdirectory
-
Better handle incorrectly resolved object in dynamic bindings
-
Sequencer: Fix edge case where sequences with server-only or client-only subsections do not behave correctly with a single target executable for both server and client using TargetType.Game. In that case both server and client-only subsections stayed included. The fix is to detect when a sequence containing server-only or client-only subsections is being compiled for such a target, and mark that sequence as volatile, forcing it to be recompiled in those circumstances.
-
Correctly initialize bOverrideAspectRatioAxisConstraint.
-
Sequencer: Snapping: Constraints: Perform Euler filter when snapping/compensation static meshes
-
Sequencer: Fix default interpolation not being used on baking/loading animation onto control rigs.
-
Sequencer: Fixed rendering when scale transform changes signs (ie. positive to negative).
-
Fix camera cut flag not being set when spawnable cameras are the last in control
-
Sequencer: Fixed string array property values being incorrectly set with incorrect values.
-
Sequencer: Fixed soft object path BP nodes not being correctly populated from payload variables
-
Sequencer: Fix sync issues with replicated sequences while that sequence is itself animating the global time dilation. The code around calculating latency was not taking into account effective time dilation.
-
PR #10925: Fixed UserWidget's PlayAnimationForward and PlayAnimationReverse not playing animations if the animation was recently stopped. #contrib 10925
-
Curve Editor: Paste should paste should just paste onto the selected curves (or if none selected, derive the curves to paste onto). It shouldn't paste onto the hovered curves
-
Handle play-rate in replicated playback synchronization
-
Sequencer: Added missing EditAnywhere tags for ExportFBXParams which was preventing it from being visible in blueprints
-
Sequencer: Control Rig: Fix keying Rotator controls from Rotation Order fallout
-
Start tracking pre-animated state on new track instance inputs before stopping tracking on old ones
-
In Sequencer, the audio clock is now interpolated between frames resulting in smoother animation.
-
Seuquencer: Smart Auto hotkey missing in Sequencer
-
Sequencer: Remove copy relative option because it's a bit of a hidden feature and causes confusion when copying keys with the mouse hovered over keys at different times
-
Rerun Construction Scripts is now respected for any base blueprint class
-
Fixed registered tick interval not being reset when player was torn down
-
Curve Editor: Added shortcut to toggle lock camera command in Sequencer
-
Fix rendering issue where color property tracks in Materials were causing key areas to get culled due to mismatching outliner and trackview heights.
-
Sequencer: Changed numeric edits so that they are applied only on Enter (and no longer on focus change).
-
Sequencer: Anim Detail Fixes, reset to default and vector3d working #changelist validated #virtualized
-
PR #10839: Fixed disappearing root motion in template sequences. #contrib 10839
-
Curve Editor: Fixed mirrored text for Arabic.
-
Sequencer: Fixed snapping to section start/end points when resizing sections.
-
Curve Editor: Fixed the curve name being carried over when you change curves.
-
Don't cache the aspect ratio axis constraint if there's no local player
-
Sequencer: Make sure setting the last view target is done even in early out. This fixes an issue where if sequence 1 plays and cuts to camera 1, and the sequence 2 plays and also cuts to camera 2, it restores properly when the sequences finish playing.
-
Curve Editor: Fixed curve framing now always framing all curve point values.
-
Handle fully-overlapped sections when arranging camera cuts
-
Preserve camera shake instances across re-imports
-
Fix displaying of looping sub-sections
-
Sequencer: Added Modify() in SetSequence to fix the UI not updating when changing the sequence on a subsequence section.
-
Sequencer: Control Rig:Only reconstruct in game thread #changelist validated #virtualized
-
Sequencer: Added back missing drop shadow on text in sections.
-
Change how the sequence observer is queried to solve networking bugs related to observer info sometimes not being replicated in time for the client to use it to decide whether a sequence should be played or not.
-
Fix editor preview blending back to gameplay
-
Curve Editor: Fixed BakeInterval for FFT Filter.
-
Don't invalidate bindings when looking for an object
-
Curve Editor: Fix performance issue by refreshing the container on tick rather than in the getter functions.
-
Constraints: Use weak pointer to hold World in Constraint Subystem
-
Sequencer: Step to Next/Previous Mark now also steps to the next/previous global marked frames.
-
Sequencer: Fixed the color tint not carrying over when switching takes or duplicating a shot.
-
Sequencer: SetCurrentTime and SetCurrentLocalTime should force an evaluation if the current time is already the requested time. Users would expect an evaluation to occur.
-
Take Recorder: Fixed setting the animation track name from the animation settings.
-
Sequencer: account for non-zero playback start times when trimming/splitting sub-sequences.
-
Sequencer: Snapper: Don't include controls without shapes as snap objects
-
Sequencer: Disallow keying muted/disabled tracks.
-
Sequencer Scripting: Change to Get/Set View and Working Ranges to double precision
-
Restore camera cut view target even if the previous view target isn't valid anymore.
-
Sequencer: If there is a subsequence range, clamp to that rather than the playback range. Users want to be able to clamp the scrubbing to the bounds of the shot, rather than the outer playback range.
-
Sequencer: Fixed tracks/bindings getting sorted incorrectly when adding tracks.
-
Fix for a rare issue with replicated sequences running an incorrect update soon after their creation
-
Patch up bound object pointers in the property instantiator system when an object gets replaced
-
Fix some issues with replicated sequence playback
-
Sequencer: Tween tool not working on objects since Sequencer isn't present.
-
Curve editor sets new key attributes based on neighbour keys (previous or next key to the curve time), in order to maintain the existing curve keys
-
Sequencer: Fixed crash when binding overrides array change when using binding overrides during runtime.
-
Movie Render Queue: Fixed the Movie Pipeline in-game overlays using visibility bindings which created a blueprint warning when Property Bindings were disabled for a project.
-
Sequencer: Fixed nodes getting automatically sorted on undo.
-
Sequencer: Fix issue where Movie Scene Event UObject payload parameters were not properly creating references to the UObjects and therefore renaming those UObjects would not create redirectors and the references would be lost.
-
Fix a crash when recompiling a user widget while sequencer is open
-
Sequencer: Game mode playback would not turn back on gizmo's, do to editor regression, which now needs you to manully turn on widgets with game mode turned off.
Deprecated:
-
Sequencer: Deprecated bRestoreState and replaced it with FinishCompletionStateOverride. Blueprints that reference Restore State will need to be fixed up manually by adding FinishCompletionStateOverride.
-
Take Recorder: Changed PreInitialize, Started, Stopped, Finished, Cancelled, MarkedFrameAdded to multicast delegates. Deprecated delegates that the multicast delegates replace
-
Sequencer: Added Time Unit as an argument to marked frames commands. Deprecated existing functions: GetMarkedFrames, AddMarkedFrame, SetMarkedFrame, FindMarkedFrameByFrameNumber, FindNextMarkedFrame. Added new functions that have the old function's display names: GetMarkedFramesInSequence, AddMarkedFrameToSequence, SetMarkedFrameInSequence, FindMarkedFrameByFrameNumberInSequence, FindNextMarkedFrameInSequence
-
Sequencer: Fixed ULevelSequenceEditorSubsystem which was incorrectly marked as Blueprintable.
-
Sequencer: Deprecated Get/SetCurrentTime and Get/SetCurrentLocalTime in favor of Get/SetGlobalPosition and Get/SetLocalPosition so that units can be specified in frames, seconds, marks or timecode.
-
Sequencer: SequenceTimeUnit has been deprecated and moved to the MovieScene module as MovieSceneTimeUnit.
-
Sequencer: Deprecated SequencePlayer on the LevelSequenceActor. It can now be accessed through GetSequencePlayer(). #noqatesting
Synthesis
New:
-
[MLDeformer] Added PIE debugging support, and Rewind Debugger integration of the external morph targets. You can now connect the ML Deformer asset editor to a character inside a PIE session.
-
[MLDeformer] Add proper support for LOD, replacing the quality level setting. Each skeletal mesh LOD level can now have the ML Deformer applied to it. You can also have a lower number of ML Deformer LOD levels than skeletal mesh LODs.
-
[MLDeformer] Add support for multiple animations as training inputs.
-
[MLDeformer] Changed the framework and neural morph model from beta to production ready.
-
[MLDeformer] Added support for comparing ML Deformer models side by side inside the ML Deformer editor. The comparison MLD assets requires to be trained on the same skeletal mesh for it to work. They can use different ML Deformer model types though. Also added support for detailed searches for MLD assets inside the content browser. For example you can search for untrained MLD assets, or assets with specific input animations or property values. All those searchable properties start with a "MLDeformer." prefix.
-
[GeomCache] Added some virtual method to the tracks to sample at a specific frame directly (sample index).
-
[MLDeformer] Add support for output morph weight clamping in the Neural Morph Model. This is an extra safety feature to prevent potential extreme deformations when running the deformer on unseen poses.
-
[MLDeformer] Improve neural morph model bone mask generation.
-
[MLDeformer] Show the frame counts in geom cache vs anim sequence duration mismatch warnings.
-
[MLDeformer] Add an extra improvement to the handling of bindings in the ML Deformer Component. Also removed the quality level from the ML Deformer component as that isn't used anymore since we added LOD.
-
Added the ability to specify the parent of the world-space controls in Physics Control Component
Bug Fix:
-
[MLDeformer] Fixed some issue where just saved newly created assets would still be marked dirty after opening them again.
-
[MLDeformer] Fix some crash when pressing Undo in a specific case.
-
[MLDeformer] Fix some reimport issue when reimporting skeletal meshes.
-
[MLDeformer] Fixed a crash when enabling ML Deformer Framework plugin, but no ML Deformer model plugins, and creating a new ML Deformer asset.
-
[MLDeformer] Improved handling of delegate bindings, which could prevent crashes.
-
[MLDeformer] Fix a crash when saving a level after creating a character blueprint with Vertex Delta Model in it and a compute graph component.
-
[MLDeformer] Fixed a crash when packaging a project with a blueprint that has a VertexDeltaModel based ML Deformer inside it.
-
[MLDeformer] Fixed a crash when switching between NMM and NN and back to NMM models.
-
[MLDeformer] Fix some bug that reported crazy amount of memory usage in the UI and directly improved it by separating memory from asset sizes.
-
[MLDeformer] Fixed some crash blocker bug when creating a new ML Deformer asset and switching to Nearest neighbor model. #trivial
-
[MLDeformer] Crash fix when clearing the input animations array in the UI and when switching characters.
-
[MLDeformer] Fix sampling inaccuracies, which could lead to large deltas at certain frames. And some small parallel optimizations to make samplers slightly faster.
-
[MLDeformer] Some small tweak when detecting if an animation is the same length or not. - Fix in the Vertex Delta Model training, where it would fail when clicking Train, as the API changed but the python script wasn't updated yet. - Fixed a bug in the VertexDeltaModel where it wouldn't save the neural network. - Fixed a bug where the VertexDeltaModel extracted the wrong size from a tensor.
Editor
API Change:
- This still encodes and uploads a tiny black texture to the hardware.
New:
-
New "Asset Disk Size" tool (Tools | Audit > Asset Disk Size) for Unreal Editor which can load AssetRegistry.bin and .ucookmeta files from a cook and provide a variety of analysis options for investigating asset and plugin dependencies and their costs in terms of disk size. The tool allows you to ask questions like: "What is the marginal cost in terms of disk space for adding an additional asset to the game?" and "How much disk space would we save by removing this asset and any assets that it depends on (which are not used by any other asset)?"
-
Added angular speed units (deg/s, rad/s) for display in editor and conversion
-
Texture RenderTarget export to DDS file supports cubes, volumes, and all pixel formats.
-
Optimized loading of Asset Registry data in the editor, the initial asset scan should be significantly faster on large projects
-
Categories in the Message Log window are now sorted alphabetically
-
Add support for manual auto-complete commands in the Output Log console
-
Add r.Editor.NeverStartInPreviewMode Disable Preview Platform automatically if Preview crashed
- Added the ability to optionally run content validation during cook
- The following flags can be passed when running the cook commandlet: -RunAssetValidation. Run asset validation (EditorValidatorSubsystem) on assets loaded during cook. -RunMapValidation. Run map validation (MapCheck) on maps loaded during cook. * -ValidationErrorsAreFatal. Consider validation errors (from RunAssetValidation or RunMapValidation) as fatal (preventing the package from being cooked).
- Any validation errors are downgraded to warnings when running without -ValidationErrorsAreFatal to ensure that things looking for log errors or a non-zero return code don't consider the errors as failing the cook, and the "Cook.AllowContentValidation" CVar controls whether validation can run even if the flags are passed.
- These flags (-RunAssetValidation in particular) replace the older (and broken) bValidateAssetsWhileSavingForCook option in EditorValidatorSubsystem.
- New context menu options added to Spline Components:
- Closed Loop - Quickly toggle the Closed Loop property StraightenToNext - Quickly reset selected points tangent to align directly toward the next spline point StraightenToPrevious - Quickly reset selected points tangent to align directly toward the previous spline point ToggleSnapTangentAdjustments - Toggle behavior that would reset tangents when performing any Snap or Align action.
-
Engine (map and set add item); Implementing a way to have the map and set fill in with the next available enum value instead of always doing the default value. -- Code -- PropertyHandleImpl: FPropertyHandleMap::AddItem() - Added a HasKey() lambda. We're then checking if the map property's key is an enum property, if so, we'll loop the enum values to see if the map doesn't already have that enum value as a key. When we find one that isn't in the map, we're adding a child node and then setting the child's key node to be the enum value that is not in the map yet. If the map property's key is not enum then we do the old check for if the default key isn't there. FPropertyHandleSet::AddItem() - Added a HasElement() lambda. We're then checking if the set property's element is an enum property, if so, we'll loop the enum values to see if the set doesn't already have the enum value as an element. When we find one that isn't in the set, we're adding a child node and then setting the child node to be the enum value that is not in the set yet. If the set property's element is not enum then we do the old check for if the default key isn't there. UnrealTypes: FSetProperty::GetElementProperty() - Added this getter to return the ElementProp property.
-
Property Bindings: Add MaxDepth parameter to the widget so that systems can customize the maximum property depth to discover
-
Copy relevant warnings/errors to the texture editor window to avoid having to hunt them down.
-
The Editor's splash screen now includes information about module loading progress
-
Add tokenized search support for Searchable Combo Box
-
Added a category type that can be used with FMessageDialog to control the icon used by the in-editor dialog.
-
Imath: upgrade Imath to version 3.1.9
-
Added a context menu entry to perform asset validation on specific actors
- Added basic source control support to Content Browser file data sources
- This is enough to support the basic operations (on add, delete, move, rename), as well as the revision control file menu (to allow sync, revert, check-in, history, and diffing).
-
SCC: Fix Uncontrolled Changelist missing writable assets to reconcile
-
Editor | Add mechanism for extending the global status bar elements (Content Browser and Output Log buttons)
-
Added a content browser filter to only show the assets that are not used by another asset.
-
Make it possible to listen when the Status Bar Output Log is cleared
-
Add ImageCore::ResizeImage a high quality and fast resizer using stb_image_resize2. Old "ResizeTo" will be deprecated.
-
Texture RenderTarget create static texture and update texture now works with all pixel formats. Use the new GetRenderTargetImage API.
-
Scene Outliner: Add an option to mark a folder as the Current Folder on double click instead of expanding it
-
UnrealPak now uses the CookMetadata file to optionally write out size information for plugins. This information is written back to the cook metadata file, and is enable via a project packaging setting.
- Added FCoreDelegates::OnCommandletPreMain and FCoreDelegates::OnCommandletPostMain
- This allows things to hook in to provide additional initialization or shutdown logic for any commandlet that may be run.
- FCoreDelegates::OnCommandletPreMain is akin to FCoreDelegates::OnFEngineLoopInitComplete (which doesn't run for commandlets).
-
Add viewport client to the view modifier parameters so that subscribers know what viewport is being modified
-
The texture editor now clearly shows when the texture being viewed is not what will be used in the shipping game.
-
Added directory watchers for plugin root directories (instead of individual directories) in the Asset Registry to save memory
-
Added AssetRegistry.IgnoreEmptyDirectories console variable that can be enabled to ignore empty directories left behind by renames to improve load times along with several others for tweaking asset registry scan performance
-
Add new Texture asset actions in the right-click menu for textures in the content browser which can modify the texture source data stored in the uasset. Actions include changing higher bit depths to 8 bit, compressing the source with JPEG, resizing below a threshold size, and resizing to power of two.
-
Make r.InstanceCulling.OcclusionCull have ECVF_Preview flag
-
Add ECVF_Preview to cvar r.Mobile.AntiAliasing so it is previewable
-
New: Added support for removing (and optionally reverting) animation modifier(s) from a selection of sequences in the content browser.
-
Added metadata map to MetaHuman DNAAsset that comes with a Face SkeletalMesh.
-
Support setting actor picker with the currently selected actor in the level editor
-
GenerateStreamingInstallManifest - Add AllowPerChunkCompressionWildcard to allow pak files to opt into or out of being compressed through CompressedChunkWildcard. CopyBuildToStagingDirectory - Use bAllowPerChunkCompression to enable bCompressed to override global compression settings. This will correctly allow chunks to opt in and out of being compressed. NOTE: If DDPI specifies a hardware compression setting of 'None', this won't work as expected because there will be no global compression settings to opt in to. In this case, set
bForceUseProjectCompressionFormatIgnoreHardwareOverride=true
andbCompressed=False
in [/Script/UnrealEd.ProjectPackagingSettings], then setup whatever project compression settings you would like chunks to be able to opt in to. -
2D Textures can now be marked as "CPU Accessible". This switches the texture from being usable by the GPU and allows the CPU to access the texture's source top mip. The format doesn't change.
-
OpenEXR: upgrade OpenEXR to version 3.2.1
-
Add cvar, Mainframe.ShowRestoreAssetsPromptInPIE, to allow re-opening asset editors when -PIE is present
-
Scene outliner and changelist window now sort entries by name in natural order
- Cooked Editor: Fixed an issue where the asset registry state of an cooked plugin would remove some of the needed development tags from an asset that might already exist in the EditorClientAssetRegistry data.
Bug Fix:
-
Fixed a crash in our Json serialization code that would happen when serializing an object with an empty string as a key.
-
Preview Platform message displayed only when Preview is Active displayed
-
Fix for dynamically sources textures going black when opening in the texture editor.
-
Make the ProcessClick behavior in the SCS Editor Viewport Client handle the ComponentVisManager in the same order as the Level Editor Viewport, making it easier to add custom tools and extensions to your editor. This will result in the right click behavior being evaluated in the same order as the level editor for more consistent options.
-
Fixed various crashes associated with editing a texture or otherwise changing the ddc key during a texture build.
- Clear the auto-save restore file after closing the main frame (and discarding changes)
- This avoids the auto-save restore prompt appearing if the editor crashes after the user has already opted to discard their pending changes during shutdown
-
Fixed soft-object actor references failing to fix-up when moving (via copy/paste) actors to a new world
-
Env. Light Mixer: Expose inner properties of SecondFogData when parent row is displayed
-
Removed old code that would incorrectly ensure if a raw memory address was reused for temporary maps in the editor
-
Fix for encode speed not showing up in the texture editor viewer on newly built textures.
-
Lots of various cook metadata fixes
-
Crash fixes for FConsoleVariablesEditorModule
-
Fix several bugs that would break Game Feature Plugins when changing the Asset Manager project settings in the editor
-
Made the paper2D on object reimported function safe to use in a cooked editor and made the existing code more robust by not crashing if we are missing the SourceTexture meta data.
-
Fix seamless travel not using the correct feature level
-
Fix undo history crash when temporary property not yet in object reflection data.
-
The content browsers path filters settings are now persisted properly per instance.
-
Fix PropertyHandleRotator crash when children not yet populated
-
Fix OverrideSP to work with the correct command line
-
Fixed an issue with the api of the asset definitions. The GetSourceFiles function didn't allow to resolve the source file paths in a way that is independant of the asset implementation details. This also fixes the issues where the editor is not able to find the source file during a reimport or simply navigating to that file via the content browser.
-
Fixed material editor crash when trying to restore previously open shader code tab before shader instances are populated
-
Removing texture build metadata.
-
Select All Actor of Class: Use full class path to avoid ambiguous results
-
Fix for typo in non pow2 volume texture mip count computation.
-
Fix crash in level editor context menu for delta transform to actors
-
Fixed incorrect scaling of tangents for meshes with non-uniform BuildScale. Note that the previous, incorrect behavior is still supported by a "bUseLegacyTangentScaling" flag on the static mesh asset, and already-imported assets will default to use that old behavior to avoid modifying existing meshes.
-
Fixed many bugs with displaying gamma correction of textures in the texture editor viewer and thumbnails. One side effect is that normal maps will now be shown the linear gamma, so they appear light blue instead of dark blue.
-
Property editor - Optimized performance when using a PropertyPermissionList to save several minutes of editor startup time
-
Re-enables video and audio capture on the Mac platform when using a media player asset in the editor.
-
Fix PropertyPathHelpers crashing due to missing vtables from incorrect pointer calculations
-
Fixed ComponentTypeRegistry blocking unload of ActorComponent blueprint classes
-
Fix bug where grayscale textures stored in TSF_G8 that used compression type UserInterface2D (EditorIcon) due to odd dimenions would output incorrectly as R8 and therefore appear red instead of gray.
-
Fixed bug where starting Play In Editor before the asset registry scan finished could break assets like Data Registries that listen for the completion callback
-
Don't allow 16Bit VALU for the Preview SP if the Editor SP does not support it
-
Fix Select All Actor Children was not part of a transaction
-
Fix the Game Feature Data UI to show an error instead of crash if one is created outside a plugin
-
Fix UnlitViewMode for Mobile Preview
- Editor: Fixed a bug when entering PIE and clearing selection, which attemps to clear selection on a spawnable that has been destroyed.
Deprecated:
-
Deprecate asset registry writeback after stage as we're running in to too many things that need information we no longer have after stage. Use asset registry writeback during stage if you need compressed package sizes.
-
Removing the AR Point Cloud plugin as it's no longer supported or maintained.
Content Pipeline
New:
-
Added a new translator for USD primitives types (like Cube or Cylinder). The generated meshes will use the same points and topology used by usdview whenever possible.
-
It should now be possible to isolate the session layer and it's Sublayers when right-clicking them on the lower panel of the USD Stage Editor window.
-
OpenUSD: upgrade OpenUSD to version v23.11
-
Alembic: upgrade Alembic to version 1.8.6
-
Fixed many issues with USD file format listings on save/export/open/reference/payload dialogs.
-
Improve handling of nested skeletal data (such as nested SkeletalMeshComponents or nested SkelRoots) when importing, opening and exporting USD stages.
-
Added support for handling skeletal attach sockets when exporting transforms to USD.
-
Setting material overrides on HierarchicalInstancedStaticMeshComponents generated for USD PointInstancer prims will have the corresponding assignment written out to the USD Stage, just like for other component types.
-
The "USD Stage" window has been renamed to "USD Stage Editor", and has been moved out of the Windows -> Virtual Production menu onto the top level of the Windows menu.
-
USDImporter: add support for the usdMtlx plugin on Mac The usdMtlx plugin that is included with OpenUSD adds a file format plugin for reading MaterialX documents and translating them into UsdShade shading networks. The plugin was already supported on Windows and Linux, and this adds support for the plugin on Mac.
-
Added support for importing and exporting prim metadata from/to USD, by storing it on the generated assets' AssetUserData.
-
Added some support for alternate USD draw modes as described by the UsdGeomModelAPI schema, including bounding boxes and cards and even animations of some properties.
-
Added a new UsdStageActor property and USD import option called "bReuseIdenticalAssets", that lets users disable the mechanism that shares the generated Unreal assets by hash when opening or importing USD Stages.
-
Added support for handling USD Skeleton prims with multiple root bones when opening or importing USD Stages.
-
Added support for exporting the output actors and components of PCG graphs to USD.
-
Added support for subdividing USD meshes via OpenSubdiv and pxOsd.
-
OpenSubdiv: upgrade OpenSubdiv to version 3.5.0
-
It is now possible to isolate session layers on the USD Stage Editor window.
-
Added support for USD collision APIs. Now the UsdPhysicsCollisionAPI schema must be applied to a mesh prim to enable it as a collider while UsdPhysicsMeshCollisionAPI can be applied to specify the collision approximation shape to use.
-
Added cvars under USD.StaticMesh.BuildSettings and USD.Nanite.Settings to control quality of static and Nanite mesh building.
-
Added support for parsing OpenVDB textures referenced by USD Stages as Unreal SparseVolumeTextures.
-
USDImporter: align sublayer manipulation API on FSdfLayer wrapper with USD API The utility functions in UsdUtils for creating and inserting sublayers perform additional work that may not always be desirable such as authoring a root/default prim, so wrapping the sublayer manipulation functions from the USD API allows direct access to edit sublayer paths.
-
Geometry caches can now be exported to USD.
-
When exporting static and skeletal meshes to USD, the old 'unrealMaterial' prim attribute will no longer be emitted, in favor of authoring material bindings with full USD Material prims with "unreal" render contexts. Using the 'unrealMaterial' string attribute on prims is now fully deprecated.
- Implemented the "StageState" property on UsdStageActors, that can control whether the currently opened stage is closed, opened, or opened and loaded (assets and components were generated).
- This property can be bound on external LevelSequences to easily control when to load the stage, or can be used to quickly open USD Stages via the USD Stage Editor without fully loading assets and components.
-
USDImporter: expose more type name-related functions of UsdPrim on UE wrapper This adds SetTypeName(), ClearTypeName(), and HasAuthoredTypeName().
- Right-clicking on a prim on the USD Stage Editor will now show a couple of new options on the bottom of the menu that allow adding or removing any arbitrary API schema, as well as quickly adding the most common API schemas.
Bug Fix:
-
Fixed how the mesh's material assignments were not being factored in for the asset hash when exporting static and skeletal mesh assets to USD.
-
Fixed how the right-hand panel of the USD Stage Editor wouldn't refresh in some situations.
-
Fixed how the "kind" prim attribute would be shown twice on the prim details panel of the USD Stage Editor.
-
Fixed a crash when importing USD Stages with LiveLinkAPI schema on a SkelRoot or Skeleton.
-
Fixed how morph target controls were not being generated when using Control Rigs with USD Skeleton and SkelRoot prims in USD Stages without skeletal animation.
-
Alembic: Static and skeletal mesh import now merge the non-unique material slots together. Each unique face set now translates to a unique material slot regardless of the "Merge meshes" setting.
-
Fix imported LevelSequences from USD Stages ending up with broken actor and component bindings on some scenarios.
-
Fix Sequencer tracks generated for animated USD Stages not receiving keys if the animation originates from a non-local layer (such as a reference or a payload).
- Alembic:
- Materials are now properly mapped on geometry caches when visibility animation is used. Now, the materials won't shift around when a mesh section is hidden. * Alembic import of geometry cache and skeletal mesh can now be interrupted.
-
Fixed MaterialX reference paths set up inside USD Stages being ignored in some situations.
-
Alembic: Import conversion presets have been renamed. Max/Maya preset names have been switched since their transform were reversed.
-
Fixed an ensure being triggering when parsing USD Stages with invalid UV set indices.
-
Fixed support for exporting LevelSequences with attachment tracks to USD.
-
The UnrealUSDWrapper module will now be automatically loaded if one of its static functions is called before the caller has explicitly loaded it.
-
Fixed how the File -> Export All option of the USD Stage Editor wasn't working for new stages.
-
Fixed incorrect skeletal mesh material assignments on meshes generated from USD SkelRoot prims whose Skeleton prim had a very high number of bones.
-
Imrpoved use of g room cache in Blueprint and Sequencer. Now it is possible to set the a groom cache through Blueprint and to add and set multiple groom cache tracks in Sequencer (for multiple groom components on the same actor).
-
Fixed some UX issues related to the USD Default Asset Cache dialog.
-
Fixed a crash when exporting USD layers to file paths that are invalid paths for the USD SDK.
-
Fixed how materials generated from USD were not updating after changing the reference material paths on project settings and reloading the stage.
-
Fixed a crash when the USD Importer plugin generated StaticMesh assets without any valid render data.
-
USD: Improved memory usage of geometry caches by properly unloading them when closing the stage.
-
Fixed how the File -> ExportAll option of the USD Stage Editor window would silently output layers to Engine/Binaries in some cases.
-
Texture2DBuilder shouldn't remove mips - this is unneeded, and in the use cases where the builder texture is reused as the final texture, causes issues.
-
Fixed a crash when repeatedly importing AnimSequence assets from USD in some scenarios.
-
Fixed a crash when trying to cook UsdAssetCaches with persistent StaticMesh assets.
-
USDImporter: fix allocator management scoping in UsdUtils::GetPointInstancerTransforms()
-
Fix strange joint rotation behavior when importing skeletons with negative scalings (such as mirrorings) from USD.
-
Fixed a crash when trying to parse SkeletalMeshes from USD Skeleton prims with no bones.
-
Fixed crash when using the Actions -> Import workflow with an UsdStageActor without a valid UsdAssetCache.
-
Fixed how it wasn't possible to package assets imported from USD for all platforms.
-
Fixed various crashes on corrupted files during content import.
-
Fixed some crashes when parsing Groom and GeometryCache assets from USD stages.
-
Fixed a crash when exiting the Unreal Engine with a loaded USD Stage actor on the level.
- Fixed how the USD Stage Editor would not update when the prims were modified during a Play-In-Editor session.
Datasmith
Bug Fix:
- Fixed an issue where double clicking on a Datasmith Scene asset wouldn't open its corresponding editor.
Framework
New:
-
Introduce validation for MustImplement meta tags for SPropertyEditorClass and SPropertyEditorEditInline to prevent non-interface classes being specified, and to protect against UInterface from being specified.
-
Return a proper error message when a user tries to submit a changelist containing files not mapped to the current stream.
-
Context Menu/SubMenu slate widgets can now be tagged
-
Reduce log spamming by making the 'scene viewport resized log' verbose.
-
Improved performance in the editor for allocation heavy workloads by slightly increasing the delay when memory goes back to the OS.
-
Add a new initialization path to ISourceControlProvider allowing the caller to customize the initialization logic and retrieve more info about the initialization itself.
-
Added tag metadata to items in New Asset menu of Context Browser
-
Material Editor: Added statistics for preshaders, and dumping of preshader expressions and parameter fetches in human readable form to the HLSL source. Preshaders are bytecode expressions generated from a material graph and executed on the CPU, to offload invariant work from the GPU -- inspecting them can be useful for debugging.
-
Return files not being marked for add due to P4IGNORE as errors rather than info.
-
Support MustImplement, AllowedClasses and DisallowedClasses filtering for EditInline properties.
Bug Fix:
-
Fixed ensure when editing CDO properties in FDataLayersBroadcast::OnObjectPostEditChange.
-
Ensure that the editor's PlayWorld context is valid prior to handling a request to end the current PIE session.
-
Fixed property clamping not taking into account the instance meta data if present on the property handle
Landscape
API Change:
-
Note : this API change is backwards-compatble both on the code and data side
-
Removed FLandscapeEditorServices, which didn't make much sense in terms of design wrt dependency inversion : instead, FLanscapeEditorModule is the one implementing ILandscapeEditorServices
New:
-
When calculating runtime virtual texture volume bounds, if the bounds align actor is a landscape, then we now include all of its child landscape components.
-
Fixed incorrect landscape CVar names
-
Water: exposed a function to set river transition materials from blueprint and added a water mesh update when setting these materials to ensure the new MIDs are set.
-
Water: Expose a method to set the far mesh material from blueprint on the water zone.
-
Fixed BP functions RenderHeightmap/Weightmap/s functions so that they don't require their transform and extents pin to be connected, since it's a supported case already. Also, made it explicit in the code that WeightmapScaleBias is not to be used, since it has a different meaning than HeightmapScaleBias. This was compensated by the FloorToInt32 that is done later, but still, it might avoid any future confusion to explicitly use a 0 bias instead (which is always true on weightmaps where there's no texture sharing).
-
Updates Landscape editor icons (BP Brush affects Heightmap/Weightmap/VisibilityLayer). Changes buttons to toggle buttons for landscape editor BP brushes affecting layers features. Updates landscape editor target list colors, padding, text color to reflect UE5 style.
-
Water: removed the serialized ExtentInTiles from the quad tree. This is now recomputed dynamically based on the size of the water zone to prevent potential mismatch and remove some ambiguous authority over the size of the water zone.
-
Added BP method to retrieve landscape target (paint) layer names
-
Moves GrassTypes from LandscapeProxy to LandscapeComponent. Allows the use of different GrassTypes between the proxy and components by using LandscapeMaterialOverride.
-
Water: Fixed exclusion volumes not updating water collisions when they are moved/changed. - Refactored the exclusion volume setting names so that they are more user-friendly. - Also supports a new mode which allows removing water bodies from the exclusion volume when including all.
-
Added system to invalidate VSM pages when using (non-Nanite) landscape, to hide shadow artifacts induced by the vertex morphing system of standard landscape : Relies on pre-computing max height delas from mip-to-mip for every landscape component Invalidation occurs when the evaluated max delta between the heights at the LOD value that was active when VSM was last cached is different enough from the heights at the current LOD value (for a given persistent view), based on a height threshold that is tweakable per landscape and overridable per landscape proxy Invalidation doesn't occur when Nanite landscape is used The invalidation rate is decreased as the LOD value goes up, controlled by a screen size parameter in the landscape actor (overridable per proxy), under which no invalidation will occur. This avoids over-invalidating VSM on higher LOD values, since they tend to occupy less real estate and therefore don't need to have perfect shadows Added per landscape (overridable per-proxy) shadow map bias to help with this problem too Added 3 non-shipping CVars to help tweak those 3 parameters in-game (landscape.OverrideNonNaniteVirtualShadowMapConstantDepthBiasOverride, landscape.OverrideNonNaniteVirtualShadowMapInvalidationHeightErrorThreshold, landscape.OverrideNonNaniteVirtualShadowMapInvalidationScreenSizeLimit) The whole invalidation system can be enabled/disabled via CVar landscape.AllowNonNaniteVirtualShadowMapInvalidation Added another CVar (landscape.NonNaniteVirtualShadowMapInvalidationLODAttenuationExponent) to tweak the screen-size-dependent invalidation rate curve shape Misc: Fixed landscape.DumpLODs command : now works without parameter and can be used several times Changed CachedSectionLODValues system for landscape to be usable both for ViewState-less views (one-shot renders like water info custom render passes) and "persistent" views (those that have FViewStateInterface associated). This allows to keep track of the previous frame's CachedSectionLODValues for a given persistent view and removes the previous hacky method Landscape UX fixes Fixed some landscape CVars which were not render-thread safe
-
New:** Expose Landscape force layer update to BP
-
Deprecated prototype-y function to change LOD settings on landscape directly on the render proxy : it's already doable in a normal fashion by invalidating the render proxy
-
Water: implemented support for a localized water quadtree when Local-only tessellation is enabled on the parent water zone.
-
Water: Expose an event on the water zone which is fired whenever the water info texture is created or recreated
-
Various UX improvments for landscape : Added an option to be able to consider the paint layer's hardness parameter when using the erosion tool. Set to false by default because this used to be misleading for users Set hardness to 0 by default for landscape layer info assets (for the same reason as above) Added several missing tooltips Added support for double-clicking on a paint layer thumbnail to open the corresponding landscape layer info asset
-
Nanite skirts improvements : when trying to maintain the slope at the edge by extrapolating the skirt vertex position, we now only do it if the slope is going downwards from the edge vertex to the skirt vertex (otherwise, in case of steep slopes, the skirt depth might not be enough to bring the skirt's vertex underneath the neighboring landscape proxy)
-
Implemented a new GerstnerWave shader and corresponding material function that supports splitting the wave spectrum into three buckets for low/mid/high frequency waves. This can be useful to filter out some of the higher frequency waves on lower end platforms in the material or utilize some interpolation instead of recomputing everything per-pixel for some frequency buckets.
-
Turned landscape brush size's max slider and max clamp value into project settings
-
Added RenderWeightmap/RenderWeightmaps BP functions to landscape in order to let users pack weightmaps onto the channels of a render target 2D (or render target 2D array), much like they could with heightmaps These can be called at runtime as they operate on the final weightmap data and they will render in a given world area, regardless of landscape component limits
Bug Fix:
-
Fixed ensure when painting/sculpting outside a landscape
-
Prevented computing the landscape texture hash twice when it has changed * Fixed landscape getting dirty even when the detected difference is lesser than the detection threshold
-
Fixes new landscape location/rotation/scale reset to default button not showing up when using the gizmos. Adds LandscapeEditor DetailsView RightColumnMinWidth to allow ResetToDefault button to be properly hit testable.
-
Fixed potential crashes in landscape code when iteration over garbage actor
-
Ensure the LOD level is within valid ranges when building Nanite landscape data
-
Fixed incorrect landscape components being rendered when doing a partial update of landscape edit layers
-
Fixed crash when updating landscape edit layers (account for missing layer data, like we do everywhere else in the code)
-
Made sure landscapes that belong to a level instance are not editable. The only landscapes that appear in landscape mode (and that can be updated) are now those that belong to the main level.
-
Disabled landscape.RemoveEmptyPaintLayersOnEdit by default since it causes more problems (landscape actors being dirty on load for no apparent reason) than it solves. We need a proper separation between editor and final data to solve this for good.
-
Fixed Per LOD material overrides not working on landscape streaming proxies
-
Fixes invalid ZOffset overflowing the grass exporter projection matrix.
-
- Automated LandscapeInherited/LandscapeOverridable enforcement of properties on the proxies so that using the meta-data on the landscape proxy property is sufficient to get the required behavior Changed list of overridden properties to a list of FName (memory optimization) Made bBakeMaterialPositionOffsetIntoCollision LandscapeInherited since that's how it is used Removed useless recomputation of normals when changing the scale when edit layers are enabled Fixed LandscapeInherited/LandscapeOverride properties which were not detected as such because we were using Property->Name instead of MemberProperty->Name Tagged all remaining ALandscapeProxy properties as either LandscapeInherited or LandscapeOverride Fixed landscape proxy overridable/inherited property names that didn't always appear readonly
-
Fixed landscape GPU readback pool not being depleted in most cases.
-
Changed "Mode" property in landscape import/export to either "Import Mode" or "Export Mode" to be more explicit to the user
-
Fixed landscape component count display in editor when selecting streaming proxies
-
Bugfixes for ULandscapeSplinesComponent::CopyToSplineComponent - Account for reversed spline meshes within non-reversed landscape spline segments - Added some QoL for auto detecting looping landscape splines
- Fix for landscape layer not being recognized as such when used within material layers
Deprecated:
- Landscape cleanup : Removed deprecated code from <=UE5.2 Moved UHierarchicalInstancedStaticMeshComponent::AcceptPrebuiltTree and UHierarchicalInstancedStaticMeshComponent::BuildTreeAnyThread to UGrassInstancedStaticMeshComponent
Scripting
New:
-
Allow overriding the name of an EditorUtilityTask
- Exposed DataTable column export names to scripting
- GetDataTableColumnExportNames
- Allow Python to be disabled entirely for certain commandlets
- This can be done by adding the following to any Editor.ini file: [PythonScriptPlugin] +DisablePythonForCommandlet=CommandletName
-
Allow all FillDataTableFromX functions to provide an optional row struct override for automated imports
-
Added an editor utility function for getting the asset 'root' directory - e.g. /Game/ in most projects, but sometimes $ProjectName
- Data Table automation improvements
- Always consider the FillDataTableFromX functions to be running an automated import when the optional ImportRowStruct is provided.
- Added GetDataTableRowStruct to query the row struct of an existing data table.
-
Added support for autocast functions for objects to support their super classes
-
Added bIsActionForBlueprints to UAssetActionUtility for better UX than needing to override a function
-
Add GeneratedClass API to Editor Utility Framework
-
SetEditorProperty/GetEditorProperty can now access class sparse data, and fixed arrays can be assigned to/read from dynamic arrays
- Exposed Data Table export to scripting
- ExportDataTableToCSVString
- ExportDataTableToCSVFile
- ExportDataTableToJSONString
- ExportDataTableToJSONFile
-
Added ResetEditorProperty to reset a given property back to its archetype value
- Exposed DataTable column utils to scripting
- GetDataTableColumnNames to get the raw property name of each column.
- GetDataTableColumnNameFromExportName to convert a friendly export name to its raw column name.
- Added the ability to wrap a Python object for use as a UPROPERTY on a UCLASS or USTRUCT.
- PythonObjectHandle allows Python generated types to store arbitrary Python objects as native properties, rather than rely on the lifetime of the Python wrapper object to keep a non-property object reference alive.
Bug Fix:
-
Fixed an crash when using the set editor property bp node on a property that might not be compatible with the pinned property type. The function PropertyAccessUtil::ArePropertiesCompatible was not robust enough and would crash in some case like using it to see if we can write a dynamic array to a static array property or the inverse.
-
Updated get/set_editor_property in Python to handle getting/setting the sparse class data for a CDO
-
Fixed Python Nativization failing to validate against an interface class
-
Update utility widgets to mark their child utility widgets as transient recursively. This prevents an issue where the level gets marked dirty by nested utility widgets.
-
Fixed UnpackReturnValues failing to correctly handle a None return value from a Python implemented function
-
Removed a bad assertion in UEditorUtilitySubsystem::RemoveTaskFromActiveList, and updated a similar check in RegisterAndExecuteTask to ensure we avoid duplicate task registration
-
Fixed an issue where the blueprint utility callable function DeleteAsset would fail to delete an asset due to being referenced by FBlueprintActionDatabase.
-
Sparse class data is automatically marked as bIsSparseClassDataSerializable when set from an editor utility - this prevents sparse class data from not being saved after it has been set by a script
UI
New:
-
Exposed 'use sections for categories' bool to the asset picker config - Added identifier to the expanded category (previously None)
-
Enable mobile platform stats in Material Editor by default
-
Made the editor splash screen movable.
-
[Output Log] The "Settings" dropdown menu now uses the Tool Menus system under the hood, enabling downstream/contextual customization.
-
Added option to force always compiling materials for mobile in material editor
-
Added Select All/None button for column view right click context menu in the Content Browser
-
Added "Find References" to UMG animation right-click menu.
-
Property Editor: Add getting the expansion state for a detail property row.
-
Added a scrollbar to the localization dashboard when there are many localization targets.
-
Property Editor: Remove 0-360 restriction on rotation dragging so that you can drag to negative rotations and beyond 360. The delta is set to 1 (ie. slider rotates by 1 degrees)
- Exposed RequestForceRefresh for detail customizations to use
- Using RequestForceRefresh is preferable when the refresh can be deferred, as it can prevent performance problems from refreshing the view multiple times within a single frame
-
Added single struct property support to the PropertyEditor, through the use of the StructureDataProvider interface.
-
Added support in the category builder for external structure properties, though the use of the StructureDataProvider interface
-
The main menu sub-menus, sections, and entries created by registering tab spawners into the menus can now be given explicit FNames. This allows other code to extend the same menu structure using the ToolMenus system.
-
Improve platform stats and material editor compilation warnings
-
Add a low-level unit test project for the ToolMenus menu system.
- Added a way to manually grant EditConditionHides behavior to Detail Property Rows that have custom Edit Conditions defined outside of property metadata (e.g. FDetailPropertyRow::EditCondition).
Bug Fix:
-
Mac: Fix NSCursor hotSpot logic. Need to use the actual size for the user coordinates instead of the image dimensions. Additionally, the hotspot: expects values from 0,0 -> w-1,h1. When a blueprint node specifies a value where (hotSpot.x/y * Image.pixelW/H) > Image.size.W/H, where hotSpot.x/y is 0...1.0, then no cursor would be displayed.
- Minor revision to SGraphPanel to decouple its refresh on updates to the underlying graph object from a dependency on a parent SGraphEditor.
- This allows SGraphPanel widgets that live outside of an editor context (e.g. previews) to avoid node/pin references going stale if the underlying graph object is reconstructed.
-
CommonUI: Action Domains: Fixed an edge case where action wasn't found if we had multiple action domains.
-
Editor: Fixed Allow Cinematic Control so that it restores properly when you reopen the editor.
-
Improve Class Viewer offset and padding so that it doesn't overlap with other elements
-
Fixed failure to propagate property value changes for floating point values (including structures of floating point values like rotators and transforms)
-
Scene Outliner: Fix crash in folder context menu generation.
-
Color Customization: Fixed transaction not ending when closing the inline color picker.
-
Don't show Level Instance properties on the World Settings
-
Fix image size getting set to random values when applying new materials #okforgitub public
-
Fix a crash that could happen when object references were collected while the menu system was generating a widget using a legacy code path.
-
Fixed comment bubble text input background scaling incorrectly with multiple lines of text.
- SSubobjectEditor::GetSelectedItemsForContextMenu provides the correct component for inherited SCS components
UX
New:
-
Added binding to create a new Custom Event Node. No binding by default. Similar to pressing C to create a new Comment Node.
-
The level viewport camera info will now get saved when closing the editor. They will be reapplied when the editor is relaunched and the same level is reloaded.
-
Use Microsoft Windows style grey and red hover colors for the minimize, maximize, and close buttons of the editor title bar.
-
ShowOnlyInnerProperties now works on nested structs to show the properties on the innermost struct marked with the specifier.
-
PR #10826: Add delegate in UAssetEditorSubsystem to broadcast when an asset editor is closing #contrib 10826
-
Warn if derived material instances fail to compile in Material Editor
-
Add a viewport action to focus the selected actors in the outliner (to be used with AlwaysFrameSelection off)
-
Add support for searching the collection filter in the Reference Viewer.
-
Change the background color of the editor project badge to match the rest of the title bar.
-
Add a plugin filter to the Reference Viewer. Only plugins that contain assets visible in the unfiltered graph are shown in the list.
-
Outliner: Keep folders selected when changing / clearing search text
-
Reduce vertical space consumed by the title bar and tab areas of editor windows. This includes reducing the height of the minimize, maximize, and close buttons to further pack the interface.
-
In the Level Editor, the Focus Selected command has been moved to the Actor context menu and renamed to Frame Selected. In addition, the View Options menu items now appear in the Actor menu in the main menu bar as well as in the contextual menu.
-
Add bindable viewport camera rotation UI commands
-
Add "Browse to Asset" context action to the global asset picker
-
Pasting / Duplicating an actor now moves the new one to the "Current Folder" (if it's set)
-
Report issues in base material for shader platforms not covered by current RHI feature levels.
-
Added new keybind that combines Close Minor Tab and Close New Tab. Unbound by default, this keybind will let users press a single key to close the focused tab regardless of its type, prioritizing minor tabs.
-
Make keyboard shortcuts searchable in Editor Settings with the format: KeyBinding="F"
-
Make it possible to move the UE window by dragging with the mouse on the title bar project badge.
-
Property customizations: Added a CreatePropertyValueWidgetWithCustomization API that accounts for customization and thus supports struct properties.
-
UToolMenus: Add API to support Menu Profiles, a menu profile is a lightweight version of a menu customization - but you can have multiple menu profiles and activate/deactivate them at runtime per menu instance using a new menu context.
-
EditorUtilityBlueprintFactory: Modify the class picker to use a TreeView to show classes in hierarchy
-
Most menus in the editor are searchable by typing into them. To make this more obvious, we now show the menu search field by default in menus with 10 or more items. You can change this threshold using a new setting under "General - Appearance - User Interface".
Bug Fix:
-
PR #11216: Fix Overlapping section name in FMainMRUFavoritesList by allowing an override for the favorites section ini. This fixes a bug where favorite levels were not persisting #contrib 11216
-
Fixed an issue where the modal progress bar (FFeedbackContext) wouldn't get displayed to the user.
-
Updated FNavigationConfig with an option to only send key events if no modifiers are held Updated the EditorNavigationConfig to use this new setting, preventing an issue where the Ctrl+Space content drawer hotkey would be consumed by some widgets
-
Fixing a bug where the checkout error dialog box won't show even though there are packages which failed to checkout.
-
Property Matrix: Fix a bug that stopped search from working in the "Pinned Columns" tab
-
Fix crash pressing 'w' or 'e' in material editor to due hidden viewport movement triggering a draw of hidden viewports
-
Tweaked the content drawer behavior so that it gets properly summoned when browsing to an asset from a pinned tab.
-
You can now paste into the Mobility field of the details panel.
-
Property Matrix: Fix a crash when you tried to edit a property on a light component
-
Fix a crash on hovering over the "transform" submenu in the light mixer context menu
-
AssetEditorToolkit: Fix a crash when trying to force delete an open DataFlow asset
-
Fix Rotator not shown in degrees by default Math Struct customization
-
Outliner: Fix a crash in the "level" column name selection code when you tried to exit PIE.
Foundation
New:
- Added Experimental Studio Telemetry plugin.
-
This is fetaure captures telemetry for common Editor workflows and can be extended by the end user to support their own anlaytics backends via an IAnalyticsProvider implmentation exposed from an IAnalyticsProviderModule implmentation. Studio Telemetry is enabled by default and comes with 2 sample Analytics Providers - A Horde Analytics implmentation and a JSON Log file implementation.
-
Added support for the TOptional
type to UHT. -
DDC Http Store - Added ability to configure AuthScheme (defaulting to JWTBearer as before) and the ability to directly specify a auth token. This can be used to run with the ServiceAccount scheme in Cloud DDC which we intend to use for getting onboarded quicker by licensees (it is not a recommended approch to use for wider deployments across teams).
-
Made memory usage print outs in out-of-memory situations use a common unit (GiB)
-
Add support for plain text to FAutomationTestBase::AddExpectedMessage
-
Added missing LLM Tag for AssetRegistry loading
-
Support load and save of platform specific test exclusion list from the Test Automation window
-
Added GetTypeHash to FDynamicallyTypedValue for when used as a key for TMaps.
-
Added FDataRegistryResolverScope::ResolveNameFromId interface that allows specifying temporary local objects instead of having to allocate a shared pointer for every single one. Deprecated the ResolveIdToName overload that returns the resolver as TSharedPtr.
- Made it so that LLM counters are updated more regularly during cooking (on package load and save)
Bug Fix:
-
Fixed that some FName allocations were not using the FName LLM tag
-
OidcToken - Allow multiple instances of oidc token to read the windows token store at the same time, and prevent updating the token store file if there are no changes applied to it. Reduced the scope the mutex to only cover the updating of the token store.
-
OidcToken Create output directory for temp file if its missing Corrected logic for tokens that do not expire (they are set to expire at 0 which we didn't treat correctly) * Make sure to save the new refresh token we get after using a old one, resolves issues for horde.exe that had to prompt users for logins more often then it should need to.
-
Prevent the server from sending the server-only-option of ?listen when doing a Client Travel. This will prevent the client from incorrectly thinking it's a listen server during travel.
-
OidcToken - Removed special case handling of chrome and edge as this causes issue when spawned from Visual Studio
-
OidcToken - Allow you to only specify the list of redirect uris instead of both that and the single redirect uri
-
Moved FUntilDoneLatentCommand Predicate call to be able to: - Done() correctly - Be able to call Predicate multiple times on FUntilDoneLatentCommand::Update().
-
Fixed crash in SQLite when the current malloc doesn't support FMemory::GetAllocSize.
-
OidcToken - Allow for allocating of an access token without a identity token, we never actually used the IdentityToken and allowing to get a access token without it allows us to sidestep issues with some IdPs only providing thin tokens when you request both identity and access tokens at the same time.
-
OidcToken - Added timeout option (defaults to 20 minutes) were if the user hasn't logged in the opened browser for this time we just shutdown with a error, this prevents zombie processes from sticking around at the risk of users coming back after this timeout and trying to login to the popuped browser and getting a 404 (as the local webserver will have shutdown).
Build
New:
-
UGS: We no longer download a precompiled binary if we have just downloaded that exact binary.
-
Adding SplitFirst and SplitLast StringOps to BuildGraph, which return the first and last element (respectively) of the split input string.
-
Modified UBT to generate more detailed information when the compiler crashes.
-
Added KeepFileOpenLog option to build targets so that you can optionally skip -fileopenlog during cooks to save memory
-
Support live coding when the BaseDir is != than the Executable path
-
Added a warning if a project module is found to have a dependency on a plugin module without listing that plugin as a dependency. The plugin has to be enabled by default or enabled in the .uproject or enabled in the target.cs
-
Support for game projects overriding how to copy files during staging. A CustomStageCopyHandler can be implemented to supply the copy operation
-
TargetRules can filter referenced plugins to determine if it should be ignored from the build.
-
Added support for -fextend-lifetimes compilation switch on selected Clang-based platforms which improves debugging experience of optimized builds by increasing the number of local variables for which the debugger can show values. The feature may slightly reduce performance and is intended to be used in development only. It has to be explicitly activated by setting bOptimizeForDebugging variable in
Platform section of BuildConfiguration.xml. It won't affect Test or Shipping configurations. -
UGS: Change the default UGS build config from DebugGame to Development. Only affects new UGS installs.
-
Extending ICustomStageCopyHandler to support overriding of the plugin manifest file creation. Allows game projects to have control over how plugin descriptors are added to the manifest
-
Intel® Implicit SPMD Program Compiler (ISPC) has been updated to version 1.21.0.
-
UGS: Improve the performance of the "Finding last code change..." step in the sync.
-
Add "-FORCEUPDATEALL" option to update .vcxproj.user files during project generation
-
Fixed -SkipEncryption not skipping encryption of PAK files
Bug Fix:
-
Fixed source indexing on Windows-based platforms generating incorrect paths for workspaces using the 'import' functionality on Perforce.
-
Fixed issue where UBT would fail with a concurrency error when doing log once logging.
-
UBT: Fix for MakeStubItems with Circular Deps.
-
Fix a problem with path determination during chunked DLC builds
-
Outputting the plugin filename with Json parse exceptions
-
Fix UBT to enable hot reload modules for engine only builds. This is done so that live coding checks still work when building from P4V or other tools that might not specify a project file.
-
Objects referenced only by soft path literals will be correclty included in packaged games when using CookSettings.SkipOnlyEditorOnly
Deprecated:
- Prevent future inclusion of MinWindows.h, PreWindowsApi.h and PostWindowsApi.h via header guard warning. - use WindowsHWrapper.h, AllowWindowsPlatformTypes.h and HideWindowsPlatformTypes.h instead.
Compile Time Improvements
New:
-
UBA: Handle the scenario where files may be spread across mounts and linking won't work. When this happens fall back to copying/sendfile-ing files around.
-
UBA: Fix bus error on Intel Macs due to a stacksize limit
-
UBA: Add support for CPU time for MacOS using mach messages.
-
UBA: Fix for UbaAgents waiting for host now that poll is used.
Bug Fix:
-
UBA: Fixes various small bugs.
-
UBA: Fix up tests on Mac. * Need to grab the actual clang binary location and the SDK path.
-
UBA: Close fds when done with polling to stop leaking on MacOS.
-
UBA: Fix for populateCasFromXcode.
-
UBA: Bump cmdline limit to 64k
-
UBA: Add if some defs around POLLUP for platform differences
-
UBA: Additional changes for Mac support. Fixes an issue with socket closing Adds support for getting number of procs.
-
UBA: Remove Touch test from Mac running.
-
UBA: Address issue of agents quitting instead of waiting to connect to host.
-
UBA: Various fixes for POSIX APIs. Checking returns a bit better Handling "/" in a friendly way since realpath calls stat with "/" Hooks up lockFd so we don't accidently close fd1 and fd2 (aka stdout/stderr) MacOS doesn't have subreaper so implement another way using sysctl
-
UBA: Clean up thread attrs after creating the thread.
Core
API Change:
-
Enable it via GlobalDefinitions.Add("UE_STORE_OBJECT_LIST_INTERNAL_INDEX=1") in your Target.cs. This functionality requires enabling 4 bytes wide FName (can be enabled by setting bFNameOutlineNumber to true in Target.cs) as it takes advantage of the padding in the UObjectBase memory layout.
-
UObject::CollectDefaultSubobjects was deprecated for being redundant and incorrect and the comments were updated on IsDefaultSubobject to document the confusing behavior. Most of the time it is better to use a different function like IsTemplate or the new IsTemplateForSubobjects
- Depending on a compiler this change may introduce compilation errors when passing TObjectPtr variables to UE_LOG macros in which case the raw UObject pointer needs to be extracted with TObjectPtr::Get() function:
- TObjectPtr
ObjPtr; UE_LOG(LogTemp, Log, TEXT("UObject pointer: 0x%x"), ObjPtr.Get()); - Some C++ compilers may also fail to compile foreach loop statements when iterating over an array of TObjectPtrs where the elemental variable declaration is a const value type of TObjectPtr (const TObjectPtr
Value). In this case the elemental variable declaration needs to be converted to a reference type: - TArray
> ArrayOfObjectPtrs; for (const TObjectPtr & Value: ArrayOfObjectPtrs)
- TObjectPtr
- This information is always available at runtime via the BuildSettings module regardless of being embedded in the binaries.
New:
-
Sponsor mode in UnrealTraceServer Adds new "sponsored" mode of running the server, in addition to regular "persistent" mode. In this mode the server must be started with a parent pid. Additional pids can be added. When all sponsor processes have exited and there are no active connections the server will exit. Controlling which mode the server runs in can be done in Unreal Insights or via the Trace Widget in Unreal Editor. Command line options and command parsing has also been refactored and is now parsed and passed to all main functions. Command line help is also added.
-
Update VTune library to latest 2023 release.
-
Replaced versioning implementation in FInstancedStruct to use archive custom versioning. Also make serialization symmetrical so struct serialized in cooked builds can be deserialized in Editor builds.
-
Added new static StringType::Construct* functions to replace the dubious set of string constructors whose behavior aren't obvious - the old form of constructor are not yet deprecated for FString but are for FUtf8String and FAnsiString.
-
Added TIsTArrayView_V
as a more efficient alternative to TIsTArrayView ::Value. -
Fix EUnitType::DataSize quantization factor to 1024 instead of 1000. The data size units are treated as KiB, MiB, GiB etc
-
Added another operator+ for FAsciiSet to allow for combining sets
-
Added a family of string splitting functions as UE::String::Split(First|Last)[OfAny][Char].
- Add additional macros for getting enum/member/function names as string views. Required for using in a compile time context.
-
Add missing macro for getting enum name as a string, to match the existing macros for member and function names.
-
Made LexToString more generic by providing a string type as an optional template parameter.
-
UnrealBuildTool: Setting to control print level of PVS-Studio analyzer warnings (-StaticAnalyzerPVSPrintLevel)
-
Update TFuture/TSharedFuture to work with non-copyable types.
-
The debug name provided for the DDC requests has been modified to append a "[Fast]" and/or "[Meta]" tag to make DDC logs clearer as to what key is being requested and hit/missed.
-
Improve DataTable errors to help diagnostic between mising struct and not yet deserialized error
-
Added FunctionFwd.h for the forward declarations of types defined in Function.h.
-
Added functions to CompositeDataTable for adding and removing individual Parent Tables as well as removing an array of Parent Tables.
-
Extended TArray bulk serialization to all arithmetic types.
-
PR #11054: [PVS-Studio] Add new PVS-Studio.exe silent exit code mode. #contrib 11054
-
Added floating point unit tests for FMath::Wrap. Added a new FMath::Modulo which generically encapsulates integral/float differences.
-
Moved TUseBitwiseSwap into its own header.
-
AsyncCompilationHelper - Remove 16ms main thread sleep that happens per incomplete task and instead favours polling all tasks and sleeping once if not all tasks are complete. ICompilable WaitCompletionWithTimeout () method is now documented to poll if given a 0 TimeLimitSeconds. To adjust for this, implementers of ICompilable will now poll if TimeLimitSeconds is 0 before waiting. There are a few implementers that don't use an event and sleep which is not ideal, but we at least now poll again after sleeping to avoid another round trip to know if the task is complete. FAsyncTaskBase::WaitCompletionWithTimeout now polls for completion when given a time limit of 0 seconds. This simplifies use, and avoids unintended yielding. Before PIE.Startup FAsyncTask::SyncCompletion Total Inclusive Time 5.25s (40606 calls) After PIE.Startup FAsyncTask::SyncCompletion Total Inclusive Time 195ms (39504 calls)
-
checkf and ensureMsgf will now validate the printf parameters when UE_VALIDATE_FORMAT_STRINGS is defined. FormatStringSan::bIsIntegralEnum now properly detects TEnumAsByte as enum types.
-
Added FAnsiString and FUtf8String.
-
Replaced loop with modulo in FMath::Wrap to make it run in constant time. Added some tests that would have failed with the previous implementation due to lack of floating point precision. Added some constexpr tests, though only the integer tests can be supported before C++23.
-
Added TRefCountingMixin to provide AutoRTFM aware ref-counting for use with TRefCountPtr
-
UnrealBuildTool: Option to disable anaylzing engine modules or generated code
-
PR #10774: Add target rule for ALLOW_CONSOLE_IN_SHIPPING define #contrib 10774
-
Add config file options so that the virtualization system is able to retry pulling failed payloads when running in unattended mode (defaults to off)
-
Support emitting line tables only for debugging rather than disabling debug info entirely Configuration is the same as TargetRules.DebugInfo and will override that setting except when debug info is disabled for the entire target
-
Eliminated most blocking during requests in the Cloud DDC
-
Increase the maximum possible size of TInlineValue
-
Read the environment variable UE_LOG_JSON_TO_STDOUT to enable structured logging on stdout for consistency with other tools
-
Adding an LLM console command to associate allocations with their underlying page allocation in Unix to classify them as shared/private/unreferenced. This also fixes the old smaps parser to not incorrectly bail before EOF if fewer bytes were provided than asked for as that's an allowable condition.
-
Added CHARTEXT(CharType, x) which expands out to x, TEXT(x) or UTF8TEXT(x) depending on CharType.
-
Intel ICX 2024.0 integration plus instrumented/sampled PGO support (via Jeff.Rous)
-
Added PREPROCESSOR_VA_ARG_COUNT(...) and PREPROCESSOR_APPEND_VA_ARG_COUNT(Prefix, ...) macros, which evaluate to the number of arguments passed to it and a token made by appending a prefix to the count respectively.
-
Avoid unecessary copies of FStreamableDelegate within FStreamableManager. + Added an overload of FStreamableHandle::ExecuteDelegate that takes the FStreamableDelegates by rvalue. This code path will continue to pass the delegates along by rvalue to avoid copies. + Fixed up multiple call sites where copies were being done and replaced with moves.
- Improved plugin manager exclusion support when using -EnableAllPlugins
- Added -ExceptRestrictedPlugins to allow you to exclude any restricted plugins
- Added wildcard support to -ExceptPlugins (and -EnablePlugins and -DisablePlugins) so you can do something like -ExceptPlugins="Online*"
-
Cache the 'NotExcluded' state alongside 'Excluded' and 'Included' to prevent excessive query ConditionallyExcludeObjectForRealm on deeply nested object graph with a lot of public leaves
-
BuildSettingsVersion.V4 enable msvc strict conformance mode by default
-
JsonObject, JsonWriter and JsonSerializerMacros updated to use FStringViews and FString to avoid unnecessary allocations.
-
Add IsValidIndex function to TPagedArray for parity with other containers.
-
Added the ability to delay reachability analysis interations by the specified number of frames (with gc.DelayReachabilityIterations console variable) to stress test garbage collector write barrier in TObjectPtr.
-
TArray::Append now consistently uses a 'grow' instead of 'reserve' memory growth strategy, so it has amortized linear cost to call many Append()s in a loop for all versions of the function. (Previously it inconsistently used either strategy depending on how it was called.)
-
Added FPackageName::GetVersePath as a shared util for UObjectBaseUtility and FAssetData
-
Add FindFrom function to TBitArray, to allow a user to provide a start index when searching for a value.
- Added a scoped override for FMessageLog behavior
- FMessageLogScopedOverride can override the log behavior of a given named FMessageLog for the duration of the overrides lifetime, optionally suppressing output log mirroring, or promoting/demoting log categories (eg, to make errors act as warnings, or warnings act as errors).
-
Add a control widget in Unreal Insights and Trace widget in Unreal Editor to control the local UnrealTraceServer instance.
-
UScriptStruct::ImportText is now const-correct
-
Added verification tests to make sure there's no unreachable objects still being referenced by reachable objects after garbage collector's reachability analysis has completed (enabled with gc.VerifyNoUnreachable console variable)
-
Added StrCast as a long-term replacement for StringCast, because of the latter's behavior with regards to mid-string zeros, and used it to fix FString serialization when it contains a trailing zero.
-
Add floating point append operators to FStringBuilderBase. Uses the same format specifiers as LexToString does (via TFormatSpecifier in UnrealTypeTraits.h)
-
Add an overload to the FindRef method of TMap and TSortedMap that take a fallback default value
-
Improve LinkerLoad instancing context population to catch object in external package outered to object in instanced packages
-
Add overload of TryConvertFilenameToLongPackageName using FStringView and FStringBuilderBase
-
StaticDuplicateObject now uses unversioned property serialization, improving the performance of object duplication
-
Reduced book keeping memory in FMallocBinned3
-
Serialize complete property type names with tagged property serialization to support more robust asset loading when the type schema changes.
-
UObject::GetAssetRegistryTags changed its function prototype to take a Context object that reports whether the call is coming from SavePackage (and should calculate everything) or load (and should skip expensive tags). This new Context object allows Engine classes and Licensee classes to report different tags for the three scenarios of editorsaves, cooksaves, and dynamic on-load updates.
-
Added support for up to 128 bytes alignment in the FMallocBinned2 for small bins allocations. Previously allocations with alignment higher than 16 would be treated as OS allocations and would be multiple of a memory page size (4KB)
-
Added FThreadManager::ForEachThreadStackBackTrace for retrieving callstacks without incurring additional allocations (which will be used to avoid failing to allocate memory while crashing out of memory).
-
LLM: Added "-Assets" and "-AssetClasses" params for the "DumpLLM" console command. This will dump the respective tag sets (instead of default tag set). Requires LLM_ALLOW_ASSETS_TAGS and game/editor to be started with "-llm -llmtagsets=Assets,AssetClasses" in command line.
-
Make AssetFails, AssetWarning and AssetPasses functions use const object parameters
-
Added an option to replace a hash map in the ClassToObjectListMap (a part of UObjectHash) with an array. This will improve lookups and reduce memory footprint.
-
Add CVar, core.EnsureAlwaysEnabled, to allow disabling of ensureAlways and treat them as regular ensure instead
-
Load additional BuildConfiguration.xml files from
ProgramData
&LocalAppData
-
Add TBitArray range-based for loop support
-
Added multi-process support to the saving of Derived Data Cache (DDC) replays
-
Adds missing GetId() member from TSet::TBaseKeyIterator. Without this implementation, it's not possible to use GetId() on TMap::TKeyIterators/TConstKeyIterators This missing implementation is specifically helpful for cases where you'd like to find the KV Pair ElementType for a given KeyArgumentType in cases where you may have collisions between keys and the actual KeyArgumentType value is important. Example case is when dealing with FNames in Editor since they compare on case-insensitive CompareIds but have unique DisplayIds for different casing. If you want to know the casing used when inserted into a map, you can now do the following:
TMap<FName, FAssetPackageData*>::TConstKeyIterator It = CachedPackageData.CreateConstKeyIterator(PackageFNameOfAnyCase); FSetElementId Id = It.GetId(); if (!Id.IsValidId()) { return nullptr; } const TPair<FName, FAssetPackageData*> KVPair = CachedPackageData.Get(Id); FName PackageNameWithCasingUsedUponInsertion = KVPair.Key; return KVPair.Value;
-
Removed some unused includes in coreminimal.h and color.h from stat.h.
-
Make Linux/Mac use editor version of crash reporter when compiled with WITH_EDITOR.
-
Added support for multi-line entries on config set properties. Existing config values for set properties should continue to be loaded the same way as before. Example syntax: SetProperty=("Value1", "Value2") +SetProperty="Value3" +SetProperty=("Value4", "Value5")
-
Oodle Data, Network and Texture updated to 2.9.12
-
Add GetFNameSafe functions for UObject and FField. These complement the existing GetNameSafe functions.
-
Update FInterpCurve
::FindNearestOnSegment to avoid allocating TFunctions. -
Added a constructor to FMutex to acquire the lock upon construction
-
Set UE_VALIDATE_INTERNAL_API to control the define UE_INTERNAL which will be set to an empty macro for Engine modules and [[deprecated]] for non-engine modules
-
Allowed casting functions like MoveTemp and Forward to be elided and replaced with direct casts.
-
Add support for /PDBSTRIPPED msvc symbols with -StripPrivateSymbols
-
Add new IsTemplateForSubobjects function that correctly handles querying for all types of subobject templates and improve related comments
-
Cooker: SkipOnlyEditorOnly. This flag is now on by default, and not using it will eventually be deprecated. Packages that are loaded during the cook for editoronly reasons are no longer automatically added to the cook output; they will only be added to the cook if referenced from a cooked package, or via a few other possible methods. *If SkipOnlyEditorOnly causes a problem, and it is not obvious how to fix it, turn it back off again by editing DefaultEditor.ini:[CookSettings]:bSkipOnlyEditorOnly=false, and please send a UDN asking for help in fixing the issue.
-
Assigning a value or copy-constructing TObjectPtr will now run garbage collector write barrier when incremental reachability analysis (garbage collection) is in progress. This means TObjectPtr is no longer trivially constructible and assignable.
-
Scheduler improvements and bug fixes
-
FHarvestedRealm::NameExists changed to consume const FName& rather than FNameEntryId as it leaked the internal storage details for export names of the realm into the API. Since we only store display names in the realm, we can directly compare FNames using display names when verifying we saved correctly. 114ms -> 3ms for SaveContext_NameExists over 71,680 calls
-
Memory-optimized custom IOStore hash map - 65.7 -> 25.9MB for internal project on Gen5 console
-
Replaced many UE traits with standard traits and metaprogramming constructs with simpler and faster-to-compile constructs.
-
Add support to set NTDDI_VERSION with WindowsPlatform.TargetWindowsMinorVersion
-
Added nodiscard to the constructors of TGuardValue, TOptionalGuardValue, TGuardValue_Bitfield_Cleanup and TScopeCounter.
-
PR #11383: Project Generator for Visual Studio Workspace support #contrib 11383
-
Added fallback to standard stack walking for memory tracing for Windows. In some cases our unwinding tables approach didn't work (e.g. when compiled with clang). In those cases fall back to the standard stack walking methods.
-
Add msvc 14.39.x to preferred msvc toolchains
-
UnrealPak: Replace check with warning for missing import Script Object in IoStore describe
-
Version 1.20 of UnrealTraceServer for Windows, Linux and macOS.
-
Added support for incremental Gather Unreachable Objects (post reachability analysis phase of garbage collection). It's now possible to split this phase into multiple frames to avoid hitches on slow or single-threaded platforms.
-
Significantly improved performance of marking objects as unreachable (initial phase of garbage collection) when running in single-threaded environments.
-
Add support for universal binaries for UnrealTraceServer.
-
Added experimental support for incremental reachability analysis (a phase of garbage collection that determines which objects are to be destroyed). It's now possible to split reachability analysis into multiple frames with the specified per-frame soft time limit.
-
Exposed metadata more extensively in the Derived Data Build API
-
Bump preferred MSVC compiler to 14.38.33130 - VS2022 17.8
-
Allow applications to limit the total number of worker threads used by TaskGraph at compile time using UE_TASKGRAPH_THREAD_LIMIT.
- UPackage->Guid deprecated and replaced by UPackage->GetSavedHash.
- FPackageSummary::Guid deprecated and replaced by FPackageSummary::GetSavedHash. FAssetPackageData::PackageGuid deprecated and replaced by GetPackageSavedHash. UPackage->Guid has been marked deprecated for a while; we will remove it in 5.5. The new SavedHash API is only available in the editor; in the cooked game we are removing UPackage->Guid with no replacement because it is unnecessary and costs memory. GetSavedHash currently just returns the old deprecated Guid, but in 5.5 it will change to instead return a hash of the package's bytes that were saved to disk.
-
The content browser tool tip property "Has Virtualized Data" is now only displayed if a project has enabled virtualized assets.
-
PR #11565: Added a new format of the analyzer report #contrib 11565
-
Add a few commands to the command console autocomplete list:
obj gc
,obj dump
,debug crash
,debug rendercrash
and extendedobj refs
-
Moved some FString default arguments out of some headers to allow them to be compiled with only a forward-declaration of FString.
-
Removed NetworkVersion.h from Vector2D.h.
- Save and ResetLoaders only flush loading requests specific to the package when there's already pending async requests
Bug Fix:
-
PR #10682: When linking msvc platforms with clang pass -gcodeview-ghash with -Xclang #contrib 10682
-
Ensured that the primary TIsContiguousContainer trait isn't instantiated with an incomplete type and so memoized into a bad state. Added a specialization for unbounded array types, which are not regarded as contiguous containers because they don't have an determinable end.
-
PR #11411: Fixes for Rider project file generator #contrib 11411
-
Made UE_DEPRECATED_MACRO emit errors in MSVC when bWarningsAsErrors=true.
-
Fix warning "Failed to find object 'Object None.None'" when deserializing FObjectAndNameAsStringProxyArchive. This should also speed up loading a buffer with a lot of NULL objects considerably
-
PR #11261: Fixed missing toolchain include paths on Linux #contrib 11261
-
PR #10515: Add architecture info to Rider project files #contrib 10515
-
PR #11163: Expose additional project properties from UBT to Rider #contrib 11163
-
Move clearing of dirty flag and file size update out of InnerSave This allows delegate broadcast for dirty state update to happen out "IsSavingPackage" scope
-
Support UE versionning in FMovieSceneEventParameters
-
Add setting to control disabling some debug info optimizations when compiling msvc platforms with clang that can in some cases cause missing debug information
-
Added checks to ensure that users cannot emplace intrusive unset values into TOptionals.
-
PR #10511: Fix rsca for toolbox 2 0 #contrib 10511
-
Fix trace in "no logging" configurations
-
PR #10594: Add list of subrules files to generated Rider project files. #contrib 10594
-
PR #11227: Fixed missing system include paths on macOS #contrib 11227
-
Improve comments related to Interfaces to match the actual behavior for blueprint-implemented interfaces. The public documentation for Interfaces has also been improved to explain that blueprint-implemented interfaces do not actually exist in the C++ representation of an object
-
Ensure UnrealBuildTool.dll exists when cleaning projects in installed builds
-
Invalidate makefile if a header only directory is added or removed
-
Fixed TreatWarningsAsErrors not affecting the verbosity of the underlying log, and added TreatErrorsAsWarnings
-
Properties that aren't going to be serialized are no longer considered when determining whether Sparse Class Data should be written out
-
Fix socket keep alive in UnrealTraceServer for Mac/Linux.
-
Cooker: Improve error message: Change "was never saved as an export" message into clearer text "content is missing from cook", and add feedback for why it is missing from the cook.
-
Allow _DEPRECATED properties in sparse class data to not be marked as VisibleDefaultsOnly or EditDefaultsOnly
-
Fixed the root node's children not being properly unset during TOctree2::ApplyOffset.
-
PR #10946: [Rider] Fix IntelliSense by adding include order deprecation defines #contrib 10946
-
BootstrapPackagedGame: Allow skipping the prereq installer if the required dependencies are bundled with the application
-
Enable tracing of "CustomTag" when FName based tags are disabled.
-
Fixed assert firing in the destructor of FArchiveFromStructuredArchiveImpl caused by FMulticastSparseDelegateProperty::SerializeItem() not closing an archive adapter.
-
Fix issue with C# JsonWriter to support characters the should be escaped in a value name.
-
Fixed move semantics in TFrameValue.
-
PR #10731: UnrealBuildTool: fix GenerateClangDatabase #contrib 10731
-
PR #11345: Fix for rebuilding whole Unreal Engine sources in Rider #contrib 11345
- Filter unmounted packages when querying a cooked asset registry in the editor
- This provides a consistent experience between the cooked and uncooked asset registry
-
Fixing a crash when an empty string is passed to CompareWithNumericSuffix
-
Cooker: AdditionalPluginDirectories: Fix staging to look in the RemappedPlugins directory when cooking DLC plugins that are in AdditionalPluginDirectories. Fix cooker to store all metadata in the RemappedPlugins. Fix cooker for even normal DLCs to store all metadata in the DLC's directory rather than the project's directory.
-
Make sure objects preloaded during the async deferred post load step of the legacy loader adds them to the list of objects it tracked
-
Fixed some TArrays of C arrays, which was never supported and only partially worked.
-
Added a fatal error if the DDC is not readable or writable
-
Ensure FileInlineGenCPPMap is set for the module compile environment
-
Updated NoExportTypes.h to add missing entries to EUnit, and to correct the order of units that were already there. This fixes some serialization issues.
-
Exit the game in PreInit on Windows when an unsupported CPU is found rather than wait for an unsupported instruction exception.
-
Fixed creation of DDC stats when using a throttle node
-
CborStructSerialalizerBackend fixes for FSoftClassProperty. Serialize it like FSoftObjectProperty, where the path can be valid even if the object reference isn't.
-
ConcurrentLinearAllocator: Allow not FastPath platforms to allocate blocks with supported alignment. Currently Malloc will fail on such platforms, because not all platforms support 64kb alignment.
-
Correctly add project source dir to include path when building a generic target (UnrealEditor, UnrealGame) with a -Project
-
Fix not selecting the preferred WindowsSDK if it is available when a supported version min or max is also requested
-
Remove some redundant check()s from TArrayView constructors, in particular when copying from other TArrayViews.
-
Fix TMatrix2x2 rotation constructor. Use TQuat2 instead of FQuat2D.
-
Fix to ArchiveCrc32 operator<<(FArchive&) template generalization for structs to only apply for direct serialization to ArchiveCrc32 and if there is no better conversion available.
-
Fixed AsArray and AsObject in CompactBinary to store type errors
-
Fixed TBitsToSizeType's static assert, which would only fire if passed zero.
-
Fixed TScriptInterface's implicit conversions.
-
Fixed reporting of container property names when logging references to objects.
-
Fix a bug where loading a bulkdata payload from a cooked package mounted in the IoStore could end up loading more data off disk than required.
-
Replaced explicit memmoves with RelocateConstructItems inside TArray. Optimized some repeated rereads of unchanged data mid-loop.
-
Workaround for a VC bug: When inlining, VC works to avoid the load->store forwarding stall but loses track of things and inadvertently ends up requiring alignment on temps it creates causing semi random crashes depending on whether the allocator/stack decided to align them. The fix is to switch to directly setting the values.
-
Fixed TSparseArray::operator() indexing usage in its TConstSubsetIterator.
-
Made the JsonArchive structured formatters non-copyable so that their useless copy and move consturctors don't show up in IntelliSense.
-
PR #10620: Make sure BuildU[A|B]T.bat explicitly call the Windows find.exe utility #contrib 10620
-
Fixed an issue where the engine might query the asset registry before the premade asset registry had finished loading.
-
Fix for FString::ParseIntoArray when string to parse has a length of 0, but still has backing memory
-
Fixed FLinkerInstancedPackageMap::BuildPackageMapping to be case insensitive - Added optional SearchCase parameter to TStringView<>::Contains and TStringView<>::Find defaulted to ESearchCase::CaseSensitive for backward compatibility
-
FStructUtils::AreSameLayout now returns true for nullptr, nullptr - importantly this fixes comparison of class layouts when the class does not have any sparse class data
-
Support Intel compiler 2024.1
-
Fixed default initialization of TLS slots to 0 across the engine. 0 is a valid TLS slot and some slots could have been tested against 0 to detect their validity leading to a TLS slot leak at best
-
Fixed some unreachable code errors.
-
Fixing single entry set properties not being saved correctly in some cases. Making UObject::SaveConfig fall back to the default non-specialized behavior if a set property has one or fewer elements to match the load behavior
-
Enables SymsLib resolver in TraceAnalysis for Mac and Linux.
-
PR #11563: UnrealVS: Prefix encrypted Perforce server port address with "ssl:" #contrib 11563
-
Added FArchiveFromStructuredArchiveImpl::operator<< overload for FObjectPtr which fixes a crash when serializing TSubclassOf.
-
Fixed TStaticBitArray::operator== const incorrectness and implicit conversions, which caused operator!= not to used but to construct a temporary and compare that instead. Added TStaticBitArray::HasAnyBitsSet().
-
MpscQueue - Fix for dequeuing move only types.
-
Fix double redirector not properly resolving themselves in some loading order edge case
-
Fix compile single file for external projects & show additional target.cs files
-
Fix UnrealTraceServer timestamps on Linux.
-
EX_Let handles attempted assignments to null objects when the property has a setter
-
Fixed uninitialized variable in FInterpCurve
::FindNearestOnSegment() when BreakBeforeEvaluate() returns true on the first iteration. -
Account for complete trace event fitting in the buffer for scoped events. Previously Header and event body could end up in different buffers, causing incorrect data.
-
Fix compile error caused by an uninitialised const "Unit" member in FNumericUnit when initialising from another unit type.
-
MB2 Allocator optimizations. - Removed extra page allocation for VMA pool header. - Added VMA pool stats reporting. - Removed extra lock per pool (was not used). - Scale factor parameter is configurable via compile-time definition.
-
Removed FAnsiStringView overload for HexToBytes, because it's already handled by the UTF-8 overload and causes ambiguous overload resolution.
-
Fix HTML formatting for FPSChart
-
Fixed a potential race condition in the object annotation system
-
Allow traced log messages to be longer than 1500 characters.
-
Fixed a crash when a boot cache is present in the DDC configuration
-
Prevent unnecessary rebuilds of windows resource files for development builds to reduce how often binaries relink Only embed info from Build.version in exes and dlls for precompiled or shipping targets. Set default windows resource ProductVersion to ENGINE_VERSION_STRING if BUILD_VERSION is not defined
-
Fixed a crash caused by trying to re-construct a template on top of itself when creating non-nullable object property default value.
-
Fixed undefined behavior in ManualResetEvent
-
PR #11342: Use integrated terminal for VSCode #contrib 11342
-
PR #11012: Makefile generator is now platform agnostic #contrib 11012
-
Fix UnrealTraceServer directory listening for Linux. The file notification api was not told to listen to renames.
-
Don't allow using a separate UnrealIntermediateEnvironment folder for installed engine as the intermediate path needs to always match
-
PR #10781: Apply buildconfiguration.xml to SNDBS class #contrib 10781
-
Renamed TArrayView's private namespace to match standards.
-
Fixed TWeakFieldPtr asserting with "const T" template parameters.
-
Fix broken file extension filter in FWindowsPlatformProcess::AddDllDirectory to restore the Windows dll directory cache optimization that helps with boot times on Windows.
-
PR #10683: Fix linking Shipping msvc platforms with
lld-link
#contrib 10683 - -Mode=GenerateClangDatabase should use clang by default as the compiler
Deprecated:
-
Deprecated TChooseClass.
-
Deprecate GetCurrentTag/InvalidateTag and remove all calls as the feature was unreliable and is no longer used by TSoftObjectPtr
-
Added EAllowShrinking as a better replacement for bAllowShrinking parameters on containers, and deprecated the bool overloads.
-
Remove Visual Studio 2019 support
-
Removed PLATFORM_COMPILER_HAS_IF_CONSTEXPR. Deprecated CONSTEXPR, PLATFORM_COMPILER_HAS_DECLTYPE_AUTO, PLATFORM_COMPILER_HAS_FOLD_EXPRESSIONS and UE_NORETURN.
-
Removed the UE_LOG_JSON global mutex on Windows that enabled structured debug output. Integration with other tools can rely on the -JsonDebugOutput command line argument.
-
Remove defunct HybridExecutor
-
Deprecated GET_VARARGS macros and replaced them with GET_TYPED_VARARGS.
Dev Tools
New:
-
Allow enabling/disabling LiveCoding via command line switch -LiveCoding=true|false
-
Removed the more trivial C++ UHT compatibility shims in the code generator.
-
Configure multiple MemReport profiles with ini sections. Use "File" command array which outputs each command into separate file.
-
Cleaned up code generated by UHT. This includes general formatting issues and organization.
- A define ENABLE_ARRAY_SLACK_TRACKING was added to ContainerAllocationPolicies.h, which enables a SlackReport console command which generates a detailed report on array slack (unused elements in TArray containers). Useful when looking for memory savings where arrays can be more accurately sized or trimmed to size.
- Reports are generated as TSV (tab separated value) files in Shared/Logs/SlackReport, which can be loaded into a spreadsheet program. A filename can be specified, or a default one with an incrementing index will be used. Parameter -Stack=N (maximum 9) allows adjusting the stack frame depth -- setting a lower value can coalesce instances of the same allocation from slightly different call stacks.
-
MemReport now can write command's output into separate csv files for commands specified in Engine.ini in [MemReportCsvCommands] section.
-
UHT data in generated code now uses constexpr where possible.
-
Removed the MODULENAME_API from the private copy constructor definition generated by UHT.
-
CsvProfiler - Add end capture timestamp to the csv metadata. This allows easily calculating capture duration by checking the delta between StartTimestamp and the new EndTimestamp. This is much faster than trying to calculate the duration by looking at all the frame times.
-
PluginReferenceViewer - Added a context menu item that launches the asset reference viewer showing the asset references across plugins.
- Added more auxilary information to some trace scopes:
- AsyncLoading package names when LoadTime channel is activated.
- GameFeaturePlugin statemachine name during transitions.
- Scope GC incremental analysis and purge destroyed under one trace region
-
[MemoryTrace] Covered more allocations with asset metadata scopes - Added package/object/class metadata for Iris network spawned actors - Added asset metadata for ConfigFiles - Added package metadata for allocations coming from LinkerLoadPackageSummary - Added metadata for Object::Serialize allocations - Added metadata for UI/Slate and UI/UMG. - Removed metadata scope for UObjectHash/UObjectIndex global buffers realloc.
-
Add option disable/enable running after steps in LowLevelTests.xml.
-
[UE] Improve GameplayTags.DumpTagList Added an output for Sources and References for each GameplayTag Added Columns for showing if tag has Native or DefaultIni source
-
Improved error message with TObjectPtr appearing in function signatures.
-
[LLM] Disable hitchdetector when LLM is enabled It is expected that LLM capture adds CPU overhead during captures, hang/hitch detection made things just worse by spamming logs with unhelpful info.
-
Added the limited ability to add C++ attribute specifiers at the start of a UFUNCTION declaration.
-
Adding support for more complex #define scopes in UHT.
-
Adding new P4VUtil "Combine Shelves", which creates a new shelf combining multiple selected CLs, and works with both shelved and unshelved CLs.
-
Added client-side CSV stat for active replicated object count
- Added RedirectToFile dev command - Usage: RedirectToFile
[COMMAND_OPTIONS]... - It allows output the result of the COMMAND to the file specified by FILEPATH - For security purposes FILE_PATH is sandboxed: Only subdirectories inside Project/Saved directory are allowed - Command will create required directory structure before creating of the file - RedirectToFile does not work for DEFER commands and has no effect for MEMREPORT
Bug Fix:
-
Fixed UHT issue with parsing LAYOUT_FIELD_INITITALIZED
-
Fixing issue introduced into UHT that allowed unsized enumerations to be used as blueprint types. Will once again be limited to uint8.
-
Mark more SceneRender reallocations with correct LLM tag instead of EngineMisc
-
Make the XML parser preserve newlines
-
Removed usage of include file macros from Live Coding source since it was causing issues with SN-DBS
-
Fix linker issues when declaring types outside of "FunctionalTesting" that inherit from "FFunctionalTestBase"
Horde
New:
- Add idle settings to
ProgramData\HordeTrayApp\Settings.json
which allow setting critical processes that should stop the local agent from processing tasks
Insights
API Change:
-
FCpuProfilerTrace::OutputEventType() and FCpuProfilerTrace::OutputBeginDynamicEvent() needs to be called only if the CpuChannel is enabled, otherwise the "spec" trace event is not emitted, so it will result in "
" cpu timers. -
FCpuProfilerTrace::OutputEventType and FCpuProfilerTrace::OutputBeginDynamicEvent needs to be called only if CpuChannel is enabled, otherwise the "spec" trace event is not emitted, so it will result in
cpu timers. Also fixed code that matches OutputBeginEvent with OutputEndEvent.
New:
-
Unreal Insights now displays the priority in package summaries to help understand the order in which packages are loaded and if package priorities are being respected.
-
Unreal Insights : delete trace is now allowed as soon as at least one deletable (i.e. not-LIVE) trace is selected so that a user can "select all" and then delete all non-LIVE traces
-
Some channels are marked read-only (e.g. memory tracing channels) and cannot be toggled while the application is running. However there was no feedback when users tried to enable those channels using console commands for example or using the public API. With this change a logging channel argument is added to several internal methods in order to output information correctly, to console feedback when needed.
-
Added memory tracing for FMemory::SystemMalloc and FMemory::SystemFree.
-
CsvProfiler: Added named events (and trace cpu timing events) also for Csv stats identified by FName.
-
Added an insights preset designed for analyzing load times that can be used by adding -trace=loading to the command line
-
Added LLM tag for untagged video mem allocation in PhysicsField.
-
Added the Windows error message to the log warning when the "UnrealTraceServer.exe" process fails to start. Also updated log messages re UTS launch.
-
Add Trace Pause/Resume menu entry to the Trace Editor Widget.
-
CONTROL_FLOW_PERF_TRACE_STEP. Adding support in FControlFlow and TRACE_CPUPROFILE macros to allow you to begin an event in a control flow node implementation and have it automatically terminated by FControlFlow whenever/however that node completes. This ensures that in a profile trace sequential steps show up sequentially rather than appearing nested (despite the technical fact that they are actually invoked as nested functions). ControlFlow is still an experimental plugin.
Bug Fix:
-
Removed leading spaces in name of PlayerController cycle stats.
-
D3D12RHI: Fixed CreateDiagnosticBuffer to use MEM_COMMIT | MEM_RESERVE (instead of just MEM_COMMIT) with VirtualAlloc in order for memory tracing to correctly track these buffers.
-
Fixed memory tracing and stats for a reallocation in GPUDefragAllocator.
-
Fixed CpuProfiler to flush the trace thread buffer (if not already empty) when the thread ends.
-
Fixed usage of TRACE_CPUPROFILER_EVENT_SCOPE macros in various engine files and in engine plugins.
-
Trace: Improved trace data writer to drain only the buffers available when we start draining buffers of a thread. This avoids cases where a thread floods the writer with new buffers.
-
Fix StartTraceSendTo blueprint
-
Fixed memory tracing to report correctly the name of the wrapped allocator.
-
Fixed usage of CpuProfiler trace in TaskTrace.
-
Fixed usage of CpuProfiler trace in BlueprintActionFilter (when ENABLE_BLUEPRINT_ACTION_FILTER_PROFILING is enabled).
-
Fixed asset metadata association with mem allocations to match LLM.
-
Fixed memory tracing for OnDllUnloaded.
-
Fixed missing ProgramSize allocations for Unix platform.
-
Fixed "Frame" CPU timing events for the Render thread to not be added when the "RenderCommands" trace channel is on. This is because the "BeginFrame" and "EndFrame" commands will define CPU scopes (when "RenderCommands" channel is on) and will overlap with the "Frame" timing event (resulting in incorrect timestamps for both "BeginFrame" and "Frame" timing events). Also renamed "Frame" to "RenderingFrame" for the timer to not be merged with one used in the Game thread.
-
Renamed the "LoadObject" named event (defined by SCOPED_NAMED_EVENT) as "StaticLoadObjectInternal" (measures time in StaticLoadObjectInternal() function) because there is another "LoadObject" cpu scope (defined using the UE_TRACE_LOG_SCOPED_T macro; the one with metadata) which measures same function.
-
Fixed tracing for stats counters (-trace=stats). For each thread, the additional buffers (after the initial buffer is flushed) had incorrect initial timestamps.
-
In certain situations thread starving can occur due to thread starving between TraceLog worker thread and tracing threads.
-
Fixed memory tracing for virtual allocs to track allocations also when just MEM_COMMIT is used (with a nullptr address).
Framework
API Change:
- Derived classes of LocalFogVolumeComponent that need tick functionality will have to override PrimaryActorTick.bCanEverTick in their constructor.
New:
-
Reworked Electra media player's DX12 support to allow for more optimized data delivery from the decoders. Also adds further optimizations if using Windows SDk 22621 or newer.
-
Fixed various issues with MediaFramework, ImgMedia, WmfMedia and Electra concerning playback timing control and blocked / sycnhed playback behavior
-
Added a flag to always make the actor spawned by a ChildActorComponent transient
-
GameFeature Plugins will deactivate any plugin dependencies that where also activated by the referencing plugin if reference includes the property "activate": true
-
Extended support for colorimetry information from video streams for non-standard HDR streams (e.g. allowing 8-bit HEVC data to use Rec2020 & PQ etc.)
-
Removing the need to create textures on-demand on the render thread from Xbox GDK playback code in Electra, hence improving decode performance
-
Added the ability to selectively activate listed plugin dependencies when a plugin is activated. The plugin reference requires the property "Activate: true"
-
Bug fix: Fixed performance issue with LocalFogVolumeComponent. Changed PrimaryActorTick.bCanEverTick to false.
-
Optional plugin dependencies need to be compiled enabled or command line enabled otherwise they are ignored during startup when the plugin manager enumerates a plugins dependency list for enabling.
-
Allowing attenuation settings to be live updated while in the editor.
-
Reworkied WmfMedia's state handling of WMF to correct playback timing and sample handling shortcomings
-
Fix reinstantiation of subobjects in CDOs and reused the same logic on instances to fix thier subobjects as well.
-
Added support for Enhanced Input show debug command to use debug target, fixing issue where show debug menu always only showed input information of first local player in a game instance even if debug target selected others.
-
Disallowed plugin entries can now contain a developer comment. Changed data type from a string to a struct. Backwards compatibility retained
-
Add support for writing JSONs with original property name casings
-
Added world name to UWorld::CleanupWorld warning to help diagnose related issues faster
-
Applied same CDO subobject fix to Archetypes
Bug Fix:
-
Fixing up some GPU state management for Electra's AVF texture sample code to fix glitchy video playback on some Apple devices
-
Fixed up SRV support for PC DX12 P010 format: plane selection code was missing
-
Fixing up texture sample setup from colorimetry information returned by Electra decoders to correctly reflect encoding vs. mastering display information
-
Fixed an issue with plugin templates where package names would fail to fix up after a new plugin is created. This can occur if two template files have the same filename but the extensions are different (.csv, .uasset). Only need to create redirectors for unmodified file types
-
PR #10885: Fix IsValidLandingSpot for Large World Coordinates #contrib 10885
-
Added ENGINE_API to ALight::PostLoad. Follow-up fix to a linker error from CL 27595673 that was reported by a licensee. If you created a custom class derived from ALight, there would be a linker error reporting a missing definition of ALight::PostLoad. The vtable of a derived class needs to call PostLoad, which requires that the symbol has been exported.
AI
New:
- Learning Agents 0.2
- Completely overhauled the LearningAgentsInteractor to allow for more sophisticated observation and action structures.
- LearningAgentsComponent classes were reparented from ActorComponents to UObjects. Introduced new "make" functions on the LearningAgentsManager.
- All blueprints need to be be rebuilt from scratch.
-
AI Path Following: Add an option to test reachability prior to updating the destination to an Actor's position
- Added new simple NNE runtime NNERuntimeBasicCpu.
AI Behavior Trees
New:
-
PR #9497: fixed mismatch in BT component description format
-
Add ability to override default blackboard key value for most types. Prevent child blackboards from being able to modify the key type of inherited key.
-
Create helper function InitializeNodeMemory & CleanupNodeMemory in BTNode to handle creation and clean up of node instance memory Update bt nodes that use instanced memory to use the new helper to create and destroy their instance memory
-
[Behavior Tree] Add support for node-specific error reporting
-
UBTTask_FindAndUseGameplayBehaviorSmartObject now reaches slot location before using object
-
Added more logs to auxiliary node and converted some EQS log to vlog
Bug Fix:
-
Fixed TimeLimit decorator when used in composite decorators Problems was that the decorator was returning a failure after requesting execution which could be the case in a composite decorator using operand
Or
-
ForceSuccess decorator effect should not be limited during the search
-
Fix Behavior Tree Composite Decorator had an erroneous tooltip ("Class not found, make sure it's saved!")
-
[Behavior Tree] Fix re-opening BT assets on project start-up opens up the BB instead
-
Fixed potential access to an invalid FindInBTResult pointer in BehaviorTreeEditor
-
BTService to RunEQS should not be allowed to tick on search start to ensure proper query management.
- Updated TimeLimit Decorator to not get get ticked again in case it is still active after requesting execution (e.g. latent abort)
-
An execution is now scheduled when a task completes and there is a pending execution.
-
Fixed delta time for tasks using tick intervals Problem was that a new task to execute using tick intervals could be ticked using the accumulated delta time from the previous task.
-
Converted OnBlackboardKeyChanged delegate to a global multicast delegate so every BehaviorTreeBlackboardView linked to the modified asset can refresh their actions.
-
Fixed crash in BT that could occur if the tree was stopped the same frame one of its EQS queries finished.
-
Fix BT decorator and service lists (and also some custom licensee graph implementations) put the first and second level category on the same level
-
Fix issue where BT cooldown decorators would return false due to the last used time being 0. The cooldown calculation was also changed to prevent possible undefined behavior arithmetic.
- Prevent ForceSuccess decorator from affecting node results from unrelated nodes. Should only modify result if associated task or composite node fails.
AI Debugging
API Change:
-
Deprecating old FVisualLogger::GetEntryToWrite in favor of a new, static FVisualLogger::GetEntryToWrite for consistent Engine Timestamps in Editor.
-
- Deprecated the overload-based FVisualLogger::GeometryShapeLogf / FVisualLogEntry::AddElement API
New:
-
Encouraged Engine Timestamps by deprecating FVisualLogger::GetEntryToWrite.
-
Gameplay Debugger now selects the local Actor on start-up if no other suitable Pawns are found. Use shift-' to force select the local Actor.
-
PR #9729: Fix Visual Logger Capsule first param to match cpp
- GameplayDebugger
- adds key modifier 'Shift' support for local player selection
: Toggle debugger ON + Single best pawn candidate selection (closest to reticle) | Toggle debugger OFF - Hold
: Toggle debugger ON (if not already opened) + Continuous best pawn candidate selection (closest to reticle) - Shift +
: Toggle debugger ON + Local player selection | Toggle debugger OFF - Hold Shift +
: Toggle debugger ON (if not already opened) + Local player selection
-
Improve behavior tree debugging - Add a warning to the bottom left of the debug window when the behavior tree being debugged is paused. - Gather runtime values from instanced nodes when needed so the correct values are displayed when debugging. - Make double clicking on a dynamic subtree node open the running subtree
-
[VisLog] Improving multiple PIE session VisLog capabilities. The TimeStamp used is now a global Engine TimeStamp. The WorldTimeStamp is also recorded separately for ease of debugging. By using this Engine TimeStamp during PIE sesions, we can correctly record the time for client & server events, allowing us to see the effects of replicated data more clearly on the timeline.
- Visual logger improvements : Added sphere visual logs Added "wire" variant of various visual logs (box, OO box, cone, cylinder, capsule, sphere) Added blueprint versions of most visual logs (box, OO box, cone, cylinder, capsule, sphere, arrow, circle) Take into account the log's color's alpha value when drawing visual logs (multiplied by the scene proxy's own alpha), except for text, as is tends to become unreadable Fixed oriented box debug renders, which didn't support rotations appropriately (they wouldn't match the wireframe version) Fixed cylinder debug renders which were always vertical * Skip visual logs with empty text in the visual logger window's tooltip
Bug Fix:
- Quitting the game (e.g. ending PIE) while the Gameplay Debugger was active would prevent further messages from being logged to the screen in subsequent plays.
AI Navigation
New:
-
[Navmesh] Building actors spawned from instance actors don't dirty areas anymore (navmesh is expected to be already up to date from the instance actor being replaced).
-
Removied heavy include dependencies in NavRelevantInterface.h.
-
[Navigation] Addition of a boolean to control navigation relevancy in UGeometryCollectionComponent.
-
Removed NavigationTypes.h from NavRelevantInterface.h, StaticMeshActor.h and AITypes.h.
-
Removed NavigationSystemConfig.h and NavLinkDefinition.h from NavigationSystemTypes.h.
-
[Navoctree] Objects with empty bounds are not added to the navigation octree anymore.
-
PR #11080: Change bit-field type from int32 to uint32 in FRecastDebugGeometry #contrib 11080
-
Added cheat command 'ai.debug.nav.DirtyAreaAroundPlayer' that can be used with dynamic navmesh to dirty tiles in a square area around the local player using provided value as extent (in cm) or 10 meters if not specified.
-
Added an optional ReachCheck on NavLinkCustomInterface to allow navlinks to override the basic reach test done by the PathFollowingComponent. Improved the path ReachCheck for existing custom links.
-
Optimization to RemoveTiles and addition of profile tags to UpdateActiveTiles().
-
Addition of a warning in UGeometryCollectionComponent to catch GC that might be using bStripOnCook without bUseRootProxyForNavigation (resulting in exporting nothing).
-
Removed Actor.h from NavigationTypes.h.
-
Removed NavigationQueryFilter.h when unnecessary in headers.
-
Log invoker priority as string instead of the enum value.
-
[NavMesh] Add a NaN check to dirty area bounds.
-
[NavMesh] Added early warning for invalid bounds when creating FNavigationDirtyArea.
-
Added a new type of NavModifierComponent, that is, SplineNavModifierComponent which assigns a given nav area to all parts of the nav mesh in the vicinity of a spline.
-
[Navlink] Added custom link owner's name to link ID warning to allow identifying the problematic actor when ID clashes.
-
[Navmesh] Fixed AgentStepHeight not set in NavDataConfig.
- NavigationRelevant:
- Added flag in FNavigationRelevantData to indicates elements that want to skip dirty areas when added/removed from the NavigationOctree.
- Method ShouldSkipDirtyAreaOnAddOrRemove has been added to INavRelevantInterface to control the flag.
- UpdateNavOctreeElementBounds now takes a list of dirty areas instead of a single area to allow batched modifications.
- UInstancedStaticMeshComponent updates:
- Added a cache for navigation bounds
- Implements ShouldSkipDirtyAreaOnAddOrRemove so we don't dirty the whole area covered by the instances on registration but only a list of explicit areas using the instances.
- Added PartialNavigationUpdates for batched modifications
- Fixed partial update not sending the right area for the original position
- Added console command "ai.debug.nav.DrawDistance" to tweak navmesh draw distance at runtime.
-
Added labels indicating the number of elements in each node if octree details are enabled.
-
Fix UInstancedStaticMeshComponent::GetNavigationPerInstanceTransforms to return only the instance transforms in the provided area box as expected. This represents a significant performance improvement when using multiple instances ISM with AI navigation.
- ANavigationTestingActor
- Addition of a query to display if navigation data is ready (has been generated) within a given radius.
-
Addition of NavigationBuildDetailed CSV profile tags in the NavigationSystem tick.
-
[NavMesh] Added more information to the error message and warning messages related to the tile limits.
-
[NavMesh] Added more information when reporting the error message related to the TileNumberHardLimit. [NavMesh] Added more information when reporting the warning message related to the tile pool size.
-
ISM support for partial navigation update.
- Replaced requirement of PrimitiveComponent by INavRelevantInterface + UObject for registration to the NavigationSystem.
-
Added dedicated delegates in the NavigationSystem for UObject based registration and update.
-
Fix navmesh rasterization issue when generating navmesh high above 0.
-
Removed Actor.h from AITypes.h.
-
Removed usage of CoreMinimal.h from navigation modules.
- Updating dirty tiles:
- Optimizations when marking dirty tiles:
- Extracted finding the seeds and building sub areas to do it once for all NavData ActiveTiles now use a set instead of an array
- When using active tiles, don't try to mark dirtytiles if there is no ActiveTiles
- Added profile tags Fixed warning message for oversized dirtyarea to use the AdjustedAreaSize
- NavInvokers
- When updating invokers, use 3D invoker seed locations to compare against the maximum seed distance.
- Update InvokersSeedBounds with the vertical limits as well.
- [Dirty area] Using VeryVerbose verbosity, LogNavigationDirtyArea now logs purple boxes showing dirty areas that will dirty tiles.
-
Validating AgentMaxStepHeight in relation to AgentMaxSlope and CellSize.
-
Improve FRecastNavMeshGenerator::MarkDirtyTiles speed by prefiltering dirty area bounds using the bounds of invokers seeds.
-
Added some profile tags in MarkDirtyTiles.
-
Added extra logs when Navigation DirtyAreas are being reset.
-
Replaced custom NavLink static registration queue by a new world subsystem that will also store NavRelevant objects that are not AActor/UActorComponent based. This allows new NavigationSystem created after initial map load (e.g. ANavSystemConfigOverride) to properly recreate its custom nav link mappings and octree.
-
StaticMeshComponent is no longer relevant to navigation until compilation of the associated mesh is completed. This approach replaces the previous one consisting in returning either the render bounds or invalid bounds which could produce log spam when loading level and compiling multiple meshes.
- Added bounds to NavCollision since geometry can differ from StaticMesh
- Bumped the DDC version of the NavCollision
- Updated StaticMeshComponent to return bounds from the NavCollision when possible
- Fixed InstancedStaticMeshComponent not using the additional geometry of the NavCollision when exporting the custom navigable geomerty
- Updated InstancedStaticMeshComponent to compute bounds using the NavCollision for GetNavigationBounds, PartialNavigationUpdate and when gathering per instance transforms for navigation
- Updated UHierarchicalInstancedStaticMeshComponent to use bounds from the NavCollision for PartialNavigationUpdate
-
Use partial update when creating and destroying physics state of ISMC instead of doing a full navigation update. That prevents huge amount of tile dirtiness.
- [Navmesh] Fix navmesh sinking too far below surfaces causing navigation issues.
- Addition of a MaxVerticalMergeError and a SimplificationElevationRatio to ARecastNavMesh to allow navmesh to adapt more precisely to vertical collision variances.
-
Addition of InvokersMaximumDistanceFromSeed allowing to restrict invokers updating far from seed points (player positions by default).
-
Removed World.h include from NavLinkCustomInterface.h.
-
NavigationTestingActor: Don't reset ShowStepIndex for every request and allow to save it's value (not transient anymore).
- [Navmesh] Improved navmesh generation on steep slope:
- Fixed navmesh being generated at locations too steep and above the step height threshold.
- Addition of LedgeFilterMode on RecastNavMesh to select the desired ledge slope filter mode.
- Addition of a new filter mode that takes into account the maximum walkable slope when filtering voxels.
- [Navmesh] Tile generation debug improvements:
- addition of an options to skip contour simplification and display raw contours;
- addition of text labels to FRecastInternalDebugData;
- addition of indexes and coordinates to contour debug edges, allowing to identify them individually.
-
Add camera location to invoker seed locations when the pawn is null so nav mesh is not removed in cases where the player camera is near the invoker but the player pawn has been destroyed.
-
[Navmesh] When using a SimplificationElevationRatio > 0, navmesh contour now tessellates between regions to improve navmesh height precision.
- [Navmesh] Raw contour improvements:
- Allow merging the first contour points with the next and the last to remove differences with contours from other regions.
- When walking contours get max of neighbors height.
-
Exposed RequireNavigableEndLocation to MoveToLocationOrActor BP function.
-
Addition of the average tile generation count per second in LogNavigationHistory.
-
In UGeometryCollectionComponent, addition of a boolean to control navigation relevancy.
-
[Navmesh] Update navmesh display lines to better distinguish edges borders and polygons borders.
-
[Navmesh] Cancel async building tasks when navmesh generator is destroyed to prevent leaking any build tasks.
-
Only do navigation updates for the required instances in UMassVisualizationComponent::HandleChangesWithExternalIDTracking (instead of dirtying the whole component size).
-
[Navigation] Only update navigation for actor instances when initially populating the ISMC to prevent unnecessary dirtiness.
- Added linear extrapolation support in SplineMeshComponent
- added support to distort bounds that could exceed the mesh bounds used to define the spline local range [0, 1]
- in case point on spline is outside default range we use linear extrapolation for position or bounds
- this change also improves positioning of objects attached to sockets outside the mesh bounds
- navigation bounds are now computed and cached to match distorted navcollsion
Bug Fix:
-
Fixed possible memory corruption in SimpleCellGrid::Serialize() due to missing bounds check and integer overflow.
-
Fix voxel filtering issue when using high AgentMaxSlope values in combination with high CellSize values.
-
ISMC support for obstacles and nav areas: fix ISMC not exporting as obstacles.
-
OnNavigationBoundsUpdated, make a removal request if the bounds are invalid. This avoids having invalid RegisteredNavBounds when undoing the addtion of a NavMeshBoundVolume.
-
Fix usage of SHOW_NAV_EXPORT_PREVIEW define.
- [Navmesh] Fix navmesh tiles being removed and not generating for some modifiers when navmesh is in DynamicModifierOnly mode. (Before the change, if we were DynamicModifierOnly mode and a resolution was set, it would set the Geometry flag as well as the DynamicModifier flag, resulting in the touched tile being flushed but not fully rebuilt.)
-
[Navmesh] Fixed an issue with bFillCollisionUnderneathForNavmesh.
- ISM
- Fixed partial navigation update not using up to date navigation bounds when updating a single instance
- HISM
- Fixed missing scale support for filters used in overlapping queries
- Fixed tree marked as out of date when performing in place update (i.e. updating rotation or scale) resulting in accumulated navigation dirty areas until next rebuild. To minimize change on this fading out component we rebuild the tree instead for operations performed in non game worlds (where we expected most of this manipulations to be made).
-
Fixed issues that for both editor time and runtime, in some settings, when placing new StaticMeshFoliage or HierarchicalStaticMeshComponent in the level or changing their transform data, the Navmesh generation on them would be incorrect.
-
[Navmesh] Properly checking for extents in navmesh findNearestPoly queries.
- [Navmesh] Fixed DynamicModifierOnly navmesh missing tiles when using nav modifiers.
- When using navmesh resolution, Area modifiers are not added to ANavModifierVolume anymore.
- When adding dirty areas make sure to prevent bRebuildGeometry for game world with static navmeshes.
-
Fixed navmesh dirty area logs to display bound sizes as indicated and improved log readability.
-
[World Partition Navmesh] Fixed WP navmesh generation by setting GridSize for ANavigationDataChunkActor (needed since the addition of FPartitionActorDesc::GetEditorBounds()).
- Fixed partial navigation updates for Editor manipulations of InstancedStaticMesh component
- added partial update on component registration/unregistration
- skip updates when adding/removing instances when component is not registered
- added list of dirty areas to pending dirty element so they could be applied when udpate info is successfully processed
- added some missing updates when not using partial updates
-
[Navigation] Added support for obstacles and nav areas with Instance actors by adding bOverrideNavigationExport and bForceNavigationObstacle properties to FISMComponentDescriptor.
-
Fixed "Looking for NavData using invalid FNavAgentProperties." warning spam.
-
[Navmesh] Fix navmesh generation issue where polygon would wrongly connect to a different height, resulting in a broken navmesh surface.
-
NavModifierVolume actors getting their position updated via their parent Instanced Level Actor in the Editor now update their navigation data.
-
Added specifiers to property PerPointLaneProfile in ZoneGraph so it is properly handled by the component instance data when a BP actor is reconstructed.
-
Fix invalid memory access (use-after-free) in FGraphAStar::FindPath.
-
Added navigation update in StaticMeshComponent when associated mesh gets compiled. This will invalidate any pending add to the octree and dirty tiles since the component is no longer relevant until compilation completes.
-
Prevent ANavSystemConfigOverride from using the world if it's in the process of being destroyed in PostUnregisterAllComponents (else it will try to recreated the original navsystem in the world currently being destroyed).
-
[World Partition Navmesh] Fixed for ANavigationDataChunkActor having wrong actor location caused by missing RootComponent.
-
Fix ZoneShape visualization when re-selecting the shape or undoing actions.
-
Fixes potential crashes when invalid parameters are provided to the NavLocalGridManager
-
[Navmesh] Fixed crash in DetourTileCacheBuilder canRemoveVertex.
-
Fixed codepath in StaticMeshComponent for navigation update when associated mesh gets compiled.
-
GeometryCollectionComponent: using root proxy to take into account root particle position when computing bounds.
-
[Navmesh] Fix debug display issue in duDebugDrawHeightfieldLayer.
-
[Navmesh] Navmesh resolution from modifiers is now correctly read when used with in async tile generation combined with lazy modifier gathering.
-
Fill Collision Underneath for Navmesh on an ISM now applies to each instance.
- Fixed UpdateActorAndComponentsInNavOctree to properly update attached actors
AI Smart Objects
New:
- SmartObjects on actor instances:
- mass tag, fragments to create/destroy smart objects for Mass entities
-
Add Find Smart Object functions that take in AActor's and avoid using the normal QueryBox. This is more friendly to the UE Gameplay Framework and lets you pass in specific actor's that you case about. If you had to use a spatial query, then you may get results from objects that you don't explicitly want if they are overlapping objects.
-
Removed dependency on MassEntity to store slots
-
Added option to toggle smart object annotations in GameplayDebugger
- Added option "Slot Details" to the Gameplay Debugger to be able to reduce the amount of replicated data for worlds with large amount of SmartObjects.
- This option is required to display annotations (i.e. turning it off will disable annotations and turning on Annotations will turn this one on)
- When turned off, a single shape will represent the SmartObject in the world
-
Add two Smart Object Request Filter options to return claimed and/or disabled slots too
-
Expose some smart object component, definition, and runtime options to blueprints to make it possible to have some very basic interactions with them inside a blueprint.
-
Provide owner actor to FindSmartObject in EQS query generator
- Added reasons to control the enabled states of smart objects:
- Gameplay tags are used to identify a reason
- Default reason "SmartObject.EnabledReason.Gameplay" is a tag (UE::SmartObject::EnabledReason::Gameplay) provided by the plugin and used by default if no other reason is specified
- Tags are converted to bit masks and stored as disable flags in runtime instance
- External systems can declare new Gameplay Tags for the specific needs. System currently allows 16 different reasons (1 default + 15 custom)
- A Smart Object instance is considered disabled as soon as at least one reason is set
-
Add a "Find Smart Object from Targeting System" request to smart objects. The targeting system is often used for player interactions to determine what the player is "targeting", so being able to find the smart objects that a player is looking at will make using smart objects for player interaction easier!
-
Add some Blueprint Functionality to the Smart Object system. - BP functions for checking if slot handles are equal or not - to string functions for slots and handles - is valid functions for slot handles
- Added config to clear world preconditions for client builds
- [/Script/SmartObjectsModule.SmartObjectSettings] bShouldExcludePreConditionsOnDedicatedClient=true
- Allow smart object creation from definition, transform and owner descriptor struct that will use dynamic ids
- Replaced registration type
WithCollection
byBindToExistingInstance
in USmartObjectComponent since it can also be used for objects not tied to a component lifetime created from CreateSmartObject - Allow subsystem component accessor to force hydrate the actor associated to a smart object.
Bug Fix:
-
Mark the test smart object test types (USmartObjectTestSubsystem, USmartObjectTestBehaviorDefinition, and ASmartObjectTestCollection) as a NotBlueprintType. This prevents it from coming up in the BP context menu when using a regular runtime blueprint.
-
Display options in the GameplayDebugger are now replicated to properly display their status on the client
-
Fixed slot condition activation
-
Fix slot condition that could get activated multiple times
AI State Tree
New:
- StateTreeDebugger
- enabled by default in the StateTreeEditor
- traces can be automatically started on non-editor targets by setting 'bAutoStartDebuggerTracesOnNonEditorTargets = true in StateTreeSettings or' under [/Script/StateTreeModule.StateTreeSettings] in the .ini config file.
- traces can be manually started/stopped using
statetree.startdebuggertraces
andstatetree.stopdebuggertraces
from the console
-
Create BTTask_RunStateTree and BTTask_RunDynamicStateTree that allows the execution of state tree in a behavior tree
- StateTreeDebugger
- added option to disable state transitions
- added state transition breakpoints
- added console variable
statetree.displayitemids
to display states, tasks and transitions Ids in the StateTreeEditor (details view and state treeview)
-
Create StateTreeMoveToTask wrapping a UAITask_MoveTo allowing state tree to move AI using the same framework as BehaviorTree Create the FStateTreeAITaskBase & FStateTreeAIActionTaskBase state tree task namespace for AI focused ST task
- StateTreeDebugger
- created a dedicated option to auto-scroll and converted debugger pause to control event processing
- clear tracks when selecting new valid session
- scrub buttons can now be used as soon as analysis is pause of auto-scroll disabled
- added new button to the DebuggerView to control the session analysis state (pause or not). Mainly required when performing a remove analysis of non editor target.
- added new button to the DebuggerView to toggle auto-scroll. Manual selection in the timeline will turn it off so it can now be turned back on.
- StateTreeDebugger breakpoint improvements
- added support for breakpoint when exiting state (was only when entering)
- added support for breakpoint when entering or exiting a task
- state breakpoints can be added from contextual menu in the TreeView or from the Debug options in the details panel
- task breakpoints can be added from the Debug options in the details panel
- added feedback labels in the details panel for states and tasks with breakpoints
-
StateTreeDebugger can auto start analysis of traces started from console command
-
Added deferred stop and validation for reentrant calls to Start/Stop/Tick.
-
Add an option to retain property values when the class of a node changes
- Create IStateTreeSchemaProvider that allows a derived class to override the schema used by a parent property. Create StateTreeAIComponent & StateTreeAIComponentSchema derived from StateTreeComponent but guaranteed to have a AIController
Bug Fix:
-
PR #11008: Fix nullptr error for invalid StateTreeRef #contrib 11008
-
Fixed a bug where keyboard focus are not properly routed to WebBrowser before user interacts with the browser content.
API
New:
- Streaming improvements for fast response assets
- Fixed RequestedMips condition in FRenderAssetStreamingManager::TickFastResponseAssets()
- Call ProcessAddedRenderAssets() after Async work is complete so newly loaded meshes can be set as fast response assets. Can be disabled by setting r.Streaming.ProcessAddedRenderAssetsAfterAsyncWork=0 Streaming API additions
- Added UMeshComponent::PrestreamMeshLODs() to request the streaming system starts streaming in all LODs for the mesh; analogous to PrestreamTextures()
- Added UStaticMeshComponent::RegisterLODStreamingCallback() to match USkinnedMeshComponent
- FastForceFullyResident() returns true if the asset meets the conditions to be fast fully resident, and false otherwise
- Passing -1 for the LOD in RegisterLODStreamingCallback() asks for a callback when the maximum available LOD is streamed in.
Audio
API Change:
-
Audio decode size reduced to 4800 (100ms of 48k) down from 8k to allow for prebuffers to not stall playback. Some hardware decoders needed a subsequent fixes as were dependent on power of 2 sizes buffers.
- The function AudioModulation::GetOrRegisterParameter was updated to take the modulator name and class name directly instead of a breadcrumb with both. So if you ever call this function, you'll need to update your callsites. You can see an example in SoundControlBus.cpp.
-
The type of the TModulatorBase's Name variable was changed from an FString to an FName, so if you use that value you may need to update callsites to call the ToString method.
- Added a CVar
New:
-
Harmonix music system tools are now available as an experimental engine plugin! Design procedural music systems with the included suite of MetaSound nodes for MIDI generation and processing. Create rich, layered sounds with the powerful Fusion sampler. Manipulate sound in time with music using clock-synced modulation and effects. Synchronize gameplay and visuals with music using the Music Clock Component and MetaSound nodes for audio analysis.
-
Dynamic Submixes. Blueprint API to connect/disconnect submixes at runtime.
-
Added Quality settings to Metasounds and add logic to auto name them.
-
MetaSounds is now production-ready and out of Beta.
-
Libsndfile upgrade to 1.2.2 and add support for linux/mac. Added support for mp3/flac/opus/vorbis imports on all editor platforms.
-
Remove unneeded input binding in MetaSounds for perf
-
Added experimental MetaSound operator precaching mechanism / subsystem.
-
Tag loading behavior of soundwave using Soundclasses hierarchies. Allowing for cooked and inlined initial audio chunks.
-
Allow MetaSound Time data be used as a MetaSound Output
-
Fix quality settings named "None" causing issues with Defaults.
-
Modulation: New Blueprint Function: Is Control Bus Mix Active. Returns true whenever the given CBM is active.
-
Optimized memory allocations in DSP objects for recycled metasounds (operator cache).
-
[Metasound] NodeTestGraphBuilder: Add method for adding a constructor input which has a type that is not directly supported by FLiteral
-
Adding constructor pin to grain delay node for max delay.
-
Refactor to move all Engine (codecs) Decoders into their own modules.
-
[Metasound] Enable pin on envelope follower node
-
Added an experimental CVAR to amortize dynamic operator updates.
-
Increase streaming priority for audio stream cache reads to "normal" from "below normal".
-
Allow Quartz Subsystem to (optionally) tick when game is paused
-
Fixing ADSR discontinuity on envelope release.
-
[Metasound] Refactor UMetasoundGeneratorHandle to work with Live Update
-
[Metasound] Add Blueprint API to create FMetasoundFrontendLiteral instances of supported types
-
[Metasound] Use a map for faster generator handle output lookup. This results in a ~70% CPU time improvement.
-
Optimizations to FAudioParameter::Merge and related functions.
-
[Metasound] Use FindClassOutputWithName instead of GetOutputNodeWithName to get output metadata in FMetasoundGeneratorHandle::WatchOutputs This results in a 98% improvement in CPU time.
-
Added new MetaSound WaveTable Bank Evaluate Node to optimize against requiring memory copy of a WaveTable when interpolation between bank tables is not desired.
-
Added experimental CVAR to allow MetaSoundSourcePresets to use their parent graph instead of themselves when utilizing the operator cache.
-
Make Submix Sends UX consistent between attenuation + soundbase
-
Allow MetaSound member default literal values and read only member fields to be copy/pasted in the details panel
-
Change to using soundwave GUID as stream cache key, which should give more hits for reloads.
-
Allow XMA2 to deal with buffers that are not divisible by 256*Channels.
-
Avoid registering unused MetaSound send/receive nodes
-
String format optimization in MetaSounds
-
Making space bar preview a MetaSound in the content browser.
-
Move some MetaSound graph processing from runtime to cook for improved performance
-
Metasound per platform blockrate and samplerate.
-
[Metasound] Notify listeners only once per render block when a dynamic generator's vertex interface changes.
-
Show Source or MetaSound settings by default in MetaSound details panel, autoexpand graph member menu by default
-
[Metasound] Notify users when a generator's I/O changes
-
New Modulation Parameter: Additive. This parameter maps a given range to 0-1, and the values are mixed together by adding them and clamping the value.
-
Latch an error state in the case where the decoder returns negative samples
-
Added new USoundModulationDestination which allows users to enable modulation destinations via gameplay code or Blueprint and easily get the value on the Game Thread.
-
Add Find tab for searching within a MetaSound
- Several small changes were made to user interfaces in Audio Modulation to improve usability.
- Modulation Patches: changed the order of parameters on Modulation Patches to put the most used settings at the top of each input, set Bypass to false by default for new Patches, and changed the name of Shared curve assets in the curve selection dropdown to "Custom."
- Control Buses: Moved the Address settings and list of Generators to an Advanced category, and added a comment to the Parameter variable that explains what it does, as it's very important.
-
Added APIs to get total number of frames in a FSoundSource
- Audio can be now optionally inlined for Load on Demand.
Bug Fix:
-
Fix attenuation override not being respected within the audio interface update #contrib 11149
-
Fix MetaSound trace debug print name for graph nodes
-
Fix for DynamicSubmix's attaching to Master by accident and also submixes Auto registering AudioDevice Creation
-
BaseDefaultSubmix was not working in all situations
-
Fix MetaSound trigger parameter being retriggered on realizing virtualized sounds and unneeded parameter updates being cached while virtualized
-
Fix race condition with MetaSound async registration
-
Fix non-cooked quality settings by adding a cook stage the MetasoundSource to correctly save them out per platform. Previously the PerPlatformSettings was added to the MetasoundSettings, however as this is not a true asset they weren't being correctly cooked. The code previously pulled the global settings, then allowed overrides upon this. This decision is now made during cook.
-
Fix MetaSound reset to default arrow still showing even after literal has been set to default
-
Fixing ADSR invalid memory access.
-
Fix for a rare Audio Hang on Shutdown
-
Fix editor crash for invalid MetaSound graph connection view when previewing sound
-
Improved performance when querying Control Bus Mix Values
-
Fix Audio Synesthesia NRT editor crash when settings object is invalid
-
Fix for Metasounds not using device rate when Quality Settings are disabled
-
Fix for submix cook warning on mac/linux
-
Handle bad ADPCM decodes
-
Disable adding comment nodes in non editable MetaSound graphs like presets
-
AT9 Fix to handle non power of 2 decodes.
-
Rollback fixes around handling large truncated files, as they caused bugs with seeking for adpcm.
-
Make the Metasound CVARs a global override instead of just the defaults
-
Fix for Quality settings overriding defaults in the "0" case.
-
Several small changes were made to improve the stability of Audio Modulation during engine shutdown/PIE exit.
-
Fixed a crash when CacheSizeKB=0 was set in the ini config.
-
Fix crash caused by race condition when building MetaSound graph operators
-
Make Trim print correctly handle the uint64s
-
Fix nullptr deref after bad cast in submix register
-
Fixing tooltip typo #rd trivial
-
Fix erroneous MetaSound warning for external node classes
-
Fixed TriggerDelay node to only fire after the most recent execution of the input trigger
-
Fix for Google resonance Spatialization being incompatible w/ multi-pie.
-
Fixed an invalid read crash on Audio Mixer Shutdown.
-
[Metasound] Guard against unbounded growth of MetasoundGeneratorHandle output queues
-
Disable audio synesthesia NRT analysis for procedural soundwaves including MetaSounds
-
Fix bug in audio resampling.
-
Fixed rare crash in editor caused by Global Modulation Buses when shutting down PIE.
-
Fixed issue where FloatADSREnvelope node would drop to 0 for one cycle on trigger release if the trigger is not at the top of a block
-
Fix MetaSound Array Random node shared state not applied when No Repeats is connected to a dynamic value that changes before the Next trigger is called
-
Fix losing namespace when select click renaming MetaSound graph members
-
Fix MetaSounds not playing within Sound Cues with certain Sound Cue quality settings
-
Fixed a bug where binaural sounds would ignore submix modulation when using an external spatializer (eg. Resonance).
-
Dynamic Submixes. Fix unregistering submix on disconnect and Fix debug command to correctly view graph
-
Fixed a crash when importing ADPCM audio files.
-
Fixed an issue where FAudioCapture objects were incorrectly being instantiated when sound was disabled.
-
MetaSounds: Clamp RandomGet node's NoRepeats value immediately instead of waiting until it's saved to the RandomGets map. This fixes an issue where Shared State wouldn't work if No Repeat value was being clamped since the comparison would always indicate it needs to be stomped.
-
Fixed a crash when undoing and redoing the creation of a Metasound Source on an Audio Track in Sequencer
Deprecated:
-
MetaSound FCreateOperatorParams; Use FBuilderOperatorParams instead
-
Delete deprecated usage of GetRuntimeFormat and CreateCompressedInfo which we deprecated in 5.2
-
Remove deprecated submix code that was deprecated in 5.2
Blueprint
New:
-
Add blueprint array sort functions for native types. Adds in-place sort functions. Supports options for stable sort and ascending/descending.
-
Improved Unreal Insights instrumentation for profiling blueprint loading compilation in the editor
-
PR #10237: Convenience IsInterfaceValid() blueprint node
-
Add custom styleset support for K2Nodes
-
Animation blueprint context menu construction time has been optimized - noticeable on large projects
-
Make ENetRole available to Blueprints PR #10411: Update EngineTypes.h - ENetRole to BlueprintType #contrib 10411
-
Added Blueprint util to test whether a given class implements a given interface
Bug Fix:
-
Deferred initialization on editor load when a non-native default subobject type override has a circular load dependency with the outer object's underlying non-native type.
- Preserve the outer package dirty state after reinstancing a Blueprint object containing one or more subobjects that are no longer load-compatible with the original's serialized data.
- Example: This can occur after reparenting into a new hierarchy with matching subobjects having incompatible/downcast types. In that case, if data was previously saved using the old type, it cannot be loaded against the new type without re-saving the outermost package to update its serialized instance data.
-
PR #11332: Blueprint MemberReference now also looks for DeprecatedProperty metadata
-
Fixed redundant delegate registrations on BPGC load/compile (regression).
-
Added a way to treat composite members as complete values when generating the custom property list for the Blueprint instance post-construct initialization fast path.
-
Fixed several bugs related to inheritance of subobject data inside blueprint default objects. This fixes several sources of data corruption, but there are still some known issues with trying to use arbitrary subobjects (other than ActorComponents) inside blueprints that use inheritance
-
Fix a bug where UBlueprintEditorLibrary::RemoveUnusedVariables would still remove variables even if they had events bound to them in the graph.
-
Fixing reinstancing issue with nested subobjects and transaction buffer not collecting all subobject info
- We now clean up constructed components when using the Actor replacement workflow.
Deprecated:
- Removed blueprint code and properties for systems like nativization that were first deprecated in 5.0
Blueprint Compiler
New:
-
Improved error message when a blueprint attempts to compile while other blueprints are compiling
-
Added Archetype reinstantiation sorting and compute the right template object for creation
-
Add interface to add tags to BlueprintGeneratedClasses so BlueprintGeneratedClass assets can effectively replace BP assets.
Bug Fix:
-
AnimGraphNode_AssetPlayerBase now properly preloads animation assets that are transitively included in its graph
-
Fixed crash when loading anim blueprint with split pins
-
Fix crash when loading blueprints during asynchronous level streaming while using Play in Editor
-
PR #10869: Fixed BP compilation with deprecated event dispatchers (multicast delegates)
-
Fixed crash after recompiling a blueprint class based on a native class that has SparseClassData
-
Update UFunction::SuperStruct values in skeleton classes when relinking them during compilation. This prevents them from going stale and referencing UFunctions in a TRASHCLASS
-
Avoid potential collisions with existing non-transient objects when creating transient event stub graph artifacts during Blueprint ubergraph compilation.
-
Fixed phantom compilation error when loading a blueprint after a parent blueprint has removed a function
-
Fixed a crash involving skeleton classes after compiling complicated blueprints
-
Ensure that default values are preloaded during class regeneration. Blueprint compilation expects all of its dependencies to be preloaded. Normally, RegenerateClass handles this, but we were still missing a few cases. If we don't correctly preload dependent exports, we can run into scenarios where postloading can occur prior to preloading. This typically occurs when we duplicate various objects during compilation. We can leverage FReferenceFinder to recursively find dependent exports on the class default object to preload. Note that this only covers native export dependencies. Preloading Blueprint-generated classes (and any instances of one) can get pretty thorny during this phase, so we intentionally skip those.
Deprecated:
- Deprecated and removed broken blueprint performance tracking code that has not worked in several versions, Unreal Insights should be used for profiling blueprint editor loading
Blueprint Editor
New:
-
It is now possible to modify Class Settings in the Blueprint editor's defaults-only (DOBP) mode.
-
Improved memory usage and performance of Find in Blueprint search data
-
Loading progress for blueprint function and macro libraries is now reported more accurately
-
Implement GetOptions for
UPARAM
and add it forByProfile
traces -
Macro Libraries that derive from UObject can now use functions that require a world context. The input pin for the WorldContext can be manually provided by the user by dragging the right reference and passing that into the Macro, but the Macro will also just automatically grab the world context from the caller if they have a valid world context. if they do not have a valid world context, then an error will be shown in the called at compile time.
-
Add an option to convert a comparison operator node to another comparison, like == to !=. Add the symbol to the user facing operator name for comparison operators for a nicer menu
-
Add support for units for blueprint variables (integers and floats)
Bug Fix:
-
Fix the comment bubble borders in blueprints.
-
Fixed a crash that occurs when you added a ComputeGraphComponent to a Character.
-
The blueprint editor's pin type selector has been optimized for large projects
-
Fixed an editor crash after editing Math Expression node titles while hovered over the content area.
-
Allow you to delete functions/variables in the "My Blueprint" window with backspace as well as the delete key. This makes it more consistent with the rest of the editor on all platforms
-
Fixed crash after renaming a component that was inherited from another blueprint
-
Fixed a regression that could prevent widgets from being destroyed after closing an editor window containing a graph panel.
-
Fixed up "development mode" for graph nodes to check more specifically for cook context.
-
Fixed a potential restricted mode editor crash in shipping builds.
-
PR #10747: Fix issue where graph pin hovered state becomes stuck after drag event #contrib 10747
-
Components that are placed in unexpected objects are now reported in the blueprint diff tool
-
Removed Blueprint asset sanitization from the save path to avoid invalidating harvested exports in a restricted editor mode, as well as alleviate BP compile/GC cost when multiple assets are involved.
-
Fixed superfluous warnings about new blueprints being "updated to fix issues detected on load."
-
Disable editing of the replication property in the BP details panel for Event Dispatchers. Event Dispatchers do not actually support replication.
-
Fix logic detecting blueprint subclasses in the diff panel, this re-enables logic to show differences in widget blueprints
-
Fix an incorrect tooltip on the Default Scene Root component in the subobject editor. It incorrectly said that "it cannot be copied", but it is perfectly valid to copy the scene root component and paste it somewhere else in the subobject hierarchy.
-
Fixed crash duplicating blueprint with sparse class data
-
PR #11097: Allow listener delegates to potentially mutate the managed set while iterating.
-
Fixed crash when diffing virtual revision
-
Find References: Finding references of a function call node will now do a quoted search by the function's native name rather than an unquoted search by node title. The new constructed search term makes finding function references more consistent, where it would previously fail on node titles that contain special characters or prefixes like Parent, Event.
-
Fix composite graphs not being displayed when diffing
-
Reduced some added string cost for Blueprint class assets (regression).
-
Guard against an unexpected NULL reference during explicit implemented interface removal in the Blueprint class editor.
-
Deferred validation of user-defined struct types in the pin type selector list until selection time for the member variable type widget in the user-defined struct asset editor.
-
Fixed the root cause of an assertion on Actor spawn that leads to an editor crash after undoing certain property changes that precede a Blueprint compile.
-
Fixed an editor crash that could result during propagation of a PostEditChange() event after modifying a nested struct member field on an archetype.
-
Fix GetSubsystem blueprint node to correctly handle when ShowWorldContextPin is set on a subsystem's parent class
-
Level/OFPA actor packages are no longer always being marked dirty after propagating subobject defaults in the Blueprint editor.
-
Fixed an editor crash when changing the title content on a math expression graph node.
-
Fixed the EditorUtilityWidget Blueprint asset definition to match what the Widget Blueprint asset definition does on open for edit.
-
Fixed an ensure when ctrl dragging a Vector Array pin from a blueprint function input
-
Fix ConformRemovedNativeComponents to handle components that have changed type, this prevents ConformRemovedNativeComponents from trying to destroy components that have been inherited from a native class, but some non-native class has overridden the type of the inherited component. In this case a child of that type would attempt to destroy its inherited component if it was trying to match the native parent that declared the component instead of the blueprint that overrode the component type.
-
Silenced warning when a subobject is forcibly deleted.
-
Do not show the "breakpoints" category in the right click context menu for K2Nodes if they cannot place a breakpoint. This prevents a useless empty category from being added.
-
Kick the async task queue while waiting to yield an in-progress Find-in-Blueprint global search to a GC pass on the main thread in order to avoid a potential deadlock scenario.
-
We now avoid unnecessary serialization of editor-only references at cook time when analyzing Blueprint assets for external imports.
-
PR #10335: Removed restrictions for call-in-editor Blutility functions
Blueprint Runtime
Bug Fix:
-
Optimized UUserDefinedStruct::InitializeStruct by avoiding redundant operations for STRUCT_IsPlainOldData instances
-
Fixed one cause of "Reachable garbage object" for blueprint subobjects
Gameplay
API Change:
-
UPlayerMappableInputConfig is now deprecated, you should instead use Player Mappable Key Settings on your Input Action and Input Mapping Context assets to provide the "name" of your key mapping. See Lyra for an example!
-
You can enable this check by setting EnhancedInput.Mappings.bCheckForEmptyKeyMappingsDuringValidation to true.
-
XInput 1.4 is available as a system library in Windows 10+ (the min spec for UE5), so we will now use that instead of using the older XInput 1.3 lib that is included with DirectX in the engine.
-
Use CreateDefaultSubObjects for GEComponents in the Constructor, configure them, then add them to GEComponents array. You may get ensures at runtime (with hints on how to fix) if something is wrong.
-
Added UAbilitySystemComponent::OnGameplayEffectInhibitionChangedDelegate.
-
Introduced FindAbilitySpecsFromGEHandle.
-
Introduced optional parameter to FindAbilitySpecFromHandle to handle pending adds/removes.
- Introduced some debug functionality that will attempt to catch these extremely hard to find cases where an FPredictionKey could be created and never acknowledged.
- Added console variables at the top of GameplayPrediction.h to help your upgrade path.
-
Deprecated GetSingleTagContainer on UGameplayTagsManager because it returns a raw pointer that could crash when called from multiple threads
-
Change your UGameplayEffectComponent::OnGameplayEffectChanged to use the non-const override.
-
If you have a type that inherits from CineCameraComponent and requires ticking, just set PrimaryComponentTick.bCanEverTick to true in the constructor.
- Improve comments on IsRunningDedicatedServer and similar functions to clearly indicate they are meant to be used for data loading and not gameplay purposes
New:
-
[GAS] Improving Gameplay Ability System Debuggers. Ability System Debug Commands have now been moved to a CheatManagerExtension. This allows multiple clients to use the debug commands and they will be applied to the correct client. Adding more comments and logging around why things can be rejected or work a certain way (e.g. AbilitySystem.Ability.Activate). GameplayCueManager now attempts to display the Gameplay Cues in non-overlapping fashion, so it's easier to see when multiple events occur for the same GameplayCue.
AbilitySystem debug commands are prefixed with AbilitySystem.Ability or AbilitySystem.Effect depending on if you're targeting Gameplay Abilities or Gameplay Effects.
-
[GAS] Improving VisLogging Capabilities of the Gameplay Ability System. Using the VisLog is now viable for figuring out complex interactions between Gameplay Abilities, Effects, and Attributes.
- [GAS] Improving the debug facilities. Use shift-' to bring it up for the local player.
- Gameplay Tags now show state differences between Client & Server
- Gameplay Effects now show state differences between Client & Server
- Attributes can now be debugged in the Gameplay Debugger (and show important replication state)
- Layout and color coding have been improved
-
Deprecate UPlayerMappableInputConfig in favor of the new UEnhancedInputUserSettings with 5.3.
-
AggregateGeom (more accessors); Adding ways to get a shape by the name and get the shape index by name. -- Code -- AggregateGeom: GetElementByName() - Goes through shape arrays and returns the first found element that has the passed in name. GetElementIndexByName() - Goes through the shape arrays and returns the first found index for the element that has the passed in name. GetElementByName() - Templated version to reduce shared code. GetElementIndexByName() - Templated version to reduce shared code.
-
[GAS] Exposing Gameplay Effect's GetAssetTags / GetGrantedTags to Blueprints
-
Add a cvar to check to enable checking for keys mapped to EKeys::Invalid, which will allow for some better content validation if desired.
-
Added a way to temporarily defer rebuilds of the GameplayTag tree managed by the GameplayTagsManager, along with a means for manually rebuilding the GameplayTag tree.
-
Update to XInput version 1.4. Instead of requiring the XInput 1.3 dll from DirectX, we can just add a system dependency and it'll work. 1.4 brings some small improvements and bug fixes and is the default that is shipped with Windows 10.
-
Add a flag on Default Mapping Contexts for Enhanced Input to register with the User Input settings by default.
-
[GAS] Adding more data in the Gameplay Ability Audit
-
Added new Blueprint functions for converting multidimensional array indices. Specifically, this adds conversion functions for 1D -> 2D, 1D -> 3D, 2D -> 1D, and 3D -> 1D indices. For example, in a 3x2 array, converting the 1D index 4 to a 2D dimensional index would yield (1,1). Tests were also added, which demonstrate usage and expected output. #virtualized
-
[GAS] PR #10717: Optional parameter to GameplayTagCountContainer::Reset allows a user to empty the container while keeping all of the registered tag count change callbacks.
-
[GAS] It is now easier to implement native GameplayEffects properly.
-
[GAS] PR #11505: Add on gameplay effect inhibition changed delegate #contrib 11505
-
[GAS] Gameplay Debugger now reconciles Server vs. Client state for Gameplay Effects, similar to how Tags and Attributes work.
-
Added a non-const getter to allow classes running in editor to modify the Actions list in GameFeatureData
-
SpeedMultiplier property on InterpToMovementComponent so the timing of its movement can be changed even after it has started its move.
-
[GAS] Made it clear that we currently do not support replication when using InstancedPerExecution GameplayAbilities.
-
Add the ability to bind lambda expressions to the Enhanced Input component outright. Also mark the delegate handles as protected instead of private so that users can more easily extend upon the Enhanced Input component and add more binding options to it if they want.
-
[GAS] Changed the friendly DisplayNames of the GameplayEffectComponents to make them easier to comprehend. Inspired by PR #11357.
-
Gameplay Ability System: Added a serialization operator<< implementation for FGameplayAbilitySpecHandle so users can invoke serialization on a FGameplayAbilitySpecHandle if needed. This allows FGameplayAbilitySpecHandle to be a member of structs that override NetSerialize().
-
Added a new Preload In Commandlets option to the 'Add Data Registry' Game Feature Action. When enabled, the specified data registries will be preloaded when running editor commandlets. Useful for commandlet automation of editor operations that rely on Preload In Editor (which does not itself cause preloading of data in Commandlets)
-
Add FBox Blueprint callable utility functions.
-
Adjusting Data Registry Register Asset Result changes to be more informative for how to upgrade to the new Engine version.
-
Target Selection Task: Added the ability to perform target traces using capsules and boxes in addition to the existing line and sphere traces.
-
[GAS] PR #10711: Create FGameplayTagCountContainer::GetExplicitTagCount.
-
Adds functionality to allow a character to stay based while jumping on a base, as long as the base is under the character.
-
Added a way to temporarily override how the GameplayTagsManager handles unloading of GameplayTags in response to removing INI search paths.
-
Added option to ProjectileMovementComponent to use scoped movement updates during simulation for cheaper movement/transform updates when processing multiple movements (sub-stepping or deflections). New flag: bSimulationUseScopedMovement (default false, as the delayed impact events could change behavior, use with care).
-
Gameplay Tag Manager: Adjusted the loop in "UGameplayTagsManager::StaticGetCategoriesMetaFromPropertyHandle" to break early if the outer base class of a child property and its parent are of a different type. This helps us avoid situations where a suboject's gameplay tag property may inherit meta categories from a different class it didn't expect and cause unintented restrictions on the child tag property.
-
Targeting System / Sort By Distance: Added option for more accurate distance calculation based off of nearest collision surface instead of actor location.
-
Add WaitGameplayTagChanged async tasks (ability and actor versions). This task allows reacting to all tag count changes as opposed to just Add and Remove.
-
Added a non-const getter to allow classes running in editor to modify the Actions list in GameFeatureData
-
[GAS] Instant and Periodic GameplayEffects now respect Modifier tag requirements
-
Added an option for ProjectileMovementComponent to avoid interpolation transform updates on some frames when an object isn't as relevant. Default version is based on not recently rendered but this can be extended.
-
Added new Input Modifier - Smooth Delta. It provides a normalized smoothed difference between the current and last input value, which options on how the value is calculated for different behavior. For boolean Input Values, it just returns the boolean as is.
-
[GAS] Gameplay Cue Unit Tests
-
Added a OnSubsystemInitialized callback to UDataRegistrySubsystem, notifying when all known data registries have been scanned and initialized.
-
Add an IsDebugCameraActive method to Cheat Manager
-
PR #9012: Ensure only plugins in the GameFeatures/ folder are considered as GameFeatures.
-
[GAS] PR #11483: Adding Debug support for GameplayAbilityTargetActor_Radius
-
Update
FilterArray
's result be auto-cast to the filter type -
[GAS] Added a first pass of Gameplay Ability System plug-in documentation markdown. Accepting PR's!
-
Update the comments on bIgnoreAllPressedKeysUntilRelease to be clear and provide some examples.
-
Optimize UGameplayTagsManager::GameplayTagsMatchDepth to remove excess allocations.
-
Allow cheat manager extensions to respond to adding/removing from cheat manager in native code.
-
Update the comments on the Enhanced Action Key Mapping and the Input Action asset to be very explict about the order of which modifiers are applied.
-
[GAS] Introduced UGameplayEffectComponent::OnGameplayEffectApplied which corrects the rules for applying stacked GameplayEffects. The rules are simpler for Applied, but the other functions (Executed, AddedToContainer) still exist due to the complex rules.
-
Added a new "Max Once Per Frame" parameter to TimerManager timers to allow opting out of "catch-up" behaviour where the timer callback will run as many times as would fit in the current frame delta. For example, a looping timer with interval 0.001s would run 9-10 times in a frame with delta 0.01s.
- Add GetOwnedGameplayTags and GetBlockedAbilityTags that return a const-ref to avoid allocating and copying
Bug Fix:
-
[GAS] Fixed an issue where AbilitiesGameplayEffectComponent could fail to grant and remove abilities if those abilities were granted/removed during the same scope lock (due to the PendingAdds/PendingRemoves).
-
Fix DataRegistry issue where an invalid table source would break the cache for other sources, and add extra validation for invalid sources
-
Gameplay Tags: The native method for resolving a gameplay tag, FGameplayTag::RequestGameplayTag(), now applies tag redirectors.
-
Fix for a crash when changing the class or a subobject marked as "Within" to a BP subclass instead.
-
Gameplay Ability System: AbilitySystemComponent will now correctly perform cleanup in DestroyActiveState after leaving, re-entering and leaving play again via level streaming (including world partition) and seamless travel.
-
Fixed GameFeaturePlugin config inis not applying config values to blueprint classes.
-
[GAS] Various FPredictionKey Fixes.
-
[GAS] Skip the check for unmapped references when receiving the replicated Server Initiated Gameplay Effects. This ensures the Gameplay Cues will always fire properly.
-
[GAS] Handle 0.0f and negative time input values on GameplayTask_WaitDelay as finishing on the next tick. inspired by #contrib 11079
-
UE-143412 - Using Collapse to Function inside of a thread safe graph does not mark the resulting function as thread safe Since the nodes in a threadsafe function are threadsafe, it follows that the collapsed graph is also threadsafe. Not doing so creates a clumsy workflow: the Blueprint will fail to compile until the user manually marks the collapsed function as threadsafe.
-
Fixed root motion replication to proxies when finishing root motion to ensure the replicated shadowed state is correct on the frame that root motion finishes.
-
[GAS] PR #7531: GAS stops search for PC only if valid PC is found
-
[GAS] Ability System Debug HUD now uses the correct source for CanActivateAbility.
-
Fixed issue where loading Gameplay Tag Containers before the tags were registered would cause non-exact matches to randomly fail
-
[GAS] Gameplay Effects could previously hold on to old GameplayTags (they were stored in deprecated variables)
-
[GAS] PR #10922: fix removing gameplay effect delegate handle
-
Common Conversation Plugin: Changing ExitTag generation when compiling conversation graph assets to use
AddTag
instead ofAddLeafTag
. Using the leaf version was causing issues for conversation graphs that used both a a child and a parent tag for two different exit points. The result was the parent tag exit point getting ignored and thus that exit point not counting as a dependency for the given conversation asset, which could butterfly effect into sync loads because the given graph is not pre-loaded properly when readying a conversation component. - Affected Conversation Graphs will need to be re-saved for the fix to take effect. -
[GAS] UGameplayEffectComponent::OnGameplayEffectChanged has been changed to non-const to allow the proper flow of updating its values on Post Blueprint Compilation.
-
[GAS] Ensured all FScopedServerAbilityRPCBatcher prediction keys generated in its batch are dependent.
-
[GAS] Gameplay Cue Notify Actors are now removed properly on Listen Server instances.
-
[GAS] FActiveGameplayEffect::GrantedAbilities was not handled property in copy/move constructor/operators.
-
[GAS] AbilitySystemComponent::NotifyAbilityEnded was marking Gameplay Abilities as Garbage, but they could still be used in later functions.
-
[GAS] PR #11117: Fixed typos and wrong parameter name in comments in the AbilitySystemComponent header file
-
Added scoped movement update for character mesh to avoid redundant movement of mesh children during multiple scoped moves within CharacterMovementComponent. Also cleaned up previous scoped update into it's own wrapper struct to make it easier to use and find uses of that versus other scoped moves.
-
Gameplay Tags: Fixed FGameplayTag and FGameplayTagContainer pin value modifications not being undoable/redoable. Now properly creates a transaction in Undo history. Additionally, the pin "Reset to Default Value" action now also creates an undoable transaction.
-
GitHub 11226 : Fix newline escaping in DEFINE_TARGETING_DATA_STORE A backslash shouldn't appear on the last line of a macro definition. The continuation of the newline can potentially yield compilation errors on some platforms. #contrib 11226
-
Fixed handling of character movement timestamp resets that arrive during ForcePositionUpdate, so they correctly trigger timestamp reset callbacks and sync the time correctly. Fixed APlayerController::TickActor() not resetting forced update state once good new moves had been received, it was waiting on the max timeout period first.
-
[GAS] PR #7661: Mark functions as virtual in AbilityTask_WaitTargetData.
-
UCharacterMovementComponent::RoundAcceleration() changed to match the same rounding and clamping that is used by replication of FVector_NetQuantize10.
-
[GAS] Removing a GameplayEffect that uninhibits while being removed would previously cause an ensure to happen. This is actually a valid use case.
-
[GAS] Fix TryActivateAbilitiesByTag crash due to iterating on pointers on a mutable (resizable) array of ActivatableAbilities.
-
[GAS] Fixes for GameplayCueNotify OnActive executed twice for Duration GEs on Standalone + ListenServer in Mixed/Minimal Replication Mode.
-
Avoiding potential double registration of static mesh proxies after moving an actor, this fixes one cause of "Assertion failed: !Primitive->SceneProxy"
-
[GAS] GameplayEffect's GrantedAbilities were not auto-upgrading properly. Removing GrantedAbilities in a child GE would previously not be respected upon upgrading.
-
[GAS] Fix for newly created Gameplay Effects not getting their proper version number set to latest (and therefore not working correctly until an Editor restart).
-
Character movement should attempt to base on cluster unions - not the underlying geometry collection.
-
Gameplay Abilities System: Fixed a client-side crash when an Attribute Set is removed server-side prior to or at the same time as a Gameplay Effect is removed that modifies an attribute from that set.
-
[GAS] Moving the GameplayEffects logs from LogAbilitySystem to LogGameplayEffect. Enhancing the locations of the logs to provide better context to what is happening.
-
[GAS] Fixing a regression where Gameplay Cues may receive two OnActive calls when executed by a non-instant Gameplay Effect.
-
[GAS] Fixed AbilitySystemGlobals resetting the FActiveGameplayEffect Handle Cache too early (during a map change).
-
UE-203565 - OnBrowseSocket BP Menu failing to open when the SubobjectEditor list is docked to the side panel or closed. When a window is docked in the Blueprint editor, it gets added to the STabSidebar, which is created by the toolkit host. If we use the current SSubobjectEditor as the widget path, we won't actually find a window, because it now lives under the STabSidebar. As a result, the drop down menu for mesh sockets would fail to open. The easiest fix is to simply use the toolkit host's parent widget, which finds the correct widget path in the docked and undocked cases.
-
Gameplay Abilities System: Fixed a client-side crash that happened when showing a GameplayAttribute debug view with the console command AbilitySystem.DebugAttribute
when the server has applied runtime constructed GameplayEffects, due to those being replicated with null Spec.Defs. -
Fixing a non-deterministic replay crash caused by level streaming not always completing during replay playback by the same frame it completed when recording the replay. This could result in dropping dependent packets or delivering them out of order in a way that the client isn't expecting to handle. Created a new cvar demo.DoNotDropPackets which will prefer to pause the playback until the prerequisites are satisfied. Gating behind a cvar to ensure backward compatibility and because dropping packets is required to ensure consistent framerate (at the cost of further reducing determinism).
-
Fixed a performance regression of USceneComponent::GetChildComponent() from unnecessary implicit TObjectPtr conversion.
-
Added an explanatory message to !IsUnreachable() assertion failure in UObject::ProcessEvent().
-
Fixed CineCameraComponent registering for tick in builds where it won't do anything useful.
-
Data Driven CVars now show their tooltip as hint text in the in-game console when suggested by auto-complete.
-
Do not attempt to load the project default IMC assets on the CDO of UEnhancedPlayerInput. Doing so will result in any subobjects of the IMC (triggers, modifiers, player mappable key settings) being null at the time of loading if they are outside the Enhanced Input module. We can't guarantee that the load order of these modules such that they would be available before the EI module is being loaded, so we can just skip them here.
-
Making sure FGameplayTag meta properties of Categories and GameplayTagFilter are interchangeable and case insensitive
-
ChildActorComponent no longer holds onto its ChildActor if it has already been destroyed - this prevents a 'reachable garbage object' warning related to ChildActor objects.
-
Gameplay Ability Montage / Bug Fix: Fixed montages not replicating what section to play on simulated clients when the AbilitySystemComponent is set to only replicate the current montage section instead of the percise montage position. The current montage section would only be replicated when jumping to a section, and not when naturally transitioning from one section to the next. This has been fixed by ensuring SectionIdToPlay is updated in AnimMontage_UpdateReplicatedData. NextSectionID is now also utilized when only replicating section to improve the transition between sections.
-
[GAS] Allow Gameplay Abilities to use Blueprintable Replicated Variables.
-
Fix a bug where the "OnForceFeedbackFinished" on Force Feedback component would never be called.
-
Fixed cases where mid-tick changes in movement mode could continue movement with the old mode's Phys** function in a customized CharacterMovementComponent
-
UE-203280 - Blueprints from UE4 with dangling delegate reroute node crashes on UE5 load GetLinkedDelegateSignature has a fairly aggressive assert. It's entirely possible that a knot (reroute) node doesn't have an output linked. In those cases, we can safely break out of the loop, since there won't be a linked delegate signature.
-
Fix an error error when overriding vector axis key bindings on an input component.
-
Shorten GFP plugin identifier to just be the leaf file name. This avoids issues with non-normalized paths.
-
Fix crash when trying to delete an in-use DataRegistry source in the editor
-
Prevent a crash on the player controller when attempting to restart the player if the game mode was null. So far the only known case of this happening is if you delete everything from an active PIE session and then attempt to respawn the pawn. Now instead of crashing, we wil log that it is happening and early exit.
-
Fixed issue in CharacterMovementComponent where a delayed movement adjustment would have the adjusted movement mode overwritten with the current mode, sometimes resulting in a mismatch and further corrections
-
Fixed issue where a character could intend to stay vertical (aligned with gravity) but unable to change pitch or roll to get there.
-
[GAS] Properly dirtying the ActiveGampelayEffects array when granting a new Gameplay Ability Spec Handle.
-
UE-194830 - The Blueprint compiler is not consistent with UHT when generating DefaultToInstanced variables Object properties that reference a DefaultToInstanced class also need to set the "EditInline" metadata to true. Otherwise, this property can't be instanced in the editor. This mimics UHT's behavior for UhtObjectProperty.
-
Fixed a few different crashes that were a result of a replicated LevelSequenceActor being recreated on client, but using a SequencePlayer from a previous, destroyed copy of that actor that hadn't been garbage-collected yet.
-
[GAS] Ensure that UAbilitySystemGlobals::InitGlobalData is called if the Ability System is in use. Previously if the user did not call it, GAS did not function correctly.
-
Gameplay Ability System: Fixed a crash that happened when a GameplayAbility destroys its owning actor on ability activation, due to actor destruction attempting to clear the ability list while in an ABILITY_SCOPE_LOCK. Calling ClearingAllAbilities() while in a scope lock will now defer the action until the end of the scope. Abilities are now allowed to destroy their owning actor on ability activation.
-
Gameplay Ability System: Fixed a crash that happened when an AbilitySystemComponent has pending TimerManager callbacks from GameplayEffects with durations when it's unloaded as part of a sublevel. ASC now correctly clears pending TimerManager callbacks on removal from world.
-
Fix route gamepad to second window. Gamepad input was never being routed to the next viewport client during a PIE session with multiple viewports.
-
Make the Enhanced Input BP node module PreDefault instead of Default. This fixes a bug where enhanced input nodes would sometimes not be loaded in template C++ projects.
-
[GAS] Ensured FPredictionKeys only attempt to "catch-up" if they were locally generated.
-
Fixed it so actors that are spawned during world initialization will not call PostRegisterAllComponents (and related functions) twice. s.OptimizeActorRegistration can be used to restore the old behavior or add additional error logging
-
Optimize TQuat
::Slerp_NotNormalized(). Removes 1 branch, based on negative angle identity for Sine function. Added startup tests to validate old versus new function and also test both versions for both positive and negative 'RawCosom' values (not previously tested). -
Fix GameFeatureAction_AddAttributeDefaults not cleaning up references to objects when unregistered
-
[GAS] Fixing up a case where OnRemoveAbility would not EndAbility on a non-instanced Ability that was still Active.
-
[GAS] PR #10474: Update
GetAbilitySystemComponent
to default parameter to Self -
Fixed inconsistent tooltip for Blueprint config variables. GetConfigName doesn't always return the base name of an .ini file, which is what we want. For example, if the class uses DefaultEngine.ini for its config values, GetConfigName will return the base name, "Engine". However, if the class uses DefaultEditor.ini, GetConfigName returns the path to the merged .ini file that's located under the game's "Saved/Config" directory. Since ClassConfigName corresponds to the base name of a config file, we can just use that for the tooltip.
-
[GAS] PR #11119: GameplayEffect ApplicationRequirements Upgrade Fix
-
Expand the use of UProperty's ForceRebuildProperty to include properties inside nested properties such as UStructs.
-
Add location to HitResults from Targeting Selection Task AOE
-
Fixed issue where transient DataRegistry data sources were not being correctly removed from the RuntimeChildren array when a registry was Deinitialized
-
[GAS] PR #6354 : Fix ability montages stopping abruptly on simulated proxy
-
[GAS] PR #10990: GAS Montage Section Crash Fix
-
[GAS] When using ForceReplication on the AbilitySystemComponent, also call ForceReplication if using a ReplicationProxy Actor to ensure the prompt delivery of GameplayCues and GameplayTags.
-
[GAS] PR #8063: FGameplayEffectContextHandle : Check is data valid before retrieve "Actors"
-
Fixed for GameplayAbilities not always being removed from the ReplicatedSubObjectsList prior to being marked as garbage
-
[GAS] PR #7542 : Retain rotation for GAS Target Data LocationInfo
Deprecated:
-
[GAS] Cleaning up some misconceptions (and bugs) about dependent FPredictionKeys inside the Ability System. We no longer replicate FPredictionKey::Base because it's never used. Inspired by #contrib 11151
-
The FPlatformNamedChunkInstallDelegate has been deprecated in favor of the more extendable FPlatformNamedChunkCompleteDelegate.
-
[GAS] InhibitActiveGameplayEffect was reusing an ActiveGE which could have been invalidated. Deprecating that function in favor of SetActiveGameplayEffectInhibit to make it clear to users this can happen.
Mass
API Change:
- Where before INDEX_NONE was previously used to denote an 'invalid' StaticMeshDescIndex (e.g in FMassRepresentationFragment), we now use FStaticMeshInstanceVisualizationDescHandle::InvalidIndex to denote invalid Mass static mesh instance visualizations.
- FStaticMeshInstanceVisualizationDescHandle itself does have special case handling to internally convert INDEX_NONE to the new InvalidIndex value on construction, which should catch most cases automatically, however it's recommended for any comparisons of StaticMeshDescIndex against INDEX_NONE to be explicitly converted to the new InvalidIndex value. To ensure comparisons aren't silently mismatching against the old INDEX_NONE, StaticMeshDescIndex has been renamed to StaticMeshDescHandle in FMassRepresentationFragment to force the breaking change.
New:
-
MassAI - Added gdt.mass.ToggleDebugLocalEntityManager console command to toggle between local / remote entity manager debugging in the Mass gameplay debugger category. Useful if your game is overriding the default shortcut (Shift + L).
-
Made UMassActorSpawnerSubsystem::ReleaseActorToPool a virtual method to allow subclasses to customize actor pooling behavior.
-
PR #9620: Fix typo in MassEntityZoneGraphSpawnPointsGenerator.h
-
Added support for all owned queries for processors inheriting from UMassSignalProcessorBase
-
Added GetNumMatchingEntities overload to FMassEntityQuery for calculating the number of matching entities in an FMassArchetypeEntityCollection array.
-
Added mass.debug.Representation CVar similar to mass.debug.RepresentationLOD to debug draw representation states for entities. Also added the ability to set both mass.debug.Representation and mass.debug.RepresentationLOD to 2 to VisLog states instead, or 3 for both VisLog and debug draw.
-
Added UPROPERTY markup to various fragment struct members for text export. This allows them to appear in the Mass category of the AI gameplay debugger when inspecting fragment values on a debugged entity.
-
PR #9351: Fix typo in MassVisualizationComponent.cpp error message
-
Mass Visualization - Switched signed int16 StaticMeshDescIndex handles to new explicitly typed FStaticMeshInstanceVisualizationDescHandle which uses unsigned uint16 internally, to double the number of possible ISMC visualization registrations.
-
Added mass.debug.Representation.MaxSignificance and mass.debug.RepresentationLOD.MaxSignificance CVars to limit debug drawing for performance and readability with large agent counts.
-
Added const and non-const shared fragment accessor methods to FMassEntityManager.
-
Replaced FMassTagBitSet with FMassArchetypeCompositionDescriptor in the MassExecutionContext. This follows the addition of DoesArchetypeHaveFragment which originally used the fragment view, making the lookup more expensive than it needed to be. This change gives access to the full bitsets used by an archetype to provide a more efficient lookup as well as room to expand in the future for other types of fragments.
-
MassVisualizer actors are no longer visible in the outliner so user can't delete them.
-
PR #9326: Fix typos in comment in MassAgentComponent.h
Bug Fix:
-
Updated some processors that shouldn't run in Editor
-
Fragment data is now always applied before notifying observers when adding new fragments instances
-
PR #10931: Fix MassRepresentationAccessMode Made an additional fix to another query detected by checkSlow #contrib 10931
-
Fix false positive error log for reaching the loop maximum when flushing Mass command buffers.
-
MassRepresentation processor dependency ordering fixes: Added UE::Mass::ProcessorGroupNames::LOD to ExecuteAfter dependencies for UMassRepresentationProcessor by default, to ensure LOD computation occurs before MassRepresentationProcessor tries to enact the requested LOD's representation changes. Also put UMassStationaryISMSwitcherProcessor.cpp in the Representation processor group, still keeping it's explicit ExecuteAfter of UMassVisualizationProcessor within the group.
Networking
API Change:
- When running with Iris enabled, the following CSV stats will no longer output a value (previously would just output 0):
- GatherPrioritizeTimeMS, NumOpenChannels, NumSkippedObjectEmptyUpdates, NumTickingChannels, ReplicateActorTimeMS, SharedSerializationPropertyHit, SharedSerializationPropertyMiss, SharedSerializationRPCHit, SharedSerializationRPCMiss
-
Changed UNetDriver::ERemoteFunctionSendPolicy from an enum to an enum class so you may have to fully scope it if you were using it in your code.
- When running with Iris enabled, the CSV files will now include metrics for:
- ReplicationBridge_PreUpdate, ReplicationBridge_PollAndCopy, ReplicationSystem_UpdatePrioritization
New:
-
Iris - Added filter inclusion group feature. Filter inclusion groups are processed after dynamic filtering, filters implemented via UNetObjectFilter implementations, and their only purpose is to optionally enable replication of objects that were filtered out. This allows for example an object to be spatially filtered out but then enabled by a team or view target group for example. No such groups are implemented by default, it's up to the user to implement the relevant game logic to create, update and destroy such groups. Only root objects may be added to filter inclusion groups, subobjects will be filtered like the root object.
-
Add some replication testing utilities & a test case for renaming dynamic actors on servers. UE::Net::FTestWorldInstance and and UE::Net::FTestWorlds enable writing synchronous test cases within the scope of one function that create full UWorlds and utilize the whole networking & replication path. Useful for testing features that rely on worlds, actors, streaming levels, etc. The worlds created are PIE worlds and they currently only work in the editor.
-
Added console command to set nettrace verbosity at runtime - NetTrace.SetTraceVerbosity [verbositylevel]
-
Added log in NetDriver initialization telling what replication mode its set to.
-
Deprecated FFastArraySerializer::FPostReplicatedReceiveParameters::bHasMoreUnmappedReferences as its behavior is inconsistent and code should not rely on it.
-
Added cvar net.SerializeNewActorOverrideLevel to optionally bring back the functionality of not serializing a replicated, spawned actor's level, which will cause it to spawn in the persistent level on clients, regardless of its level on the server.
-
Iris - Implemented support for Apply in FNetSerializer. If implemented it will be called when pushing received state to the target state. FRepMovementNetSerializer makes use of the new functionality to avoid overwriting quantization levels.
-
Iris - Add concept of Ordered RPCs. Unicast RPCs are now ordered with respect to reliable RPCs and other unicast RPCs targeting the same actor. From client to server all reliable and unicast RPCs are ordered with respect to eachother, regardless of target actor.
-
NetDriver * Added exclusive csv cpu scope to FlushNet call to track time spent inside NetworkHandlerComponent (compression, encryption, socket send, etc.)
-
Net.DebugDraw 1 now showing NetGUIDs
- Added some optional handling of replicated actor outer changes on servers.
- Only supports dynamically spawned actors, not placed actors
- ReplicationGraph support added and toggled with the cvar Net.RepGraph.HandleDynamicActorRename
- Cvar net.CleanUpRenamedDynamicActors will tell clients to destroy an actor if the server moves it to a level that's not currently visible on the client (disabled by default to preserve current behavior)
-
Stripping non-iris CSV net metrics when running Iris NetDrivers. Previously all these were set to 0 and output every frame, so this should reduce raw csv size quite a bit. You can now also define these in BaseEngine.ini
-
Iris - EndReplication now handles ending replication for objects marked as garbage. - Fixed ensure when executing DestructionInfos for objects with SubObjects
-
Added optional cvar net.ClientIncomingBunchFrameTimeLimitMS to amortize incoming network processing over multiple frames, as an option to trade off some latency for frame time. Disabled by default.
-
NetDriver: Added engine crash context "ReplicationDriver" * Set to Generic, Iris or the class name of the replication driver
-
Iris: Added ability to prefer a Replication System via the GameMode class. When a game mode selects a specific replication system, the server will create its GameNetDriver using that mode if compatible. Note that the clients are NOT able to ask the game mode for the proper repsystem, so use this only when you can correctly predict the proper mode before connecting on the server. Otherwise the clients may disconnect due to incompatible netdrivers. PIE clients started inside a single process will use the correct repsystem of the dedicated server. Setting -UseIrisReplication=0/1 on the cmdline will override the GameMode's requested system.
-
Changed UNetDriver::ERemoteFunctionSendPolicy from an enum to an enum class
-
Iris: The GameInstance can now request a replication system via GetDesiredReplicationSystem
-
Network: Improved handling of ack history overruns which will no longer cause false negatives, if we overshoot ackhistorybuffer client will now flush the sequence history before accepting new data packets.
- NetDriver:
- Added tracking stats to NetConnection that track number of rpcs delayed by unmapped guids and how many frames they were delayed by.
- Added tracking stats to NetDriver that track number of reliable bunches.
- Added console cheats to force only unreliable RPCs to be dropped. This can be used to better simulate a scenario where specific unreliable RPCs get dropped and not resent but not the adjacent property data sampled the same frame. Useful to test gameplay code using unreliable RPCs.
- NetEmulation.DropAnyUnreliable : drops a % of all unreliables sent
- NetEmulation.DropUnreliableOfActorClass: drops a % of all unreliables sent by a specific class
- NetEmulation.DropUnreliableOfSubObjectClass: drops a % of all unreliables sent by a specific class
- NetEmulation.DropUnreliableRPC: drops a % of all unreliables of the passed function name.
- NetEmulation.DropNothing: stops dropping unreliable rpcs
-
Adding CSV stats for Iris PreUpdate, Polling and Prioritization
-
NetDriver: Now collecting the amount of packets sent & received by each connection each frame. Outputting in csv profiler the average and max per-connection packets received and sent every frame. Added net.ForceOnePacketPerBunch cheat to force every packet to contain a single bunch. This can be used to debug rare ordering issues when two actors are dependant but should not.
-
Added logging of actor & property name for more cases of replication serialization errors.
-
Increased the reliable buffer for replicated bunches to 512.
-
Added LogNetTraffic error that tells which RPC failed to send when the reliable buffer overflows.
-
Iris: Added support for sending attachments flagged as SendImmediate from PostDispatchTick
- Added ValidateActorReferences to RepGraph and RepGraphNode types * Iterates over all nodes in the RepGraph and checks for potentially stale actor references
Bug Fix:
-
DemoRecording: Fix CanSkipUpdate when demorecording is enabled alongside an Iris netdriver PushModel is not enabled to generic NetDrivers when Iris is enabled in another net driver.
-
Fixed issue where some exports was not properly exported with recorded demo frame if exported by checkpoint causing bunch errors due to not all must be mapped exports being registered.
-
Add P_GET_WEAKOBJECT_NO_PTR and P_GET_WEAKOBJECT_REF_NO_PTR script macros to avoid issues with repnotify functions for TWeakObjectPtrs that pass in the old value.
-
Fix crash with GameplayDebuggerCategoryReplicator when its held by ReplicationGraph. Setting it bReplicateToOwner should only have been done when Iris is actually running.
-
Iris - Fixed issue where object could get stuck in state waitforcreateconfirmation, if cancelling creation, and then cancelling destroy.
-
Networking: Replicated components added in the ConstructionScript of a blueprint class will now be considered netaddressable and properly mapped on the client instead of instantiated twice. * Now ensuring when we start replicating a dynamic UserConstructionScript component that is built from an archetype different from the class CDO. The client version of such components were always initialized using the class CDO and probably initialized wrong.
-
Iris: Fixed disconnect issue on clients due to server sending more data to not yet acked hugeobjects.
-
PushModel: Fix RemoteRole not synced correctly when push model is enabled * Calling ForceCompare() will now force push model properties to be evaluated even if they are not flagged dirty.
-
Fixed an issue where replicated actors may not replicate correctly if they're dormant and have dormancy flushed while a client doesn't have the actor's level loaded. Controlled by cvar net.FlushDormancyUseDefaultStateForUnloadedLevels.
-
Iris: Keep reliability as is when splitting a NetBlob. Split unreliable multicast RPCs will now also keep their normal execution order.
-
Fix actor component created post-beginplay that were getting added to the replicated subobject list despite IsReplicated being false
-
Fixed an issue where replicated object pointers to subobjects that are net-addressable/stably-named may not replicate or map properly. Controlled by cvar net.RemapStableSubobjects.
-
ChildActorComponent: Fix simulated actors using the wrong template to spawn the actor if the CAC template instance is of the wrong type.
-
Fixed replication of object references in UNetworkPhysicsComponent's rewind data.
-
Iris: Properly manage partially resolved refererences to only include them in applied state when they are resolved.
-
Fixed shutdown crash in FNetGuidCache and FObjectReferenceCache
-
Fixed a bug in Replication Graph where an actor having its dormancy state set to awake may have been treated as always net relevant unintentionally.
-
Iris: Fixed issue where subobjects of objects pending dormant all would not always be polled as they should
-
Network insights: Fixed aggregate display in PacketView
-
Iris: Fixed BitStream corruptions due to sending unexpected data to not yet confirmed objects - Fixed issue where PendingFlush would not properly flush attachments if posted on the same frame as the object was destroyed if it was waiting for creation confirmation.
-
Iris: Fixed ensure when client destroys actor marked as bNetTemporary.
-
ReplicationGraph: Ensure when an actor is replicated with bNetTemporary set
-
NetDriver: Fix for Push Model may prevent actors from going dormant * Now testing changelist history in CanSkipUpdate
-
Iris: Fix issue where state changes accrued while going out of scope and later readded to scope was not dirtied correctly
-
Fixed an issue in Replication Graph when Net.RepGraph.DormantDynamicActorsDestruction is enabled where dormant actors may fail to replicate correctly if they have dormancy flushed while a client is outside of their network relevancy range.
-
Iris: Added code to trap cases where we call EndReplication from client code where it shouldnt be called - Fixed issue with client calling EndReplication on components when it should not.
-
SubObject Replication: Make sure new subobject bunches are always reliable even if the subobject created an object replicator earlier than expected. PR #9850: Fixed an issue where Object requested an unreliable RPC before the ObjectReplicator was sent for the first time
-
Iris: Fixed floating point precistoin bug with really high priorities which caused issues with scheduling of dependent objects
-
Fixed a bug in network replays/the DemoNetDriver where if a recording time limit was set via the SetMaxDesiredRecordTimeMS function, some actor destruction wouldn't be properly recorded in the replay.
-
Fixed issue where FNetBitArray::FindLastZero would return index out of bounds for array sizes not aligned with the size of the storage.
-
Fixed an issue where replicated fast arrays in replicated subobjects may get redundant change notifications when flushing dormancy. Controlled by cvars net.EnableFlushDormantSubObjects and net.EnableFlushDormantSubObjectsCheckConditions.
-
Iris - Added explicit configuration of splitsizes for unreliable attachments from server and client - Fix issue with old moves being delivered from client if split and packet dropped.
-
Fix an issue in multiplayer PIE where some actors in world partition levels wouldn't replicate properly.
-
Iris: Changed Iris FastArraySerializer implementation to not rely on ItemMap when issueing FastArraySerialzierCallbacks as the itemmap was reset from callbacks
-
Ensure that DormantConnections and RecentlyDormantConnections are cleared for seamlessly travelling Actors, to prevent issues with replicating dormant actors that were persisted through a seamless travel
-
Iris: Fixed issue with posting rpcs to out of scope subobjects being scheduled with internal index and transmitted with invalid object.
Content Samples
New:
-
Archvis template has an updated GPU Lightmass map
-
Archvis SunSky Reverted Indirect lighting intensity setting from 2 to default 1
Level Design and Art Tools
Bug Fix:
-
Fixed an issue with the mesh painting tools loosing its texture override on an material intstance when an static permutation is enbabled.
-
Fix Pilot Actor not creating a transaction.
Geometry Core
New:
-
Updated TQuaternion::EpsilonEqual to recognize that the negative of a quaternion is also equal, and added an IsIdentity() method.
-
FDynamicMesh: add a CanCollapseEdge function to check if an edge collapse might fail before actually trying it
-
Exposed a new property bIsEditable on UDynamicMeshComponent to allow them to block any modifications done through EditMesh/SetMesh. Additionally, when this flag is set to false, the UDynamicMeshToolTarget is blocked from being created for the dynamic mesh component so modeling tools can't edit the mesh either.
-
The Convex Decomposition merge algorithm now supports callbacks to optionally track or prevent merges, allowing the algorithm to be used with more fine-grained control, and in new contexts.
-
Added a new polygon-based simplification method to ConvexHull3, and a tolerance for the initial hull build, to support use cases where we do not need an exact hull and can prioritize using fewer plane + avoiding near-degenerate planes in the output. This simplification is especially effective for cases where a large number of near-coplanar faces would exist in the exact-hull output.
-
Added cbrt (cube root) function to mathutil
-
Added support for inverting Transform Sequences, appending inverses of transforms to Transform Sequences, and for testing if a TTransformSRT3 can represent its own inverse (to help efficiently represent Transform Sequence inverses)
-
Added a static helper to the convex hull class to compute the convex hull volume for an array of points
-
Added a normal-based clustering algorithm, which groups connected triangle groups based on the current average normal of the group.
Bug Fix:
-
Fixed an issue where the convex decomposition proximity graph could be incorrectly generated, leading to suboptimal results.
-
Improved robustness of the edge bevel operation
-
Fixed a race condition in the sparse dynamic point octree sampling method, which could cause a crash in the ComputePoissonSampling method
-
Fixed Polygon2::Simplify's handling of case when initial close-point-removal reduces polygon to two points
-
Fixed crash in convex hull generation when tolerance-based point discarding is enabled.
-
Fixed a bug where polygon offsetting could crash or use excessive points when the output is an ellipse.
-
Fixed an issue where the mesh simplification and remeshing code could skip considering some edges for simplification/remeshing.
-
Fixed an issue where the convex decomposition algorithm could fail to respect requested negative space in some cases
-
Added the option to StaticMeshOperations::TransformMesh to correctly transform the normals and tangents. Default to the current behavior, which instead matches UE renderer. Add comments explaining both paths.
-
Made the MergeCoincidentMeshEdges operation not ensure on inputs with near-zero bounding box size
-
Improved robustness of the FGeomTools2D::TriangulatePoly method, making it more likely to successfully create a triangulation
Deprecated:
- Removed the deprecated FTransformSRT3's Inverse and legacy ExactPredicates methods from GeometryCore
Geometry Script
New:
-
Added a geometry script function to transform simple collision shapes.
-
Updated the display names of Geometry Script methods for setting per vertex normals, to clarify which computes new normals and which copies them from an input list.
-
Added a 3D polygon triangulation Geometry Script method, using ear clipping.
-
New DynamicMeshComponents now default to using externally-provided tangents, and have UI-exposed settings to change how their tangents are determined.
-
Geometry Script's CopyMeshFromComponent method can now optionally read instance colors from Static Mesh RenderData LODs.
-
Added a new method for Geometry Script to approximate convex hulls with spheres or boxes, if the shape is similar enough.
-
Added new geometry script functions to copy and transfer simple collision shapes from dynamic and static mesh components
-
Added additional spline->polypath conversion functions to support converting subsections of splines within a specified time or distance range, and to also get distance values associated with each point.
-
Added support for Geometry Script to convert Geometry Collections to Dynamic Meshes, via the CopyMeshFromComponent method
-
Added new point set functions to Geometry Script, including methods for for k-means clustering, computing bounding boxes, and converting between arrays of transforms vs arrays of points
-
Added a level set option to the geometry script 'Collision From Mesh' method
-
Added Geometry Script methods for directly manipulating sphere coverings, which can be used to control convex decomposition and convex hull merging algorithms.
-
Added a MergeSimpleCollisionShapes function to Geometry Script, which can reduce the number of simple collision shapes by merging them. This works via convex hull merging, so merged shapes will always be convex hulls, but shapes that are not merged will be left with their original type.
-
Added an 'AppendSimpleCollisionShapes' Geometry Script function, which constructs mesh representations of simple collision shapes
-
Added new properties to control the sample range for the Geometry Script spline->polypath and spline->transform array functions
-
Added support for a min thickness parameter in Geometry Script collision shape merging
-
Dynamic Mesh Component's complex collision mesh now supports physics materials
-
Added convex hull simplification to the geometry script collision functions
-
Added support for generating and visualizing sets of spheres that define important negative space around a shape, and for generating collision shapes which do not overlap those spheres.
-
Geometry Script methods to set collision on static mesh can now control whether the static mesh collision is marked as customized. This is useful for example to distinguish manually-modified collision from collision that was set by Geometry Script as part of an import pipeline.
-
Dynamic Mesh Component can now show collision in the editor view
-
We now optionally allow empty results for Geometry Script mesh Boolean operations
-
Added a Geometry Script function to combine simple collision shapes, by adding the shapes from the second to the first.
-
Added more point set functions for Geometry Script: 1. OffsetTransforms to offset the location of all transforms in an array, e.g. to move them all along their local Z if you want to move mesh samples along their normal 2. DownsamplePoints to downsample points to a fixed number of samples, optionally with priority weighting and approximate uniform spacing
-
Added a DetermineMeshOcclusion method to detect mesh instances that are fully occluded in a scene.
-
Added a method to remove unused vertices from a dynamic mesh
Bug Fix:
- Fixed a crash on appending to an empty polygon list
- Made the polygon path offset functions properly update their success flag output, and respect the 'copy input on failure' setting.
-
Made Geometry Script's methods to copy from/to static mesh properly respect the static mesh build scale.
-
Fix geometry script's ray plane intersection function
-
Made USplineComponent's public, recursive spline sampling functions work correctly for arbitrary curve ranges; previously they only sampled the spline accurately for short ranges (half a spline segment).
-
Guarded against the runtime StaticMesh -> DynamicMesh conversion functions crashing when CPU access to render data is not available; they should now instead ensure with a message explaining that CPU access is required
- The Geometry Script 'Recompute Normals' method now logs a warning if it is called on a mesh with no attributes or no overlay normals, and defaults to a per-vertex overlay in that case.
Modeling Tools
New:
-
Made the modeling mode physics inspector automatically update its visualization when collisions are updated by external actions
-
Selectable mesh elements are now highlighted when Mesh Element Selection is enabled.
-
Added Bridge action to TriEdit.
-
Level Sets can now be more accurately visualized by the modeling tools, using their surface instead of a grid of cubes.
-
Changed: Changed Tool Presets flyout dialog in the New Preset window to use a list presentation instead of a tile presentation, allowing for more clarity in reading names on long preset collection labels.
-
Added the option for the Mesh Inspector to draw edges without depth testing, so it is easier to see all the holes or other potential issues in a mesh
- BakeVertex improvements to per channel bakes
- BakeVertex per channel bakes will now only write over the specified channels.
- BakeVertex can now specify One/Zero evaluators for per channel bakes to flood a channel with the respective value.
-
Added an offset parameter to the Spline Tool, to support drawing splines that are not directly on the clicked surfaces
-
Added support for deleting polygroup edges.
-
Added collision shape merging to the 'mesh to collision' tool
-
Made the Mesh to Collision tool support its Min Thickness option for more collision shape types, and disable the option when it is not supported.
-
Added new space protection settings to the Mesh to Collision tool's convex decomposition method.
-
Added an 'At Origin' option for the desired Target Position in the Add Primitive Tool
-
Add a method for IModelingModeToolExtensions to provide tool target factories so that plugins can extend the interface with new ToolTargets.
-
The Mesh to Collision and Inspect Collision tools can now optionally show solid renderings of the collision shapes, in addition to wireframes.
-
Remesher: add an optional edge length scale function that can be used for adaptive-density remeshing
-
Made the Convert tool support a larger range of scene component sources, including Geometry Collection.
-
PDI thick line rendering now uses fewer triangles per line and is faster, improving responsiveness of preview wireframe rendering for some tools
-
Made modeling mode tools that do not affect selection auto-restore the previous selection after use.
-
Add support for copying simple collision shapes in more tools, including Merge, Boolean, and some Voxel tools.
-
Scene snapping now works in the DrawPolygonTool when the mouse is not hovering over the tool plane. This allows the user to be positioned between the tool plane and the objects being snapped to in the scene.
-
Adds 'Local Frame Mode' toggle in the Mesh Element Selection Toolbar Settings so users can edit with the gizmo frame based either on the selected geometry only or on the entire object
- The ScriptableTools plug-in is now moved from Experimental to Beta.
Bug Fix:
-
Fixed confusing comment leaking into editor tooltips for Y axis of FVector/FVector4/FQuat properties
-
Fixed undo for the AutoLOD tool when modifying an existing static mesh.
-
Improved Mesh to Collision tool capsule auto-detection, to prevent cones and cylinders-with-open-ends from being detected as capsules
-
Changed the hotkey for 'Lock Rotation' from 'Q' to 'Ctrl+R' in Polygroup Edit, allowing the 'Q' hotkey to enable selection as expected
-
Updated LOD Manager's preview of nanite triangle percent to the newer/more-prominent Keep Triangle Percent
-
Fixed an issue where that caused the mouse to spuriously jump to origin in some cases when modifier keys were pressed
-
The Static Mesh Editor now properly handles level sets in the same way as other simple collision shape types.
-
GroomToMesh tool: update the default value for RadiusScale to account for hair radii values no longer being normalized
-
The Simple Collision Editor tool now only run on targets that support writing collision. This fixes an issue where it would previously appear to allow editing the auto-generated collision for volumes, but discard the result.
-
Fixed an issue where the primitive tools (Add Box, Sphere, etc) could place the primitive behind the camera in some cases.
-
Fixed an issue where the Generate PolyGroups algorithm would randomly create very large, oddly-shaped regions in cases where the settings would normally generate many single-triangle regions.
-
Made the modeling tools correctly handle static mesh build scale.
-
Fixed the 'mesh to collision' tool not properly updating dynamic mesh component collision settings
-
Fixed the coordinate frame used when applying scaling in the Lattice tool
-
Fixed undo for simple collision shape updates for Dynamic Mesh components in some modeling tools
-
Fixed an issue with the Mesh Splines tool where best fit planes for separate splines would all still use the same plane origin, so adjusting one spline could affect the triangulation of another.
-
Scene snapping used when placing new primitives in the modeling tools now filters shape components in the same way as volumes, so that e.g. a trigger box is filtered (or not) in the same way as a trigger volume.
-
Fixed an ensure in the PolyEdit's tool's edge loop selection
-
Fixed a crash in the Draw Spline tool if an unusable blueprint class is requested.
-
Fixed a crash on interacting with sockets in the static mesh editor when the sockets window was not open.
-
Fix an issue where cancelled mouse-drag actions would be incorrectly handled as successful mouse-drag actions for some modeling tools.
-
The Mesh to Collision tool now respects the weld edges setting, instead of always welding mesh edges.
-
Fixed an issue where the Boolean and Merge tools would set updated materials on the asset but not the component, and so could show incorrect materials on an updated actor.
-
Fixed an issue that could occur in dynamic sculpting and other tools on an undo in the middle of a click-drag action.
-
Fixed an issue where some edges and vertices could not be moved with the mesh element selection system
-
Geometry Tools: Mesh LOD Toolset - fix bug in LODManager that could leave the mesh hidden after deleting the highres mesh. Also made sure the displayed information was correctly updated after undo in the tool
-
Improved gizmo placement for polygroup edges that form closed loops.
-
Made the Mesh to Collision tool's box auto-detection more robust, so it no longer detects staircases as boxes.
-
Added a filter to skip degenerate triangles when converting a mesh to a volume, so volumes created by the modeling tools are more often valid. This fixes collision for the modeling mode cone and arrow primitives when they are created as blocking volumes.
-
Fixed a bug which previously did not allow PolyGroup preview to be displayed in the viewport when using the Generate PolyGroups Tool
-
Fixed an issue where the initial preview of the merge mesh tool would appear in the incorrect location.
-
Fixed a bug with 'Clean Materials' in the LOD Manager Tool which was removing the incorrect material
-
For Mesh to Collision tool, improve auto-detection of spheres, so that e.g. low-poly cone shapes are not recognized as spheres.
-
Changed display name for Draw Spline's 'World' mode to 'World Objects' to try to make it clearer that it's raycasting to objects in the world
-
Fixed an issue where some of the modeling mode collision tools handled non-uniform actor scale incorrectly.
-
Fixed an ensure on trying to place a new modeling tools primitive mesh in a level when a volume is in the level and volume snapping is enabled
-
Fixed an issue the Simple Collision Editor and Mesh To Collision tools would not correctly undo for Dynamic Mesh components.
-
Changed LOD manager's "Show Seams" option to "Show Borders" and disabled it when the default LOD is showing
-
Fixed an issue where the Collision to Mesh tool would set incorrect transforms on simple collision shapes when Output Separate Meshes was enabled.
-
The Bake Transform and Edit Pivot tools no longer create two transactions when editing meshes with convex collision shapes, as the bug that required this workaround has been fixed.
-
Fixed a crash in the Draw Spline tool when the referenced blueprint is recompiled while the tool is in use.
-
Fixed an issue where vertex colors were used to render the modeling mode selection material.
-
Fixed a crash when inspect tool properties are modified after tool shutdown
-
Fixed an issue where the source mesh would be invisible if the Plane Cut tool was started with Show Preview unchecked
-
Made usability fixes to the Mesh to Collision tool: Added tooltips, removed the non-functional Simplify Polygon property, and made the Simplify Hulls toggle no longer affect the Swept Hull polygon.
-
Geometry Tools: TransfromUVs, fixing undo within the tool. GeometryFramework: Adding primary UVs to FVertexChange data.
-
Fixed a bug in the Mirror Tool which previously ignored scale transforms when writing to new objects
-
Bug Fix: Updated missing and incorrect icons for mesh selection mode.
-
When manually updating Brush Size in Group Paint Tool, the new size is now reflected in viewport immediately, without having to click in viewport to see updated size
-
Fixed an issue where non-uniform scaling of a selection in modeling mode could be incorrectly disabled or use the wrong coordinate frame.
-
Clamped Poly Edit's bevel distance ranges to avoid weird results for negative, zero, and very large bevel distances.
-
Preview mesh now properly updates when toggling Shells to Solids in the PolyEdit extrude activity.
-
Fixed an issue where some brush properties were shared across vertex painting tools that did not expose those properties in the UI, which could leave those tools stuck in an unexpected state.
-
Fixed an ensure in the Hole Fill tool for meshes complicated open boundaries
-
In the Mesh Element Selection Toolbar, when the Local Frame Mode is set to 'From Object,' the gizmo is now placed at the selected geometry's pivot, rather than the object's pivot
-
Made ctrl+click to position custom plane work more consistently in the Draw Spline tool
-
Fixed an ensure in the Auto UV tool when processing meshes with no colliding components.
-
Fixed an issue in the BakeTextures tool where MaterialID bakes resulted in gaps in the gutter pixels.
-
Fixed incorrect positioning of the extent gizmo in the pattern tool on undo/redo.
-
Fixed a crash in the AutoLOD tool when running on invalid StaticMesh assets.
-
Fixed an issue where the UV Layout tool would incorrectly continue to show a preview wireframe after the preview was toggled off.
Deprecated:
- Deprecated the FGenericMeshSelection struct, which is a now-unused part of a previous version of the modeling mode's selection system.
Procedural
API Change:
- AttributePartition and AttributeGenericPartition C++ API Extended in PCGMetadataPartitionCommon.h to support a TArrayView of selectors
-
Modified MetadataPartition node to support multiple partitioning of attributes
- The BP library for setting and getting graph parameters has been updated to receive a graph interface, which now includes both graphs and instances.
New:
-
Added support for Named Reroutes in the PCG Editor.
-
Added support for feedback loops where some results can be passed from one itheration to the next. Improved UI and pin properties to support this.
*Added a Get Loop Index node.
-
[PCG] Added a node that creates point data
-
[PCG] Nativation of CombinePoints Node, which combines each point to share a singular bound extent.
-
[PCG] Enabled Force Generation for PCG Component
-
[PCG] Nativized SplitPoint node, which splits each point into two separate points, and sets bounds based on the position and axis of the cut
-
Subgraph nodes now support recursion and will continue executing until there are no inputs left.
-
[PCG] Created a context menu which creates a subgraph node or loop node when dropping graph assets in graph
-
[PCG] Nativized DuplicatePoint node, which creates duplicates of each point with optional transform offsets.
-
[PCG] Add Replace Tag node for data tags
-
[PCG] Added a node that sorts points based on attribute
-
[PCG] Nativized DistanceToNeighbors node, now named Point Neighborhood
-
[PCG] Added a node that adds tags from the output pin to the next node.
-
[PCG] Added a node that creates points in a 2d or 3d grid
-
[PCG] Included support for partitioning (including CreatePoints)
-
Added new mode of generation for PCG Components called 'Runtime Generation', used for efficiently scheduling components for generation and cleanup based on proximity to 'Generation Sources' such as the player.
-
Added visual edge feedback when debugging (e.g. fat edges) and editor settings to control the appropriate values. Enabled inspection on reroutes and named reroutes.
-
[PCG] Nativized ApplyScaleToBounds and EditPointCenter blueprint nodes
-
[PCG] Added ApplyScaleToBounds which converts scale of a point into the bounds
-
[PCG] Added EditPointPivot - (renamed from ResetPointCenter)- which sets a new center point for the point, adjusting the bounds
-
Added PCGWaterInterop plugin with a 'Get Water Spline Data' node for getting 'Water Spline Components' in the level. Provides read-only access to Water Spline Metadata from PCG graphs.
-
[PCG] Added a node that applies a new random seed from point input using its position and user seed input.
-
[PCG] Create Sample Texture node, which samples the color of a texture at each point
-
[PCG] Added context menu to debug object tree, enabling jumping to a specific node/graph by right clicking the object in the debug tree
-
Added 'Preview' and 'Load-as-Preview' modes on the PCG component which allow changes on the component without dirtying while retaining ability to save pregenerated data and keep regeneration working.
-
Made the 'keep zero density points' option available in non-editor builds and non-transient where it makes sense (in data operations, not filtering elements)
-
Created new Visualize Attribute node, which currently prints an attribute's value to string with an offset for each point input
-
Added Runtime Quality Branch and Runtime Quality Select nodes. Added 'pcg.Quality' console variable ranging from 0 to 4 (Low, Medium, High, Epic, Cinematic).
-
Made the search recursive in the PCG Editor so we can easily find things in subgraphs as well
-
Added multiple details view and multiple attribute list views in PCG Editor with locking mechanisms.
-
Add actor property overrides to spawner nodes.
-
Added options to the get landscape data node to be able to retrieve physical material, component key, proxy touched.
-
Added support for compressed texture formats with PCG 'Get Texture Data' node.
-
Support Texture2DArrays in Texture Sampler
-
Added some flexibility around how we serialize and build the landscape cache (never, always, only on cook). Set on the Landscape Cache object on the PCG World actor.
-
[PCG] Reduced the cost of target calls, added ShouldComputeFullOutputDataCrc() for performance
-
Added a dependency only pin on the Gather node so that execution can be sequenced without requiring to filter data.
-
Added wire thickness settings in PCG editor.
-
Added a new Filter node, "Filter Data By Index", which will filter a data collection by user selected indices
-
Added 'Get PCG Component Data' node for getting generated graph outputs from other PCG Components in the level.
-
[PCG] Added support for CopyPoints node to allow multiple sources and targets
-
Add 'Apply On Actor' node. Applies property overrides and executes provided functions on a target actor.
-
Added native and blueprint element templated pins to the Proxy node
-
Add post-process functions on Spawner nodes ('Static Mesh Spawner', 'Spawn Actor', 'Create Target Actor', and 'Create Spline') that allow calling functions on the relevant target actor.
-
Added Attribute Set to Points and Points To Attribute Set nodes.
-
Updated the Volume Sampler to the new Time Slice Context
-
Added 'Number of Samples' mode to the 'Spline Sampler' node that samples a given number of evenly spaced points along the spline.
-
Add 'Create Surface From Spline' node for creating an implicit surface from a closed spline.
-
Created a new "Time Slice" context to make time-sliced node authoring simpler and consistent
-
Updated the Surface Sampler to the new context
-
Added Filter Data By Attribute node that verifies if data has some attribute or not. All filter data nodes now have both an in filter & out filter pins to allow easier manipulation.
-
Updated C++ API in PCGMetadataPartitionCommon.h to support partitioning on multiple attributes
-
Provide option on 'Spline Sampler' to have segment index as a metadata attribute. Provide boolean on 'Spline Sampler' to know if a point is a control point (Subdivision Mode only). Provide option on 'Spline Sampler' to have control point tangents as metadata attributes.
-
Added overriding properties in the Static Mesh Spawner when spawning By Attribute, which will partition points based on the overrides and create one ISM per customization.
-
Added match to nearest (& threshold distance) on the Match & Set.
-
Added a new Control Flow node, "Select (multi)" which operates on int, string, and enum values
-
Created a native PCG data asset class and an accompanying level-to-data-asset menu action. Replaces the editor utility blueprint that we had before. Also update the Alembic-to-PCG importer. #contrib 11380
-
Added Delete Tags node
-
Added "Sum" mode in the reduce node.
-
Added a new node called "Print String" which will emit a log/warning/error to the log, and optionally the graph and screen as well.
-
Refactored Graph Parameters to operate with PCG Graphs directly
-
PCG Biome Core experimental plugin added. The Biome Core is a data-driven PCG biome creation tool example. #virtualized
-
Added a Color Projection Mode to the Projection Element to include Source, Target, and common Blend modes (Add, Subtract, Multiply)
-
Added option to get both the single point and the data from the generation at the same time on the Get Actor Data node.
-
Replaced C++ API PCGPointProcessingElement with new PCGPointOperationElement to simplify authoring point operation elements and benefitting from Time Slicing.
- Four new dynamic events are now available to bind to on the PCG Component
- OnPCGGraphStartGenerating
- OnPCGGraphCancelled
- OnPCGGraphGenerated
- OnPCGGraphCleaned
-
Add double-clicking rows in the 'Debug Object Tree View' to auto-expand and select the first entry as the debug object.
-
Added the Proxy node that can execute other nodes (including dynamically selected values). Update the Load Data Table to allow outputting an Attribute Set Table instead. Added the Get Attribute Set By Index akin to the Point version.
-
Add editor command to rename nodes in PCG Graphs. Hit 'F2' or right-click the node and select 'Rename'. Double clicking node title no longer begins editing the title for nodes in PCG Graphs.
-
Added iterative relative transformation in the DuplicatePoint node.
-
Added the Match And Set node that allows to copy all attributes from a given Attribute Set Table entry when there is a match against a given attribute (similar to a join). Also supports additional selection by weight.
-
Add EPCGTextureFilter for Point and Bilinear filtering on 'Get Texture Data' node.
-
Add option to compute alpha and distance along curve as attributes in PCGSplineSampler. Alpha is a value in [0,1] along the curve where each segment of the curve represents the same interval. For example, if the curve has three segments, points on those segments would lie in [0,0.333], [0.333, 0.666], [0.666, 1] respectively, and interpolate across those intervals using the spline's interpolation. Distance is the total cumulative distance along the spline to reach a given sample point
-
Added support for actor post-process functions that take Point + Metadata as parameters on the 'Spawn Actor' node.
-
Added merge attribute set node
-
Provide flag 'bForceEditorOnlyCPUSampling' on 'Get Texture Data' node to force creation of a CPU-accessible duplicate of the texture. Avoids GPU compression artifacts and allows for more accurate sampling.
-
Updated the Attribute (metadata) operations to support multiple inputs in cases where it would make sense. Now accepts N:1, N:N operations on input pins.
-
Support sampling textures marked as 'CPU-accessible' in PCG Texture Data.
-
Added ability to copy all attributes in the Copy Attribute node.
-
Replaced the Intersection node with a new Intersection node, which supports dynamic source inputs. Primary inputs will be iterated on and secondary inputs will be implicitly merged. The previous Intersection still exists, but has been renamed "Inner Intersection"
-
Added some abnormal state logging that will iterate over everything from the PCG menu.
-
Added a new Control Flow node, "Switch", which operates on int, string, and enum values
-
Added the option to tag some graphs as editor-only to prevent some data validation issues. This is a transitive property (through subgraphs) and is propagated to PCG components as well.
- Added mode to spawn actors selected by attribute in the Spawn Actor node.
Bug Fix:
-
Fixed culling in CreatePoints and CreatePointsGrid nodes where it wasn't working properly for local components.
-
Fixed a bug where in the Static Mesh Spawner, the ISM Body Instance Customization was displaying default channels after reloading the Editor
-
[PCG] Fixed issue with AddTags node outputting overrides
-
Fixed profiling issues that were corrupting profiling data (in the PCG Profiling window) especially in loops & dynamic subgraphs.
-
Subgraph nodes with no selected subgraph (& no dynamic graph provided) now act as passthrough nodes.
-
Fixed a bug causing the Volume Sampler to sample the last column in X, Y, Z incorrectly
-
Two console variables 'pcg.CheckSamplerMemory' and 'pcg.SamplerMemoryThreshold' have been added to help alleviate an Out of Memory crash when unintentionally sampling too many points.
-
[PCG] All native nodes now forward tags
-
[PCG] Fixed issue where multiple debug object tree objects could be selected
-
Fixed a bug where the PCG Volume did not properly follow surface normals in the Editor.
-
Improved support of PCG inside of level instances.
-
PCG static mesh spawner now respects the ISM component type decision and applies a change only in HISM+Nanite cases
-
Bug Fix: [PCG] Fixed attribute selectors that were not overridable
Deprecated:
- Removed the per-node tag filtering and tagging as this was marked deprecated already in previous versions.
- Nodes that were using the Add Tags On Output and had downstream nodes will have new nodes adding tags added automatically. Removed the 'remove duplicates' option on the debug settings since it served no real purpose and was transient.
- Removed deprecated pins by default on input node. Existing pins will continue working and feed in the data the right way but future work should use the appropriate Get...Data nodes.
UV Editor
New:
- Added a new UV Editor tool, Texel Density, which supports manipulations of texel density for UV Islands. The new tool supports a sampling mode, to read and apply texel density from one region of a mesh to other regions or meshes.
Bug Fix:
-
Added missing localization text for Transform Tool's property categories.
-
Fixed issue where unwrap material was set with a depth offset multiplier that rendered mesh lines difficult to see in the unwrap view of the editor.
World Building
New:
- Branch culling to avoid executing inactive nodes downstream of Branch and Switch nodes.
- Required pins added to native nodes which must be wired for node to be compiled and executed.
- Requiewd Unified visualization of culled state in editor (covering both compilation-time and execution-time culling).
- CanCullTaskIfUnwired added to node settings API to always execute some nodes, even if unwired.
-
PCG - first pass of world builder added to generate PCG components in a level.
-
Display grid size label on nodes when inspecting hierarchical generation.
-
World Partition Editor QoL Make sure we can only play with the Loaded Regions & related streaming features when the streaming is enabled. Hide the loaded regions when we toggle the Streaming enable so we keep them. When converting a Loaded Region to LocationVolume, make sure we have an incremental label for the user. Make sure the scaling gizmo would be intuitive on the Location Volume (after converting a loaded region) by scaling the brush instead of the actor. Fixed : Converting a loaded region into an asset does not count as a transaction on the undo history, but deleting it from the viewport or the outliner does.
-
Greatly optimized FActorFolders in PIE (now has no impact of PIE performance) - Outliner automatically hides empty folders in PIE
-
InstancedStaticMesh Serialization Optim+Fix when bEditableWhenInherited == false (PackedLevelActors) - Avoid persisting PerInstanceSMData, PerInstanceSMCustomData in this case and copy values from Archetype - Also assign NumCustomDataFloats from Archetype in this case to fix warning (issue was with PerInstanceSMCustomData being always serialized and NumCustomDataFloats being delta serialized causing warnings before ReRunConstructionScript got to run)
-
PCG Replace "Can Be Multithreaded" option on PCG Blueprint nodes with clearer "Requires Game Thread"
-
PCG - multi-line node titles supported with sub-lines giving task information
-
WorldPartition: Added Blueprint function UDataLayerManager::GetDataLayerInstances and exposed to BP UDataLayerInstance GetDataLayerShortName, GetDataLayerFullName and GetAsset.
-
Allow Get Actor Data to trigger generation when querying data from Preview components that are not already generated.
-
Added builder support for generating Preview components.
-
PCG - Add Make Concrete conversion type for wiring to Concrete pins, performs a collapse of non-concrete Spatial data.
-
World Partition: Expose Per User Settings into Editor Preferences (under World Partition (Local) section)
-
PCG- Added new Get Bounds node to compute bounds of input Spatial data
-
World Partition Editor: Add option (slider) to play with the unloaded region opacity (default is now ~10% brighter). Tweak clamp between good values with the rest of the features such as highligting regions, loaded regions. Value is saved in PerProjectUserSettings.
-
Avoid unnecessary graph executions when switching between debug objects one component
-
World Partition * Add an editor preference to log the generate streaming in PIE (default true).
-
Modified WorldGridPreviewMaterial to preview streaming with both 2d and 3d components when using the new Runtime Hash. - Added a hatched grid pattern to display 2D cells within 2D range - Replaced the 3d streaming spherical radius display with 2D circle instead - Full semi-opaque cells without the hatched pattern represents the actual 3D loaded cells using the spherical test. #changelist validated
-
Remove debug object dropdown from PCG graph editor, functionality replaced with Debug Object Tree window
-
PCG - Added warning/error status icons to Debug Object Tree with summary tooltip
-
World Partition Editor Hide Options menu when no option are available (mostly for UEFN). Use UToolMenu for the Contextual Menu. This way Licensees and FN could extend it. Re-org the Contextual options for clarity. * Make Load From Here a user create region to be consistent with the editor and remove No loaded region tip.
-
ReplaceActors: Selection optimization (costing > 40seconds for about 500 selected actors). Avoid notifying for every selection change since it is already inside a batch operation.
-
Add an option to place actors under a subfolder instead of the root when breaking a Level Instance. If this option is enabled, the actors will be placed inside the folder the LI is inside of, under a subfolder with the name of the Level Instance, and also keeping their original folder structure. So if i.e. the Level Instance Actor is called "Desert/LI_House2", and an actor inside is named "Lights/Light_Sun", the actor will be moved to "Desert/LI_House2/Lights/Light_Sun" in the outer level.
-
UDataLayerEditorSubsystem now exposes to Blueprint functions to Add/Remove Data Layers to the Actor Editor Context.
-
PCG - Add actor volume output to grid size node, and add Cull Points Outside Actor Bounds node, for convenient culling of data outside of the current grid cell.
-
Sanitize attribute names when creating from component/actor tags. Replaces invalid characters with underscores.
-
[PCG] Avoid unnecessary graph re-executions when trivial changes are made to a graph such as adding a new unwired node which will be culled during compilation.
-
External Data Layer V1 - Allows for plugins to inject/remove content (actors) in a partitioned world - Serves as a replacement for the experimental 'Content Bundle' feature - Added new External Data Layer (EDL) Asset - Added new Game Feature Action 'AddWorldPartitionContent' to control activation of an EDL asset - Supports Data Layers inside a plugin (child of an EDL) - Added builder to convert content bundles to EDL (UGameFeatureActionConvertContentBundleWorldPartitionBuilder) - Feature is temporarily disabled by default and can be turned on using Editor Experimental Settings 'Enable World Partition External Data Layers' flag
-
Packed Level Actor: Avoid updating blueprints if packing result is unchanged
-
Exposed UDataLayerLoadingPolicy and FWorldPartitionActorViewProxy to plugins via ENGINE_API
-
PCG - when inspecting a node, debug objects for which this node produced output data are highlighted in the Debug Object Tree.
-
PCG - Projection node defaults to automatically collapsing point projections to point output data.
-
[SceneOutliner] Using Load and Unload selected volumes context menu options for LocationVolume in the Outliner does not grey out these options.
-
[PCG] Disable warnings on grid size nodes if higen disabled or if component is not partitioned, so that graphs are portable across different execution setups.
-
Finer-grained change propagation during graph execution - CRC computed per node output pin rather than for the whole output data collection.
-
Get Actor Data element (and other typed getters) default to performing a full data CRC on point data which can also avoid unnecessary re-execution.
-
Implemented dormancy for AWorldDataLayers which reduces actor replication to the minimum (i.e. replicates only when necessary).
-
WorldPartition: Added option in WorldDataLayers actor to save each DataLayerInstances in their own file (disabled by default)
-
PCG - Disable Hierarchical Generation when a graph is executed as a subgraph, to avoid conflicts in grid level designations between this graph and the parent graph.
- World Partition Editor Upgrade overall UX (new icons, new menus, new toolbar, new layout) Now possible for licensees to extent options in our menus. * Add same LevelViewport actions in the WP Editor (Build Hlods, build minimap, etc.) via new Build menu.
Bug Fix:
-
Refactored UWorldPartitionLevelStreamingDynamic to go through ULevel::CleanupLevel for trashing packages and clearing standalone flag.
-
PR #10872: Fix crash in data layer editor when streaming-out a partitioned level with runtime data layers #contrib 10872
-
PR #10609: Nullify World->ContentBundleManager if World Partition is disabled. * Could happens when switching from non WP world to WP world. #contrib 10609
-
Fixed ULevelStreamingLevelInstance::LoadInstance to properly handle a streaming level load while the underlying streaming level already exists but has not executed/completed. Added bAllowReuseExitingLevelStreaming to FLoadLevelInstanceParams to allow reusing an existing streaming level (defaulted to false).
-
FAsyncPackage and FAsyncLoadingThread2 CallCompletionCallbacks now properly sets GPlayInEditorID with associated package request PIEInstanceID using FPlayInEditorLoadingScope.
-
Fixed UWorldPartitionLevelStreamingDynamic::RequestLevel which didn't properly handle requesting a WorldAsset already requeted by another streaming level in the world (affects PIE). Refactored ULevelStreaming to share code with child classes.
-
LevelInstanceSubystem: Handle OnCleanupWorld to properly cleanup currently loaded LevelInstances as CleanupWorld doesn't do proper streaming out of levels Reported through UDN : This is an issue with UWorld::ReInitWorld() (which is called on "Rebuild All"), it calls CleanupWorld / InitWorld which was leaving the LevelInstances in a bad state.
-
Fixed the server not respecting the runtime Data Layers logic operator.
-
ApplyCVars Fix: Move Effective values from globals (which could change between cook and runtime) to per SpatialHash values that are initialized only when GenerateStreaming is called This also fixes ApplyCVars being called mulitple times in PIE when using Level Instances which could lead to different results if Level Instances were using different settings than main world
-
Choose File To Save: Fix issue where Saving a map would save it's dirty actors even if they werent selected by the user
-
Fixed regression in APlayerController::ClientFlushLevelStreaming_Implementation introduced by 1730015 (inverted logic). ClientFlushLevelStreaming was not flusing which was causing replication issues when a client joins a server which previously streamed sublevels.
-
Fixed PIE crash when client tries to connect to the server: loaded world package PIEInstanceID was not set and package name had no preflix UEDPIE. This change is basically a revert of an old CL 1810531, which doesn't really go into the details on the change outside of mentioning that it's was a temp fix. Loading a PIE World without its package PIEInstanceID nor properly fixing up for PIE is not a supported code path.
-
PCG - Fix bug where projected splines do not work when fed to a Difference node.
-
Fixed world partition streaming generation not properly handling dirty actors of a newly created level based on a template partition map.
-
WorldPartition Server streaming : Make sure the server streaming always loads a bit more than the client. This is necessary to avoid making the client wait indefinitly for the server to finish loading cells that are not even requested by the server because of a slight difference between client and server streaming source locations. Network quantization and world partition location/rotation quantization can contribute to this difference. - Added wp.Runtime.ServerStreamingSourceMinimumExtraRadius to control the minimum extra radius applied on server streaming sources. - Added wp.Runtime.ServerStreamingSourceMinimumExtraAngle to control the minimum extra angle applied on server streaming source shapes.
-
Fixed cooking indeterminism caused by code assuming that IAssetRegistry::GetAssets returns a deterministic ordered list (which is not true).
-
WorldPartition: wp.Runtime.UpdateStreamingStateTimeLimit is now ignored if world is HighPriorityLoading or is in SeamlessTravel or if is inside a BlockTillLevelStreamingCompleted or if match hasn't started.
-
Fix crash when wiring nodes.
-
Added virtual UWorldPartitionRuntimeCell::ShouldServerWaitForClientLevelVisibility which can be overriden to allow for a server cell to ignore client level visibility before unloading the cell. - WorldPartitionStreamingPolicy keeps UPROPERTY references for activated/loaded cells to avoid any deinjected cells to be GC'ed. - Deprecated IsAddedToWorld and CanAddToWorld in UWorldPartitionRuntimeCell as they are no longer used - Removed unused SortedAddToWorldCells in UWorldPartitionStreamingPolicy
-
Fix some data CRC issues where graph was not re-executed correctly when an attribute name is changed.
-
Delete Actor: Avoid warning about Soft/Hard references if that reference is also being deleted
-
Defer FWorldPartitionRuntimeSpatialHashGridPreviewer material initialization (loading) to avoid calling LoadObject during async load.
-
Fixed removal of leaf data layer instance (when using data layer parenting) that was not properly updating parent. Fixed removal of a data layer instance which could trigger an infinite loop when reparenting children of the removed data layer instance.
Online
New:
-
Added new plugin EOSOverlayInputProvider to forward input to the EOSSDK Overlay and stop transmitting input to the game when it is open.
-
Added bugfixes and missing logic to ensure Dedicated Server Sessions work in Lyra when using OSS EOS.
-
Add OnlineRequiresSecondLogin console variable to OSS Null for testing the use case of a system being offline when it is first launched
Bug Fix:
-
Fix Icmp ping posix implementation and enable it for iOS
-
OnlineBeaconClient now cleans up properly if the beacon's NetDriver is pending destruction.
Hotfix System
New:
- Added UCurveTable modification callback deferral in OnlineHotfixManager, significantly saving the number of callbacks if performing a large number of row updates.
HTTP
New:
-
Enable event loop by default on most of the platforms.
-
Add http request progress delegate 64 bit support.
-
Improve default HTTP retry behavior when services do not indicate how long to wait for retries - Retry period changed from linear to exponential; - Adds random jitter multiplication to computed backoff. Final default retry lockout period formula looks like this: RandRange(JitterMin, JitterMax) * Pow(Base, RetryNumber + 1 + Bias) where RetryNumber is 0, 1, 2, 3... Defaults: JitterMin = 0.5 JitterMax = 1.0 Base = 2.0 Bias = 1.0
-
Deperecate the FGenericPlatformHttp::UsesThreadedHttp interface and remove corresponding impls, now all platforms are using threaded http requests.
-
Deprecated HttpTimeout config, use HttpActivityTimeout or HttpTotalTimeout instead; Deprecated HttpReceiveTimeout and HttpSendTimeout config, only use HttpActivityTimeout; Made HttpActivityTimeout work on all platforms, not only CurlHttp.
-
Update RapidJson to latest code at commit 3f73eda.
-
Added http fail reason interface in http request and response, instead of using the status to check if it's connection failure or any other reason.
-
Make sure don't pass received data to stream interface after cancelling the http request or after shutdowning http module.
-
Switched to use thread-safe delegates for http requests.
-
Added the support to make http retry system don't rely on Tick from game thread.
-
Added status code received callback for early access before downloading request complete.
-
Add third party library RapidJSON_v1.1.0.
-
Removed the dependency of http request from http response; Make http requests use GET by default if verb is not set.
-
PR #10520: Fix issues with non blocking sockets in SocketBSD preventing http server from serving large files on linux
-
Extract the Response from http request implementions into HttpRequestCommon; Fix the issue the response in request is not cleared on some platforms when retrying.
-
Added GetEffectiveURL interface to get the effective url after redirection.
-
Changed default send/receive timeout(HttpActivityTimeout) to 30s.
-
Change the default connection timeout to 30s.
-
Made all http impls respect the connect timeout set in http module.
-
Added runtime args for enabling/disabling http event loop.
-
Fixed the potential HTTP dead lock when Flush while canceling request; Add the ProcessRequestUntilComplete sync call to IHttpRequest.
-
Added optional, separated retry limit support for connection error in http retry system.
Bug Fix:
-
Fix the issue on certain CPU, the http thread hang forever because of the incorrectly calculated elapsed time.
-
Fix dependency chain on "Chaos" plugin in WebTest to depend on "JSON" instead
-
Fixed a potential crash in http curl impl when destroy http requests.
-
Make sure to re-open the file when retry http request with streaming upload request.
Online Subsystem
New:
-
OnlineSubsystemEOS: Add "-EpicSandboxIdOverride" command line argument, which takes precedence over the "-EpicSandboxId" argument passed by Epic Games Launcher.
-
EOSShared: Add IEOSPlatformHandle::GetConfigName to expose the config used to create the platform instance. OnlineServicesEOS: Modify OnlineServicesEOS*::GetEOSPlatformHandle to return IEOSPlatformHandlePtr, so the config name etc is accessible.
-
Update the CreateSession BP node to include a "Use Lobbies If Available" boolean.
-
Add the ability to specify Steam OSS server names via config files
-
OnlineSubsystemEOS: Removed bShouldEnforceBeingLaunchedByEGS config variable. Licensees using this mechanism should migrate to using the "LauncherChecks" mechanism (see bUseLauncherChecks in TargetRules.cs)
-
Added logic to test OSS EOS Leaderboards Interface methods via console commands.
-
Updated Google SignIn implementation in OSSGoogle Android to use latest dependencies. Added silent sign in and support for offline access
-
OSSEOS - Added IUniqueNetIdEOSPlus interface, to expose getters for the underlying Base and EOS NetIds. Simply cast your EOSPlus FUniqueNetId to IUniqueNetIdEOSPlus. Note this is only safe if FUniqueNetId::GetType() returns "EOSPlus".
-
Added purchasing and store interfaces to Steam. Purchased apps connected to your main apps will now automatically show up as a receipt in the purchasing interface. For more complex microtransaction support, a new steam purchasing link has been added that allows you to maintain the same Online Subsystem interface purchasing flow as you do for your other platforms but interweave in the Steam-required server implementation for microtransactions.
-
Update GooglePlayBillingLibrary to v6.0.0
-
Full integration of EOSSDK 1.16.1 binaries, headers and libraries.
-
Update Steamworks SDK to 1.57 Expose Steam's GetAuthTicketForWebApi via IOnlineIdentity::GetLinkedAccountAuthToken
-
Update GoogleSigniIn SDK to 7.0.0 on iOS
-
OnlineServicesCommon - Add MakeExecHandler helpers
-
OnlineError OSSv2 logging changes- Fixed ToLogString discarding the prefix even if the option is set to true. The new format looks something like this- [1.1.5-3.1.17] NotImplemented (EOS_MissingInterface) ToLogString now logs the human readable ID instead of the binary ID (i.e. [1.1.5-3.1.17] instead of the binary representation of that)
-
Return the result of show login UI so game can distinguish between console login failure and cancellation.
-
EOSSDK - Delete NDA platform documentation, this is available on the EOS docs site now.
-
Lyra now has a simple sessions-based presence plugin that uploads data of the running session (or main menu status) to the online subsystem
-
Add some config vars for Steam OSS timeouts
-
Added built in support for SteamChat's rich presence keys and friend grouping keys
-
Added logic to prefer AccountPortal + PersistentAuth login when using OSS EOS on Switch with bUseEAS enabled Added logic to save, load and delete AccountPortal auth token and token expiration locally using ISaveGameSystem
-
Add EOS Integrated Platform support for Steam using the -CustomConfig=SteamEOS command line option. This also includes the SteamEOS option to enable this in Lyra, but full Steam integrated platform support in Lyra is still a WIP (Lyra does not support the adapter at the moment)
-
Add a fatal log message and message box when EOSSDK fails to be loaded. This is disabled by default, but can be enabled by setting the following config in Engine.ini hierarchy:
- [EOSSDK] bDllLoadFailureIsFatal=true
Bug Fix:
-
The -nosteam command line option now entirely prevents Steam modules from being loaded entirely
-
Changed how OSS EOS Sessions responds to a EOS_ELobbyMemberStatus::EOS_LMS_CLOSED notification, destroying the related lobby instead of just removing the lobby member.
-
Fixed an issue with the Friends interface in the Steam OSS not properly polling and retaining presence data.
-
Do not disable the sandbox in the Steam online subsystem because it causes async file operations to randomly fail
-
Added missing delegate trigger for OnPresenceReceived in UserManagerEOS
-
Fix crash in FOnlineSessionIOS::StartSession when creating sessions
-
Fix GetFriendPersonaName in Steam OSS to use 64-bit ID
-
OnlineSubsystemEOS: Fix FUserManagerEOS::QueryExternalIdMappings not correctly breaking up large queries into sub queries.
-
Fixed issue where the EOS overlay was disabled when WITH_EDITOR was true
-
Fixed an issue causing SteamSockets to fail to match session and connection IDs with the host
-
OnlineSubsystemEOS now logs into Steam via the Session ticket instead of the app ticket
-
Fixes for Steam's LeftLobby and IsMemberOfLobby, community contributed. Use a manual array search instead of built-in TArray functions since they behave incorrectly with shared refs
-
OnlineSubsystemEOS: Fix issue where Checkout was succeeding, but was failing to return a valid receipt.
-
Fix null ConnectHandle when registering EOS auth handlers
-
Addition of logic to transmit EOS Overlay session join as an OnSessionUserInviteAccepted delegate. Addition of support for OnSessionInviteReceived delegate.
Deprecated:
-
EOSSDK - Moved the "project binary" mechanism from GlobalDefinitions set on each .Target.cs, to config variables, so it is configured project wide in one place and does not need defining on every target in a project. The old GlobalDefinitions mechanism is maintained for backwards compatibility, but is deprecated and licensees should migrate.
-
[OnlineSubsystemEOS]:bUseSessionPresenceAttribute has been removed as a config option, along with the logic executed when it was set to false.
Pixel Streaming
New:
-
Added AV1 support to Pixel Streaming and AVCodecs
-
Added support for the Virtual Camera's "Pixel Streaming Output Provider" on Mac
-
Re-shipped Pixel Streaming Player that was non-functional in 5.3 and 5.2. The player now supports hardware accelerated decode where the hardware supports.
-
Added a Pixel Streaming Stats interface to enable you to graph your own Pixel Streaming related stats
-
Added support for Pixel Streaming on Mac. NOTE: This functionality is only available for M1 Macs and later. Intel based Macs are not supported.
-
Added editor notification when using Editor Pixel Streaming to inform the user that the plugin is going to disable the editor setting "Use Less CPU when in Background".
-
Added OnPlayerRequestsBitrate to the Signalling Observer interface. Allows the user to respond to custom bit rate requests.
-
Adding elevated checks so that certain data channel messages can be limited to specific users.This means that only the peer controller should be able to control things like resolution, bit rate etc.
-
Updated Pixel Streaming to use version 1.13.1 of libVpx and version 5414 of WebRTC
-
Added a pair of settings to specify a port range for WebRTC. You can specify a minimum port by launching your application with "-PixelStreamingWebRTCMinPort=xxx" (or using the "PixelStreaming.WebRTC.MinPort" console variable). Additionally, you can specify a maximum port by launching your application with "-PixelStreamingWebRTCMaxPort=xxx" (or using the "PixelStreaming.WebRTC.MaxPort" console variable).
-
Added the FPixelStreamingVideoSink class which allows you to extract decoded frames from a WebRTC stream
- Exposed three new PixelStreaming/WebRTC settings to mitigate frame drops in LAN scenarios.
- PixelStreamingWebRTCDisableFrameDropper=true, where true disables frame dropping inside UE's WebRTC.
- PixelStreamingWebRTCVideoPacingFactor=N, where N is a multiplier for how lenient we are on pacing large bitrates (e.g. a value of 100 is quite lenient).
-
PixelStreamingWebRTCVideoPacingMaxDelay=M, where M sets the max packet pacing delay (ms). The combination of these settings allows sending large fixed bitrates without frames being dropped on the UE side - this is useful for LAN streaming scenarios, but will cause stutters, lags, and congestion as packets are lost or unable to transmitted fast enough over the actual internet.
-
Allow the passing of a custom websocket to the signalling server connection
-
Allowing bit rates to be set on initial connection. The settings panel parameters from the front end should now apply properly when connecting.
-
Defaulted Pixel Streaming Player connection URL to port 80
- Improved websocket disconnect messages in the Pixel Streaming plugin. Previously all disconnects on the UE side were reported with no disconnect message.
Bug Fix:
-
Fixed the editor becoming locked if an editor stream was stopped from the browser
-
Fixed a memory leak in FVideoResourceCUDA that was affecting pixel streaming users on all platforms
-
Fixed small stream stutter when new players connected
-
Fixed Virtual Cameras not streaming on Windows when running with Vulkan
-
Fix crash when pixel streaming shutting down. The cause was the thread object (FrameThread) being destroyed while the thread was still running.
-
Fixed a frame skip issue in Pixel Streaming VCam that was caused by MediaIO capture being informed of an irrelevant resolution change.
-
Fixed a memory leak in TVideoEncoder
-
Fixed EditText button doesn't show when tapping an editable text widget
-
Fixed EditableText widgets not respecting ReadOnly property and being able to be edited by a pixel stream
-
Fixed data channel only streams being non-functional. A data channel only stream can now be started by launching an application with "-PixelStreamingWebRTCDisableTransmitVideo" and "-PixelStreamingWebRTCDisableTransmitAudio"
-
Fix peers not getting any frames when stream sharing without a quality controlling peer.
- Configure PixelStreaming VCam for lowest latency experience.
- Disable sending keyframes on an interval to have a smoother decoding/bitrate profile.
- Set a fixed video encoding bitrate ignoring WebRTC (as we know we are on LAN)
- Enable filler data during video encoding (while wasteful this ensure stable bitrate which helps with latency estimations)
- Disable the frame dropper so we can stream as very consistent FPS.
- Set video pacing factor to make more lenient to large bitrates
-
Fixed NVDEC hardware decoding being non-functional. This allows the Pixel Streaming Player to leverage hardware accelerated decoding with NVIDIA GPUs
-
Fixed Play In Editor (PIE) audio not being streamed when editor streaming
-
Fixed error log caused by passing wrong size texture into the MediaIO capture pipeline when doing VCam Pixel Streaming.
-
Fixed OnTextCommitted not being called when a text update is triggered by the LiveLink app
-
Improved end to end latency between Unreal Engine VCam Pixel Streaming and the LiveLinkVCam app by capturing frames using the UMediaCapture anythread mode. This greatly improves the consistency of the frame capture time and therefore allows for a much more stable (and less buffered) WebRTC video stream.
-
Unlocked 60fps streaming in LiveLink VCam app by configuring the default rendering rate of WebRTC's MetalKit video stream to be 60fps instead of 30fps.
- In VCam Pixel Streaming coupled render rate and stream rate for better frame synchronization (latency) between UE and the LiveLink app.
Deprecated:
- Deprecating kick player functionality. This behavior still works but is marked for removal in later versions.
Voice
Deprecated:
- Deprecate old IVoiceChat::Set3DPosition API, and add default no-op implementation - Add new simplified IVoiceChat::Set3DPosition API, and add default no-op implementation so third party implementations of IVoiceChat keep compiling.
Websockets
New:
- Added helper methods for retreiving URL parameters from websocket connections
XboxLive
Bug Fix:
- Fix a failure to join from invitation without session info.
XMPP
Bug Fix:
- Fix crash in libstrophe when a specially crafted xmpp message hits a codepath that only partially resets some internal state leading to a null pointer dereference
Platform
New:
-
Add warning on all critical sections about double unlock potentially causing deadlocks
-
First part of TargetPlatform(TP) refactor into TargetPlatformSettings(TPS) and TargetPlatformControls(TPC) TPS doesn't need SDK and will be used to get info about the platform TPC requires SDK AndroidTP has been converted to the new system
-
Added new PerPlatformConfig class flag indicating the config properties can be overridden in a Platform/PlatformEngine.ini file. When a class is marked PerPlatformConfig, in the editor the class will be loaded from the platform inis of the current PreviewPlatform on load, and when the PreviewPlatform is changed, LoadConfig will be called to reload the settings from the platform ini file.
-
Validate Cast at compile time - Casts between unrelated subclasses of UObject will produce a static warning (and an error when treat warning as error is true) - Trivial casts will be resolved at compile time without calling IsA<> This can be disabled with UE_ENABLE_UNRELATED_CAST_WARNINGS = 0
-
Bump windows version from 18362 to 19041 to meet the minimum spec for GameInput API
-
Cast, ExactCast and CastChecked with TObjectPtr are const correct
Bug Fix:
-
Disable passing
/Os
and pass/Ob0
when usingclang-cl
in debug builds by default since otherwise it interferes with debuggingclang-cl
-generated executables in Visual Studio. -
Fixes our Clang database generation to produce a compilation database that doesn't trip up against our checks in platform headers, so that it can actually be used properly.
-
Fix bug in D3D12 RHI that could cause corruption of texture cube resources due to missing resource transitions, e.g. during mip downsample for reflection captures.
Desktop
New:
- Added SecuritySandbox experimental engine plugin which allows a game client to restrict its own access rights on Windows to better follow the principle of least privilege.
Linux
New:
-
Enable preliminary Linux support for sparse volume textures and OpenVDB
-
Refactor FGenericPlatformOutputDevices::SetupOutputDevices code just a little so that we don't have to suffer code rot in a custom linux implementation
Bug Fix:
-
BugFix: Fixed fix linux compile issue with include upper case lower case name.
-
Replaced use an incorrect use of sa_handler with sa_sigaction
-
Fix invalid directory separator in GeoReferencing plugin so that Linux properly packages it
-
Fix OpenColorIO build script for Linux
-
Implement GetPhysicalProcessorCount for Linux so that PGO builds can work properly
-
Reduce repeating monitor DPI log event spew to only print on the first occurrence
Mac
API Change:
- There is no behavioral change here, but it provides the option to change what it is and supports more platforms then just Mac.
New:
-
UBA: Add Mac Menubar App for UbaAgent
-
Add Mac support for showing additional content on the right side of the title bar.
-
Added support for Privacy Manifest handling for iOS and Mac
-
Move source files from editor xcode projects to game xcode projects
-
Apple: Update runtime to macos 11 and clean up warnings from doing that.
-
Switched to Apple's Metal CPP for Metal implementation
-
Improve source code lookup feature, using dsym if exists.
-
Move the macOS main menu into the editor window.
Bug Fix:
-
Fix Tools -> Open Xcode not working with modern Xcode
-
Use ProjectDisplayedTitle as AppName on Mac if set
-
Add a toggle for the behavior of EKeys::Platform_Delete on Mac. On a Mac keyboard pressing just "delete" will act as a "backspace" on windows or linux, and pressing "function+delete" will act as "delete" on windows or linux.
-
Fix archive fail when packaging a Blueprint only project for distribution
-
Fixing NavigateToFunctionSource crashes and errors.
-
Fix multiple controllers not supported on Mac
Online
API Change:
- Previous usage of DisplayName now use a sanitized version.
New:
-
[OnlineSubsystem] Implement a content restriction interface that supported platforms can leverage for age verification information
-
Added support for new EOSSDK 1.16.1 BestDisplayName methods to OnlineSubsystem and OnlineServices
-
EOSShared has added option to compile against targets without Engine dependencies
XR
API Change:
-
Improved the extensibility of the IOpenXRExtensionPlugin interface by adding new overrideable callbacks: OnSuggestBindings, OnCreateActionSet, PostCreateActionSet, OnCreateAction, PostCreateAction, and OnActionSetAttach.
-
It may be necessary to change from using FOpenXRHMD to using IOpenXRHMD.
-
It may be possible to remove workarounds that were previously necessary because PreInitHMDDevice was called so early.
-
Some include paths have changed. Users of private headers may need to refactor as well.
New:
-
OpenXR: Need ability to add subaction paths to action. -Added SubactionPath parameter to IOpenXRHMD::AddTrackedDevice and FOpenXRHMD::FDevice so we can create actions with a SubactionPath specifed.
-
Added unsupported message to distorted mode in default spectator screen controller.
-
VR PIE: bOneHeadsetEachProcess option allowing each separate process PIE instance to own an HMD or HMD simulator. -New setting bOneHeadsetEachProcess which when true will allow PIE separate-process instances to run without -nohmd and with -HMDSimulator which an xr plugin may consume to do special vr device simulation. Even if that does not happen if we are running with OpenXR we will attempt to create an additional OpenXR instance to connect to an hmd and an OpenXR runtime may allow us some kind of connection, these pie instances might also not run correctly. #contrib 11314
-
Added system to add additional flags to stereo layers.
-
AppleARKitFaceSupport & AppleARKitPoseTrackingLiveLink reference the Private folder of the AppleARKit module -Removed private folder access along with the includes, which are unneeded.
-
OpenXRViveTracker references the Private folder of the OpenXRHMD module -Created IOpenXRHMD interface so that other plugins can do OpenXR specific things with the OpenXRHMD implementation, rather than accessing FOpenXRHMD
-
Destroy xrInstance in PreInit to yield other plugins to create xrInstance -Destroy any openxr instance created during preinit becasue we do not yet know if openxrhmd will be the chosen xrsystem and another xrsystem may try to create instance (ie the oculus vr plugin) and then fail because the runtime only supports one instance. -CVar xr.RetainPreInitInstance can be set to true to disable this behavior. #contrib 11029
-
Add a new Platform VisionOS Project Settings panel to enable/disable VisionOS's full immersion vs window mode
-
Experimental support for VisionOS Fully Immersive -First phase of VisionOS running on device. VRTemplate will run on device. -Mobile forward renderer runs if MobileMultiView is disabled at reasonable framerate, however depth is currently incorrect (we are just writing scene color to it, depth information exists but is not yet connected). The blocky black shadow artifact is related to this. -Deferred rendering runs with a proper depth buffer.
- VisionOS: hand tracking
- Hand tracking supported via OpenXRHandTracking plugin.
-
xr.DisableOpenXROnAndroidWithoutOculus evaluated too late to modify via INI -Move PreInitHMDDevice to a point quite a bit later in PreInitPreStartupScreen so that more unreal engine systems are setup when we call it, including ini reading, cvars, fplatform memory, etc.
-
OpenXR related private header access cleanup. -Refactoring to move some cross-module included Private header files into Internal. Eliminating some includes by refactoring. Eliminating some simply unnecessary includes.
-
OpenXRAR, OpenXRInput reference the Private folder of the OpenXRHMD module -Refactored to use IXRTrackingSystem and IOpenXRHMD instead of FOpenXRHMD.
-
Added Quest 3 to list of Meta supported devices.
-
Removed deprecated motion controller component code.
-
OpenXRVisionOS non-plugin support files -The changes required for VisionOS Immersive mode that are not within the OpenXRVisionOS plugin. -Enables SimpleHMD for VisionOS (stereo rendering without a hmd)
-
OpenXR XrSystem loss/change handling. -Removed unnecessary xrGetSystem call in the FOpenXRHMD constructor. It is overwritten (for example in OnStereoStartup()) without being used.
-
Enable SwiftUI by default in VisionOS mode
-
XRDeviceVisualizationComponent now works in VREditor.
-
Added Vulkan custom resolve + tonemap subpass to support mobile hdr on Meta quest devices.
-
AppleARKitFaceSupport & AppleARKitPoseTrackingLiveLink reference the Private folder of the AppleARKit module -Removed unused include and its private include path.
-
Removed the Plugins -> OpenXR Input project settings page. OpenXR now uses the list under Project Settings -> Engine -> Enhanced Input for its Input Mapping Contexts, and passes on their priority values when generating OpenXR action sets.
-
OpenXR: vive hand tracking layer breaks oculus runtime -Added a ProblematicOpenXRApiLayerInfos ini setting that defines specific ApiLayer versions that are behaving badly with regard to an extension. -Attempt to create the openxr instance by repeatedly calling xrCreateInstance with progressively more of the potentially problematic extensions not enabled. We will either find a combination that works or never find a combination that works. -This Cl also provides a structure for implementing further problematic openxr api layer handling, should a project need further workarounds similar to this.
-
IOpenXRExtensionPlugin: Add a new function for adding suggested bindings -Allow IOpenXRExtensionPlugins to add suggested bindings #contrib 10966
-
Changed default behavior to no longer automatically perform application-side HMD recentering when we receive the event XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING from the OpenXR runtime. FCoreDelegates::VRHeadsetRecenter is now triggered whenever we receive that event, whether we're in Stage or Local space. Most primary OpenXR runtimes now only recenter LOCAL space when performing a runtime-side recentering (this recentering is transparent to UE aside from the XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING event, and can often be triggered by e.g. holding down a system button). In order to give developers more control over application behavior, they now have the option of when and whether to perform application-side recentering. This can be done in blueprints by binding an event to HMDRecenteredDelegate, which is triggered by FCoreDelegates::VRHeadsetRecenter.
-
VisionOS OpenXR wrapper -Wrap the VisionOS immersive mode api in and OpenXR layer so we can run VisionOS immersive mode through OpenXRHMD. -Simulator renders in stereo and tracks the head correctly. No on-device testing has been done and the simulator only provides one eye view, so we can't be sure it will display the second eye correctly, but I tried to set it up so it would. -Very experimental. -Known problems: Using the intermediate back buffer. No features beyond basic head tracking and stereo rendering. Lots of unused code for features that needs to be updated or deleted.
-
OpenXR Supported XR_EXT_local_floor Extension. -Adds support for XR_EXT_local_floor as an optional extension. -Change tracking origin enum field names from 'Eye' to 'Local' to better fix openxr, and because 'Eye' wasn't a good description. Added 'View' to represent actual hmd centered space. View can be used for queries but cannot be used as the tracking origin. #contrib 10836
-
Added support for the XR_KHR_composition_layer_color_scale_bias OpenXR extension. On platforms that support the extension, it can be used to apply a color multiplier and offset to the main OpenXR composition layer using the UHeadMountedDisplayFunctionLibrary::SetColorScaleAndBias() blueprint node.
- Added support for changing foveation parameters at runtime.
Bug Fix:
-
Fixed VRPIE crashing when mobile multi view is enabled and editor window is not minimized.
-
GetMotionControllerData can fail in PIE because it gets a motioncontroller from the editor. -Comparing the motion controller's world to the WorldContext parameter of GetMotionControllerData to ignore motion controllers that are not part of the correct world. -Added a comment related to an ensure that can hit if VivePort openxr layers are conflicting with the meta openxr runtime.
-
Fixed an issue where XRScribe would crash when decoding a capture with an xrBeginFrame call that returned XR_FRAME_DISCARDED, which is considered a success return and should not impact emulation.
-
Fixed an issue where frustum culled primitives not visible in the primary instanced view would be incorrectly culled in secondary instanced views.
-
Assert due to NaN passed in from Oculus OpenXR runtime with valid bit set -Added an additional openxr function call failure handling branch. The runtime should be setting the flags invalid if it entirely fails, but at least one runtime in the past did not do that so we may as well handle call failure eplicitly.
-
Fixed modulated shadows in mobile multi view.
-
VisionOS: View lagging behind head motion.Fixed problem where we were doing the copy of the swap chain render target into the compositor services drawable BEFORE rendering to the render target instead of after, resulted in displaying pixels from swapchainlength-1 in the past. Now we are encoding the blits and the compositer services present into the main frame command buffer. -Fixed problem where we were caching the device positions for late update before we update them in the render thread.
-
OpenXR LoadMap causes lag of presented frame vs hmd -The two additional render thread pumps from RedrawViewports in LoadMap resulted in one xrWaitFrame on the game thread followed by three xrBeginFrame on the render thread. This violates the OpenXR spec and put us into a bad state with the SteamVR runtime (and perhaps other runtimes). -Fixed by adding a counter to the pipelined frame state so that we can tell if the xrWaitFrame that an xrBeginFrame is consuming has already been used, and early out. A cvar exists to disable this behavior, xr.OpenXRUseWaitCountToAvoidExtraXrBeginFrameCalls, which is true by default can be set to false at startup to disable it.
-
Fixed directional light shadow rendering incorrectly in editor with android vulkan preview and mobile multi view.
-
VisionOS: problem with view transforms -Fixed bug where hmd offset was applied twice. -Fixed bug where eye offsets were never applied.
-
Fixed an issue where XR would incorrectly use the "Screen Percentage Mode for Desktop renderer" rather than the "Screen Percentage Mode for VR" setting for its Default Screen Percentage.
-
Fixed OpenXRViveTracker crashing when no HMD is connected.
-
XRMotionController component when set to HMD produces log spam -Do the special case code for the hmd before trying the more generic code for controller poses because we log an error if we try the controller code with the HMD motion source. -Added "Head" to the motion sources provided by OpenXR, so it shows up in the motion controller dropdown. Made "Head" and "HMD" function identically, "HMD" is the legacy term, "Head" the more modern.
-
Fixes to mobile multi view with mobile hdr.
Deprecated:
-
Delete OpenVR from Engine\Source\ThirdParty, it has not been used in some time. -OpenVR has been essentially replaced by OpenXR at this point and this third party source is no longer in use.
-
AzureSpatialAnchors service retirement deprecation. -Marking the plugins as deprecated and logging a warning.
-
XRGestureConfig.h can be deleted in 5.4. -Deleted it, and the function that used it, and three more long deprecated blueprint functions.
Platform Mobile
API Change:
- For example, to enable VT only for iOS, add r.Mobile.VirtualTextures=1 under [/Script/Engine.RendererSettings] category inside your project IOSEngine.ini file.
New:
-
Enabled ShaderPrint and GPUScene debugger on the mobile renderer.
-
Integrate NdoL in the MergeLocalLight when done inline in the basepass
-
Clean unused shader permutation of the BuildInstanceIdBufferAndCommandsFromPrimitiveIdsCs
-
Rework GPUScene support on mobile platforms. Platforms that do support uniform buffer objects can now provide batched primitive data through UBO. There is a limit UBO range that can be accessed in shaders, so we group instances into batches that fit into this limit. Android uses 16KB views, some other platforms up to 64KB views. Mobile platforms that do not support UBO will use a desktop version of GPUScene.
-
Merge the Local Lights in Basepass for translucent objects when r.Mobile.Forward.EnableLocalLights == 2 #localization none
-
Expose bOverride_CastDynamicShadowAsMasked in MaterialInstance Editor.
-
Store the SpecularScale in the alpha channel of the MobileLocalLightTextureB of the MobileLocalLight pass MobileLocalLightTextureB is RGBA8 now from RGB10A2 Direction is stored in RGB8 using oct24 packed as 888
-
Add ability to enable support for Virtual Textures only on specific mobile platforms
-
Fix Local lights for some mobile devices drivers Change UAV of LocalLightBuffer from SINT to UINT
-
Added logging for cases where all mesh draw commands (MDC) are forced to re-cache. Re-caching all MDC is an expensive operation and this logging will help to identify when and why it happens
Bug Fix:
-
Fix a bug of black screen on Mac mobile preview with mobile deferred.
-
Fix a bug that the bloom luminance is not scaled by Exposure.
-
Fixed rendering of debug primitives on mobile when MobileHDR is disabled
-
Changed Depth and CustomDepth in a FGBufferData from half float to a full float. Half precision for depth was causing rendering artifacts in some cases
-
Fix RenderGraphValidation for localight prepass On mobile there is a separate FMobileDirectionalLightShaderParameters UB which holds all directional light data.
-
Fix a bug that the IndirectIrradiance applied AO twice on mobile deferred, it has applied AO in the base pass.
-
Fixed occlusion feedback (r.OcclusionFeedback.Enable) interaction with sub-queries
-
Fix indirect lighting of dynamic skylight on mobile
-
Fix r.Water.WaterInfo.RenderMethod on mobile devices
-
Fixed: Case where mobile deferred shading renderer was applying movable SkyLight contribution twice, once in BasePass and then in a shading pass
-
Reworked a loop for shadow cascade selection in mobile base pass shaders to avoid rendering artifacts on Adreno 7xx GPUs
-
Make sure "Memoryless" textures are discarded by RDG at the end of the pass
-
Clamp NumLocalLights to MaxCulledLightsPerCell in MobileLocalLightBuffer when Linked List Cull is disabled
-
- Sort depth pass instead of base pass if full depth pre-pass is enabled. 2. Disable auto instancing for the translucent passes on mobile
-
Require Mobile HDR when using Mobile Deferred Shading in Project Settings.
-
Fix pixelated sun with light shaft bloom enabled on mobile.
-
Fix a crash bug of missing MobileSceneTexture uniform buffer when rendering custom depth with TAA enabled on mobile.
-
Correctly disable GBuffer output for unlit opaque materials in a mobile rendering
-
Fixed wrong stencil settings for a sky mesh in a mobile rendering. This speeds up fog shading by excluding sky pixels from it #11106 #contrib 11106
-
Fixed float overflow in a mobile bloom shaders. This was causing rendering artifacts in a scenes with very bright lights
-
Clamp number of active scene captures for mobile Deprecate calling GMaxNumReflectionCaptures and GMobileMaxNumReflectionCaptures directly to avoid errors in the future
-
Fix sharp edges of spotlights when using mobile local lights buffer
-
Fix a bug that primitives use a light channel will lose sky lighting on mobile deferred.
- Change MobileLocalLightBuffer limit from (MaxCulledLightsPerCell - 1) to the correct MaxCulledLightsPerCell when LinkedListCulling is off
Android
API Change:
- For example, add GlobalDefinitions.Add("USE_STATIC_FEATURE_LEVEL_ENUMS=1"); into MyGame.Target.cs for Android platform to compile mobile rendering only binary.
New:
-
Add support for HWAsan in NDK 26, which is available on all phones running Android >=14.
-
Update GooglePlay dependencies to use play-services-games-v2 version 19.0.0. Added support for offline access to OSSGooglePlay
-
Enable memory tracing on Android. In addition to
-trace=memory
requirespackage_intdir/files/UEEnableMemoryTracing.txt
token file to exist to activate it as of now. -
Added bDontBundleLibrariesInAPK setting to significantly improving code iteration times by not bundling libUnreal.so in the .apk and instead pushing it separately. Opt-in and experimental as of 5.4.
-
Added UAT "-ScudoMemoryTracing" option to hook libc.so malloc/free/etc into memory tracer on Android.
-
Added option to request microphone permission for AndroidVoice module at startup (SplashActivity) to Android project settings
-
Enable Android Turnkey for launcher builds by default
-
Minor: Merge from FN-29 Do cleanup in LaunchAndroid.cpp and remove any logic that was experimental Minor: Cleanup runOnUiThread in SimpleContextWrapper.java BugFix: possible fix for FORT-699059
-
Enabling Vulkan Validation Layers on Android
- Added device profiles for Android Emulator choosing selecting Vulkan.
- Fixed Android device detection on the Android Emulator by falling back to an ES2 context.
-
Added Android static feature level and static platform information. This can be used to compile out rendering code that is irrelevant to mobile rendering only binary
-
[Android] Changed loaded SPIR-V compression algorithm
-
New: Adding AndroidSingleInstanceService plugin and engine code changes, Tested on Android with Lyra and also preflight checks.
-
New: Update AndroidSingleInstanceService plugin to properly generate ASISProject
-
Force Lowerst Lod for Sky Capture on Android
-
Support devices without lz4 compression for bDontBundleLibrariesInAPK
-
Adding support for >=2 Android devices in VS+AGDE when pushing libUnreal.so outside of .apk. Implements support for patching .vcxproj.user files.
-
PR #11247 : Add launch image for Quest devices
-
Added Android x86_64 architecture prebuilt files to launcher build
-
Enable using NDK 26.2.x
-
Report gl version string together with vulkan API version string on Android
-
Added Android SM5 device profiles for Adreno, Mali and Xclipse devices
-
Introduce short names for both
AndroidTargetPlatformControls
andAndroidTargetPlatformSettings
, which are causing certain built targets to run afoul of theMAX_PATH
limit we impose on UBT file path lengths. -
Enable support for non-4k virtual page sizes on Android
- Update Android Background Services dependencies to fix support for Android targetSDK 33
- New library versions: androidx.appcompat:appcompat:1.6.1 androidx.work:work-runtime:2.8.1
-
Improving iteration times by using llvm-strip output file argument instead of copying libUnreal.so.
- Update cmake to 3.22.1
Bug Fix:
-
Fix a sky capture issue in OpenGL that occurred when binding a mipmap as a RenderTarget and sampling from a different mipmap. Fix a artifacts caused by half precision in Pixel Shader on GL.
-
PR #11428: Create separate arm64 and x64 target platforms for use with AGDE
-
Added null clipboard item check for text input
-
Kill java,exe before clean step on Windows to fix locked files issue that sometimes occurs with minifyReleaseWithR8
-
Only add Android architectures to VS project enabled in project settings
-
Kill java.exe runtime before clean step on Windows to fix locked files issue that sometimes occurs with minifyReleaseWithR8
-
Mali read-only driver bug workaround
-
Fixed an issue with EMDoneTrigger timeout failure in SuspendApp_EventThread() Bug Fix: Fixed an issue introduced recently regarding swapping W/H in portrait mode.
-
Add back new/delete operator global visibility for Android shipping builds
-
Added Xclipse 940 chipset and GPU (5xx supported and falls through to low) device profiles
-
Fix FAndroidMisc::GetCellularPreference (was always returning 0)
-
Updated Android styles to more modern base theme
-
Leave only immutable texture path for GL(only use glTexStorage2D), don't set GL_TEXTURE_MAX_LEVEL as it isn't needed anymore
-
Fixed issue with Android env vars not always set on Mac
-
Fixed an issue by Restore how app_cmd_init and restore is handled (remove ASIS STANDALONE ifdefs that are no longer needed)
-
FSceneCapturePS has highp floats forced now to fix a driver bug FullPrecisionInPS can now be enabled on a per global shader basis and not just globally controlled by r.Mobile.FloatPrecisionMode
-
Check directory exists before adding to dependency check
-
Filter out VR manifest changes from AFS project APK (uses __ExcludeFromAFS="true" attribute tag)
- Refactoring onCreate for GameActivity and switching nativemain to use AndroidMain,
-
Updating ASISStub to properly handle activity change and theme change. New: Also added gradle build files for ASISStub to make it easier to use the sample android app to test Android
- Fixed crashes due to to guarding against isStandalone in GameActivity.java.template. this fixes some AndroidSingleInstanceService crashes and activity switching.
-
Also updated ASISStub and output ASISProject
-
Fix the Safezone updated incorrectly issue, the SafeFrameChangeEvent needs to be triggered after the orientation changed. Fix the Gyro broken issue.
-
Improved checking .so files to see if we need to rebuild the .apk
-
PR #8385: Do not shutdown voice module on app stop event
-
PR #11394: Fix Android Studio path detection for installs from JetBrains Toolbox
-
Fix Zen store connection on Android if multiple ip addresses available.
-
PR #11280: Fix missing dash symbol in ShortArchNames
-
Optimized GetNetworkConnection
-
Fixed Android Single Instance Service missing files for packaging and short name used in plugin's build.cs
-
Fixed fix missing include
-
AndroidSingleInstanceService fixes to address crash and activity/surface binding issues. known issues remaining: have to pause before switching surface binding (should be handled internally eventually) need to finish up the changes for compiling reference ASIS android studio project samlple. This will be in another submit.
-
Improved startup sequence for AFS server with updated UnrealAndroidFileTool executables (added pulldir command)
-
Fixed a crash when using Android Vulkan Mobile preview platform with Mobile Multiview enabled.
- Added protection to InputDevice check for gamepads
Deprecated:
-
Deprecated: changed logic so **STANDALONE_DEBUG_LOG messages in non standalone builds for android are only output in debug builds.
-
Deprecated: **remove AndroidSingleInstanceService from engine plugins.
iOS, tvOS, and iPadOS
New:
-
iOS15+ now requires an entitlement key to enable GameCenter.
-
Initial Privacy Manifest files for iOS and Mac
Bug Fix:
- Fix a bug that the loadValuesAsynchronouslyForKeys could be invoked after PlayerItem is released in AvfMediaPlayer 2. Fix a bug that the seekToTime could be invoked after MediaPlayer is released in AvfMediaPlayer 3. Fix a bug that the loading task is still running after the MediaResourceLoader is released in AvfMediaPlayer
RAD
New:
-
Adding the RAD Audio Codec. This is a perceptual audio codec that compresses better than Bink Audio with better quality and comparable speed / memory. It is available on all UE supported platforms.
-
TextureFormatOodle make all the versioned DLLs load on demand rather than loading all up front. Add config option to force use of latest Oodle Texture version rather than the sticky version on each texture.
-
Latest Bink tools.
Bug Fix:
- Fixed a rare race condition on Bink Audio decoder startup.
Rendering
API Change:
- CVARs that can be converted into compile time constants can be found in ReadOnlyCVARCache.h Associated defines should be added into MyGame.Target.cs.
New:
-
Added the DoubleFloat math library and refactored the majority of GPU systems to use it. This is a floating point format for performing double-precision math on GPU, that offers more precision and better reliability than the tile-offset system that was previously introduced in 5.0.
-
Add ray tracing support to Cable with WPO support.
-
Added r.ShaderPrint.DrawOccludedLines (by default set to 1), which allows to disable drawing lines behind geometry on demand. Useful for complex visualizations, where drawing occluded lines makes it too messy and hard to understand.
-
Implemented support for virtual texture feedback in ray tracing hit shaders.
-
Improved performance of the manual hair skin cache and enabled it by default. This removes the need to enable skin cache for a given project. This works properly only for regular skinning (no morph target).
-
Added a new project setting configuration for the renderer (MorphTargetMaxBlendWeight), to allow configuring per project morph targets maximum blend weights. This setting can be tested with in editor using the console command r.MorphTarget.MaxBlendWeight N (where N is the maximum value we want to test). The CVar value is reset when the editor starts to the configured renderer value.
-
Added bCastHiddenShadow property to FISMComponentDescriptor so hidden shadow casting state is copied from mesh components to ISMC's
-
Fix hair deep shadow in VR.
-
Add support for additional texture layout for groom cards/meshes. This allows more compact & effecient texture layout.
-
Moved GPU-Scene update to the end of UpdateAllPrimitiveSceneInfos (now FScene::Update) to enable more efficient and consistent scene updates for sub-systems that interact with GPU-scene.
-
Initial; implementation of per-instance occlusion query based culling Perform occlusion test per instance using HZB, followed by per-pixel test for instances that were visible Use the full depth buffer for per-pixel test with feedback from pixel shader through UAV buffer (one buffer slot per instance) Feed occlusion query results from current frame into instance culling pass for the next frame Gives an average ~20% reduction in number of drawn primitives for depth and base pass, improving performance in vertex-limited scenes Add CVar r.InstanceCulling.OcclusionQueries (default: 0) Known limitations for v1: No multi-view support (though groundwork is prepared for it) No support for large number of instances in GPU scene (limited by 1D compute dispatch size, implementation planned) No support for no-cull distance (needs to be generally implemented in the main instance culling code too)
-
Apply random color to instances when visualizing mesh distance fields.
-
Add OIT permutation to base pass shaders in order to handle runtime toggle. Add RHI ROV feature to know if the runtime RHI supports ROVs. OIT permutation is only compiled when the OIT project settings is enabled. OIT permutation allows to handle case where a platform supports ROV, but the actual RHI doesn't. This also allow to toggle OIT support at runtime (through quality settings for instance).
-
Added ability to turn some of the rendering read-only CVARs into compile time constants
-
Add Point/Curve trimming report into groom editor and remove warning report during building. This information is now only displayed at import time and within groom editor.
-
Fixed stats instance counting issue for hierarchical instance culling that led to underreporting the work
-
Add Vertex Factory controlled VSM constant bias that applies to Non-Nanite geometry
-
Add debug visualization for instance culling occlusion query renderer Enabled using ShowFlag.VisualizeInstanceOcclusionQueries=1 Modified FMobileSceneRenderer::ShouldRenderHZB() to take instance occlusion culling into account
-
Exposed rect light sampling on translucent to the render setting panel.
-
Add hair cards/meshes binding & deformation support for mobile renderer.
-
Reduced memory usage of Distance Field Scene.
-
Change GPU-Scene to use persistent primitive ID instead of the packed index to reduce change frequency.
-
Improve determinism of CitySample performance testing (when -Deterministic is used).
-
GPUScene upload optimizations - Removed some primitive setup work from the new InstanceSceneDataBuffers path (that is no longer needed) - Removed copy step for FPrimitiveSceneShaderData instead writing directly to the upload buffer. - Inlined FInstanceSceneShaderData build & cleaned up includes of InstanceUniformShaderParameters.h to reduce rebuilding - Cleaned up the FPrimitiveSceneShaderData a bit - Removed dummy identity transform and needless matrix work for single-instance primitives.
-
Moved VSM distant light invalidation logic before init dynamic shadows such that we can skip (non-nanite) mesh setup for fully cached lights.
-
enable lens flare pass in mobile platform
-
Added a cvar to force skylight cubemap blending per platform for forward shading.
-
Improvements to RHI performance when using raytracing hit shaders.
-
Improve noise on hair transmittance and shadow by replacing jitter noise with a blue noise function which removes structural noise.
-
Optimized Hierarchical Instance Culling update mainly by separating static and dynamic primitives along with some further low-level optimizations.
-
Added cook-time precomputed spatial hash for hierarchical instance culling, controlled via r.SceneCulling.Precomputed (default enabled).
-
Reduce cooked Groom size by 45%.
-
Avoid to build invalid groom bindings and add clearer error message when groom binding is invalid
-
Add holdout support for grooms.
-
HairCardsVF now supports PrimitiveID & GPUScene on mobile platform.
-
Added support for directional light in scattering for mobile volumetricfog.
-
Add r.HDR.Aces.GamutCompression (disabled by default) for HDR output so that we get a similar behaviour to the BlueCorrection parameter. https://docs.acescentral.com/specifications/rgc contains more details about gamut compression
-
Avoid re-creating whole rendering state for a primitive when MaxDrawDistance or InstanceCullDistance has changed. HLOD system often updates MaxDrawDistance and InstanceCullDistance for a big number of primitives which can cause performance issues on a weaker platforms
-
Added SkyAtmosphereLightIlluminanceOnGround node.
-
Add groom AutoLOD mode. This automatically scale grooms' curve count based on screen coverage and adapt the hair coverage to preserve the look in distance. AutoLOD can be enabled/disabled per project. Groom asset will use project setting, but can override it per asset (Default, Manual, Auto). AutoLOD is enabled by default which improves hair performance overall.
-
Removed r.OptimizedWPO as it is no longer useful and causes confusion as we default bEvaluateWorldPositionOffset to true for primitives.
-
Remove point to root index indirection as now interpolation already contains this data. This avoids an indirect fetch. This also fixed what looks like a long standing issue where the curve index was reinterpreted as the point root index.
-
Add Depth of Field Use hair depth property on PostProcessVolume.
-
Enable anisotropy on cards texture samplers.
-
Fixed bug in hierarchical instance culling that caused the footprint-based test to never be selected.
-
Add possibility to use strands guide as card guides for card groom having non-conforming topology (i.e. triangles strip).
-
Fixed incorrect implementation of parallel prefix-max operation in the instance culling load balancer. New version is also rather more efficient.
-
Deprecated UInstancedStaticMeshComponent public functions & data that concern a loosely supported ID mapping. This will be removed in favor of new ID based functions.
-
Optimize hair lighting for local lights by adding OnePass VSM ShadowMaskBit & OnePassHairTransmittance support for DeferredLightPS.
-
Batch groom LOD selection, groom interpolation, groom simulation to improve performance.
-
Move ray tracing instance culling completely to the GPU.
-
Added path to make instance culling context pull the instance count from the Scene and bypass Mesh Draw Command re-caching (new behavior can be disabled using the cvar r.InstancedStaticMeshes.FetchInstanceCountFromScene).
-
Added VSMResolutionLodBias to light scene proxy. Controls the resolution of the shadow map on a per-light basis
-
Made SceneUniformBuffer publicly accessible, allowing plugins to add their own data without modifying engine code. This buffer is included in many render passes.
-
Help compiler to compile out unused "Shading Path" renderer code on platforms with a static feature level. (This cuts ~2.5MB from a mobile only binary size)
-
Added cvar ('r.InstancedStaticMeshes.AllowCreateEmpty', off by default) to make it possible to create ISMs with zero instances.
-
Improved Render Thread performance in Ray Tracing code paths.
-
Added new SupportsLandscape() vertex factory flag, and removed hardcoded VF string checks determining if a landscape material should compile with a given VF.
-
Optimize groom asset & groom binding asset building (~4x speedup).
-
Improvements to deferred decal CPU performance.
-
Add TriStrip geometry support for hair strands and add project settings for hair tristrip geometry as not all project are compatible with this (e.g., 2 CVs short hair).
-
Add option to force velocity output for grooms.
-
SkyAtmosphere - added multiple scattering support on the directional second light for parity.
Bug Fix:
-
Fix global distance field not being built in some situations even though materials in the level require it.
-
Depth-of-field stays consistent when adjusting the Squeeze ratio on the cine camera.
-
Fix for HDR viewports not rendering properly when Slate.EnableGlobalInvalidation=1
-
Fix GPU crash when using OIT pixel sorting.
-
Fixed thick lines being clipped with ortho views because near clip distance is set to 1 then. This fixes the water landscape brush which relies on canvas draws for updating curves render target (!)
-
Fixed crash when using r.RayTracing.Geometry.MaxBuiltPrimitivesPerFrame to limit number of BLAS built per frame and Nanite is enabled.
-
Fixed volumetric fog extinction being affected by exposure.
-
Removed quadratic memory usage of detecting overlapping vertices when cooking skeletal meshes
-
Fix memory leak when the level editor viewport is set to realtime but it's not visible, e.g. if another editor is docked and active in the main window.
-
Fixed an issue where debug traces would fail to draw correctly in offset stereo views.
-
Fixed memory reporting for 2D array texture resident mips
-
Fixed some spline mesh rendering bugs on mobile platforms with GPU Scene enabled.
-
Fix crash in hair voxelization buffer allocation when having 16 macro groups or more, with large bounding boxes.
-
Changed contact shadows UI to be disabled if "Cast Dynamic Shadows" is off as this means contact shadows are disabled too.
-
Fixed incorrect colors in HDR screenshots.
-
Fix uninitialized Groom deformer OutputMask value causing the output position to not being updated consistently.
-
Fixed volumetric cloud not receiving high quality aerial perspective in the secondary far traced cloud buffer.
-
Fix missing cards data on multi-group /multi-geometry type grooms. For LOD0/LOD1, grooms have both strands & cards data. The LOD settings are set to strands geometry type for LOD0/LOD1 . When building the groom data, the cards data were discarded due to the mismatch of geometry type. It works for group0 as a matter of facts but all groups >0 would have not data being built.
-
Fix hair instance streaming sharing same asset.
-
Fix missing screen shadow casting on non-shadowed light for hair strands samples.
-
Fix incorrect groom shadow casting not respecting hidden in game / hidden shadow casting flags on instance.
-
Fixed a case where volumetric fog ambient would not be lit correctly due wrong ambient sampling source.
-
Fix hair flickering when LOD transit between strands and cards LOD.
-
[Custom Primitive Data] Fix crash when adding elements on a BP instance placed in the scene
-
Enable separate translucency depth upsampling on SM5 platforms instead of only d3d
-
Fix ResolvedView not resolve before using on MobileHQDof Setup Pass. Fix ScreenSpacePos caculate bug on MobileHQDof Setup Pass.
-
Fixed incorrect Distance Field / Card Representation when multiple mesh sections with different settings point to the same material slot.
-
Reenable depth bound test when computing shadow mask for hair shadow. This improves hair lighting cost.
-
[Custom Primitive Data] Fixing detail customization where the color picker would previously only commit the first channel.
-
[Custom Primitive Data] Prevent Colorpicker from closing when picking a color
-
Fix groom binding asset being rebuilt while being already cached. The logic for filling the DDC key, used later for warming local DDC, as incorrectly run too early. This causes the logic to check if data are available to fail, and forcing the data to be rebuilt.
-
Only include draw commands with HasPrimitiveIdStreamIndex flag in occlusion query instance culling list
-
Split hair binding root bulk/resources into seprate data/resources per LOD to fix crash when concurrent mesh LOD are streamed-in.
-
Fix reversed green and blue conditions for SetMeshConstantVertexColor
-
Fixed missing landscape geometry at the edges of the screen related to GPU culling that may happen at a certain landscape configurations
-
Fix incorrect local bound when creating dynamic instance uniform buffer. The local bound and (overriden) local to world transform were not expressed in the same space (original vs. overridden)
-
Fix for out of bounds GPU memory accesses (on some platforms) in ThreadGroupPrefixSum and VSM directional projection (Short circuit VSM page table lookup with out of range clipmap levels, avoids an out of bounds access on some platforms)
-
Fix missing bound scale on groom component.
-
Made ShadowCacheInvalidationBehavior override HasDeformableMesh such that it can suppress that behavior if needed.
-
Fix hair/groom view mode in cook build.
-
Fix cached raytracing instances not being updated when mesh LODs are streamed in/out causing incorrect LODs to be used in ray tracing.
-
Fixed crashes caused by Spline Mesh and Hierarchical Instanced Static Mesh components creating scene proxies while their mesh has LODs that are not streamed in.
-
Fixed incorrect ray tracing culling of ray tracing instances using WPO.
-
Fix hair cards/meshes reloading when changing assets properties.
-
Fix a bug of CSM caching that the static primitves are renderred twice.
-
Fixed an issue with D3D12 where failing to allocate a resource might not report to the user that it is out of memory.
-
ShouldPrepareDistanceFieldScene should return true when VisualizeMeshDistanceFields or VisualizeGlobalDistanceField is active
-
fix .exr/.pngs sequence alpha channel corrupted with MRQ on some platforms.
-
Fixed case where StaticMesh will not be rendered if component overridden MinLOD is less than StaticMesh MinLOD
-
Fixed: missing Texture2DArray information in a 'listtextures' command dump
-
[Custom Primitive Data] Fix issue where editing the Custom Primitive Data fields on a BP instance in the world didn't stick.
-
Add coverage/tangent fallback on card groom when no texture are provided.
-
Fix ensure when accessing the default material during water PSO collection from the game thread
-
Only pass PerInstanceRandom parameter from VS through interpolators only if PS uses it. Also fixed broken PerInstanceRandom for cases where GPUScene is disabled
-
Fix incorrect group names when groom does not have group ID mapping.
-
Fix missing group name on groom asset once imported.
-
Fixed inaccurate luminance/illuminance meter values in Visualize HDR mode.
-
Fix for VRS getting disabled on projects using film grain (i.e. CitySample)
-
Fix for leaking render objects on app exit caused by EngineLoop not processing the last set of pending cleanup objects it acquired
-
Request full garbage collection when FPreviewScene is destroyed to ensure that the PreviewWorld is destroyed immediately, together with any GPU resources it might still hold through FScene. The preview world is a heavy-weight object and may hold a significant amount of resources, including various GPU render targets and buffers required for rendering the scene. Since UWorld is garbage-collected, this memory may not be cleaned for an indeterminate amount of time. By forcing garbage collection explicitly, we allow memory to be reused immediately.
-
Fix CoordU channel not being correctly generated during hair strands texture generation.
-
Fix OIT sorted triangle index buffer crashing on creation due to data not being streamed-in at creation time. When the data are not ready yet, this CL postpone sorted index buffer initialization later, until the data are ready.
-
Fixed an issue where Contrast Adaptive Shading (Tier 2 VRS) would not be applied correctly to views with constrained aspect ratios (black bars).
Deprecated:
- Deprecated IPersistentViewUniformBufferExtension.
Architecture
API Change:
- Changes to custom render pass API :
- Made all class members protected/public in order to help with eventual deprecation Added utility to have a custom render pass perform a render capture operation (full capture, begin capture, end capture) when it runs Added BeginPass / EndPass functions, that run right before/after PreRender/PostRender, which are only really useful for properly scoping the render capture operations described above BeginPass/PreRender/PostRender/EndPass are now non-virtual. Child classes now have to implement the virtual On[...] version of them Added proper class for custom render pass user data (same lifetime as the render pass) and allowed multiple user data to be attached to a custom render pass, identified by a FName, which allows custom render data to be retrieved in a safe way by any module. Currently, the system was only used by landscape so it was working, but really, any render pass could hold any kind of user data so this would have crashed * Added bare-bones RTTI system to both render passes and render pass user data (GetTypeName). Use IMPLEMENT_CUSTOM_RENDER_PASS (and IMPLEMENT_CUSTOM_RENDER_PASS_USER_DATA, respectively) to implement it
-
You can use the new SetMeshDrawCommandStatsCategory() on primitive components to set category types for the new stats.
-
We still need to maintain old SoftObjectPtr reference (and sync load) for backwards compatibility. Also note that the new system depends on the AssetManager seeing the EditorOnly reference. So existing content will need a resave to take advantage of the new system.
- Added GetShaderResourceTexture() to FRenderTarget that returns the RT's RHI texture resource by default but can be overridden to return another one, for classes where the shader resource RHI may differ from the render target resource RHI (FTextureRenderTargetResource and its child classes : e.g. FTextureRenderTargetCubeResource)
New:
-
Optimized compute pipeline state creation/management to use a thread local cache like graphics already does, avoiding significant write lock performance problems in ExecuteSetComputePipelineState.
-
- Changes to custom render pass API
- Fixed water info render captures (r.Water.WaterInfo.RenderCaptureNextWaterInfoDraws) when running with custom render passes (r.Water.WaterInfo.RenderMethod 2)
- Changes to custom render pass API
-
Add mesh draw command stats collection. This collects information about each draw call in each pass used during mesh draw command rendering. It reads back indirect args to get the correct final rendered instance and primitive counts after GPU culling. Use "r.MeshDrawCommands.Stats" to show the new stats on screen.
-
Fix PreskinnedNormal of skeletal mesh when skin cache is on
-
Added a VulkanRHI vkTrimCommandPool call between map loads to free up extra memory reserved for command buffers
- Added support for per instance LOD on InstancedStaticMeshComponents. This improves on the old behavior which would select a single LOD for all instances based on the full ISM bounds. LOD is handled by the GPU instance culling system.
- The new approach is used if GPUScene is enabled and instance culling is enabled and bUseGpuLodSelection is true on the component. Also the consolevariable "r.InstancedStaticMeshes.GpuLod" can be used to turn the system on and off.
-
Break apart FD3D12DescriptorCache SetSRVs, SetUAVs, and SetSamplers so you can allocate and copy GPU descriptors and retrieve the handles without actually setting descriptor tables (needed for an upcoming GPU feature).
-
Added an option for InstancedStaticMeshComponents to use conservative bounds.This will not iterate over all instances to recalculate the bounds on every instance add/remove/transform update. But instead will maintain a conservative bounds that can only grow. This is an optimization for the case where we might have very high instance counts causing the bounds calculation to become very expensive. The behavior is off by default, and controlled by SetUseConservativeBounds(). Even when the option is turned on for an ISM, we keep the existing behavior whenever the number of instances is below "r.InstancedStaticMeshes.ConservativeBounds.Threshold".
-
Implementation of Custom Render Pass - Supports rendering depth prepass and base pass, output scene color and depth - Replacing the underline implementation of rendering scene capture depth as additional scene view - Added water plugin support
-
Reduce default file cache size used by virtual texturing. Add profiling to track file cache usage.
-
Refactored D3D12 ray tracing descriptor heap/cache functionality into a more generic utility usable outside of ray tracing when explicitly managed descriptor tables are necessary (includes renaming FD3D12RayTracingDescriptorHeapCache -> FD3D12ExplicitDescriptorHeapCache, FD3D12RayTracingDescriptorHeap -> FD3D12ExplicitDescriptorHeap, FD3D12RayTracingDescriptorCache -> FD3D12ExplicitDescriptorCache)
- The material NaniteMaterialOverride no longer uses a SoftObjectPtr to hide from the cook. Instead we take advantage of new SkipOnlyEditorOnly cooking and use an EditorOnly ObjectPtr instead. This avoids issues with sync loading during PostLoad().
Bug Fix:
-
Fix D3D12 TerminateOnOutOfMemory to not pop up a message box when running -unattended, causing build machine jobs to spin for 30m until timeout instead of crashing in just a couple minutes.
-
Add GPU instance culling to decal passes. This fixes an issue where HierarchicalInstancedStaticMeshComponents containing decals would only show a single instance.
-
Add custom depth support to nanite geometry collection.
-
Fixed RDG validation with indirect args being accessed in a debug shader as a structured buffer while indirect args are actually plain buffers
-
PR #10647: Fix RoundUpToVSyncError value in FDynamicResolutionHeuristicProxy::RefreshCurrentFrameResolutionFraction_RenderThread() #contrib 10647
-
Fixed synchronous read back functions for cube textures
-
Fix follower component lagging behind lead component. Dynamic data updates for skinned mesh components happen in parallel, i.e. follower component can update before lead component. As follower component relies on lead component's current revision number, updating the revision number in dynamic data updates create race condition. So change back to updating current frame revision number immediately when animation updates, and add a previous revision number variable to help calculate current revision number.
Deprecated:
- Removed RenderTargetTemp.h, which isn't used anywhere anymore
Lighting
New:
-
Fix alpha channel in Ray Traced translucency and add Holdout support The alpha channel is now tracked like in other passes (it was not working consistently before). This applies both to RT translucency and the RayTracing Primary Ray debug view.
-
Remove deprecated RTGI indirect lighting technique Lumen is a superior alternative in all cases and is the supported system going forward.
-
RayTracing: Implement a new light grid used in raytracing passes (Translucency and Lumen Hit Lighting) based on the method used in the Path Tracer The new light grid can localize the influence of each light better than the previous system, reducing the number of lights that light loops need to process. This refactor also allows more than 256 lights (no code was actively depending on this limit anymore). However there is still a fixed number of lights available per grid cell. Using the "Light Grid Occupancy" Ray Tracing Debug mode can help visualize where this might be occurring. The following cvars can be used to control memory usage and performance: r.RayTracing.LightGridResolution: Resolution of the 2D grid which holds lights r.RayTracing.LightGridMaxCount: Maximum number of lights per grid cell (if there are fewer lights than this in the scene, that number will be used instead)
-
Added cvar to mark only even/odd mips from local lights. This can be used to cut down on instance duplication, which can be a New performance cost especially for higher poly/larger non-nanite meshes. r.Shadow.Virtual.MarkPixelPagesMipModeLocal Even mips mode (1) cuts down on instances but can increase the resolution vs. the default mode for some pages. i.e. fewer instances/vertices, but more pixels. Generally a performance win for non-Nanite geometry, but a potential performance loss for Nanite geometry. Odd mips mode (2) cuts down on instances and resolution so has a higher performance benefit, but can be a noticeable loss in resolution. From Pari at The Coalition
-
Removed "Draw only VSM invalidating objects" and associated code. This had been broken for a long while and there are different visualizations available now.
-
Support nanite overdraw visualization in VSMs. This is preliminary and subject to change but lays the groundwork for more nanite-related VSM visualizations.
-
Respect bCastShadows and bCastRayTracedShadows in Lumen / Many Lights HWRT.
-
Only Destroy/Add Light Primitive Interactions when needed on light transform update On mobile this means we only invalidate MDC's when needed
-
Add support for rect light texture to volumetric fog.
-
Added VSMTexelDitherScale to the light scene proxy, analogous to r.Shadow.Virtual.SMRT.TexelDitherScale
. Controls the amount of temporal dither filtering applied to shadows on a per-light basis. - Add virtual shadow map "dynamic resolution" controls that can decrease the global resolution LOD bias based on page pool pressure to avoid page pool overflows.
- Relevant new cvars: r.Shadow.Virtual.DynamicRes.MaxResolutionLodBias (maximum amount it is allowed to modify, default 2) r.Shadow.Virtual.DynamicRes.MaxPagePoolLoadFactor (page pool filled factor beyond which the bias will begin to apply, default 0.85)
-
Improve sampling of specular highlights at high roughness to minimize the number of wasted rays
-
PR #11174: Add LowerHemisphereColor to fast path for updating skylight scene proxy #contrib 11174 #11174
-
Allocate VSM shadow mask slots based on pruned light grid rather than relying on sorted light order. This avoids issues with simple lights getting sorted to the front of the list (required for some other passes) and wasting slots, and makes the allocation more robust against light ordering..
-
Add light channel support for cluster shading. This allows to batch more lights through the cluster shading path.
-
Added lighting channels support for VSM.
-
Add rect light support for cluster shading.
-
Added EditCondition to light transmission to force user to set the light to moveable prior to activate light transmission.
-
Add IES Atlas support for translucent surface.
-
Change default VSM page marking to 2x2 stride. This lowers the overhead of the page marking pass and to date has not produced any artifacts.
-
Skip unnecessary page marking and SMRT work for shadow receiver pixels behind rect lights From Pari at The Coalition
-
Fix incorrect ref counting decrement when texture are removed from rect. light texture manager.
-
Integrated Bend Screen Space Shadows in Mobile Renderer.
-
Add support for IES profile in cluster shading pass.
- Changed the default value r.Shadow.Virtual.ForceOnlyVirtualShadowMaps to 1. Primitives that are incompatible with VSM will not be rendered, but performance and memory is improved.
Bug Fix:
- Fix issue with r.SceneCulling 1 where instance culling was not respecting the detail geometry flag (and thus rendering all the small stuff into coarse pages)
- Make clipmap visualization colors based on absolute level so they are consistent with the clipmap virtual address space visualization
- Add a cvar to scale the size of the nanite occluded instances buffer. This is not really a proper fix for overflows, but the cvar allows testing if flicker/shadow issues are due to this.
-
Add support for directional light's ShadowAmount for hair mask shadow and fix incorrect shadow mask channel writting in hair mask shadow.
-
Fix rect light filtering border with non power of two texture. This fix invalid colored at texture border which could happen since the atlas is never cleared.
-
Fix the screen space denoiser causing ray traced transmission leakage. Add another bilateral filtering weights specific to transmission for Screen space ray traced shadow denoising. So shadows on subsurface profile will behave the same to other material, and the transmission will be filtered separately. The spatial filtering weight will be set to 0 if the reference and the neighbor pixels are not all subsurface profile. Suggest: Increase r.Shadow.Denoiser.PreConvolution to 2 to remove the border line neglectable transmission artifact due to temporal accumulation if needed.
-
Fix distance field shadow on SLW.
-
Fix Reflection capture removal causes the primitive GPU state become dirty.
-
Fixed per-object / modulated shadows in mobile forward renderer.
-
Fixed some bugs causing incorrect results in DFAO.
-
Fixed an issue where non-VSM shadows were missing for Nanite geometry if there was no static shadow map. Nanite primitives are now included in static, non-static and uncached shadow maps instead of static only, and use Nanite primitive filtering to select the primitives with the matching mobility on GPU.
-
Fixed issue where distance field shadows and far shadow culling would not work correctly when r.Shadow.Virtual.ForceOnlyVirtualShadowMaps=1
-
Fixed popping in distance field shadows when new distance field mips are streamed in.
- Fix hash collisions in raytracing auto-instanced mesh batches
- In some rare cases different materials could be detected as identical by the ray tracing auto-instancing code, leading to incorrect appearance. This was most noticeable with path tracing which uses ray tracing for primary rays, but could happen in any ray-tracing based pass as well.
-
Fixed incorrect upsampling in distance field shadows that caused minor artifacts.
-
Fix incorrect rect lighting on translucent light grid.
-
Fix overflow when computing rect light texture MIP causing incorrect atlas packing.
-
Fixed bug where downsampling capsule shadows would cause a crash in rare cases due to a groupsize of 0
-
Fixed issue in distance field shadows when using r.HeightfieldShadowing.
- Solve OOB access of FLocalLightData when LinkedListCulling is off. Add GetMaxLightsPerCell that returns GMaxCulledLightsPerCell when LinkedListCulling is off and NumLocalLightsFinal when it is on Replace calls of GetNumLocalLights with the GetMaxLightsPerCell where it would cause an OOB if used with LinkedListCulling off
Lumen
New:
-
Added multi-bounce reflection support for standalone Lumen reflections.
-
Added performance overview view mode to Lumen. It visualizes pixels requiring dedicated reflection rays and is useful for reflection performance optimization. Accessible either from the Editor UI or from console (r.Lumen.Visualize 2).
-
Implemented wave32 wave ops version for ScreenProbeConvertToIrradiance in order to make it faster on GPUs which support wave32, but don't support wave64.
-
Added support for multiple scattering approximation w.r.t. project setting
-
Release Lumen GPU resources when Lumen is being disabled at runtime.
-
Optimized Global Distance Field update by overlapping clipmap updates and merging initial culling pass.
-
Log asset name when encountering a mesh card with corrupt derived data.
-
Optimized FLumenMinimalPayload size by replaced PrimitiveIndex and PrimitiveInstanceIndex with a single GPUSceneInstanceIndex.
-
Added capture of translucent meshes into lumen card for ray traced lumen reflection&refraction.
-
Exposed screen space trace settings in the Post Process Volume
-
Add light function altas support for Lumen scene lighting. This allows all ligths with (compatible) LF to be batched during Lumen scene lighting (-0.1ms)
-
Replaced float epsilon comparison in Lumen Front Layer Reflection with a float precision relative one to make reflections work the same independent from the camera distance.
-
Reduced leaking caused by the World Space Radiance Cache.
-
Disable RAY_FLAG_FORCE_NON_OPAQUE when it's not needed - it's only used for a short distance from the surface in order to skip back faces in some tracing methods. This speeds up Lumen with hardware ray tracing by 0.1-0.2ms on consoles.
-
Turn noise into less noticeable structured error by constraining random ray directions to a smaller subset which can be handled by a temporal accumulation.
-
Don't build the ray tracing light grid when it isn't used. This saves ~0.12ms on consoles when hardware ray tracing is enabled.
-
Improve Lumen card add/remove. Change most of the tracking logic to use bitfield for fast indexing (2x/3x improvements).
-
Change Lumen scene lighting to batch light with IES profiles since IES profile are now atlased and can be dispatched in one pass. Save 0.1ms during LumenSceneLighting with 100 scattered IES lights.
-
Exposed "Max Roughness To Trace Reflections" the in Post Process Volume. New CVar r.Lumen.Reflections.MaxRoughnessToTraceClamp can be used to clamp it for scalability purposes.
-
Fixed light function to be clamped, avoiding making shadow area too bright.
-
Merge Lumen mesh cards requests allocation to remove array growing cost. This reduces UpdateSurfaceCacheMeshCards from worst 54ms -> 14ms avg: 28 -> 5ms.
Bug Fix:
-
Fix race condition between Lumen scene lighting, and atmosphere transmittance update. This could cause some flickering when the directional light parameters are animated (which would reset the directional light transmittance value).
-
Don't require DFAO to be enabled in order to compose Landscape into the Global Distance Field, as other systems like Lumen may also be using it independently.
-
Fixed "r.Lumen.ScreenProbeGather.Temporal.RejectBasedOnNormal 1" causing artifacts due to mismatching history scene normal (overwritten by water) causing constant temporal history rejection.
-
Fixed cloud shadow support
-
Fixed crash when using SM5 shaders with hit lighting. Hit lighting uses wave ops inside ComputeDirectLighting, which are not supported on SM5.
-
Fixed crash when only Lumen translucency volume is using hardware ray tracing
-
Fixed stale indirect lighting bug when switching scalability levels or switching GI quality through the Post Process Volume.
-
Fix missing normal bias for screen space reflection tracing.
-
Fixed Lumen Screen Probe Gather when tile tile classification is disabled.
-
Fixed Lumen cards for landscape : those require the landscape fixed grid vertex factory now (this was working in the editor because of an unrelated bug) * Included those shaders in PSO precaching as well
Materials and Shaders
New:
-
[Shaders] - Implement recompile shaders on file save functionality for the editor. - Adds a directory watcher to watch for changes in //Engine/Shaders/... for usf/ush/h files. - When a file changes issue a
recompileshaders /Engine/Shaders/Private/PostProcessGBufferHints.usf
command. - This code should be WITH_EDITOR only. - This is opt-in behavior and can be turned on with r.ShaderCompiler.RecompileShadersOnSave=1 -
Modify Cvar r.Shaders.WarningsAsErrors to only apply to global shaders when value is 1 (and all shaders only when value is 2 or more) The default value is still 0 (off), but this gives a better mechanism to investigate shader warnings on global shaders.
-
[Shaders][Optimization][EditorInitiative] - Instead of calculating the Material DebugGroupName for every shader we draw with, calculate it once per material and cache it. - TryGetShaders submits shader jobs for missing shaders. If a shader was missing it would calculate a DebugGroupName for the material for each shader. - Instead we now cache this once and store on the FMaterial. In my test scenario I saw large speedups on the Render Thread: - ~7x speedup to the average render frames that were heavy w/ draw command building after opening a map. - ~4x speedup to the worst case render frames.
-
Holdouts: Implement the holdout flag for the deferred renderer When the holdout flag is enabled, the object will render black with an alpha matching the background. This is implemented with an extra condition in the basepass. The logic is only added to the base pass pixel shader when the project is configured to have post processing of the alpha channel to minimize the impact on games.
-
Allow warnings as errors cvar to be set per platform
-
[Shaders][Material Editor] - Add generic, data driven key, value shader statistics. - Shader stats are simply key (FName) and value (POD types) that are stored per-shader. - A Shader Statistic is a variant that can take on the following POD types: bool, float, int32, uint32 - Currently don't support strings since those weren't as trivial to implement (needed conversion and special case code to support serializing these to the memory images required by shader maps) - Adds another shader statistics row in the Material Editor that will show the platform specific stats. - The platform statistics are turned into a comma and newline separated string that is displayed to the user. - Bump the shader output worker version since I'm changing the output file format (to contain the stats). - The shader compiler output stores the stats as a
TMap<FString, FShaderStatVariant>
. Serializing across FNames between Shader Compiler Worker and the main process wasn't working (different name tables). - When storing and serializing the stats to the shader map we convert them to FNames. (seeFShader::FShader()
) -
[Shaders] - Discard non-stripped, original shader source to save on memory. Saves ~2x of the memory tracked by the LLM tag ShaderCompiler in small projects. For Lyra this saved ~600MB during a cook. - If we need the shader source (i.e. material stats in the editor) we still keep the data around. The editor compiles shaders on demand and doesn't try to load these from the DDC so we don't have to worry about cache pollution. - Shader Debug Info also needs this information so we keep it around if developers are running with this enabled. - Added a helper function to the job input which determines if we need to store the original source code. NeedsOriginalShaderSource()
-
[Shaders][ODSC] - Implement on demand shader compilation when recompile all materials after saving a material function. - Reduces shaders compiled from 13,000 to 300 in my test case - ~4 seconds saved in UMaterialFunctionInterface::ForceRecompileForRendering due to not having to build and submit shader jobs.
-
Add prioritization to the categories on UMaterials The order is the following organized by most important and grouping similar areas together: - Material - Nanite - Translucency - Translucency Self Shadowing - Refraction - World Position Offset - Post Process Material - Mobile - Forward Shading - Physical Material - Physical Material Mask - Usage - Lightmass - Previewing - Import Settings
-
Transformed MaterialTemplate.ush to use named parameters
%{num_tex_coords}
instead of%s
positional parameters. - Introduced Material Translation DDC caching.
- This update introduces a caching system for material translation outputs. Now, after a material is translated, the intermediate results are saved in the Derived Data Cache (DDC) for later use. When a translation for a material is needed, the system first queries the DDC for the existing combination of the base material, parameter sets, and platform-specific information. If this data exists, the stored results are retrieved, bypassing the need for a costly translation process and separating material translation from shader generation. The key benefit of this update is that updates to the material template source file or any dependent shader files no longer require the material to be retranslated. The material shader can still be generated accurately using the cached translation results. This ensures that the material string generation consistently uses the most current input shader files.
-
Add dynamic ray traced translucent shadows (off by default). It is available to high end PC. 1. Change the default to not trace translucent materials for shadow to align well with Lumen where translucent material does not cast shadow. 2. Use 'r.RayTracing.Shadows.Translucency 1' to turn on the dynamic ray traced translucent shadow. The shadow term is the accumulated visibility based on opacity.
- With UE 5.4 we have done a fairly significant overhaul of how shader compilation jobs are queued, where shader compilation-related work in the cook process is executed (significantly improving parallelization), and how we identify and cache potential duplicate shader jobs. Significant effort has also been invested in optimizing all parts of this pipeline. The results of this work:
- Approximately 30% fewer shaders compiled due to improved deduplication (numbers from internal projects, your mileage may vary)
- Significantly less game thread overhead when submitting and processing shader compilation work
- Significantly faster shader preprocessing
- All of the above have contributed to a drastic improvement in project cook times, particularly when shader invalidations occur.A quick overview of what we're doing differently under the hood:
- Shader preprocessing and deadstripping is now executed in the cooker/editor process as part of job submission, rather than being the first step of the compile process.
- Cache keys for individual shaders (used for the existing in-process job cache, and for per-shader DDC entries) are constructed based on this preprocessed & dead stripped source.
- As a result of the above, when per-shader DDC queries are enabled this can drastically reduce the amount of shader compilation work that is needed when a shadermap is invalidated, since results for individual jobs may already be available in the cache. Even without per-shader DDC, however, this still provides an improvement due to improved deduplication of jobs via the existing in-memory job caching mechanism. Note that as of 5.4, per-shader DDC is still only enabled by default for the editor on-demand shader compilation usage; however as an experimental feature for 5.4, we've added the ability to cache individual shader compilation results via DDC during cooks. When used in conjunction with a shared DDC via ZenServer, this reduced impact of shadermap invalidation extends to the cook process - in usage in internal projects this has reduced the frequency of cooks which compile a large number of shaders by an order of magnitude. If you'd like to experiment with this feature you can enable the following cvars: r.ShaderCompiler.PerShaderDDCCook=true r.ShaderCompiler.JobCacheDDCEnableRemotePolicy=trueWe expect to enable these by default for UE 5.5. Note that it is not recommended to use this feature in conjunction with a file share based shared DDC; the overhead of pushing/pulling data from the fileshare outweighs the benefit (shared Zen server is much more performant).Note there are a couple of caveats to be aware of with the preprocessed shader job caching feature:
- When per-shader DDC is enabled (via ODSC or otherwise) it's no longer a guarantee that any change to a shader source file will trigger compilation; whitespace, comments, and dead code will all no longer result in mutation of the key used to identify a particular shader compile job. To force a shader invalidation you must now use a new mechanism based on #pragmas, see ShaderVersion.ush for an example of usage. This file as such can still be used to force recompilation of all shaders - however all such pragmas found during preprocessing will be automatically included in the hash we use as the cache key for shader jobs, so it's possible also to perform more granular/targeted invalidations with this mechanism.
- The shader source passed to the compiler is now stripped of all comments, line directives and blank lines. As a result when debug information is generated for shaders, filename associations will not be available when inspecting via debugging tools (RenderDoc and friends). If this is problematic, the feature which controls this has a cvar toggle and can be disabled locally via: r.ShaderCompiler.PreprocessedJobCache=false
-
CookShadersCommandlet for generating a subset of shader symbol files based upon input params Can filter from a ShaderSymbols.info file, or by material name directly
-
Expose virtual texture physical pool settings in the project engine settings UI. Enable live edit of the settings, with physical pools being recreated on changes. Add config option to auto grow physical pools whenever a pool is oversubscribed. The config option applies in editor only. There is an additional consolevariable "r.VT.PoolAutoGrow" that does the same thing in cooked builds.
-
Added logging of total shader compile worker memory usage in out-of-memory conditions
-
Do not compile Raytraced input on a RayTracingQualitySwitch material node for platforms that do not support ray-tracing
-
Change D3D diagnostic buffer to output readable assert message (file/line/condition/message). Use with check() / checkf()
-
DirectXShaderCompiler (DXC) has been enabled by default for all remaining SPIR-V shader backends.
-
Added a 'default' overlay material option to a skeletal mesh asset. When assigned this overlay material will be used if component does not override it
-
Properly aggregate material stats when performing multi process cook. These stats will be reported when we report shader stats: === Material stats (aggregated across all cook processes) === Materials Cooked: 1583 Materials Translated: 1275 Material Translate Time: 1.70 s - Materials Cooked, Materials Translated, and Material Translate time are the stats that are aggregated and reported to analytics. - Piggyback the material counters aggregation in the existing shader stat aggregation for simplicity. - Removed outdated, or not impactful material cook stats. In most cases these values are extremely low and don't matter for a cook.
-
Added new runtime virtual texture "Displacement" format intended for use with Nanite displacement. This uses a 16bit UNORM texture, or when set to compressed will use BC4.
-
[Shaders] - Add LLM markers to track memory of shader compilation to help diagnose out of memory issues. - Instruments: (FShaderCompilingManager::SubmitJobs, FShaderCompilingManager::ProcessAsyncResults, GlobalBeginCompileShader, FShaderJobCache::FindOrAdd)
-
Add a toggle r.AreShaderErrorsFatal which controls whether or not DefaultMaterial and global shader errors are fatal. - This defaults to
True
, which is the current behavior. - The idea is to turn off Fatal errors (and just Error) in situations where we want to see all shader compile errors and not simply just stop when Default Material or global shaders fails. -
[Shaders] - If shader dev mode is on assume that any shader errors from materials are due to source code (and not the material graph). - This way shader retry on error works for material shaders (right now it only works for global shaders and the default material). todo: Fix a bug that causes the retry on compilation to still report the errors even after they are fixed.
-
This change modifies the chain of shader preprocessing to avoid back-and-forth conversions between wide and ANSI characters, providing a significant performance boost to shader preprocessing time.
-
Make support for virtual texture 16bit page tables configurable using the consolevariable "r.VT.Support16BitPageTable". Defaults to on which is the existing behavior.
-
Added support for a writing fixed color when baking the low resolution streaming mips for a runtime virtual texture. This replaces the fixed "debug" color and allows us to use the feature outside of debug usage. Added r.VT.RVT.MipColors consolevariable which uses the fixed color support to generate runtime virtual texture pages using debug mip colors. This is useful for debugging issues with materials sampling higher resolution mips than expected. Added support for custom expansion distance for runtime virtual texture volume bounds.
-
Modified the code that adds comments to all shaders containing all define names and values such that this is only added to the debug USF file rather than being included in the shader source passed to the compiler.
-
Significantly refactored the shader preprocessing code such that all shader formats now execute a common function for the bulk of preprocessing, and those that have their own implementation only deviate in minor ways from the common path (typically by setting additional defines that are not known at job creation time).
-
Add a command line option to the cooking server to skip cooking unsolicted packages. - This adds
-odsc
which for now just skips unsolicted packages. - This would only be used when you are launching the cooking server to just process ODSC recompileshader requests and not cooked packages. -
Do not compute per-instance parameters (fade amount, show/hide, dither) in a vertex shader if material does not use them
-
ShaderMinifier - Use memstack for various temporary allocations
-
Added translated world space (camera-relative) options to several material expressions with a worldspace input or output. Using translated worldspace is more performant and more precise than absolute world position.
-
ShaderMinifier - Optimize BuildLineBreakMap, SkipUntilNonIdentifierCharacter, ExtractIdentifiers and few other bits Generate line directive map during parsing Use xxhash instead of cityhash Avoid FStringView operator [] in ExtractIdentifiers Use TArray Reset instead of Empty where appropriate Vectorize SkipUntilNonIdentifierCharacter Vectorize ExtractBlock Vectorize line ending search Use FString directly instead of FStringBuilderBase for the final output to avoid a copy
-
Added a new "Always Evaluate World Position Offset" material property to force World Position Offset to be always evaluated, meaning that it cannot be disabled by "Evaluate World Position Offset" or "World Position Offset Disable Distance" on the component.
-
Added an API to get approximate committed memory usage for local shader compile workers
-
Remove non-WPO position from interpolators if pixel shader does not need it
-
Report the number of shader type and vertex factory type permutations to cook analytics. - Aggregate all the shader type permutations and report them as
Shaders_NumShaderTypePermutations
- Aggregate all vertex factory type permutations and report them asShaders_NumVertexFactoryTypePermutations
-
Implement
recompileshaders listtypes
command. - This dumps a list of all shader types and vertex factory types in the engine. It is dumped in csv format and includes class name and shader file name. - This list is useful in combination with otherrecompileshaders
commands to compile a single shader (where you need the file name). - Minor formatting and whitespace fixing. Example: Cmd: recompileshaders listtypes ShaderTypeName, Filename FHardwareVideoDecodingYCoCgAlphaPS, /Plugin/WmfMedia/Private/MediaHardwareVideoDecoding.usf FHardwareVideoDecodingYCoCgPS, /Plugin/WmfMedia/Private/MediaHardwareVideoDecoding.usf FHardwareVideoDecodingY416PS, /Plugin/WmfMedia/Private/MediaHardwareVideoDecoding.usf ... VertexFactoryTypeName, Filename TWaterVertexFactory< true>, /Plugin/Water/Private/WaterMeshVertexFactory.ush TWaterVertexFactory< false>, /Plugin/Water/Private/WaterMeshVertexFactory.ush FNiagaraSpriteVertexFactory, /Plugin/FX/Niagara/Private/NiagaraSpriteVertexFactory.ush FNiagaraRibbonVertexFactory, /Plugin/FX/Niagara/Private/NiagaraRibbonVertexFactory.ush FNiagaraMeshVertexFactory, /Plugin/FX/Niagara/Private/NiagaraMeshVertexFactory.ush FVectorFieldVisualizationVertexFactory, /Engine/Private/VectorFieldVisualizationVertexFactory.ush -
Display human readable DDC key for the DefaultMaterial. - This is to help debug and diagnose missmatched DDC issues between streams.
-
Add tile support to default SSR without clear. 1. Use
r.SSR.TiledComposite 1
to enable tiled SSR (off by default). 2. User.SSR.TiledComposite.Visualize 1
to visualize the current tiled SSR when SSR is enabled -
Improved volume texture visualization material creation to use a MaterialExpressionBounds node instead of a custom HLSL node.
-
Add strongly typed EShaderOptionalDataKey to access shader optional data instead of adhoc characters
-
Improved error reporting for global shader compilation failures; now the shader type, permutation, and debug info paths will be included in error messages printed when such failures occur.
-
Adds r.Shaders.SymbolsInfo option which generates a singular ShaderSymbols.info in lieu of full PDB info. Useful when full shader PDBs are impractically large, but some PDB information is desired.
-
Added new "Bounds" material expression to expose object local, instance local and pre-skinned local bounding boxes info with a single node.
-
Add support for not unmapping all pages when invalidating a runtime virtual texture. Previously the behavior was to only keep locked root pages mapped and produce them in the current frame. Unmapping all other pages caused flickering, because it will take a couple of frames to get GPU feedback requesting them for remap. This change adds the consolevariable "r.VT.RVT.DirtyPagesKeptMappedFrames" and defaults it to 8. Pages that had GPU feedback in the previous number of frames set by this are kept mapped but queued for update. Setting the to 0 should give the old behavior. The behavior of the pages queued for mapped update is also changed so that it is no longer handled in the current frame but time-sliced along with other unmapped updates.
-
Only log shader compile stats if we've compiled more shaders since we last tried to log stats. - Printing still happens on an interval (controlled by CVarShaderCompilerStatsPrintoutInterval) - If we have hit our interval, and the number of shaders compiled is different since last time, we print.
-
Do not compile Nanite input in "Nanite Pass" material expression for platforms that do not support Nanite
-
Introduced material translation logging to MaterialTranslationLog.txt, containing the list of all translated materials since startup and their translation time.
- Source shader filename is propagated to to dxc instead of using a placeholder
- This improves readability when using third party profilers
-
Runtime virtual texture volume can now be enabled per platform. This removes overhead of physical pool allocations that aren't needed when materials disable runtime virtual texture sampling per platform. Runtime virtual texture volume can now be enabled only if Nanite is turned on. This is useful for the new Nanite only use case of Nanite landscape displacement.
- Added an "Allow Variable Rate Shading" checkbox to material details under Materials -> Advanced. This setting is checked by default.
- When unchecked, the material will be opted-out of all Variable Rate Shading, both per-draw (Tier 1) and screen-space (Tier 2).
- Materials using the Masked Blend Mode are opted-out by default
- Only allocate virtual texture physical texture pools when there are allocated virtual textures using the physical space. This removes a common case of unnecessary memory allocation when a streaming virtual texture has been loaded but is unused.
Bug Fix:
-
Fix Subsurface Profile material in scene capture with r.SubsurfaceScattering set to 0 causes wrong value in alpha channel.
-
Fix threading race condition in virtual texture release that could lead to intermittent crashes during very heavy streaming.
-
Improved the way we handle null expression in MaterialFunction expression collection. Made GUID invalidation when null expressions are detected on MaterialFunction::PostLoad() deterministc so not to bloat the DDC with new shadermaps. Added a message box on MaterialFunction save that informs the user their function is corrupted and needs to be checked-resaved.
-
Nullptr check to prevent CanPasteHere from crashing.
-
Make FTargetPlatformManagerModule::ShaderFormatVersion thread safe
-
Fix incorrect mips streaming and assert firing when a runtime virtual texture has both low mips removed and a low resolution mip streaming texture.
-
Fix Subsurface Profile has artifacts if it is behind a translucent material that uses its basecolor
-
Fixed the shader debugging "direct compile" mode; debug USF files dumped with other shader debug info now contain a serialized form of the environment instead of relying on fragile commandline parameters to set this up correctly.
-
This change reworks how shader parameter metadata influences DDC keys by constructing a strong hash of the parameter layout for all parameter structs once on engine startup. This should resolve once and for all any bugs with shaders not being properly invalidated when shader parameter structs are changed in code (specifically when no related changes are made to the HLSL code at the same time).
-
Fixed an issue where materials using the Masked Blend Mode could become invisible when using MSAA with a 1x MSAA count.
-
Handle line directives in ShaderMinifier ExtractBlock() * Fix reporting line numbers in shader compile errors/warnings
-
Fixed a bug resulting from global shader jobs colliding when preview platforms are enabled; this was causing missing global shader permutations when previewing.
-
Fix the r.VT.PoolSizeScale console variable so that it can be changed at runtime and pools will immediately adjust.
-
Fixed an issue where overriding "Has Pixel Animation" in a material instance might not have any effect.
-
Fixed custom material expressions changes not updating cached materials.
-
Fixed the shader BRDF header files generated in code so that this occurs prior to loading and caching shader source file information. This occurring in the opposite order was resulting in these headers potentially being out of date when compile jobs were submitted.
-
Fixed crash occurring in FMaterialEditorUtilities::GetVisibleMaterialParametersFromExpression when a function input isn't found.
-
Refactored CompileDebugViewModeShaders() to include material shader error checking solving an Editor hang situation.
-
Correctly disable rendering of overlay material if Max draw distance set to a negative value
-
Add null pointer check to FindInputdByName().
-
Fixed ShouldCache call being bypassed when getting shaders, which could lead to missing shader types on cooked build while ODSC would instead let them build if requested. Now ShouldCache should be respected in all cases : if it returns false, the shader will be missing both with and without ODSC.
-
Fix the runtime virtual texture format "Base Color, Normal, Roughness" giving a washed out appearance. This was because the BaseColor texture wasn't set to sRGB.
-
Fix to UMaterialExpressionNamedRerouteUsage::CompilePreview crashing when opening a material.
-
Fixed batch files output for PC DXC shaders when debug info is enabled (these batch files can be used to execute DXC shader compilation directly rather than via ShaderCompileWorker).
-
Fix for crash occurring when linking a node to the UV input of a Texture Sample.
-
Fixed a bug where hair strands would be cooked out on Windows if the project had ES31 shaders as an option, even though they would be usable at runtime when rendering with SM5/6 shaders
-
Fix verbose logging of shader hashes to be deterministic - parts of the FSHA1 struct are seemingly intentionally uninitialized, but further hashing this struct itself doesn't really make sense. We now instead copy the incremental state and generate a "final" hash after each file; this isn't the hash of just that file but rather the hash of all files up to the point of that file, which is not perfect but good enough to track down real nondeterminism issues.
-
Added null check to FHLSLMaterialTranslator::GetMaterialEnvironment() to avoid crashing when a referenced Parameter Collectino fails to load (e.g. no longer exists).
-
Fixed crash occurring when linking a node to the UV input of a Texture Sample.
Nanite
New:
-
Nanite Tessellation: Can now enable dynamic view dependent tessellation on materials that are applied to Nanite meshes. With Nanite Tessellation enabled you can dynamically displace the surface through the new Displacement output pin in the material.
-
Implemented RDNA 1 & 2 ISA parser to optionally detect if a compute shader has any need for implicit derivatives (image sample, ddx, ddy, etc.). Certain shaders can be marked with CFLAG_ExplicitDerivatives, indicating the shaders prefer to handle derivatives explicitly, and this instructs the shader compiler - on supporting platforms - to parse the compiled ISA and look if any instructions requiring implicit derivatives are present. If none are found, the shader is decorated with NoImplicitDerivatives, indicating it is safe to ignore shading quads, etc..
-
Massive CPU optimizations to Nanite CS materials (add to scene, and also per-frame dispatch). Also includes optimizations to cache coherency, memory reductions, much more maintainable code, and also includes an important fix to hash the shader bindings (dynamic instancing hash) instead of explicitly hashing things like the FLightCacheInterface* and lighting policy. The previous logic would explode the # of shading bins (2-3x) when features like static lighting were enabled, even when most of the LCI's ended up pointing to the same light map resources/constants. This change also parallelizes the bulk of BuildShadingCommands, and removes the front loaded TPimplPtr from FNaniteShadingCommand and instead put it around the pass specific members to keep the important data on contiguous cache lines.
-
Heavily optimized InitViews and ComputeRelevancy for Nanite scenes (up to 8x faster on the render thread in CitySample) - requires Nanite compute materials to be enabled. == Off by default pending extensive testing (r.Visibility.SkipAlwaysVisible=1 to enable) Now all the primitive arrays are kept sorted into a "tested" vs "always visible" partition, which are then internally sorted by proxy type for cache coherency, using the primitive component ID as a tie breaker and to improve determinism (new implementation of FPrimitiveArraySortKey) The partition split location for "tested" vs. "always visible" is very efficiently calculated from the TypeOffsetTable using only a few loop iterations (as opposed to scanning the array), stored in Scene.PrimitivesAlwaysVisibleOffset (~0u if no always visible partition, or if optimization is disabled) The partition split location is aligned up to the next full dword - this is to avoid having a single dword spanning "tested" and "always visible" primitives making the lockless parallel calculations much more efficient. This will push a few (<32) primitives from always visible into the tested path, but this is not a big deal. FPrimitiveSceneProxy has a bIsAlwaysVisible flag (default false) that determines which partition it gets sorted into. Nanite determines this value with Nanite::FSceneProxyBase::SupportsAlwaysVisible() Countless places now only iterate from 0...StartOfAlwaysVisible range instead of 0...NumPrimitives, dropping the tested primitive count by orders of magnitude. r.Nanite.OptimizedRelevance=1 has been in place for a few years now, so this optimization now enforces optimized relevance in !WITH_EDITOR builds, and relies on assumptions from this (r.Nanite.OptimizedRelevance has been baked down and cvar removed) Nanite forces off IsUsingDistanceCullFade now so that any Nanite proxies going through FrustumCull will no longer test for fade distances (which are not even supported by Nanite) A new UpdateAlwaysVisible tasks is launched prior to FrustumCull (which waits on ray tracing if needed), and then FrustumCull waits on this new task. This task is responsible for filling the PrimitiveVisibilityMap for always visible primitives, and also for testing ray tracing culling per primitive for the TLAS stat initviews now contains an additional "Always Visible" timer that shows the thread time spent on processing the always visible primitives (primarily ray tracing cull tests for the TLAS) - this is not a measure of wall time though, as it's largely async Renamed (to match other methods like prepass) FDeferredShadingSceneRenderer::IsNaniteEnabled() -> ShouldRenderNanite() and moved it to the base FSceneRenderer under a virtual that can be checked in the FComputeAndMarkRelevance task Deleted legacy and broken r.Visibility.PrimitiveCull.SkipNanite cvar and logic FPrimitiveSceneInfo::CacheNaniteMaterialBins now calculates material relevance across all shading pipelines, and merges them into a combined primitive view relevance struct (without any view dependent bits, as Nanite does not have any per-view relevance tests that are respected) The combined Nanite relevance is now merged into FViewInfo at the end of FComputeAndMarkRelevance::Finalize(), after waiting for the CacheNaniteMaterialBins task to finish (which computes the combined relevance) Switched FrustumCull and UpdateAlwaysVisible tasks to use RESTRICT instead of GetData() to allow the compiler to perform additional optimizations Nanite "tested" primitives no longer create mesh draw commands when going through FDrawCommandRelevancePacket::AddCommandsForMesh FRelevancePacket::Finalize() now completely skips creating visible cached mesh draw commands for the NaniteMeshPass Optimizing the relevance code was critical after pushing 60k+ primitives (in CitySample) down the always visible pass, because now there were ~124k static mesh relevances to process, which would previously rely on accurate visibility. It was an insane amount of overhead to compute something that is effectively not a per-primitive or per-mesh decision in Nanite. Nanite Proxies using features like custom depth, lighting channels, or static lighting will be forced down the "tested" path. Additionally, the editor will disable the "always visible" optimization due to various features like hit proxies or debug view modes relying on dynamic relevance (this will hopefully be addressed in the future).
-
Nanite rasterizer scheduling rewrite - massive CPU/GPU/Memory optimizations (avoiding 2-4x redundant work in most cases, overlapping passes to fill bubbles, reuse rasterizer pass results between main vs post and !tessellated vs tessellated). Also makes it very flexible to support multiple rasterizer passes efficiently, and try different overlapping schemes
-
Initial Nanite support for RHI shader bundle dispatch functionality (exclusively in CS material path)
-
Implemented graphics pipeline support for shader root constants
-
Improved culling effectiveness by adding explicit instance hierarchy cell bounds (r.SceneCulling.ExplicitCellBounds), as well as debug rendering of cells (r.SceneCulling.DebugRenderMode).
-
Initial support for Nanite displacement scaling to work for MICs (upload and fetch via UB instead of baking into base material template)
-
Refactor of Nanite fixed function rasterizer binning fallback ** - Fixes race condition with FixedFunctionBin where it would usually not be set by the setup task prior to shading binning RDG pass running - Fixes issue where even if FixedFunctionBin wasn't racing, a scene with no fixed function materials would have no fixed function bin to search for - Fixes cases where spline meshes and/or two sided would fall back to a fixed function bin that wasn't capable of rendering correctly - Simplifies the 100% disable case by only having a single codepath - Now supports raster binning shader selectively choosing which raster bins remap to fixed function (i.e. supporting by distance or other criteria)
-
Updated the Variable Rate Shading manager, Contrast Adaptive Shading generator, and Foveated Shading generator to allow generating a shading rate image with a 2x2 pixel tile size, smaller than that supported by hardware VRS. This "software VRS image" can be generated on its own by toggling on r.VRS.EnableSoftware 1 (even on platforms that do not support VRS) or alongside a typical hardware image, and can be requested by rendering passes designed to use it in their compute shaders (currently only Nanite base pass).
-
Implemented Nanite mesh shader support for VK_NV_mesh_shader extension, and re-enable VSM mesh shader rasterization now that the the arg wrapping is implemented and we're D3D12 mesh shader spec compliant.
-
Shader root constants support (initially) for DX12 - shader bundles now have a very fast path that pushes record index and 3 arbitrary pass data parms into root constants without the need for a global uniform buffer.
-
Optimized Nanite CS material sort key, saves ~0.16ms in CitySample Nanite BasePass without bundles (4.79ms -> 4.63ms) The general idea now is: First group all shaders with the same bound target mask (UAV exports) Then group up all shading bins using same shader but different bindings * Sort indirect arg memory location in ascending order to help minimize cache misses on the indirect args
-
Lightmap support for Nanite CS materials
-
Updated Nanite texture coordinate encoding so that it is always crack-free and better handles texture coordinates with very high repeat counts.
-
Enabled hierarchical instance culling & precomputation by default (r.SceneCulling). This improves instance culling performance for dense scenes like CitySample significantly, in particular when there are many local lights.
-
Optimized Nanite combined material relevance with always visible path
-
Added a new "Enable Tessellation" option to materials to explicitly enable or disable tessellation (and therefore displacement) in materials and material instances.
-
Enable r.Visibility.SkipAlwaysVisible by default now
-
Fully disable the "skip always visible" optimization under WITH_EDITOR for now (only cooked builds will run it)
-
Implemented Nanite tessellation visualize modes (patches, (micro)triangles, and tessellation)
-
RDNA disassembler fixes: Support for DS instructions, Fixed DS microcode format, and Added missing instructions
-
Added a new Nanite Visualization mode for pixel-programmable rasterization.
-
Optimized Nanite transcode pass to run faster on Intel ARC GPUs.
-
Added "Max Edge Length Factor" to the Nanite Settings of Static Mesh to mitigate oversimplification of Nanite meshes that are intended to be deformed (e.g. via World Position Offset or Spline Mesh Component).
-
Added CFLAG_ShaderBundle and decorated Nanite CS materials with it (some platforms can use this to build relevant data structures for internal bundle implementations).
-
Cleaned up shader bundle public API to remove unused buffer arguments, changed record index and platform data over to root constants, and fixed some flow control issues on some platforms.
-
Enable Nanite shader bundles by default
-
Added LerpUVs property to Nanite static mesh settings. Enabled by default. When disabled UVs are not lerped in the simplifier. This is useful when data stored in UVs isn't valid to interpolate, for example indexes. Allows the AnimToTexture plugin to be used on Nanite meshes without rendering artifacts.
-
Updated Nanite DispatchBasePass to new shader bundle dispatch API
-
Hooked up Nanite CS materials to CPU visibility culling results, and also significantly optimized CS material PSO retrieval.
-
Improvements to RDNA ISA logic
-
Implemented Nanite material visibility support for CS materials, significantly dropping CPU overhead in certain scenes (matching what PS materials already supports)
-
Implemented new work in progress shader bundle dispatch API, that can take an aggregation of compute shaders / pipelines, a GPU generated dispatch XYZ count buffer, and launch a platform specific method of compacting/removing the zero sized dispatches from the aggregation, while also doing as little work on the CPU as possible.
-
Implemented Nanite tessellation stats
-
Improved Nanite disk encoding that is typically ~10% smaller after compression at the same quality.
-
Significant improvements to Nanite rasterization performance for pixel programmable materials (Masked/PDO) on the order of 30-50%.
-
Reduced the footprint of an internal Nanite buffer, saving some persistent VRAM with Nanite.
-
Added proper mip sampling of displacement maps in materials with Nanite tessellation.
Bug Fix:
-
Fixed an issue where Nanite tessellation would crash on Vulkan when using NVIDIA graphics cards
-
Fixed the selection of Nanite collision meshes in Player Collision view.
-
Fix a bug where the substrate outputs get mixed up in Nanite CS materials when "Velocity Pass" in Project Settings is set to "Depth Pass".
-
Sampling an out of bounds UV set with Nanite now clamps to the highest available UV set instead of returning zero, which is consistent with the non-Nanite behavior.
-
Fixed an crash when clearing the Cached Cooked Platform Data on a nanite displaced mesh. The Cache Tasks where not canceled and would sometime crash when destroyed.
-
Fixed issue where the Nanite builder would crash on meshes with extremely large position coordinates.
-
Race condition fix for Nanite CS materials using parallel cmd list submission (bundles disabled). Lifetime of visibility data was tied to RDG, but the parallel cmd lists can outlive RDG since they are not waited on until dispatched much later.
-
Don't warn about using legacy IO path for Nanite if the game is not packaged with pak files
-
Fixed a bug where some Nanite clusters would not be culled by the global clip plane, causing visual artifacts in things like planar reflections and portal rendering.
-
Fix bugs with motion vectors on Nanite objects that have both materials with and without WPO when the project setting for "Velocity Pass" is set to "Depth Pass"
-
Fixed a bug where Nanite materials would get mixed up when enabling/disabling sky lights in the scene.
-
Improved (and correct) implementation of Nanite fast tile clear optimization. This new version fixes issues where even fully Nanite shaded tiles would not write through all/any of the gbuffer, but we would still unset the metadata (resulting in uncleared gbuffer / hall of mirrors). New implementation builds a per material bound target mask (based on shader reflection), masks that against possible bound targets suitable for the optimization, and then the clear shader determines which tiles are safe to optimize the meta data, and the rest are cleared by the regular hardware path.
-
Fix a bug where all Nanite will render for a scene capture with "ShowOnly" actors enabled, but has an empty list.
-
Fixed an issue where recently disoccluded Nanite objects would not render properly in non-instanced secondary stereo views, such as splitscreen views.
-
Fixed issues with Nanite spline meshes calculating an incorrect tangent frame.
-
Fixed issues that prevented tessellation from working with Nanite spline meshes.
-
Race condition fix for CS materials with split screen, where View0 and View1 were sharing the same batched parameters memory, and trampling on each other during parallel command list recording.
-
Fixed issue where Nanite Tessellation would crash on Intel ARC GPUs
-
Fixed Nanite custom depth rendering to render correctly with r.CustomDepthTemporalAAJitter=0.
-
Fixed an issue with missing Nanite Landscape rasterization shaders in cooked builds.
-
Fixed some bugs with ray tracing Nanite spline meshes (still only ray traces the fallback mesh).
-
Fix some race conditions in new Nanite raster scheduling (do not use the DispatchContext indirection lists on the render thread as the setup task may not have completed yet). Also fixed a GPU sync issue during patch splitting (pre-existing bug) where the indirect args were not present in the pass parameters, so RDG would not issue barriers for it.
-
Fixes to Nanite fast tile clear on some platforms where the sub tile mode can be different than morton order
-
Temporarily disable Nanite CS materials for Vulkan until there is support for CS explicit derivatives and implicit LOD
-
Fixed a bug where negative scale in Nanite spline mesh parameters would cause the faces to be flipped.
-
Fixed issue where cooking multiple platforms at once could cause some of them to be missing Nanite streaming data.
-
Fixed an issue where a random Nanite object could appear selected in wireframe view when no objects are selected in the editor.
-
Fixed custom depth rendering in right eye when Instanced Stereo is enabled with Nanite objects in view.
-
Fixed Issue where Nanite imposter rendering would output incorrect depth values
-
Fixed issue where rasterization of extremely long and thin triangles would not be watertight on some hardware.
-
Fixed a bug with Nanite spline meshes where spline deformation might be randomly disabled on the mesh, due to using the wrong rasterization shaders.
-
Fix for Nanite raster bin recompile shader crashes
-
Fixed a rare crash caused by the Nanite builder simplifying a cluster to 0 triangles.
-
Fixed Nanite picking visualizer from crashing on some platforms during GPU buffer readback, and improved the overall code
-
Fix for issue where Nanite builder would not handle empty submeshes correctly.
-
Correctly clamped rough VRS shading rates to 2x2 max for Nanite Software VRS. Software VRS is no longer disabled in areas using 2x4, 4x2, or 4x4 rates.
-
Hardware ray tracing now respect the Minimum LOD index property for Nanite geometry.
-
Fixed incorrect == operator for FVirtualPage in Nanite streaming manager, caught by static analysis
-
Fix race conditions / lifetime with parallel cmd list recording and Nanite shading commands. Reactivate Nanite parallel base pass recording
Niagara
New:
- Heterogeneous Volumes: Shadow-casting support and integration with translucency pass.
- Enabled via Heterogeneous Volumes category of Heterogeneous Volumes.
-
The new Niagara Asset Browser revamps the menus when creating Niagara Emitters and Niagara Systems, as well as adding Emitters to existing Systems. It is similar to the Content Browser, and offers tagging functionality to organize your assets.
-
Niagara per particle mesh LODs - This is disabled if we can not run the sort / cull process (i.e. OpenGL RHI) as we don't have a CPU LOD path currently
-
Modify sim cache buffer data to be packed into a single array - Add optional BulkData serialization, controlled with bAllowSerializeLargeCache - Large caches (BulkData) can grow beyond 2GB and are considerably faster to serialize in the editor - Small caches will use TArray serialization and are not optimal. These are useful when sending data as text across the network for debugging for example as BulkData serialization is not supported by all FArchieve types - Clean up sim cache includes to reduce compiles - Update existing SimCache tests #virtualized
-
Validation rule for user data interfaces
-
Add InsideVolume output to RVT sample - Change user parameter binding to be a UObject rather than exposing URuntimeVirtualTexture to Niagara
-
Filter out attributes (for linked inputs) that are not allowed in the current usage context.
-
Static mesh DI add socket sampling to safe CPU access functions
-
Make Niagara Data Channel assets a BP Type so BPs can reference them.
-
Change default for NDC DIs overriding spawn group when spawning particles. Preferred method is to now use the GetNDCSpawnData function.
-
Add option to select particle mesh LOD based on component bounds - All particles will render at this LOD
-
Remove "experimental" tag from Niagara sim caching plugin and enable by default
-
Add platform set to Niagara System to allow systems to be culled for specific platforms / quality levels
-
Add option for ribbon plane normals to follow the geometry rather than face screen / custom facing vector - This is now the new default as it matches the other ribbon shape modes - Existing content will use the previous mode
-
Double-clicking a data interface function in the graph will now open the c++ source file
-
Add cache comparison functionality to arrays
-
Add optional CSV memory usage output for FX, mode is controlled with fx.DetailedCSVStats.MemoryMode and disabled by default as it impacts performance - Implement GetApproxMemoryUsage for Niagara and use this function in the debug HUD so we display Cascade memory usage
-
Typing '/' in Niagara Script graph's action menu will now prioritize the 'Divide' action
-
Added a new module to play looping audio
-
Applying HeightFog and VolumetricFog in-scattering and attenuation to Heterogeneous Volumes.
-
- Added initial parameter support to the audio data interface * Reworked the existing audio modules a bit with better default values + added a module to initialize parameters
-
Static variables can now be linked to non-static inputs of the same underlying type
-
Add a pool for RDG texture / buffers - On some platforms artifical barriers were being added (i.e. d3d12) which resulted in slowdown - In my test for 400 dispatches with a neghbor grid it went from 3.6ms of GPU to 0.33ms
-
Add platform set to sorting rules
-
New Blueprint API to read/write data channels added new nodes that automatically generate matching pins for the data channel used added versioning information to data channel assets, so dependent assets can pick up on changes
-
Heterogeneous Volume Component: Add ability to set VolumeResolution within a blue print
-
Add ability to append to an existing simulation cache - Frames that are before the current simulation age / tick count will be culled - BeginAppend can be called vs BeginWrite and it will handle the initial setup if the cache is invalid - Update capture library with a new call so that we can specify all the parameters, such are removing timeouts, should we append, etc.
-
Expose FFT solver for 2D gases
-
Add SourceMode to object reader, allows you to easily read from the attached actor - Add support for invoking BP get functions to read properties - Fix issue with alignment on FVector4's
-
Add auto attachment information to the HUD
-
Show compilation error when writing to attributes from the wrong namespace (e.g. particle script writing to system namespace). This will be just a warning for 5.4, so old content can be fixed up (configurable via project settings).
-
Add support for specular scale with the simple lights. Includes support for Niagara to set the attribute per light through the light renderer. #virtualized
-
Optimizations to activation saves ~10% - 20% depending on system
-
Added details panel support to data channel BP node, so users can exclude pins from being written to
-
Enable GPU particles & sorting for Quest 2/3
-
Niagara task priorities can be set per tick group - This helps to reduce wait times if we execute a simulation later and allows us to fit around physics tasks
-
Set display name of Niagara double type to "float", as that's what is used internally for simulations and is also similar to the way Blueprint handles double types (which still display as float in the ui)
-
Add GetTriangleIndices to skel mesh DI (This mirrors the functionality from static mesh DI) - Add Interpolated methods to get skinned vertex data to match triangle / bone
-
Added a validation rule to make sure some modules are only used once per script
-
Add warning to Niagara compile results if the constant table contains a NaN
-
Niagara action menus: Removed parameter action favoring and halved NPC parameter search score. This should result in somewhat more accurate search results.
-
Debug HUD add performance unit selection (millisecond / microsecond) - Add an auto mode to the perf graph for the unit scale
-
Enable quick release of particle memory
-
Added integer-based equal/not equal ops for enum graph pins
- Added Spawn Count Scale UI to emitter nodes
-
Changed the scalability indicator to function as a toggle button to enter & exit scalability mode
-
Allow newly spawned systems to avoid adding to concurrently running simulations - Situations can occur where we execute the simulations in a TG and then attempt in a subsequent TG or an async task on the GT to add to the concurrently running simulation - The new path will push the instance into an existing simulation that is not running concurrently or a new system simulation - This also fixes a potential issue with TG transfers where we might of added to the wrong simulation - The CVar fx.Niagara.WorldManager.AvoidAddingToExecutingSims can be used to flip between old and new behavior
-
Simple tick group based exec ordering for systems reading from NDCs. We define a tick group which reads must be ordered after. Reads before, or writes after this TG emit a warning.
-
Use explicit pin types on op nodes for type casting of connected inputs
-
Test execution state before performing the LWC tile boundary test - This fixes an issue where crossing tile boundaries while deactivating could bring the instance back to active
-
Add cast shadows option to sprite / mesh / ribbon renderers
-
Add LOD mode to Mesh Renderer - Allows you to specify a LOD level to use or a LOD bias based on Min LOD - If the LOD level is not available it will fallback to the next available lower level
-
Add support for reading the Skin Cache to Niagara Skel Mesh DI - Add a project setting (enabled by default) to control if this is enabled as some lower end platforms could have issues with the additional Buffer's
-
Validation rule to check if sorting is enabled on sprite / mesh renderers
-
Default SubUV blending to enabled on mesh / sprite renderers
-
Added a hlsl function to generate unique random numbers picked from a given range (FastUniqueRandom)
-
Added visualizations for volume textures stored in sim caches
- Niagara Notes have been refactored:
- Works with (almost) all kinds of stack rows now (inputs, properties etc., not just entire modules)
- Supports editing of notes after submitting them
- 'Full Display Notes' can now be converted to 'Inline Notes' by clicking on the note icon
- UI access via right click menu or on-screen widgets.
-
Couple of optimizations to HLSLcc, replaces the use of a hash table to store referenced variable information with an std::multimap and optimizes the amount of data that needs to be copied as scope changes (if/loop/function) based on the instructions in the body of the scope rather than the entire outer scope. Validated against all shaders to produce the same result. In the case of Niagara VM shaders a particularly expensive system update script's compile time was brought from 16s down to 6s.
-
Add support for SetEmitterEnabled in Niagara - Similar to Cascade this will halt all spawning, but won't naturally complete the emitter this will follow how emitter state is setup
- Support Spawning into any emitter from one shared DI. New value Engine.Emitter.ID available in the Map Get node. This is the current emitter's ID.
- Several NDC Data Interface functions now require an emitter ID if they interact with a specific emitter. For example when spawning via SpawnConditional.
-
Debug draw for Position Array Data Interface
-
Niagara template for painting 2d coordinates to a Render Target using Simulation Stages.
-
Enable Niagara Debugger in UEFN Editor.
-
Removed category from asset options in favor of the new Asset Tags
- Path tracing updates for Heterogeneous Volumes.
- Prevent per-frame grid build once simulation completes. Remove r.PathTracing.HeterogeneousVolumes variable, inheriting system default behavior.
-
Fixed delete icon in Niagara parameter collection editor Fixed deleting an entry in a parameter collection via hotkey (instead of using the button) Fixed top level area expansion state
-
DisableAdvancedFeatures in Niagara Preview Viewport - This saves a lot of memory per Niagara VP that is created by disabling things like Lumen
-
Added Orbit Mode option to Sim Cache Editor Viewport. Orbit Mode defaults to enabled to match parity with the Niagara Editor Viewport.
- Optionally construct velocity buffer for heterogeneous volumes
- r.HeterogeneousVolumes.Velocity (Default = 0)
- Updated Overview Node UI for collapsed Emitter nodes Features:
- a thumbnail image that has to be manually taken by clicking on the Thumbnail button in the collapsed Emitter node.
- toggles for 'Determinism', 'World/Local Space' and 'CPU/GPU'
- When clicking on the node, summary view is displayed
-
Show restricted content stack errors for scratch pads that use things like custom hlsl nodes
-
Fix Blueprintcallable vs DLL exposed inconsistencies
-
GDME Niagara shadow opts - Early out if all views can never create a mesh batch & improve per view early out for shadow passes - With 30 instances of a test asset this was ~3.0ms -> ~1.8ms for GDME. We still had a couple of renderers casting shadows but the majority do not.
-
Changed Lerp C pin's friendly name to 'Alpha'
-
Added analytics for system data, cascade conversion and sim caches
-
Hierarchy Editor: Visuals are a bit more consistent with the rest of the engine - Changed the layout from a horizontalbox to a splitter. Allows resizing of the the three columns
-
Niagara renderer can now provide a streaming scale for materials - This fixes an issue with sub image streaming for sprite renderers where the calculation did not take into account that the UVs would be scaled
-
Engine.Owner.Velocity will read the owner actors velocity for the initial frame rather than defaulting to zero - This fixes an issue where reading this attribute in emitter / system spawn scripts or a burst on the first frame would always have zero velocity
-
Add an optional name to validation rules - This makes it easier to know what you are breaking #changelist validated #virtualized
-
Change IsVisible for pooled components to only check the attached components level collection rather than the attached component - This mirrors what Cascade does and fixes an issue with gameplay cues that are attached as they are sometimes attached to hidden components but we don't actually want to hide our component
-
Console Variable Niagara Data Interface
-
Rigid Mesh DI / SM DI move from RequiresDistanceFieldData to RequiresEarlyViewData as mesh distance fields are ready once we have a view to read the data - Rename RequiresDistanceFieldData to RequiresGlobalDistanceField to be more explicit
- Improved sequencer sim caching:
- allow scalability override per cache track
- allow locking of cache tracks to prevent unintentionally overriding a cache asset
- display system name inside cache assets
- disable sequencer looping when recording
-
Heterogeneous Volumes: Basic stereo rendering support (non-ISR)
-
Action menu now autmatically selects an action if only one action is contained. Useful for Niagara Math nodes that have add menus that will only list "Numeric" as addable type
-
Display water body information on Debug HUD - Remove warning that would spam per instance about water body
-
Display Shader Statistics in Niagara Script Stats
-
Allow ribbons to share generated data where possible - CPU will share the generated data across views (i.e. split screen) when opaque or not using multi ribbons - GPU will share across view families in the same frame (i.e. split screen / shadow passes), this is because we don't support multi ribbon sorting on the GPU - Niagara.Ribbon.ShareGeneratedData can be used to enable / disable the optimization
-
Validation rule for ribbon renderer - Allows validation information for using GPU / GPU init as it may not be valid for all platforms
-
Add GPU usage information to ribbon renderer output
-
Correctly support negative UV Scale with SubUV
-
Allow enum inputs in the stack to be displayed as button grid
-
caching 2D render targets #virtualized
-
Mesh Renderer GDME optimization when using MeshIndex / Renderer Vis - While below the cvar controlled instance count look over the mesh index & renderer vis information to determine what meshes are relevant - Because the information is generally hot in cache from copying to GPU buffers, the cost for this is negligible, but can save an entire mesh submit
-
2d cubic interpolation #virtualized
-
Allow Kill Volume Position to be bound to something other than Particles.Position #virtualized
-
Add FNiagaraSimCacheCompare which can be used to compare simulation caches - New comparison allows us to exclude attributes and supply a custom tolerance when comparing caches - Removed the old comparison method from the UNiagaraSimCache
-
Take into account scalability spawn count scaling for Spawn Per Unit #virtualized
-
Heterogeneous Volumes: Apply bounds culling to trim active voxels when computing the lighting cache. #changelist validated #virtualized
-
Heterogeneous Volumes: Accelerating rendering with continuous level-of-detail by applying LODFactor to voxel factors, lighting cache, and volumetric shadow map resolutions. r.HeterogeneousVolumes.CLOD (Default = 1) r.HeterogeneousVolumes.CLOD.Bias (Default = 0)
-
Scripts that have Debug Draw functionality can now additionally define a Debug Draw message that will appear as a tooltip on the Debug Draw toggle on the module.
-
Add FlushComputeAndDeferredQueues to world manager - This wraps some duplicated functionality when manually ticking worlds, like in the baker, etc. - It will flush the compute disatpch queue, optionally wait for GPU to complete, then execute any deferred callbacks
-
'Emitter Properties' are now an item available for Summary View
- Improved data channel ux:
- improved display of variables in asset
- enforce unique variable names in asset
- improved property naming and tooltips in various places
- fixed asset color
- added hyperlink to docs
-
Add a simple object pool & object referencer for Niagara to the World Manager - Users of this pool & referencer are expected to handle recycling / unregistering correctly - Allow clusters to be built for render target data interfaces by moving object referencing into the world manager - Use object pool for render targets so that we can avoid waiting on GC before resources are collected - This reduces a lot of memory usage when scrubbing in the editor / sequencer timelines
-
Add Default Mesh to Skeletal Mesh Data Interface - Unlike the preview mesh the default mesh is not cooked out and can be used in PIE.
-
Heterogeneous Volumes: Prevent SVT streaming request when component is not actively being rendered.
-
Cache GDF information and use when tick flushing - This fixes issues like scrubbing backwards in sequencer with distance field collisions enabled
-
Overload RequiresGameThreadEndOfFrameRecreate for Niagara as we are safe to run async
-
Added parent emitter path to the open parent emitter tooltip on an Emitter node
-
Added sim cache support for data channel writes (the writer data interface calls are persisted in the sim cache and played back when a frame is read).
-
SimCache storage & visualizer for Niagara Arrays
-
Enable high pri cvar for some projects - Clean up the high pri cvar related code
-
Add option to adjust the anim notify progress information based on rate scale, this is disabled for existing content and enabled by default for new content - Add option to apply time dilation to spawned niagara components based on rate scale, disabled by default
-
Niagara MovieRenderQueue plugin - Contains a data interface for inspecting MRQ information
-
Add an option to control occlusion queries for Niagara - Currently it's hard coded to look for custom depth enabled or not, but sometimes you still want occlusion queries to run even though custom depth is enabled
-
Changed default Niagara note contents text to "Title" & "Text" respectively
-
Memory Buffer Data Interface - Allows user to allocate a block of memory to load / store floats & ints however they want
-
New method for allowing particles spawned from NDC to access the NDC element that generated them. New function GetNDCSpawnData(). Returns the NDC index for a particle as well as the total count for that NDC and the spawn index for the current particle inside that NDC spawn. i.e. NDC local Execution Index. Previous SpawnGroup based method still works as a backup where needed. There may be cases where the new method cannot work. For example if a proper Execution Index per NDC is needed.
-
Methods to get the vertex data for a skinned triangle - This is to reduce VVM calls by bundling all data in one function
-
HeterogeneousVolumes: Add option to change compositing order r.HeterogeneousVolumes.Composition Change the order of Heterogeneous Volumes composition (Default = 0) 0: Before Translucency 1: After Translucency
-
Heterogeneous Volumes: Add partial final step to address harsh boundary when intersecting hard surfaces
-
Enable lightweight memory capture by default
-
2 way Coupling supports ellipsoidal shapes add new coupling template #virtualized
-
Basic Niagara Component leak detector - Looks for constant growth in component counts / active components - This will be refined over time and is likely to not catch all cases / produce false positives in some cases
-
Simple Counter SimCache Support - Change test to use sim cache #virtualized
-
Modify visibility display for debug hud to call IsVisible and that can include things like the owner's level collection visibility - Show any active SimCache information on HUD also
-
Allow users to select ribbon material back facing culling vs shape mode
-
Support custom visualizations for data interfaces stored in sim caches * Added visualization for cached data channels
-
SimCache to Json support
-
Emitter & Renderer Count Validation Rules
- Optional data interface comparison for sim cache compare
Bug Fix:
-
Fix for cull proxies and used materials - We need to gather the list from the cull proxy not our controller as it could be different with regards to MIDs, etc - Note: This change does not fix the fact the cull proxies do not map to MIDs correctly
-
Fix for Engine.Emitter.NumParticles & Engine.System.NumParticles not working with GPU emitters - Engine.Emitter.NumParticles will be the GPU count no the GPU count so will be latent
-
Fix for ParticleSubUv material expression working on non-vertex fetch shader profiles when used with Niagara mesh rendererer. The default UV coordinate needs to be reserved on the material in order for the VF to connect the data for rendering
-
When resetting systems be sure to also invalidate the compilation results for child scripts. This ensures deterministic behavior when cooking for platforms that don't require AV data, and makes sure that the resulting editor only data isn't bloated with things like HLSL source code when the data is never going to be used.
-
Made Niagara note header wrappable & reduced max width for note tooltip as it was just too wide
-
Don't detach components when inside non game worlds - Don't call Modify on the attach parent when we detach a Cascade / Niagara component due to system completion - This fixes an issue where levels are being marked dirty if they have one shot FX inside them that play on level load
-
Fix for NPC data interfaces not working - Because NPC DIs do not resolve they were assumed to be internal, this meant they did not flow through the parameter stores correctly.
-
Clean up unnecessary data out of the NiagaraShaderMap DDC payload. Most significantly this removes the FriendlyName as the DDC data can be generated from multiple distinct NiagaraSystems, the name is non-determininistic.
-
Don't allow particle read DI to be a user parameter - It doesn't function, as in you can not change the target emitter
-
Move RapidIterationParameter::DebugName to transient to prevent stale debug names
-
Fix landscape DI for LWC. Supplies tile information for sampling the VT and cached heights as well as corrects the cached height acquisition for large worlds.
-
Fixed average perf stats being wrong when multiple systems are active at the same time
-
Attempt to sanitize symbol name when creating a pin for a customhlsl node
-
Change Neighbor grid to use pixel format capabilities vs volume atomics
-
While active always include the calculated bounds when using auto attachments - This fixes an issue where the effect would no longer be visible due to incorrect bounds if we are attached, become detached (potentially forced via BP) and wish the effect to continue playing
-
Fixed a bug where clicking during a cache recording could cause dropped frames from Slate throttling
-
Fix a crash with main pass scene captures mesh renderers with low latency - Don't build translucent batches for scene captures which perform opaque only draws
-
Fixed missing tooltip for set attributes node when linked to a parameter definition asset * Fixed ui bug in param definition editor
-
Fix for circle occlusion and screen percent changes
-
Fix potential nullptr access in data channel BP node
-
Disabled bHasDeformableMesh for FNiagaraSceneProxy to avoid continuous Virtual Shadow Map invalidation from the primitive bounds.
-
Optimize UNiagaraScript::ComputeVMCompilationId()
-
Fixed issue that preventing pre-culling in some cases when using Auto Attachment.
-
Add braces to the list of characters that are treated as separation tokens for niagara's custom hlsl node processing
-
Fix for GPU ribbons max using the maximum ever allowed vs maximum estimate - This saved a simple GPU ribbon test ~15mb of memory
-
Fixed a bug where renaming a parameter in a module script would in some edge cases not correctly propagate to existing usages
-
Fix fx.NiagaraReleaseBuffersOnReset to allow releasing memory on reset - Currently only GPU buffers will be released on reset, not CPU - Releasing CPU memory reduces component pool usage - In one test run we went from ~4mb -> 1.4mb of particle buffer memory by enabling the early release.
-
Cleaned up logging when exceeding primitive counts with the NiagaraDataInterfaceRigidMeshCollisionQuery
-
Fix transitions for array & simple counter - Cleanup some old code to remove casting
-
Fix for UniqueID being shared incorrectly between spawn groups on the GPU
-
Reset OverrideFormat on return to the pool as some will use RenderTargetFormat vs OverrideFormat
-
ExternalParameter cbuffer is now packed and padded explicitly by the translator to ensure compatibility across all shader platforms.
-
Disable low latency on none surface domain materials - This fixes an issue with volume fog sprites which is rendered before simulations are enabled if they use things like depth buffer reads
-
When converting Color Over Life from Cascade to Niagara, we now correctly select between scaling Particles.Initial.Color and Particles.Color
-
Fixed a bug where new parameter collections were only visible in Niagara systems after an editor restart
-
Fix Niagara landscape DI sampling of RVT to use SRV so that we can properly handle the different texture formats that the data may be stored in (i.e. BC3_UNORM vs BC3_SRGB)
-
Fix for niagara attribute trimmer edge case where we would miss dependencies for the first read of a variable within a stage (in very specific circumstances).
-
LWC fix for sampling SM / SKM without a component - The LWC tile offset was incorrectly applied to the component transform
-
Fixed a bug that prevented users to edit any complex structs in user parameters (e.g. matrices)
-
Fixed an issue with relevance in Niagara where the default material relevance forced us to always render in the depth pass
-
Fix SetEmitterEnabled for GPU & Event Spawns
-
Fixes for rigid mesh DI not correctly setting the MeshScale of Sphere/Capsule bodies
-
Fixed a bug where the context menu in module scripts would show invalid conversion operations for primitive types
-
Fix for Niagara landscape sampling with collision geometry not being properly initialized in game
-
Disable parallel scene proxy creates in Editor - Various other UObjects we might query are unable to run wide during EOF updates because they might invalidate render state
-
Fixes for non-determinism for Niagara scripts. Handles differences between getting the results from an actual compile and pulling hte results from the DDC. In particular -exposed variables are properly applied from the DDC -rapid iteration parameters (including static variables) are now applied all together before SetVMCompilationResults is invoked since it ends pulling data from depenedent scripts -non compilable scripts will now have their rapid iteration parameters (including static variables) to/from the DDC
-
Prevent PostEditChangeProperty from impacting a niagara graph when it's intended for compilation
-
Cleanup source of the referenced compile hashes for Niagara's compilation Id. Because of reordering and non-uniqueness the source strings would be lost and are generally not needed unless someone is using one of the debug options.
-
Couple of fixes for Niagara script compilation -make sure that static variable collection is run nested for emitters -handle shader compilation when threading isn't supported -forward VM backend compiler warnings (typically div/0) back to the log
-
Fixed a bug where recording tracks in subsequences with offset start positions would not play back the correct timeframe.
-
Fixed enum read/write for data channel BP nodes
-
Fix for cleaning up inactive solo systems when they are still holding onto a simulation and the simulation is being changed
-
Set RDG internal access mode on RTs - This fixes an issue when an external RT is used in one pass, set to external access, then used again in another pass
-
Fix for verbose debug rendering of the rigid body DI
-
Change OnSystemComplete delegate to be DuplicateTransient
-
Fix for not generating cutout information on SubImageSize change
-
UE package version incorporated into the DDC data for niagara scripts as we use standard struct/object serialization for the data
-
Make newly created emitter assets inheritable by default
-
Added a fix for inaccurate quaternion interpolation in particle spawn scripts
-
Skel Mesh DI handle the various combinations of 16 bit bones / 16 bit weight & different bone modes
-
Make sure that we only return NPC when we have an initialized world
-
When pulling results from the DDC make sure we properly handle user variables with SWC structs (need to convert them to LWC) in order to mirror what we would have found with a precompile.
-
Speculative fix for crash with nullptr data in async task - Adjust wait code to check for batch task completion at the end of the function to avoid pointer caching - Ensure change to tasks are visible to the game thread
-
Removes ensures from getting triggered when typical graph errors suffice for pushing the informaiton to the user (rather than a potentially long hitch processing the ensure)
-
Provides a fallback path to the parameter map traversal to ensure that we get accurate aliased variables in the history. Without the aliases in place we can miss resetting the chunk cache in the translator which leads to variables leaking between emitters and between the emitter and the system scripts. This was typically seen using a dynamic input in both system and update scripts (Multiply Float).
-
Fix for name collision in the script context for Cascade to Niagara converter. Previously parameters outside the module's namespace could be used instead of the module variable. This allows modules to have input parameters with the same name as parameters in different namespaces.
-
Fixed multiple undo/redo related issues around scratch pad renaming
-
Disable GPU emitters that use FP16 if we do not support typed UAV store / load - fx.Niagara.GpuEmitterCheckFloat16Support can be used to disable this check - Also ensure we flush any pending setting updates each frame
-
Fix for converting Init Mesh Rotation module from Cascade to Niagara, using a new conversion module that takes an Euler rotation, and converts it to a quaternion, and sets particles.rotation.
-
PR #11396: [Niagara] Fixed the problem of repeated recycling of the Resource List #contrib 11396
-
Fixed a crash when using a Data Channel asset without a type set
-
Reset sequencer speed when recording a cache and it's in reverse mode
-
Fix for island type data channel systems being deactivated despite still being used
-
Fix for BP array SetValue calls not updating the GPU copy - Fix various poiints in the array code where we might overwrite the GPU sync incorrectly
-
Update normal extraction from (non VT) landscape with Niagara DI. Not all platforms seem to handle SampleLevel with an explicit index offset, so stole the implementation from the landscape PS using a pair of gathers instead. #virtualized
-
Attribute trimming fix for impure functions not finding all variables that need to be preserved because of Module namespace shenanigans
-
Update constant resolver to include emitter information when stepping through the emitter node to it's subgraph.
-
Fix for ambiguously typed clamp in GetSkinnedTriangleVertexDataHelper
-
PR #9888: Fix use after free in Niagara data interface details
-
Fixed an issue where inputs would not apply entered math expressions correctly
-
Fix an issue where caching Niagara particle in a subsequence would close the root sequence and open the subsequence in isolation
-
Fixed a bug where scratch pads didn't always enable the apply button after a change
-
Fix for Niagara landscape sampling getting the sufficient components when overlapping the system bounds on the landscape
-
Make sure to PostLoad the RendererBindings so that they can be sorted & searchable in cooked builds. Addresses some sporadic issues where static bools used for bindings might not be found and assumed to be false.
-
Fix issue causing changes to an Island NDC's systems to not be applied correctly until editor restart.
-
Reset SKM data interface if the source component is unregistered - Reading from an unregistered skeletal mesh will have no ComponentSpaceTransforms and hit an ensure
-
Saturate the lerp in flight controls - This fixes a potential !finite issue if the lerp could go over 1 and ever increase the float value to be invalid
-
Fix buffer underrun from EVVM - If we output < 4 instance we are writing to memory before the allocation - Data buffers are allocated 16 byte aligned and each component is aligned to 16 bytes so we can therefore just loop until all components are written
-
Fix for invalidating asset when create a new exposed curve texture
-
Fixed issue in which NDCs would not function correctly if used on the same frame they were loaded.
-
Fix for static mesh DI not picking up the right SM when using child blueprints - Add support for mesh parameter binding to SM DI
-
Made several properties on the cached Niagara Script data Transient. This prevents conflicts with deterministic DDC results (DDC-Verify) and reduces the size of our DDC payload substantially (about 50% smaller).
-
Fix for disabling an override from an NPC Instance not being reflected immediately
-
Emitter binding changed to be case insensitive - The unique emitter name is an FString and binding is an FName, the FName can be impacted by the first user so case is not guaranteed
-
Fix race between game / render threads when deciding if rendering was enabled - The render thread was reading from the renderer GT array to determine if rendering was enabled, on proxy recreates this could lead to a race and the system would not render for a frame
-
Pixel Coverage for translucent now uses A rather than RGB - This fixes an issue with particle darkening as pixel coverage kicks in rather than fading out
-
Fix low latency meshes not rendering in shader complexity view modes
-
Update Niagara landscape DI to collect texture resources during a render command from PerInstanceTick instead of during SetShaderParameters and moves SRV parameters over to textures to clean up resource lifetime issues.
-
Disable Niagara ribbons for RayTracing - This is not supported currently as the index buffer can potentially be packed and will cause a GPU hang when used with RT
-
Fixed a crash when editing a data channel asset and compiling a BP with dynamic read/write nodes in it
-
Fix for linking up function inputs when types differ because of SWC/LWC custom structs
-
Fix override parameters not working with cache playback
-
Remove debug only data from Niagara scripts during cook to reduce the size
-
Fix for mesh renderer MeshBoundsScale being unused - Fix for incorrect bounds scaling, it was assuming centered bounds
-
Fix for bad normals on some mesh renderers - Remove normalize from CalcTangentToWorld in mesh particle renderer. This is causing issue with some data from meshes which is invalid (i.e. 0,0,0) and matches what the local vertex factory does. The per particle matrix we transform by is already no scale so the normalize is superfluous
-
Improve attribute trimming when dealing with impure functions in non-expressions
-
Disable auto-save when caching tracks from sequencer
-
Add an option for NiagaraLandscape DI to disable use of VT
-
Early out of updating merged scripts if we're not allowed to compile any shaders. Avoids problems with trying to generate compile ids because we can't access the shader files for hashing
-
Only log lwc reset warning when the system already ticked
-
- Fix cache playback not respecting dataset limit
-
Fixed small issues with the sim cache asset editor
-
Fix for "FX.AllowGPUParticles 0" causing crashes
-
PR #11182: [GAS] Removed ensure that is triggered when a cue plays a particle system that gets preculled #contrib 11182
-
Fix Niagara type registry crash in packaged builds
-
Fix for rare crash with stack footer accessing null StackEditorData
-
Fixed missing comment toggle on new compact style Niagara nodes
-
Fixed issue preventing the Niagara Debug HUD perf graph from displaying GPU performance data. Simple fix. At some point it was just left out of a check to enable the underlying GPUProfiler that generates the stats.
-
Fixed landscape DI function pin to use correct position type (the shader already treated it as lwc position, so just a cosmetic change).
-
- Fix for use after free - Resource names for Niagara must be character arrays not other types of strings, as the internal pool may hold a reference beyond the lifetime of the Niagara data
-
Add bFilterByObjectType option to the RigidMeshCollisionQuery DI to allow people to try what seems to be a more reliable mechanism for controlling which rigid bodies get added to the query.
-
Fix for some attribute bindings not getting renamed properly with emitter merging
-
Handle null rate scale distribution in Cascade converter
-
Fix for baker not capturing anything if the system was already complete
-
Fix for emitter mode approximate motion vectors being incorrect
-
Fix for ParticlePosition previous value being incorrect - To mitigate cost & interpolators we only provide the value for vertex shaders, not pixel shaders - Previous data is also not generated in all cases, it falls back to how it is currently which is previous equals current - Niagara Sprite & Mesh renderers will generate accurate data when motion vectors are set to accurate - Without accurate the results from uising velocity are somewhat mixed
-
LWC fix for Niagara sorting & culling
-
Fix for not updating the GPU sync mode for packaged builds
-
Fix for uniqueness of NPC namespaces
-
Request a compile of the system when handling a change to a user parameter name. Avoids a crash that can happen because of a mismatch between the compiled constant table layouts and the parameter stores.
-
Fix Niagara vector field sampling via ispc supporting masked output (if some of the channels are unused)
-
Cascade to Niagara converter handle nullptr distributions
-
Fixed a bug where undo wouldn't work when deleting a parameter from a module script
-
Fix for emitter sourced mesh rendering using MeshIndex binding
-
Fix array remove on GPU when 0 or max elements
- Fix NaN's poisoning the VVM constant table - Comparing A==B will return true for NaN depending on the FP mode, so we now compare if both values are finite before comparing for equality. - This does not fix the source of the error, but will stop all subsequent float values being set to NaN
Deprecated:
- Deprecated vortex velocity module
Path Tracer
New:
-
Implement Holdout flags for Atmosphere and Exponential Height Fog. This can be used to isolate the contribution of these elements in layered renders.
-
Path Tracer: Build RTPSO for the path tracer during startup to avoid lengthy compilation times the first time the path tracer is selected in the UI
-
Optimize shadow tracing in the path tracer
-
Path Tracer: Implement support for virtual texture feedback
-
Reduce performance impact of decals and volumetrics
-
Skip Distance Field tasks when the path tracer is active
-
Optimize storage of volume intervals in the path tracer
-
Added experimental neural denoising platform (NNEDenoiser) for the Unreal Path Tracer based on the Neural Network Engine (NNE).
-
Path Tracing: Change Indirect Emissive Lighting Component back to its original name. Including this flag as part of the Lighting Components led to some confusion with users as it does not behave quite like the other Lighting Component entries. The original name "Emissive Materials" represents what this setting does more accurately (enable emissive materials to cast indirect lighting into the scene).
Bug Fix:
-
Fixed incorrect rendering of materials that require global distance field when using Path Tracing.
-
SvPosition was not set correctly, leading to inconsistent output from the ScreenPosition material node
-
Avoid path tracer invalidation when a camera is selected in the editor
-
Path Tracer: Fix light functions on directional lights
-
Avoid path tracer invalidation when a DecalActor is selected
-
Hide Path Tracing menu entry on platforms (such as Vulkan) which support raytracing but cannot yet run the path tracer
-
Skip Planar Reflections when path tracing is active
-
Remove passes from Deferred Renderer that are not needed while the path tracer is active
-
Tweak the default ray bias to avoid artifacts in larger scenes
-
Path Tracer: Fix possible NaNs in specular highlights when Anisotropy is set but Tangent is not
-
Avoid cooking errors in decal shaders on platforms which do not support the path tracer
Postprocessing
New:
-
Add tile overlap support to texture indexing mode for neural post processing. Add
Auto
mode toTile size
to directly tile the screen image without scaling AddBorder Overlaps
controls between each tile to deal with discountinuity. * AddOverlap Resolve Type
: 1. Ignore. Overlapped regions are ignored when concatenating tiles. 2. Featherng. Overlapped regions are combined bilinearly - Add neural post processing (experimental).
- Add neural profile to config which neural network to use. Texture index is used by default where [-1,3,H,W] is supported. Use Buffer index to support [-1,C,H,W]. Need to config the batch size override or the tile size correspondingly.
- Config in the post process material of which neural profile to use and enable
used with neural network
. - Use neural input/output to control the input and output of the neural network. For neural input, [B,C, U, V] is the index, input0 takes 3 effective channels, mask determines if we should use it as input to the network. Only one node can be used per material; Multiple neural outputs can be used. For texture indexing, automatic bilinear downscaling and upscaling is applied. For Buffer indexing, the user has full control to access the value ( user needs to perform their own filtering).
-
Added support for controlling which regions are considered highlights and shadows using thresholds in Local Exposure.
-
Add support for mobile SSAO at half resolution. This works with SSAO only, and not GTAO. Use "r.Mobile.AmbientOcclusionHalfResolution" to enable.
- Add NNERuntimeRDGHlsl runtime inference support for neural post processing, and catch more errors into log.
Bug Fix:
-
Fixed bloom when local exposure is enabled but bloom threshold is not used.
-
Fix post process ambient occlusion border filtering out of range. Clamp the sampling UV to ViewportMin/Max bounds. Mobile ignores this clamp as it does not use half resolution normals and Downsampled AO created in the setup.
-
Fixed bugs with Post-Process materials that use stencil test when Nanite meshes that render custom depth are visible.
-
Removed clamp from Bloom setup pass which reduced bloom intensity on very bright pixels.
-
Fixed an issue where Variable Rate Shading could crash or behave incorrectly when one split-screen view was within a post-process volume with an after tonemapping post process material, and another was not.
-
Fixed an issue where artifacts would appear in secondary views when using LocalExposure.
-
Fixed artifacts when using Local Exposure.
RHI
New:
-
Enabled support for screen-space (Tier 2) Variable Rate Shading on Xbox Series X.
-
Remove BUF_ImmediateCommit in favor of only having an explicit buffer commit operation
-
Implement support for shrinking reserved resource memory allocations in D3D12 RHI Release backing heaps when they become unreferenced (contain no committed tiles) Use available slack space in the backing heaps before allocating new heaps Track committed / free memory in ReservedResourceData in terms of tiles instead of bytes Add unit test to cover the basic functionality and a few edge cases Perform AddRef() on the heap directly in FD3D12Heap::DeferDelete() instead of requiring caller beforehand Add RHI stat counter for physical memory used by reserved resources
-
Extend D3DX12Residency library to allow making a set of resources resident independently of command list execution * Issue an explicit residency request when updating tile mappings for reserved resources
- Enhanced the D3D12 RHI to handle up to 32 samplers.
- Added a 'RequiredSamplersSwitch' material editor node, allowing branching based on a shader platform's maximum sampler count.
-
Added support for previewing platforms with support for more than 16 samplers. On editor platforms without Dxc and SM6.0 support the preview menu options are disabled.
-
Added MSAA sample count support to canvas render targets.
-
Perform tile mapping updates on the direct queue when the current queue does not support the operation
-
Extend RHI unit tests to cover basic direct and indirect drawing with instance and vertex offsets
-
Implement basic support for D3D12 Reserved Buffers - Add BUF_ReservedResource and BUF_ImmediateCommit, similar to corresponding TexCreate flags - Add GRHIGlobals.ReservedResources.TileSizeInBytes to indicate minimum unit of physical memory that can be mapped to a reserved resource - Add few basic RHI unit tests to exercise new code paths
-
Refactor D3D12 resource residency tracking to allow multiple residency handles per resource. Add reserved resource backing heaps to the residency tracking system.
-
Add bSupportsVertexShaderSRVs to DataDrivenShaderPlatformInfo which drives PLATFORM_SUPPORTS_VERTEX_SHADER_SRVS shader * This should be used to guard any features that require explicitly accessing buffer or textures SRVs in vertex shaders
-
Added support for point list primitive type on PS4
-
Enabled Vulkan LLM in Test configuration
-
Initial implementation of explicit D3D12 reserved buffer commit / resize First pass implementation only supports growing Commit is implemented as a resource transition to allow asynchronous memory mapping operations in the future
-
VulkanRHI: Update to Vulkan SDK 1.3.250.0
- Add support for reserved buffer commit operation to RDG Add QueueCommitReservedBuffer() to FRDGBuilder Add GetCommittedSize() to FRDGPooledBuffer, to query the physical size of the buffer Change ResizeBufferIfNeeded() to issue a commit operation instead of copying when possible Add r.Nanite.Streaming.ReservedResources CVar (default: false) to allocate Nanite ClusterPageData.DataBuffer as a reserved resource of maximum size, which is committed in ResizeBufferIfNeeded() Based on implementation by Zach Bethel.
Bug Fix:
-
Fix HDR on D3D12 for Intel GPUs
-
Wait on GPUFence if provided in RHIMapStagingSurface implementation
-
Fix vulkan validation layers not being included in installed engine builds
-
VulkanRHI: Vulkan fixes for world normals in path tracing and nanite double-sided materials.
-
Fixed memory leak when standalone games are minimized & videos or other apps are creativing active GPU activity.
-
Completely turn off FSR or FDM when the other is available to avoid vulkan validation layers warnings.
-
Fix logic mismatch between FD3D12Adapter::CreateCommittedResource() which calls StartTrackingForResidency() and initialization of bRequiresResidencyTracking in FD3D12Resource()
-
VulkanRHI: Allow the use of AMDBufferMarkers and NVCheckpoints simultaneously (fix crash on drivers that support both).
Deprecated:
- Deprecate DrawIndexedIndirect, since it's just a more confusing version of DrawIndexedPrimitiveIndirect.
Substrate
New:
-
Rename r.Substrate.TileOverflowFromMaterial -> r.Substrate.UseClosureCountFromMaterial and also remove r.Substrate.TileOverflow, as layer count will now be driven by r.Substrate.ClosuresPerPixel when r.Substrate.UseClosureCountFromMaterial=0
-
Make Glint/SpecularLUT/SheenQuality be set per platform.
-
Add Substrate support for Lumen reflection downsample tracing.
-
Added material topology preview on material graph node, colored pin & wire for Substrate data.
-
Expose Substrate MP_FrontMaterial material attribute to make it accessible from Python scripting.
-
Add GBuffer data value picking/visualization.
-
Add Substrate SubstrateConvertMaterialAttributes to ease material attributes setup & manipulation with Subtrate data.
-
Add analytical derivative support for PT and fix Glint support for PT.
-
Change how Lumen integration work with Substrate. This improves Lumen shading reliability with multi BSDF and improves performance.
-
Fix missing specular lighting with rect light when slab having anistropy. Proper GGX anisotropy lighting with rect light is not supported at the moment. In such a case we fallback onto isotropic case.
Bug Fix:
-
Fix NaN when using light transmission with SSS MFP with MFP=0 for certain channel.
-
Fix incorrect specular/diffuse contribution in LumenCards with Substrate. The original code used EnvApprox, which bypass a lot of specular code (e.g., SpecularProfile) and does not respect the diffuse/specular contribution weight. This leads to incorrect hue/appearance in reflection.
-
Fix Substrate env. lighting on mobile renderer.
-
Fix MediaImage / MediaPlate pre-visualization with Substrate.
-
Fix missing SpecularProfile weighting on secondary specular lobe for env. evaluation.
-
Fix complex special tile not being rendered with local light because stencil value was cleared during the stencil based shadow mask computation.
-
Fix fuzz cancelling SSS on material having a single slab.
-
Fix missing SpecularProfile in Lumen reflection.
-
Fix raytraced translucent shadow with Substrate
-
Fix missing contact shadow casting on hair with Substrate.
-
Fix missing subsurface (Profile/Wrap) in Lumen reflection with hit lighting.
-
Fix nDisplay InCameraVFX rendering with Substrate.
-
Fix Lumen Multi-Bounce AO with Substrate.
-
Fix incorrect break, causing complex materials with fuzz to have incorrect transmittance.
-
Fix Substrate with Lumen Reflection only (i.e. without ScreenProbeGather.)
Simulation
Physics
API Change:
- Rotations and velocities in physics particles are now stored in single precision. It was stored previously in double precision. All the API using a returned reference to edit those values are no longer supported. The following functions should used the new API Set_Value_() instead
- TRotation
& R() - TRotation
& Q() - TVector
& V() - TVector
& W() - TVector
& PreV() - TVector
& PreW()
- TRotation
-
In FTransformDynamicCollection in GeometryCollectionProxyData.h all attributes were public, then now are private. Use the new API to access them.
- The Chaos Cache Manager track compression feature is controlled by a console variable and enabled by default (p.Chaos.Cache.CompressTracksAfterRecording)
New:
-
[NetPhysics] Added NetworkPhysicsSettingsComponent as an ActorComponent as a way to set individual settings for networked physics per actor. Currently implements a limited amount of settings for physics replication through Predictive Interpolation and physics Resimulation.
-
Mac: Change the default of Slate.MacMainMenuInsideUnrealWindow to true
-
Chaos Cloth Asset - Added USD Import node.
-
Geometry Collection: Enabled rendering of root proxy meshes when available ( in both editor and game )
-
Cloth Editor Remesher: better handling of open meshes in the Render mesh. Add the option to detect connected boundary vertices that are coincident with another connected set of boundary vertices on another boundary elsewhere. We can then explicitly remesh these "seams" while maintaining a vertex pairing, before then going on to remesh the interior of the mesh islands.
-
Chaos Cloth Asset: - Added a new Cloth Component property to enable the Cloth Asset simulation in editor. - Added simulation controls to the Cloth Component Details panel. - Added a new Cloth Sim section filter at the top of the Cloth Component UI. - Tidied up the Cloth Component categories.
-
Geometry Collection: Optimize data marshalling between physics thread and game thread for geometry collection proxy. This reduces the size of the data to be marshalled as well as the time to process it
-
Add grow, shrink, and flood buttons to the Selection tool
-
Added a Geometry Collection dataflow node for magnet clustering
-
Chaos Cloth Asset - Added a new Proxy Deformer node to the Cloth Asset Dataflow nodes.
-
Added a new cvar (p.Chaos.Convex.UseSimplifierForTConvexHull3Builder) to use a new ConvexHull3-based simplifier in the chaos convex builder, instead of the default simplification; this may give better results in some cases.
-
Added a Geometry Collection dataflow node to create containing cluster nodes for collections w/ isolated root nodes w/ no other transforms.
-
Cloth Editor: focus on tool-defined selection box when user hits 'F', not the entire cloth object
-
[NetPhysics] Implement runtime correction for actors using resimulation while within threshold of not triggering a physics resimulation.
-
Dynamically scale down memory allocation for rewind caching when cache shrinks.
-
[NetPhysics] Allow NetworkPhysicsComponent for physics resimulation to be implemented on AActors instead of only on APawns.
-
Added a warning and progress bar when user attempts to convert a large mesh (>1M tris) to geometry collection
-
Added a dataflow node to get the number of spheres in a sphere covering, to help analyze fracture collision shape generation.
-
Cloth Asset Editor - Removed saving from Dataflow asset creation to match the cloth asset behavior.
-
Implement various physical properties accessor functions on the primitive component in terms of the underlying physics object handle (UPrimitiveComponent::GetPhysicsLinearVelocity, UPrimitiveComponent::GetPhysicsLinearVelocityAtPoint, UPrimitiveComponent::GetAngularVelocityInRadians, and UPrimitiveComponent::GetCenterOfMass).
-
Expose ForceRebuildGTParticleGeometry on cluster unions publicly to allow AddComponentToCluster to optionally not call it immediately so the call can be bulked.
-
Added HashTable implementation for AABBTree payload tracking to reduce memory costs of AABB trees in when used as a local sub-acceleration.
-
Cloth Editor: move Tool buttons to the top toolbar
-
[NetPhysics] Physics replication improvements - Enable time-dilation without using resim to keep client and server physics aligned for better physics replication. - Allow larger replication target alignment, since it will be kept in check via time-dilation. - Allow early out while target has velocity and extrapolate target correctly while performing early-out. - Take receive rate into account for Position and Rotation correction. - Don't send RepMovement from server if using ReplicationCache and the async physics thread has not ticked.
-
Add p.Chaos.DebugDraw.ColorShapesByClusterUnion to be able to differentiate between cluster unions when drawing internal clusters.
-
Geometry collections now set debug name on their GT particles.
-
Cloth Editor layout changes: - Dataflow Graph Editor extends to the left of the editor window - Dataflow Node Details tab is horizontally aligned with the Asset Details and PreviewScene Details - Outliner is in the same tab stack as Dataflow Graph Editor
-
ClothingMeshUtils: if we encounter degenerate triangles during skinning, only do a Slate notification once rather than for each vertex. Multiple slate pop-ups can cause the Editor to become temporarily unusable.
-
Update Chaos::TEventContainer to use a map for storing handlers to optimize unregister calls. When the container has several thousand handlers the linear search is very slow (several MS). Switching to a map increases this significantly. We do lose a bit of speed in DispatchConsumerData as we need to iterate over all the events, but this didn't seem to cause a noticeable regression when profiling.
-
Turn on acceleration structures for cluster union queries.
-
When creating a geometry collection from the fracture editor, suggested name now uses a "GC_" prefix instead of the "_GeometryCollection" postfix to better match Unreal asset naming convention
-
Make FRigidClustering::RemoveParticlesFromCluster and FRigidClustering::AddParticlesToCluster do incremental updates (as much as possible) to the cluster particle's internal strain, cluster group, and physics proxy set instead of needing to re-build these properties from all its children.
-
Add a "secondary selection set" to the Selection Node, Tool, and Facade. This is an optional second set of mesh elements for a given Selection. The intended use case is for operations where the user wants to associate one selection set with another -- for example pairing up Sim Faces and Render Verts for wrap deformer binding.
- [NetPhysics] Predictive Interpolation improvements:
- Perform soft-snap if replication starts going out of sync
- Improved early-out logic
-
Cloth Editor: visualization of seams in 2D and 3D sim views
-
Cluster unions no longer manage their child components' owners' dormancy.
-
Add cvar (p.Chaos.OnlyUseInterclusterEdgesAttachedToMainParticles, default false) to only allow particles directly connected to a cluster union via an intercluster edge to be added/kept in a cluster union.
-
Cloth Editor: when creating a new Dataflow asset, add a Terminal Node by default
-
Geometry collections now emit an event when their particles are fully decayed.
-
Cluster unions will now export their navmesh geometry from their child components.
-
Chaos Cloth Asset: - Fixed missing Cloth Asset package dirty flag whenever the asset is re-updated. - Added a refresh button to the Terminal Node UI to force regenerating the asset when the code but not the data has changed.
-
Expose fully decayed flag on geometry collection components to game systems
-
Chaos Cloth Asset: - Added remap function to the AddWeightMap node. - Fixed property detail view refresh when the node's connections changed. - Deactivate the active tool when a node is invalidated.
-
Geometry Collection: Improved use of cached component space bounds to avoid unnecessary computation
-
[NetPhysics] Various fixes for physics resimulation. - Make sure RewindData is setup before UNetworkPhysicsComponent::CreateDatasHistory is processed. - Use the same history size in UNetworkPhysicsComponent as in RewindData. - Make "Project Settings > Physics > Enable Resimulation" setup RewindData. - Fix issue with time dilation RPC not getting applied on the client. - Fix issue with FPhysicsReplicationAsync::ResimulationReplication not triggering a resimulation due to target TickCount not always being 0 for resimulation targets. - Stop warning logs of "out of rewind data bounds" from printing before the rewind data is populated fully. - Remove / fix various asserts that could trigger during a resimulation due to objects having changed between cached history and current state, for example an object existing currently but not in history which is intended. - Don't allow duplicate or out of order physics replication targets.
- Deprecateed an unused flag from FLinearDriveConstraint.
- Added SetDriveParams to ConstraintInstance to allow the most common changes to be made without needing to make multiple calls and locks. Renamed the FPBDJointConstraintHandle version of this so it matches.
-
Added an AssignPhysicsAsset node to the skel mesh editor subsystem to handle editor scripting of modifying the physics asset for a mesh.
-
Implement shallow copying for Chaos geometry speeding up modifications to geometry and shape arrays on particles.
-
Cloth Weight Map Paint Tool/Node: allow weight map painting on Render vertices. The AddWeightMapNode now stores two sets of vertex weights: one for sim vertices and one for rendering. Changing the view mode while the paint tool is active will load the appropriate weight map from the node. There is also a drop-down selector for choosing which of the two vertex weights should be saved into the ClothCollection (or both.)
-
Improve help text for functions moving actors etc, giving more info about the behaviour when teleport is/isn't used.
-
Updated _ChaosDebugDrawComponent _to render in the Editor world
-
Geometry Collection: Optimized ticking logic on the geometry collection component. Now the component only ticks when there are pieces actively being removed
-
Cloth Editor paint tool: allow brush to get super small. Also fix brush circle not updating after manually setting the brush size property
-
Chaos Cloth Asset Editor: - Added node evaluation progress bars.
-
Cloth Editor: adding two ways to hide/show triangles in the paint tool: - A new HideTriangles brush mode that will hide triangles that are brushed - A new tool property that is a list of Patterns and whether each one is visible or not Limitations: - Hide/show information does not come along when switching between 2D/3D modes - Checkbox interface for selecting which patterns to show is clunky - Manually hiding triangles via brush then unchecking all patterns will clear the manually hidden triangles Also adding an optional white-red mode to visualize the weight map. Painting an all black object in 3D with a dark grey background is pretty annoying.
-
Cloth Editor weight map paint tool: change from triangle painting to vertex painting
-
Expose GetGeometry in the physics object interface.
-
Added the option for Fracture Mode's Autoclustering tool to favor clusters with more convex shapes.
-
Store velocities and rotations in single precision in Physics particles This is saving 80 bytes per particle
-
Added SetCurrentTime blueprint function to Chaos Cache manager/player
-
Geometry collections now track their previously set world transform external so the GT can compute the difference between the two if needed (e.g. if it needs to query the difference prior to the PT->GT sync).
-
Cloth Editor: optional information in the Construction viewport - Numeric mesh stats (so far just triangle/vertex count) - Color-coded cloth patterns
-
Cloth Editor: refresh the Construction view after the Dataflow graph executes. Also rename a member variable from the too-generic "DataflowNode" to "SelectedDataflowNode"
-
Chaos Cloth Asset - Disable the Cloth Asset properties that must be set within the Dataflow graph, to prevent these properties from being accidentally edited inside the Cloth Asset Details panel.
-
Cloth mesh-to-mesh skinning: check that the area of a normal-offset triangle is non-zero before trying to compute barycentric coordinates for it
-
Added a geometry column mode to fracture hierarchy view, which shows triangle and vertex counts, including cumulative counts for cluster nodes
-
Exposed SetUpdateKinematicFromSimulation on Primitive Components to Blueprint
-
FPhysScene_Chaos::HandleGlobalCollisionEvent nonw bubbles up the collision ShapeIndex in cases where we collide against a cluster union
-
Added an option to show in PhAT when a pose violates the joint limits
-
Cloth Editor Weight Map paint tool changes - set default Strength to 1.0 - hook up Q/A hotkeys to cycle through brush modes - hook up W/E hotkeys to adjust Value property
-
Expose enable/disable collision functionality (etc) in the Simulation. Using this provides more reliable collision interactions with the ImmediatePhysics simulation (affects RigidBody and RigidBodyWithControl animation graph nodes).
-
Expose UGeometryCollectionComponent::IsRootBroken publicly.
-
Cloth Selection Tool: add a flood fill deselect action: shift+ctrl+click will deselect all connected mesh elements
-
ClothingMeshUtils: use the same error format for degenerate triangles in both the single-influence and multiple-influence code path
-
Cloth Editor: move the Simulation Visualization panel from drop down menu to its own tab
-
Move cloth editor tool headers to private. Rename ClothEditorToolBuilder to ClothEditorToolBuilders and centralize ToolBuilder classes for the cloth editor
-
Cloth paint tool: add an Invert action to flip paint values. Also, when painting in 2D update any additional 2D vertices that are mapped to the same 3D vertex via welding.
-
Dataflow: highlight "Deprecated" or "Experimental" nodes
-
Geometry Collection are now using a optimized replication logic
-
Cloth selection tool: fix back face material checkerboard
-
Dataflow: Add StaticMeshToCollection node
-
Chaos Debug Draw: Added mass display for kinematic and dynamic particles (p.Chaos.Solver.DebugDrawMass)
-
[NetPhysics] Implement physics resimulation error correction through render interpolation for Cluster Unions and Geometry Collections.
- [NetPhysics] Resim improvements:
- Render interpolation bug fixed as a result of PullData being properly updated in all cases.
- Reduce redundant inputs in each network sync to 3, same default value as the server input buffer.
- Implement resim runtime correction for velocity and angular velocity, guarded by CVar that is disabled by default for now, also implemented as an option int the NetworkPhysicsSettingsComponent
- Implemented replication particle correction that recalculate friction points after an XR correction to make corrections overcome friction.
-
Reduced memory usage of geometry collections.
-
Cloth Editor: make the SkeletalMesh and Animation properties of the Preview Scene persist between editor sessions
-
Cloth Editor: add a "ping pong" mode to the skeletal mesh preview animation playback
-
Cloth Editor Remesh Node: regenerate long-range attachments and self-collision spheres after remeshing. Also remove any other Selections if we remesh.
-
Geometry collections now return false for CanEditSimulatePhysics if no rest collection is set.
-
Add a Remesh node for Cloth. For the sim mesh, the node operates on the 2D representation by first remeshing the seam and boundary edges, then remeshing the entire mesh while constraining those edges. Finally it (un)projects the 2D mesh to 3D using the input 2D/3D mesh representations. For the render mesh, it remeshes the boundaries first, then the interiors in 3D since there are no seams. (Render Mesh LOD generation is likely to be replaced with something more user-controllable in the future, this is kind of a placeholder.) Still TODO: additional constraints for other sim needs
- [NetPhysics] Resim improvements:
- Allow applying closest state on rewind if there is no state for the rewind frame.
- Cache incoming inputs for local player so that the server can alter inputs and have them applied on autonomous proxies during physics resimulation.
- Set a Prediction Interpolation object to resimulation while it interacts with a resim object.
-
[NetPhysics] Functionality for input decay during physics resimulation when there are no more valid inputs.
- [NetPhysics] Resim and replication improvements:
- Implement functionality to find a valid resim frame where all particles in a resim island have a valid target to rewind to.
- Deactivate predictive interpolation logic while particle is in the same island as a resim particle.
-
Chaos Cache Manager: Made observed component component ref accessible from blueprints
-
Chaos Cloth Asset: Added a default template Dataflow asset that appears on all newly created Cloth Assets.
- Geometry Collection: Added bDensityFromPhysicsMaterial to the geometry collection component
- When on, the density set in the rest collection asset will be ignored and the one from the assigned physics material will be used
-
Added an optional transform selection to the Geometry Collection dataflow Flatten node
-
Added a Geometry Collection Dataflow node to clear convex hulls from a selection of bones
-
Cloth Editor preview scene: add a toggle to enable/disable PostProcess Blueprints on the SkeletalMeshComponent
-
Made the Fracture Mode Flatten tool and the corresponding Geometry Collection Dataflow node skip all non-clusters in the selection, rather than converting them to select the parent cluster. This allows one to e.g. select all level 1 nodes and flatten without risk of flattening level 0 if there are leaves on level 1.
- Geometry Collection: Optimized dynamic collection memory
- The immutable MassToLocal attributes have been removed and are now read directly from the asset rest collection This saves 2x96 bytes per bone per geometry collection component instance
-
Adding the ability for Geometry Collections to specify the use of the potentially more expensive collision geometry from the source Static Meshes on the game thread instead of the combined GC collision, when precision is more important than the possible improved performance of the combined GC collision
-
Geometry Collection: Optimized computation of component space transforms ( they are now computed on demand )
-
Made the Fracture Mode's Reset tool into a modal tool, and made "Reset Materials" an option on the tool (rather than trying to guess whether we should reset materials based on material counts)
-
Cluster union initialization now initializes the cluster particle to the component's initial transform and all added particles now have its child to parent set based on their location relative to the cluster union component transform at the time of the addition on the GT.
-
Added additional safeguards to protect against the scenario where the cluster union actor/simulating component replicates after the UClusterUnionReplicatedProxyComponent.
-
[NetPhysics] - Predictive Interpolation replication fixes and improvements - Average out receive rate so that fluctuating send-rate and network conditions doesn't affect replication. - Redesign the angular velocity replication to adjust the target angular velocity based on the angular diff.
-
Geometry Collection: Optimized dynamic collections memory usage by removing deprecated collision related attributes This saves 6 x 4 bytes per bone per geometry collection component instance
- [NetPhysics] Enable physics rewind data capture at runtime if resimulation is used and Project Settings -> Physics -> Physics Prediction is enabled.
- RewindData starts getting captured if either using NetworkPhysicsComponent, EPhysicsReplicationMode::Resimulation on an actor or if manually toggling it by calling FPBDRigidsSolver::EnableRewindCapture().
-
Clarified the Dataflow selection set operations and added a non-symmetric difference op
-
Geometry Collection : Added a "use material damage modifier" option to the GC component. When on, all damage thresholds are multiplied by the damage multiplier property set in the physics material assigned to the component
-
Implement GetComponentVelocity for cluster unions.
-
Add a bReplaceHitWithSubComponents option to collision query params that will let us determine whether or not we hit a cluster union by subtracing into the cluster union but only return the cluster union if it hit
-
Chaos: Add global limit "p.Chaos.Clustering.PerAdvanceBreaksAllowed" to number of processed breaks in BreakingModel for strained particles.
-
Chaos Cloth: - Added a p.ChaosCloth.Solver.MaxVelocity console variable to clamp the relative particles' velocity to the skinned cloth mesh velocity. - Added a p.Chaos.VelocityField.MaxVelocity console variable to clamp the relative particles' velocity to the aerodynamics velocity field. - Added a p.Cloth.MaxVelocityScale console variable to clamp the maximum velocity scale values allowed on all cloth simulations.
-
Cloth - Added a skeletal mesh component velocity scale property to reduce the component induced velocities on all its cloths. This also replaces the bLocalSpaceSimulation property that was used with Chaos Cloth and had been deprecated.
-
Add UClusterUnionComponent::FindChildPhysicsObjectGivenShapeIndex which allows users to query a cluster union to get the underlying physics object given the shape index.
-
Geometry Collection: Added an option to allow Geometry Collection Component transform to follow its root bone (when dynamic)
-
Chaos Cloth: Added simple Self Collision Spheres constraint which is much cheaper than the existing vertex-face self collisions.
-
Cloth Editor Remesh Node: Add a Simplify option for Render mesh decimation. When enabled, this will use FSimplifyMeshOp rather than FRemeshMeshOp. The Simplifier uses QEM to prioritize removing vertices in flat areas to preserve curvature. The result is typically a lower poly count but less uniform mesh than FRemeshOp produces. Because of this, it's only enabled for the Render mesh.
-
Chaos Cloth - Added a global gravity multiplier console variable p.ChaosCloth.GravityMultiplier (default to 1).
-
Add ability for cluster unions to either set or inherit their childrens' gravity group index.
-
Reduce memory usage in Geometry Collection Relative Transform in Dynamic Collection are now in single precision. This change implicates an API change. The Managed Array of transforms being in public, and being changed make some backward compatibility breakage. This array shouldn't have been used much.
-
Geometry Collection: Optimized computation of bounds when the geometry collection is not yet broken
-
Optimized the removal of pending async commands
-
Incremental addition to/removal from cluster union implicit object geometry on both the GT and PT to improve performance.
-
Added simple track compression to Chaos Cache Manager. After recording the track will be compressed using a simple (and fast) compression logic aggregating similar contiguous keys
-
[NetPhysics] Physics replication stuttering fixes when receiving replicated states at unexpected intervals.
-
[NetPhysics] Resimulation Improvements - Runtime correction for rotation improved, faulty calculation fixed and correction not done with pre-resim data. - Don't apply replicated targets during resimulation, only on rewind. - Implemented flow to compare predicted states and inputs with the received server states and inputs to trigger resimulation from discrepancies through NetworkPhysicsComponent.
-
ChaosFlesh: Add Gauss Seidel master constraint
-
Geometry Collection: Add support for masked materials when using Nanite
-
Added a new Cluster Merge to Neighbors dataflow node, allowing selected bones to be independently merged to their nearest or largest neighboring bones/clusters
-
Geometry Collection: reduced memory usage of geometry collection components
- Geometry collections can now specify a collision profile per particle/level that loads the default asset collision profile.
Bug Fix:
-
[NetPhysics] Fix issues with replication target alignment. The fix ensures that SendInterval and ReceiveInterval is calculated and used correctly to align replication targets with and that we start target alignment first after the 3rd valid state is received.
-
Geometry Collection: Fixed issue where collision with a transform were ignored when importing collisions from source
-
Fix crash when deleting selection node while selection tool is active
-
Limit cluster children GT sync to children of dynamic clusters. Kinematic clusters aren't updating non-dynamic children and do not need to force a transform update.
-
Non-GT frozen sim callbacks now also have their SimTime and DeltaTime set properly.
-
Cluster unions should only add themselves into the SQ if they are non-empty (i.e. have a non-zero # of shapes and the shape in the shapes array isn't because of a shape created by an FImplicitObjectUnionClustered).
-
[NetPhysics] Create fake target for predictive interpolation replication on Awake event to stop client from desyncing from server by waking up and simulating freely.
-
Cloth Asset Builder: don't assert if there is not one material per render pattern in the asset, just log a warning. Even though each pattern has a material in the ClothCollection, the user can still remove materials from the asset after the graph evaluates, which can cause this assert to fire when the asset is subsequently loaded.
-
Properly separate geometry collection bone names with "_" between levels to ensure bone names are unique per GC when using auto-clustering.
-
[NetPhysics] Predictive Interpolation replication improvement, align the angular replication timeline with the linear replication timeline. Better replication of off-center rotations.
-
Fix use-after-free in the cluster union manager and ensure that the ImplicitUnion remains valid if the geometry is updated in FClusterUnionManager::FlushIncrementalGeometryOperation.
-
Chaos Cloth Asset - Fixed missing bones when the Cloth Component is used with a higher LOD Skeletal Mesh Component that runs a simplified bone hierarchy.
-
Chaos Cloth Asset - Fixed crash in welding when two consecutive stiches have one end point in common.
-
Cloth Editor: fix for clicking on the same node twice making the sim mesh disappear
-
Fix an issue where clustered particles may not be removed from the StaticClusteredMapArray and KinematicClusteredMapArray arrays when destroyed.
-
Cloth Editor Toolkit: deactivate ClothEditorMode in response to OnClose(), not OnRequestClose(), since editor shutdown can be cancelled after OnRequestClose() is called
-
Server crash on executing async physics command
-
Dataflow: made loop detection more robust when connecting nodes in dataflow
-
Geometry collections no longer set themselves dormant to avoid client/server desync
-
Geometry Collection : Fix inertia tensor and mass computation to support mirroring ( by using a negative scale on one axis )
-
Geometry collection physics proxy now properly sync the particle transform into the dynamic collection.
-
Cloth Editor: don't start the preview animation any time anything changes in the graph
-
Chaos Cloth Asset - Fixed crash when removing a LOD from the Cloth Editor Dataflow while visualizing it.
-
The GC proxy sync is now prevented from doing work if its parent GC component is removed from the scene.
-
UGeometryCollectionComponent::SetSimulatePhysics now goes through the route of recreating the physics state to ensure that the physics state gets destroyed when the component is destroyed.
-
Updates to the geometry collection's particles' shapes collision data on the PT now propagates the information to the cluster union.
-
Fixed an infinite clustering bug in geometry collection's merge neighboring clusters algorithm
-
Fixes for using a fixed timestep with immediate physics (affecting the RigidBody and RigidBodyWithControl animation graph nodes). This is useful for when the frame times can be small (i.e. high frame rates), and adds an option to allow velocities to be rewound along with positions - this ensures that controls/constraints are essentially independent of frame rate when using fixed timesteps.
-
Geometry Collection : Fixed potential crash in FillAutoInstanceMeshesInstancesIfNeeded if the index attribute is not found but the asset has auto instance meshes assigned
-
Chaos Cloth Asset - Fixed the TransferSkinWeight node's weight map name override UI mechanism that wasn't showing the input weight map name when connected.
-
Geometry collections now compute its component space transforms even on the server to prevent desync issues between client/server for character basing.
-
Cloth Editor Preview Scene: manually register skeletal and cloth components instead of calling RegisterAllComponents
-
Geometry Collection : Fixed assert when using nanite masked material
-
Geometry collections now reset their dirty index after calling PushStateOnGameThread or else dirtying that proxy will never cause a GT->PT sync ever again.
-
Chaos Cloth Asset - Fixed crash when evaluating Name output of the AddWeightMap and SelectionToWeightMapNode nodes without evaluating their collection.
-
FPhysScene_Chaos::HandleGlobalCollisionEvent should not try to grab the proxy's body instance if its owning component is no longer valid.
-
Cluster union child to parent update now store which cluster union the update is for to prevent the case where an update forces the particle to go to the wrong location since the child to parent update was for a cluster union it is no longer in.
-
Dataflow - Enable the comment node in the property editor so that the comments' text size and color can now be changed.
-
Strain modifications now happen on all the particles we want to process and not just the top level strained particles.
-
Fix an issue where UWorld::ComponentSweepMulti would return whether there was any hit rather than if there was a blocking hit.
-
Cloth Editor: don't refocus when pressing 'F' if the viewport is empty
-
Fixed a crash in the Fracture Mode's outliner system
-
Geometry collection particles no longer increment sleep/break timers while in a cluster union.
-
Chaos Cloth Editor: fix crash when selecting Comment nodes
-
Cloth Editor Selection Tool: request graph evaluation when leaving selection tool
-
Chaos Cloth Asset - Fixed the module name in ChaosClothAssetToolsModule (was ChaosClothAssetEditor instead of ChaosClothAssetToolsModule).
-
Fix material index mapping when turning multiple cloth collections into LODs for one asset
-
Geometry Collection : Fixed dynamic data replication where root bone position and velocity would be ignored if not part of a cluster union
-
The owner property on per-component data for cluster unions is now set properly.
-
Updating a particle's child to parent in a cluster union now properly propagates that change to the implicit object transform.
-
Geometry collection: Fixed bug where anchored bones were not breaking under strain
-
Fixed event buffer growing unbounded when running in single-threaded modes.
-
Server crash on GeometryCollection when updating RepData due to accessing uninitialized world.
-
Cluster union : when processing damage from contact, find the actual child particle in contact instead of using the one that has the closest center of mass
-
Fix for potentially passing a zero-length normal FindGeometryOpposingNormal in SweepQuery.
-
Fix crash when right clicking a comment node in DataflowGraphEditor
-
Dataflow - Removed ensures that caused errors to nodes whose inputs/outputs had been deprecated and removed, and replaced them with a log message instead.
-
Added mitigation for cases where geometry collections receive out of bounds replication requests for the particle array
-
Cloth - Fixed crash when undoing paint on an unbound clothing data.
-
Fix issue where adding a particle with an existing parent into a cluster union would cause that particle to snap to a different position due to ChildToParent being set too early.
-
Geometry Collection : Fixed race condition when setting some of the geometry collection proxy properties at runtime
-
Alter material fetch during destruction cluster creation to not call GetMaterialData directly as that causes a material array to be allocated.
-
Stopped geometry collection components from spending time updating their body instance inherited from primitive component when updating transforms.
-
Chaos Cloth Asset - Set default MaxDistance weight map to 1 when MaxDistance properties have been set.
-
Fix crash in the AABBTree when potentially accessing a particle with a nullptr debugname.
-
Introduced better cleanup of geometry collections to ensure that they are removed from cluster unions and that they aren't considered for being added into cluster unions in the breaking model.
-
Cluster union syncing now better handles cases where the GC proxy pointer can be almost immediately re-used.
-
Cluster unions now set BodyInstance.OwnerComponent so that it can be registered for collision events.
-
Cloth - Fixed broken camera movement when exiting the cloth painting mode.
-
Geometry Collection : Fixed rest transforms not properly reflected in the viewport when set in a construction script
-
Introduce better particle state management for cluster unions so that it no longer relies on needing to pass Chaos::FPhysicsObjectHandles back and forth from the GT to the PT which would result in the possibility of dead particles still being bookkept by the cluster union
-
Added proper cleanup the cluster union manager's PendingChildToParentUpdates and PendingParticlesToUndoChildToParentLock containers so we don't have garbage pointers lying around in containers that continue to grow uncontrolled
-
Minor optimizations to chaos collision event handling.
-
Cloth Editor: fix crash when reloading Dataflow asset
-
Fix issues where pulling data for the geometry collection from to the PT back to the GT reads old data instead of the latest data.
-
Remove calls to ResetDirtyIdx on the PT to prevent a possible race condition.
-
Cloth Selection Node: check that selection indices are valid for the associated group before adding to the collection
-
Cluster unions now properly reset their geometry to an FImplicitObjectUnionClustered in RemoveParticlesFromClusterUnionGeometry if it ends up empty.
-
Geometry Collection : fixed broken pieces failing to shrink when removal feature was enabled
-
Geometry collections and cluster unions now initialize their kinematic state on the GT if needed.
-
Chaos Cloth Asset - Fixed the bone transforms update when the Cloth Asset's Leader LOD isn't available on the Cloth Asset.
-
Geometry Collection: Physics material will now be properly set if the physics state has been already created
-
Cluster union manager now only prevent adding a particle into a cluster union only if the particle itself is in the cluster union - not caring if the new particle's parents are in the cluster union.
-
Geometry collections now reset their rest transforms just in case they were stored accidentally.
-
Chaos Cache Manager: Fixed potential crash when recording using spawnable
-
[NetPhysics] Physics replication, Predictive Interpolation, to make sure the object goes to sleep and is asleep before stopping the replication else another simulated object can keep the object awake and make it desync from the server.
-
Code specifies TeleportPhysics when moving components through physics replication. This avoids warnings that can appear in USkeletalMeshComponent::MoveComponentImpl when using the default movement method.
-
Chaos - Ensure that collisions disabled using the FMidPhaseModifier are reset to enabled the next frame
-
Geometry collections now reload their collision profiles when the primitive component body instance collision settings change.
-
Reduced memory usage in chaos RewindData.
-
Fix issue where replicated cluster union particles would not accurately account for particles that were removed from the cluster union.
-
Per-particle collision profiles for geometry collections now load correctly on the PT even when there are nullptr particles.
-
Geometry Collection : Fix memory leak when setting the rest state when the scene proxy is not created
-
PR #10735: Fix the order of multiplication of quaternions in
ApplyDeltaToAllPhysicsTransforms
in the Skeletal Mesh Component. This affects movement applied to the character through the character movement component. #contrib 10735 -
[NetPhysics] Physics resimulation improvements to rewinding physics when multiple dynamic objects are in contact.
-
Fix potential array out-of-bounds in FClusterUnionManager::HandleRemoveOperation due to duplicate particles in the array of particles to remove.
-
Cluster unions should be unbreakable on the client to help prevent server-client desync.
-
Fixed a failing check when AutoCluster is run but requests zero clusters.
-
Fixed an issue where a geometry collection source would lose its last material.
-
Breaking a geometry collection will now automatically remove from the parent cluster union.
-
[NetPhysics] Fix issue where physics resimulation could get blocked indefinitely
-
Chaos Cloth Asset Editor - Fixed scale reset to 1 on the skin weight transfer tool.
-
Non-blocking traces/overlaps now also trace into cluster unions.
-
Fixed an issue where the Fracture Mode's AutoCluster tool would not cluster when using the ByGrid clustering option.
-
Made the cluster union child to parent replication via the proxy component authoritative so that other sources (e.g. the GC proxy world transform update) don't try to fight that.
-
Improved robustness and behavior of fracture mode when a selected geometry collection is changed by something other than the fracture mode's tools (e.g., by a dataflow graph)
-
Cluster unions now properly remove from the ActorToComponents map even if the actor is no longer valid because it's pending kill.
-
Mac: Fixes to enable groom on M2+ devices. Addresses a hang that was occuring. This is leads to a reduction in hairless nightmare fuel.
-
Handle geometry collection particles being decayed immediately on the physics thread and fix immediately decayed internal geometry collection clusters reporting their children as active.
-
Fixed physics scene pending tasks causing hangs when dispatched during world shutdown
-
Fix handling of kinematics with the write-back from simulation, in particular when using the cvar SyncKinematicOnGameThread
-
Fixed incorrect options in the Fracture Mode 'Set Initial Dynamic State' menus: Added the missing Static options, and removed the Sleeping option.
-
Fixed a crash on redo of any transaction that updated both a Static Mesh's Mesh Description and its convex collision shapes.
Deprecated:
-
PhysXIncludes.h and NvClothIncludes.h will now report a deprecation message if included unncessarily.
- Deprecated COPY_ON_WRITE_ATTRIBUTE and Indirect TManagedArray (use the RestCollection to access those attributes instead)
- Removed CopyOnWriteAttributeList
UI
New:
- Improved text quality by preventing aliasing on glyph quad edges. The difference won't be noticeable in simple cases, but as soon as non axis aligned rotation, scaling, or sub pixel scrolling will occur, the glyphs with content along the edges will look better.
Bug Fix:
-
Add an InitalizeDependency to Enhanced input on the common input subsystem. Since we bind to a delegate on the EI subsystem on Initalize, we need to specify it as a dependency or else it may not be available in a packaged game.
-
Fixed FNullWindow forcing windows to be zero-sized before it was properly initialized
-
Fixed wrong vertical offset on distance field fonts imported as offline on Linux or Mac.
-
-Fixed a possible infinite loop when importing TTF with a specific glyph ranges. -Fixed issue with the FontEditor not refreshing the details view when changing the font cache type.
Slate
API Change:
- SRetainerWidget's Slate argument "RenderWithLocalTransform", as well as cvar Slate.EnableRetainedRenderingWithLocalTransform are deprecated and will be ignored, as they ares no longer necessary (it was a workaround for now fixed transformation issues).
New:
-
Added text block property ApplyLineHeightToBottomLine
-
Adding support for getting and setting the SFilterSearchBox search history text
-
Updated AssetPicker: Filter UI combo button is now created using a common helper method. This fixes the lack of the red dot overlay when filters are active & unifies it with how the Content Browser works - Filter UI combo button placement is now configurable. Maintains old behavior of being placed on the right to the search bar, but can also be placed on the left like the content browser no
-
Added ability for NavigationConfig to modify EUINavigationAction rules
-
Optimization for Slate texture atlas look-ups, resulting in roughly 4x speed-up.
-
Remove check for unscaled view rect non negative, assumption is not correct when accounting for PIE scene view offset.
-
Slat WrapBox now support flow direction.
-
Emit material names for GPU frame captures when drawing in Slate.
-
Added slate argument to SGraphActionMenu to automatically proceed when only one action exists. Defaults to off to save perf. Useful for some Niagara cases.
-
Graph Nodes now have a configurable title border margin; accessible via protected member
-
Added a new text overflow policy: MultilineEllipsis. It behaves similarly to Ellipsis on single line text, but it will ensure that if a line is partially clipped on the vertical axis, it will completely be removed, and the "..." will be shown at the end of the last visible line. It avoids possible issue occurring with multiline text and the Ellipsis mode where the "..." could be invisible because they were displayed in the lower clipped part of the text. #virtualized
-
Added a new option in the Composite Font to enable or disable usage of the Font Face ascent/descent override.
-
Fix slate texture resource crashes on null textures
-
Graph Nodes can now specify what overflow policy to use for the node title
-
Fixed expensive sub-class iteration in UWidget::FindBinderClassForDestination; this method will likely be deprecated in the future.
Bug Fix:
-
Fix ScreenResolution not mapping to viewport in PIE for UI materials / widgets.
-
Update the widget event log to automatically scroll to the bottom, since scrolling it manually will often result in more events being created
-
Fix AnalogCursor mouse move events not properly passing Cursor Index causing issue with mouse capture when using multiple cursors.
-
SSuggestionTextBox now presents the suggestions from the top of the list.
-
PR #10934: Fix RoundedBox SlateBrushes defaulting with an outline radius of (0, 0, 0, 1) #contrib 10934
-
Fix Slate Insights not working due to untracked widget names when using Trace Start / Stop.
-
Fix Slate Frame View not working when opened after insights timeline
-
Fixed issue where cursor lock position would be misaligned after moving window with global invalidation enabled
-
[Retainer] Fixed retainer widget rendering and input issues. Previously, there was a cvar "Slate.EnableRetainedRenderingWithLocalTransform" allowing to choose between 2 render paths, both with different transformation issues. Now there is a single path fixing all transformation problems, and the cvar is deprecated.
-
Fixed SlateTextureAtlas creating free nodes in the empty slot list that have dimensions smaller than what we feasibly expect can be used by glyphs.
-
PR #11088: Slate: Fix custom element shader missing for StandaloneRenderer #contrib 11088
-
Fix New LWCData not populated in slate vertex shaders
-
Fixed an issue when using Preserve Aspect Ratio on an SWindow where the window would change aspect ratio the first time it was resized if it didn't have an OS border/titlebar
-
Fixed slider only moving by one step when bMouseUsesStep is enabled
-
Fixed issue where cvar Slate.ShouldFollowCultureByDefault was ignored.
-
Update Slider widget to use current cursor position instead of previous position
UMG
New:
-
Add framework for processing slate scenebuffer copies --- To create a new slate post buffer processor, inherit from 'USlateRHIPostBufferProcessor' & implement 'PostProcess' To use in game, create a BP that derives from your buffer processor, ex 'USlatePostBufferBlur'. Set default values on that BP, then connect the processor to a buffer in 'SlateRendererSettings'. [REVIEW] patrick.boutot
-
Expose scenebuffers to UMG --- Feature guarded by 'Slate.CopyBackbufferToSlatePostRenderTargets' disabled by default in initial commit. To use simply call GetSlatePost0 material function after enabling CVar. No overhead unless a widget is rendered using the material function, overhead is minimal (Single-copy 0.003 ms). GetSlatePost1-4 require enabling via project settings. [REVIEW] yohann.dossantos jason.nadro #virtualized
-
Add support for layered Slate Post RT processing --- Add PostBufferUpdate widget which can be used to trigger an update to the Slate Post RT when it "draws" Updated Post RT will contain Scene + All UI drawn at that time & also be processed by provided processor. Updated ICustomSlateElement interface to support draw context params.
-
PR #10734: Make CommonUI nicer to use for mouse-based strategy games. #contrib 10734
-
Added BlueprintCallable function AddWidgets to UCommonWidgetGroupBase.
-
PR #11152: [Common UI] Add some root management functions to UCommonUIActionRouterBase #contrib 11152
-
PR #11183: [Common UI] Add the bClearFocusRestorationTargetOfDeactivatedWidgets setting to UCommonActivatableWidgetSwitcher #contrib 11183
-
PR #11150: [Common UI] Add the ability to disable automatic gamepad type detection #contrib 11150
-
PR #11133: Make UCommonActionWidget::UpdateActionWidget virtual PR #11134: CommonUI: Split logic that determines whether the Icon will update in UCommonActionWidget::UpdateActionWidget into its own virtual function PR #11147: Make OnActionProgress and OnActionComplete in UCommonActionWidget virtual #contrib 11133 #contrib 11134 #contrib 11147
- Updated display names for UCommonButtonBase events:
- OnSelectedChangedBase - "On Selected Changed" OnButtonBaseClicked - "On Clicked" OnButtonBaseDoubleClicked - "On Double Clicked" OnButtonBaseHovered - "On Hovered" OnButtonBaseUnhovered - "On Unhovered"
-
Add method to Activatable Widget to clear Focus Restoration Target.
-
Add QueueAnimation methods, which perform better when multiple animation transitions occur in one frame.
-
PR #11192: CommonUI: Add virtual method to CommonAnalogCusor to allow customizing when Left Click should be simulated by Virtual Accept events #contrib 11192
-
PR #10853: CommonUI: Add support for size matching CommonVideoPlayer to media #contrib 10853
-
PR #11209: CommonUI: Make public UCommonUserWidget::(Un)RegisterScrollRecipient functions and expose them to blueprint PR #11212: CommonUI: Fix ScrollRecipients not working if they were registered before the owning widget was constructed PR #11153: [Common UI] Expose FUIActionBindingHandle to blueprints #contrib 11209 #contrib 11212 #contrib 11153
-
PR #10770: Fix CommonBoundActionBar Binding filter not using ignore duplicates #contrib 10770
-
FUIActionBindingHandle: - Added GetDisplayInActionBar and SetDisplayInActionBar functions.
-
PR #10686: Add bIgnoreMoveInput and bIgnoreLookInput to FUIInputConfig equality #contrib 10686
-
UCommonVisibilitySwitcher: - Added bCurrentlySwitching flag, set to true in SetActiveWidgetIndex_Internal. - Added BlueprintPure IsCurrentlySwitching getter.
-
UTextLayoutWidget now properly updates when any of its properties are set directly
- PR #10596: Expose CommonWidgetCarousel MoveSpeed #contrib 10596
Bug Fix:
-
Fix to SetAllowRightClickDragScrolling and IsAllowRightClickDragScrolling to return the right value.
-
Fix CommonUI actions not updating. FActivatableTreeNode::HandleWidgetActivated: - If the path doesn't support activation focus, manually broadcast UCommonUIActionRouterBase::OnBoundActionsUpdated delegate. UCommonUIActionRouterBase::HandleRootNodeActivated: - Still broadcast OnBoundActionsUpdated delegate even if activated root doesn't support activation focus.
-
Correction to CommonUI's GetDesiredFocusTarget to properly used DesiredFocusWidget property correctly when set on the UserWidget.
-
Fix CommonUI actions not updating when widget deactivated. FActivatableTreeNode::HandleWidgetDeactivated: - If the path doesn't support activation focus, manually broadcast UCommonUIActionRouterBase::OnBoundActionsUpdated delegate.
-
Fixed CommonTabListWidgetBase tab registration on design time
-
PR #10817: Fix UCommonActivatableWidgetSwitcher activating the first tab when changing tabs first time #contrib 10817
-
[Retainer] Fixed clipping not working properly if "Stencil" clipping was used on elements inside a retainer (stencil clipping is used when shear or non axis aligned rotation are applied).
-
Fixed a crash in the UMG Designer that could occur when placing widgets in inherited WidgetTrees (when using NamedSlot).
-
Fix rounded border not cropping with translucent materials
-
PR #11238: CommonUI: Fix
UCommonGameViewportClient::HandleRerouteTouch
not getting called #contrib 11238 -
PR #10852: Fix bMatchSize for lazy textures in image widgets in editor #contrib 10852
-
Fixed ImageSize properties not updating correctly when changing Slate Brushes to a texture resource that was currently being streamed in
-
Fixed DataValidator crashing when run on an abstract Blueprint.
-
Fix NamedSlot failing to compile if parent widgets has any BindWidget
-
[CommonUI] Button object now remains consistent after changing sound override properties directly
-
PR #10824: Fix not being able to block input with multiple reasons with UCommonInputSubsystem::SetInputTypeFilter #contrib 10824
-
PR #10838: Deselect buttons when removing them from a UCommonButtonGroupBase #contrib 10838
-
Editor Utility Widgets: Fix to potential crash when trying to open the same Editor Utility Widget more than once using Spawn and Register and Get ID function.
-
UMG: Correction to PanelWidget to prevent a null widget to be added to the panel which could cause a crash in many situation.
-
Improved width calculation in case of multiple leading tabs in text.
-
Common UI: Fix sorting of widgets in the same CommonUI domain.
-
PR #11091: Don't pixel snap screen-space widget components in
SWorldWidgetScreenLayer
if the root widget has snapping disabled #contrib 11091 -
PR #10900: Fix not being able to click Common Text widgets in the widget designer when bAutoCollapseWithEmptyText is set to true #contrib 10900
-
Fix brush styles not applying on EUW due to SVG leftover data.
Virtual Production
New:
-
DMX Output Conflict Monitor: Added a conflict monitor for systems that send DMX from engine
-
DMX Pixel Mapping: Added rotation for pixel mapping components
-
DMX Pixel Mapping: Added support for HDR rendering. Select the source and set the Pixel Format to High Precision to enable HDR support
-
DMX Pixel Mapping: Added an option to source to let children follow texture size
-
Experimental support for level instances between -game and editor instances has been added to Multi-user.
-
Enabled editor outlines for Virtual Scouting tools. Editor outlines will now appear around selected objects in the HMD.
-
DMX Pixel Mapping: Added grid snapping
-
Added bPlay property on CineCameraRigRail to toggle play/pause in drive mode
-
DMX Pixel Mapping: Reworked the Layout Menu to reside within the designer
-
DMX Pixel Mapping: Added a context menu to the designer
-
Added bReverse property on CineCameraRigRail to control drive mode direction
-
Add support for meshing networks. When enabled, the a newly discovered node will be shared with existing nodes connected to the UDP layer. This feature has to be enabled via a setting and designed for Multi-user networks where some topology information is pre-shared on switchboard launch. The Switchboard application automatically enables this flag.To manually enable, use the bShareKnownNodesWithActiveConnections setting on the UdpMessaging module. This initial sharing will allow editors to completely mesh together without having to know the editor endpoint id.
-
Only support UE_ADDITIONAL_PLUGIN_PATHS environment variable in editor builds. Game and server builds will not use this variable to lookup additional plugin paths.
-
Added a new Control Rig node to access basic property values by LiveLink subject and property name from any LiveLink Role
-
DMX Pixel Mapping: Added an option to use the patch color as the component color
-
DMX Pixel Mapping: Added an option to flip components of fixture groups horizontally or verically
-
DMX Pixel Mapping: New components now find a reasonable size when first added
Bug Fix:
-
DMX Protocol: Fixed possible race condition when stopping output port threads
-
DMX Pixel Mapping: Fixed matrices do not update when fixture type or patch changed
-
DMX Pixel Mapping: Fixed matrix cells cannot be dragged when not locked in designer
-
DMX Fixtures: Fixed DMX Fixture Component Double to applie its value range correctly when Push Normalized Values Per Attribute is called.
Media IO
New:
-
Added media texture support for overlay materials on media plates.
-
Added depth-aware overlay composite convenience to the media plate contextual menu for minimizing TSR artifacts.
-
LiveLink: Added ability to genlock the engine to a live link subject. This is useful when live link is the primary driver of the animation (such as mocap), but needs to be separate from the timecode source.
Bug Fix:
-
Fix color flashes when changing OCIO config on a blackmagic media source
-
Allow initializing LTC Channel with same Framerate family without multi format mode.
-
Fix stage monitor hitching when receiving data from provider with invalid timecode
-
Improved image media thread safety for shared frames in the global cache.
-
Fixed mip level estimation for media drawn in overlay materials at the post-upscale resolution.
-
Fixed spherical pole artifacts for large tiled EXR sequences.
-
Prevented media thumbnail renderer from filling up the global cache with image media.
-
Fix Media Source OCIO not working with media profiles
-
Fixed crash playing an image sequence with inconsistent resolution.
-
Fix GPU Direct not working with Aja Key&Fill Fix Multiformat 1080p/4k not working, was caused by overlap between the frame buffers. We now index the frames using the biggest gaps possible in case 4K frames are used.
-
MediaIO: Increased default number of buffers from 3 to 4 to avoid starvation. Starvation may happen when anythread scheduling is disabled.
-
Fix media bundle not being able to be placed in level
-
Fixed image media global cache issue where cached empty frames could break playback.
-
Fix MediaIO audio/captions/subtitles not working if source was in JITR mode
-
Rmax: Changed default rate multiplier from 1.05 to 1.00, since the multiplier was upsetting the receiver, and it is not needed anymore.
-
Allow setting aja genlock channel to same output as video
nDisplay
New:
-
Added a new feature to the ICVFX camera component that allows the virtual depth of field rendered to a stage wall to be offset by an amount intended to compensate for the added depth of field from the real world camera when filming the wall. This feature can be enabled through the new Enable Depth of Field Compensation property on the ICVFX camera component. When enabled, the depth of field in the ICVFX image rendered to the stage wall will be offset by a dynamic amount depending on the camera's focus distance, its distance from the wall, and the virtual object's distance from the camera, attempting to compensate for the real world camera's depth of field as much as physically possible
-
Added frustum fitting warp policy and in frustum fit view origin component, which will fit a stage's geometry into either the active engine camera, or an external cine camera if specified, by fitting the projection of the stage geometry onto the camera's projection plane. In addition, users can preview the frustum fit in editor, which will display a preview version of the stage geometry, scaled appropriately, within the camera's frustum in the level
-
Added DC.Stats.Frame console variable to easily display frame number and timecode.
-
nDisplay: Added option to disable overriding transforms (xform, camera, screens) from external config (.ndisplay). Users are encountering two problems: Unexpected behavior when they launch the cluster and the projection is different than expected, and seemingly gets "fixed" when wiggling the NDC via multi-user. Difficulty in sharing the same NDC archetype in multiple levels that have NDC instances with transform overrides in them. Default to disable overrides, because it is the common desired case in VP. Users that dynamically create or modify the .ndisplay and wish those changes to override, should set this new option to true.
-
Switchboard: Sound disabled by default when launching nDisplay Sound is typically not used, and can add unnecessary overhead.
-
Switchboard: Always pick a primary node when launching the cluster. We've seen a common situation where the user launches a subset of the cluster but forgets to assign a primary node. This results in a failed launch but it is not immediately evident why. With this change, this situation should never happen again.
-
nDisplay: Detect when the exported config in the nDisplay asset is out of date. This can happen in child blueprints when their parent changes. It can also happen when there are updates to the export logic.
-
SharedMemoryMedia: Added ability to have multiple simultaneous receivers. Currently limited to 4.
-
Added a new toolbar button to the nDisplay Config Editor to import an MPCDI config into an nDisplay config blueprint, which will add all necessary cluster nodes and viewports, and configure them correctly, as well as adding screen components to match if the MPCDI config is a 2D config.
-
nDisplay: Display device exposure property now affects all materials and not just the techvis material. The property can also be useful to brighten or darken the in-editor preview, especially when preview post process is enabled. Also added a Gamma property, which can be useful when receiving a texture that needs such conversion.
-
SharedMemoryMedia: Added single GPU option so that it can be faster in those cases.
-
nDisplay: Added node name to barrier trace names. Should make it easier to debug. W/o this, one has to look up which node has the ip address that is put in the session name, reducing debugging efficiency, particularly with large clusters.
-
Added a mesh component to the DCRA that stores a 3D version of the stage's geometry map that line traces can be run against to compute distances to the stage's geometry from any point. This mesh can be make visible in the editor using a new property in the stage's Editor Preview properties to allow debugging of the stage's generated geometry map
Bug Fix:
-
nDisplay: Work around annoying LogHAL warning when checking if a named mapped memory already exists.
-
Fixed issue where stage components weren't being outlined when selected in the nDisplay config editor.
-
GpuProfiler: Support gpu trace events named with the
_N pattern, where N is some integer. Before this fix, Gpu trace events with said naming pattern would all appear with the same name, which would correspond to the first one. e.g. VP_0, VP_1, VP_2 would all appear as VP_0 in Unreal Insights. -
nDislplay: Fix inner resolution math when buffer ratio < 1. Issue is that FIntPoint float decays to FIntPoint IntType. So the resolution ended up as zero and media capture start would fail since zero resolution makes it fail.
-
Exposed the "Exposure compensation" property on post process volumes to the ICVFX color grading drawer's property panel
-
SharedMemoryMedia: Fixed inverted alpha when viewing in player. It will invert alpha by default but there is a new option in the Media Output to not invert. Note: GPU time increased up to 100us when alpha inversion is selected on Quadro RTX A6000, for a 4K texture.
-
Fixed issues with light card colors and blending caused by inconsistent gamma encoding for 3D and UV light cards with and without OCIO. Now, all light cards are gamma encoded with gamma 2.2 when rendered, and will be decoded if needed during the final composite pass when blending occurs.
-
nDisplay: Avoid HasFocus related stalls when running the cluster.
-
Added check for IsAlwaysFlushToWall when moving light cards in ICVFX panel, so that they will not be set flush to wall when Flush to Wall is disabled in their properties.
-
Switchboard: Don't include project path in command line when launching cooked nDisplay builds, which was causing it to fail launching.
-
nDisplay: Fixed icvfx camera activation logic when it has media i/o assigned.
-
Fixed issue where light cards moved through DMX were not updated in the ICVFX panel to match their new position
Rendering
New:
-
Added new VP utility post-process volume class, which sets all required settings for pass-through by default.
-
Added a convenience engine material function for color transformations from the sRGB/Rec709 color space to the working color space.
-
Exposed CPU OpenColorIO transformation to color types, and not only images.
-
Allowed OpenColorIO library use in non-editor modes.
-
Updated the OpenColorIO to 2.3.1.
-
Exposed OpenColorIO context on the configuration asset.
Bug Fix:
-
Fixed OpenColorIO scene view extension active references which could prevent its destruction.
-
OpenColorIO transforms are now disabled by default, and avoid skipping rendering on invalid settings.
-
Fixed potential use-after-free in OpenColorIO enqueued render commands.
-
Fixed OpenColorIO reload and rebuild functionality not forcing the operation due to an equivalent cache hash.
-
PanoramicCapture: Fix e.g. C: not recognized as a valid path.
-
Fixed OpenColorIO cache id crash on invalid configs.
Tools
API Change:
- Users launching custom processes via SwitchboardListener may find that, as a result of SwitchboardListener changing from a console subsystem application to a GUI subsystem application on Windows, they now need to explicitly opt into suppressing the console window for child processes, either by passing the newly-added
hide=True
argument when callingmessage_protocol.create_start_process_message
, or equivalently by setting"bHide": true
in the corresponding JSON message.
New:
-
[Switchboard] Traffic between Switchboard and SwitchboardListener now utilizes QUIC for transport encryption, and connections to SwitchboardListener require a password (SwitchboardListener 3.0).
-
[Virtual Scouting] The overhauled Virtual Scouting toolset, based on the new XR Creative Framework, is now available as an experimental plugin.
-
[SwitchboardListener] SwitchboardListener is now a Slate application. This provides a more user-friendly workflow for first time setup, and enables users to easily change the authentication password. A separate SwitchboardListenerCmd target is now available for users who still need to build SwitchboardListener as a console application.
-
[Switchboard] Because SwitchboardListener changed from a console application to a GUI application, we now need to set a flag to explicitly hide the console windows of Perforce/UnrealBuildTool child processes that were previously implicitly hidden.
-
[Switchboard] Added a context menu option to exclude individual devices from Unreal Insights tracing.
-
[Switchboard] Simultaneous multithreading (AKA Hyper-Threading) being enabled is now flagged as a warning in the CpuUtilization column of the nDisplay Monitor. These features are known to potentially cause performance hitching with nDisplay workloads.
-
Added support for calibrating lens distortion using aruco patterns to the LensFile editor.
-
[Switchboard] If the user includes the .uproject filename + extension when setting the P4 project path, it will be automatically removed, helping to eliminate a common setup mistake that would otherwise cause Perforce errors that can be difficult to diagnose.
-
Blueprint users can send custom Multi-user RPC events using a new BP API. Blueprint structs can be sent as a custom event and received on a remote client.
-
[XR Creative Framework] The InteractiveToolsFramework SelectionInteraction now ignores any actors/components that the PointerComponent has been configured to ignore.
-
[Switchboard] OSC slate change messages are only sent when text edit loses focus, rather than with each keystroke.
-
[XR Creative Framework] Added blueprint OnUndo / OnRedo delegates to UXRCreativeITFComponent.
-
Made lens distortion solves in the LensFile editor asynchronous, supporting progress messages and a user option to cancel the job before it has finished.
-
[Switchboard] The Switchboard editor settings page now allows access to the "Reinstall Dependencies" option even when the user has not created desktop/start menu shortcuts.
-
Switchboard: Added local cache that can be shared between configs. It caches: Maps in a project Asset types of interest (LiveLink presets, media profiles, nDisplay configs) Also added a progress dialog when finding the maps of a project, and an additional dialog when finding the assets of interest to parse.
-
Bug Fix: [Switchboard] Authentication now works on Linux.
-
A new Live Link Input device plugin has been created to allow users to use gamepad input as a Live Link subject. This feature is only supported on Windows.
-
UPD Messaging module has improved detection of bad socket connections and will automatically filter those connections out from communication. The UDP Messaging module also has additional support for wildcard based IP address filtering to prevent the editor from communicating with designated endpoints.
-
[Concert] Fixed a crash when transacting level instance actor filters.
-
Virtual Production utilities - All properties in the project settings relating to the Legacy Virtual Scouting tools have been placed into the category "Legacy Virtual Scouting".
-
Added a reference implementation to demonstrate one method for writing a lens distortion solver using pytorch and neural networks.
Bug Fix:
-
[Switchboard] Fixed a race condition where FThreadStats could cause a crash on exit.
-
SwitchboardListener: Fix bug where reception is not always disabled until current message is processed.
-
When launching a Multi-user server from the Swithchboard app. The server name is given a unique name based on the primary address for the switchboard config. This provides Multi-user server conflicts when multiple operator stations open the same config.
-
Object Mixer: -Fix: Engine Hitch/Delay when opening Light Mixer
-
Console Variables Editor: -Fix: "Show" Filters Do Not Update Cvar List
-
Switchboard: Fix not selecting the map when creating a new config from Unreal. The issue is that the list of maps being internally listed with the pattern /Game/MyFolder/MyMap.umap/MyMap, instead of just /Game/MyFolder/MyMap, so it never found the entry from the script and was falling back to the default map.
-
Console Variables Editor: -Check for session before sending/receiving MU cvar change
-
Object Mixer -Fix: Removing a Light from a Light Collection does Not Immediately Update UI
-
Level Snapshots: -Fix: Crash when Expanding Media Plates modifications if parameters "AutoPlay, Enable Audio, Play Only when Visible" are changed
-
Object Mixer: -Fix: Blueprint Lights Parameters Switch To "Multiple Values" When Transformed
-
Level Snapshots: -Fix: Crash after restoring Media Plate properties in Level Snapshots when in Multi-User -Fix: Level Snapshots > Crash in results editor UI when expanding VCam actor
-
Console Variables Editor: -Fix: Console Variables Editor does not Execute "HighResShot" more than once when the Execute button is selected.
Upgrade Notes
Animation
Movie Render Queue
Upgrade Notes:
- Because the format string tokens for date, time, etc. are now provided in local time instead of UTC time, rendering workflows reliant on UTC will instead need to set it via a scripting pipeline by calling UMoviePipeline::SetInitializationTime with a UTC time.
New:
- The format string tokens for date, time, etc. are now provided in user system (local) time instead of UTC time.
Rigging
Upgrade Notes:
- Older project can still use USkeletalMesh::LoadLODImportedData and SaveLODImportedData. The data will be converted from/to FMeshDescription into the older format. It is recommended to use the newer functions instead, which are modeled on the UStaticMesh API: CommitMeshDescription, GetMeshDescription, etc.
- To construct a FMeshDescription compatible with skeletal meshes, there are helper functions found for this in SkeletalMeshAttributes.h to register attributes for this purpose on a newly created FMeshDescription object.
New:
- Skeletal Mesh LOD import/editable data is now stored using FMeshDescription rather than FSkeletalMeshImportData.
Bug Fix:
- ControlRigXRayMaterial - Updated Xray shader to include eye adaptation so controls don't glow in specific lighting conditions.
Sequencer
Upgrade Notes:
- Movie Render Queue now uses local time for the time related tokens, instead of UTC time. For render farm implementations you can restore the previous UTC behavior by calling UMoviePipeline::SetInitializationTime(FDateTime::UtcNow()) after initializing the pipeline object.
New:
- Movie Render Queue now uses local time for the time related tokens, instead of UTC time.
Synthesis
Upgrade Notes:
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
New:
-
Re-organise the PhysicsControlComponent to remove the private implementation and make it more amenable to extension. Handle missing skeletal mesh component. Fully disable the controls/constraints when strength and damping are zero. Make it possible to set the physics asset in RigidBodyWithControl whilst it is running. Report attempts to use invalid controls etc as warnings (option in the Physics Control Component to enable/disable this). Move ControlSettings into the ControlData struct
-
Removed support for auto-deactivation of physics control component
-
Implemented Physics Control Profiles, which can be used in both PhysicsControlComponent and RigidBodyWithControl.
-
PhysicsControl - support body modifier "default" movement type, so it doesn't force a change to the movement. This fixes problems initialising physics assets that have kinematic bodies.
Editor
Upgrade Notes:
- The default Add Spline Point keyboard shortcut binding has been removed (Previously A-Key). You can re-assign this action in Editor Preferences -> Keyboard
Bug Fix:
- Spline Points will no longer mistakenly be added when moving camera with WASD
Foundation
Upgrade Notes:
- Called when entering and leaving test section.
- ie: For a test named MyTest.Log.Validation.TestTrue These will be called through OnEnteringTestSectionEvent before any test of the corresponding section is executed: - MyTest - MyTest.Log - MyTest.Log.Validation And the corresponding one when leaving the section after execution. One can register a callback this way: FAutomationTestFramework::Get().GetOnEnteringTestSection(TEXT("MyTest.Log")).AddRaw(this, &FMyModule::MySectionCallback); As first argument the name of the section is passed.
New:
- Introduce FAutomationTestFramework::OnEnteringTestSectionEvent, FAutomationTestFramework::OnLeavingTestSectionEvent
Build
Upgrade Notes:
-
Remove unacceptable words. "MasterEnable" has been renamed to "Enable" for MemoryMappedFiles configuration setting.
-
Project Packaging "MovieBlacklist" has been renamed to "MovieDenyList"
New:
-
Remove unacceptable words. "MasterEnable" has been renamed to "Enable" for MemoryMappedFiles configuration setting.
-
Remove unacceptable words. Project Packaging "MovieBlacklist" has been renamed to "MovieDenyList"
Core
Upgrade Notes:
-
If a project has previously relied on modifying Engine/Programs/CrashReportClient/Config/DefaultEngine.ini to set a custom reporting endpoint, this can now be achieved using [Project]/Config/DefaultEngine.ini.
-
CSV Profile output will contain additional data, but overall format remains the same
-
Loading and compiling Blueprint assets in the editor tends to be a bit flimsy. This change should help address assorted issues that we've seen in the past when it comes to preloading Blueprints and their dependencies. If you suspect there's a load-related issue with change, try disabling "linker.EnableFullBlueprintPreloading", and then report the issue on UDN.
-
CSV Profile output will contain additional data, but overall format remains the same
New:
-
Add support for project overrides in crash report client
- Introduces a few changes that enables CrashReportClient to read various settings from project configuration. Also adds compile time defined fallback for report url. This makes it easier to setup third party crash report providers without modifying engine configuration files.
- Some additions to the user interface was also added, for example being able to set company name in some user interface text.
- Finally we also improved memory usage for CrashReportClient on many core machines.
-
Adding 'iris' CSV metadata tag so we can track which builds had it enabled for when we extend playtests outside of dedicated Iris playtests. Flag is set to '1' if the GameNetDriver has "IsUsingIrisReplication" set to true. This logic is done in UNetDriver::PostCreation because doing it inside InitBase is too early on clients, as the PendingNetDriver will not have been set to use Iris yet.
-
Fix loader assumptions for BP objects Added forced flushing of exports for Blueprint classes. Toggle with the "linker.EnableFullBlueprintPreloading" cvar in case any issues arise. When Blueprints and their corresponding classes are compiled, they often need to reference other exports in the package. The expectation is that these exports are fully preloaded prior to compilation, though that's often not the case. Both RegenerateBlueprintClass and RegenerateClass have incomplete logic for preloading the exports, and often miss several, such as portions of the widget tree in a widget Blueprint. Instead of attempting to fix FPreloadMembersHelper to find all dependencies correctly, we can just exploit the fact that nearly all of the exports in a given Blueprint package will be referenced by either the Blueprint or its class. We can just force all of the exports to preload, and avoid having to traipse through object property references to figure out exactly what they reference. While the previous behavior was incorrect, it didn't expose any obvious errors. However, we're trying to ensure that objects are always preloaded prior to postloading, which was often violated during Blueprint compilation.
-
Adding flags to CSV metadata for LTO and PG_Instrumentation so that we know if either feature was turned on during the capture
Framework
Audio
Upgrade Notes:
-
Previously the ability to reverse a FMetasoundGeneratorHandle::WatchOutput was not possible.
-
To use Oculus Audio plugin, retrieve the latest plugin versions directly from the plugin vendor.
-
When you look at your source effects, they will display a warning about having mismatched parameters on your control buses. You'll need to update those Control Buses to use a Volume parameter instead, but even without doing so, they should still function properly.
New:
-
[MetasoundEngine] Provide UnwatchOutput API as inverse of WatchOutput operation.
-
Removed Oculus Audio plugin.
Bug Fix:
- Changed the Chorus Source Effect's Wet/Dry Modulation Parameters to volume (for parity with submix modulators).
Blueprint
Upgrade Notes:
-
This will patch those members back to reference the instance that was created at CDO construction time so that the asset functions correctly in the editor, but it will not restore any non-default values that may have been set prior to when the asset is/was last saved.
-
Re-saving the asset will return the asset to a working state and dismiss the warning on load. If you happen to see it during a save, this is indicative of a problem that will cause data loss.
Bug Fix:
- Added a warning on load/save when Blueprint CDOs contain serialized NULL members that should otherwise be referencing a default subobject instance assigned by the closest native parent class's C++ constructor.
Blueprint Editor
Upgrade Notes:
- The blueprint search metadata schema has been modified so that the exact search can reliably find blueprint function library calls, parent calls and function graphs that override a parent class's function or implement an interface. Currently blueprint search metadata is stored as part of the blueprint asset, so blueprint assets should be loaded and resaved to fully benefit from the updated searchability. Resaving all blueprint assets is not required. The searchability of the asset is then as follows:
- Loaded assets: Fully searchable
- Unloaded and resaved in UE 5.4: Fully searchable
- Unloaded and not resaved: Results may be missing for function library calls, parent function calls, interface implementations and function overriding graphs. Most function call-sites can still be found if it's not from a function library.
- When a project-wide search is performed the Find-in-Blueprints window will show a message when assets were parsed that contain outdated metadata. Options are shown to export the affected asset list or to load all those assets in memory so that they benefit from full searchability. All bulk operations triggered from the Find-in-Blueprints window show a warning message so that the user must confirm the action.The aforementioned option to load all assets with outdated metadata may be unwise when the project is large or if for any reason an asset crashes the editor when loaded. Alternatively, for a small project you may want to bulk resave affected assets. A setting 'Allow Index All Blueprints' has been added under 'Editor Preferences > Blueprint Editor Settings' to disable or enable bulk operations:
- None: Does not allow any bulk load or save operations from the Find-in-Blueprints window.
- Load Only (default): Allows bulk load of assets with outdated metadata.
- Checkout and Save: Allows mass checkout, load and resave of assets with outdated metadata. Setting it via the Editor UI applies it to the current user. The 'Allow Index All Blueprints' can also be set project-wide for all users by creating or modifying the Config/DefaultEditorPerProjectUserSettings.ini file and adding the section:[/Script/BlueprintGraph.BlueprintEditorSettings]AllowIndexAllBlueprints=None | LoadOnly | CheckoutAndResave
New:
-
Find References: Added an exact function search that incorporates the function's class. Previously, Find References on functions would do a raw search by name, yielding irrelevant results like same named functions from other classes and any node that contains the function name as substring. The exact search only finds function call-sites and implementations from the relevant class or interface, including blueprint libraries.
-
Find References for function-related and variable nodes is now a submenu that provides both methods of searching: By Name and By Class Member (new). The keyboard shortcut behaves as before: searching by name for functions and doing an exact search for variables. Note that searching by name is faster than the exact search. The exact search is recommended primarily when searching by name yields many irrelevant results.
Gameplay
API Change:
-
This requires access to the GDK to use.
-
This plugin requires access to the GDK.
-
This means that if you for some reason modified the engine to make XInputInterface.h a publicly available include, you need to add the XInputDevice module as a dependency. This should not be the case for anyone, unless they have customized the engine to extend on XInput and make it public in the first place (It was in a private module folder and not exposed with an API, so we can't really do anything about it if it was modified).
-
Please change the return type of your implementation of RegisterSpecificAsset to return an EDataRegistryRegisterAssetResult.
Upgrade Notes:
-
If you want to process traditional gamepads, you may want to disable XInput to avoid "double reporting" input events.
-
To use this you can simply enable the plugin for your project. To change settings and enable the the processing of devices you can modify your Project Settings.
-
This plugin is defaulted on, so no action should be needed.
-
Please change the return type of your implementation of RegisterSpecificAsset to return an EDataRegistryRegisterAssetResult.
-
No action should be needed, but there are two different virtual functions that you override on UPlayerInput, EvaluateKeyMapState and EvaluateInputDelegates, which may prove helpful if you are extending the existing input system.
-
Because the GameFeatures plugin was moved to Runtime, any PluginTemplates references in the GameFeaturesEditorSettings section of a project's DefaultEditor.ini may need to be updated
-
Added support to set destination reached distance to UAbilityTask_ApplyRootMotionMoveToActorForce.
-
Added support to AbilityTask_ApplyRootMotionMoveToActorForce to target a component with a relative location.
-
Previously, removing a GameplayCue would cause a single EGameplayTagEventType::AnyCountChange callback with its Tag and Count, even though all equivalent Cues would receive an OnRemove. So previously: 15 GC Tags would be a single callback and now it will be 15 callbacks. This will change behavior if you're using something like AbilityTask_WaitGameplayTagCountChanged on the GameplayCue Tag (that callback would fire 15x now, and just once previously). The CVar to toggle this functionality is GameplayCue.Fix.UseEqualTagCountAndRemovalCallbacks (it is now defaulted to true)
-
Previously, it was possible to get Multicast RPC's for Gameplay Abilities on Simulated Proxies (even though none of the data would have been replicated correctly). That's no longer the case -- Simulated Proxies will no longer have Gameplay Abilities replicated to them.
-
This was broken because we did not actually update the InputDeviceId on the input event, only the ControllerId. The fix is to create a new "fake" input device ID and map it to the next available local player if needed for any gamepad events. This has the resulting behavior of te Keyboard and Mouse controlling LocalPlayer[0], and the gamepad controlling LocalPlayer[1], instead of both devices controlling LocalPlayer[0]. In case this somehow caues issues unforeseen issues with split screen games, it can be disabled with the cvar 'input.bRemapDeviceIdForOffsetPlayerGamepadIds'.
-
UCharacterMovementComponent::MoveAutonomous() method got updated and its replication behavior changed, to get previous behavior disabled the EnableQueuedAnimEventsOnServer CVar. Note that now the EnableQueuedAnimEventsOnServer CVar is enabled by default after this change. Older projects that had this CVar disabled will need be enable it to get the new behavior.
New:
-
Game Input Windows experimental plugin.Game Input for Windows is a next-generation input API that exposes input devices of all kinds through a single consistent interface. The goal of Game Input in Unreal Engine is to provide support for as many input devices as possible by default in the engine. This will hopefully enable you as the developer to create some really awesome controls for your game, improving player experience and accessibility "out of the box". Game Input makes supporting "special" input devices such as racing wheels, flight sticks, and instruments easier than it has been in the past in Unreal with solutions like Raw Input. Game Input can also process "traditional" gamepads. For this experimental release the goal of the Game Input Plugin is to have feature parity with the of the existing XInput and Raw Input plugins. This means that you can use it to process gamepads as well as any custom configurations of hardware based on Vendor and Product ID.
-
Add the experimental "Windows Game Input" Plugin. This plugin will allow for the new Game Input library from the GDK to be used on Win64 and WinGDK build targets. In the future, this should allow for improved overall input device support for "special" devices in the future such as racing wheels, flight sticks, etc. Right now, the plugin will essentially have parity with the existing behaviors of Raw Input and XInput on windows.
-
Break XInput out into it's own Input Device module instead of being created as a part of the Windows Application. This will pave the way for us to enable GameInput as the default input device in the future, and make it much easier to just turn off XInput via the plugin system instead of needing to add a bunch of checks to the WindowsApplication.cpp
-
Adding an Enum return value to Register Specific Asset, because if the asset is already registered then we should not log out a warning, which causes Tools to trigger warnings.
-
Refactor the UPlayerInput::ProcessInputStack function to separate out the evaluation of the key map fromt he broadcasting of delegates. This will allow us to change the consumption state of Keys or Delegate bindings from subclasses such as Enhanced Input, which means that we can mark Input Actions to explictly block any legacy key mappings, gameplay debugger keybindings, etc.
-
Move the GameFeatures and ModularGameplay plugins out of Experimental and put them in Runtime. The plugins were changed to Beta in 5.2 but they were not moved at the time
-
Added support to set destination reached distance to UAbilityTask_ApplyRootMotionMoveToActorForce.
-
Added support to AbilityTask_ApplyRootMotionMoveToActorForce to target a component with a relative location.
-
[GAS] PR #11156: Fixed bugs caused by gameplay cue getting removed after OnRemove is sent to the cue
Bug Fix:
-
[GAS] Fixing a longstanding bug that replicated Gameplay Abilities are being replicated to Simulated Proxies (but we expect them to only be replicated to the Owning Client -- Autonomous Proxies).
-
Fix for bSkipAssigningGamepadToFirstPlayer in the GameViewportClient.
-
Fixed issue in CharacterMovementComponent where queued animation notifies were not being fired when running a full animation graph update on server
Networking
Upgrade Notes:
- UNetConnection::ClientHasInitializedLevelFor is now deprecated and UNetConnection::ClientHasInitializedLevel should be used/overridden instead.
New:
- Allow querying whether a client has initialized a level via the ULevel
Learning Resources
Sample Content
Upgrade Notes:
- Levels using BP_SunSky will need to have the VolumetricCloud Actor removed, or the VolumetricCloud component in BP_SunSky disabled, depending on preference.
New:
- Updated SunPosition plugin to add VolumetricCloud component with an updated simple to use and art directable cloud material.
Level Design and Art Tools
Geometry Core
Upgrade Notes:
- New: Provided a new CVar, modeling.DisableAutoUVAreaDensitySampling, which when set, returns the behavior to the original algorithm for UV generation in Patchbuilder, in case there are legacy reasons to maintain that behavior.
New:
- Changed: Improved the UV generation scheme PatchBuilder via a change to the polygroup generation stage, providing area aware sampling of the mesh surface and reducing the overcompensation effects that small, disconnected regions in the mesh were having on the overall segmentation.
Procedural
API Change:
- Added 'abort' capabilities on IPCGElement which allow special behavior when a task is not fully completed before being cancelled.
Upgrade Notes:
-
Any levels with existing, unloaded PCG Partition Actors should be fully loaded and the PCG World Actor should be saved. This will perform a deprecation step that avoids creating duplicate PCG Partition Actors in unloaded grid cells. It is safe to unload the PCG Partition Actors at this point. If these steps were not taken and you have duplicate PCG Partition Actors in some grid cells, you can recover the data by deleting all serialized PCG Partition Actors (Tools -> PCG Framework -> Delete all PCG partition actors), and then regenerating your original PCG components.
-
Previous deprecated nodes will have a Union node emplaced before the Source to respect old behavior
-
The "CancelExecutionOnEmpty" property on PCG Data Collection is deprecated and doesn't do anything anymore.
New:
-
Add support for creating PCG Partition Actors on demand outside of editor, and outside of World Partition levels.
-
Refactored the Difference Node to follow new pattern of looping on the Source pin with an implicit union on the Difference pin.
Bug Fix:
- Improved cancellation behavior, especially in the presence of graph dependencies. Removed the CancelExecutionOnEmpty feature, this was causing problems and is superseded by node culling
UV Editor
Upgrade Notes:
-
Added CVAR modeling.UVEditor.EnableLivePreviewArrangement - Enables or Disables the auto arrangement feature when selecting from the Content Browser. This exists to support legacy behavior where users might want the object's baked in transform to position objects in the UVEditor.
-
Added CVAR modeling.UVEditor.LivePreviewArrangementMode - Selects the mode of the auto arrangement. 0 indicates a line formation. 1 indicates an adaptive circular arrangement.
New:
- Changed: Improved handling of multiple object loading in the UVEditor's 3D viewport. When opening multiple assets from the viewport, relative transforms are preserved. When opening multiple assets from the content browser, automatic arrangement is applied.
World Building
Upgrade Notes:
- In the unlikely event there is C++ code in your project that directly utilizes FWorldPartitionResolveData, please update the code to use FTopLevelAssetPath overloads for improved performance
New:
- Change World Parition Resolve Helper to use FTopLevelAssetPath to avoid unnecessary string manipulation
Localization
Upgrade Notes:
- Don't mount localization data for explicitly loaded plugins by default
- Anything that was calling one of the MountExplicitlyLoadedPlugin functions to load a plugin, will now need to also call MountExplicitlyLoadedPluginLocalizationData if it wants to also mount the localization data.
New:
- Don't mount localization data for explicitly loaded plugins by default
- This allows them to separate their mounting and content loading into two phases, such as allowing a GFP to mount the plugin when 'mounting' and defer mounting the localization data until 'loading'.
- For GFPs specifically, the "GameFeaturePlugin.DeferLocalizationDataLoad" CVar to control whether GFP localization loading has the old (5.3) or new (5.4) behavior.
Online
HTTP
Upgrade Notes:
- This change requires existing holder of FHttpRetrySystem::FManager be converted to shared ptr.
New:
- Make sure it's safe to retry http request in http thread, by keep the shared ptr of retry manager in the request.
Rendering
Upgrade Notes:
- Use r.RayTracing.RequireSM6 to restore previous behavior.
New:
- Disable ray tracing for shader model 5.
Lighting
Upgrade Notes:
-
If the previous behavior for clipmap level selection is desired, set r.Shadow.Virtual.Clipmap.GreedyLevelSelection 1. Adjusting r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias can provide a tradeoff between performance and visual artifacts in scenes with lots of foliage animated with WPO. Note that WPO disable distances must be set on the primitives for it to have any effect.
-
This change brings pages from scene captures and similar systems back into the main VSM physical page pool, so it may be necessary in some of these cases to increase the page pool size to avoid cache thrashing.
-
Old projects that relied on the old behavior can either set the distance scale to a very high value to call no lights to be culled (as before). Alternatively 0 is now a meaningful value if the desire is to cull all lights (with cull distances) at a given scalability setting.
New:
-
Implemented a new system to determine static/dynamic caching per instance for virtual shadow maps based on previous invalidations and WPO behavior. This improves various situations around instanced geometry (commonly foliage) getting transitioned to dynamic caching and never going back.
- Support disabling WPO animation in clipmaps past a certain point (based on the WPO disable distance). This works even when caching/static caching is disabled as it can still be a good performance tool. Related cvars:
- r.Shadow.Virtual.Clipmap.WPODisableDistance: When enabled, disables WPO animation in clipmap levels based on a primitive's WPO disable distance and r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias setting. Default 1 (enabled).
- r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias: The number of clipmap levels further than the distance that an instance would be animated to allow shadow animation. Typically 2-4 works well but may need to be adjusted for very low light angles with significant WPO movement. Default: 3.
- Add cvar to control greedy clipmap level selection (r.Shadow.Virtual.Clipmap.GreedyLevelSelection); disabled by default. This addresses some old issues around coarse pages getting greedily chosen at certain angles, and also makes the behavior around the new WPO distance disable more predictable.Invalidate instances when the evaluate WPO/WPO distance changes.
- Make virtual shadow map cache more persistent and robust against multiple renders in a single "frame" (scene captures, etc).
Bug Fix:
- Fix bug where setting r.LightMaxDrawDistanceScale to 0 (as is done on Low) would cause local light max draw distance to be ignored. Setting this to 0 now results in all local lights with non-zero cull distances being culled. Adjusted r.LightMaxDrawDistanceScale on default Low scalability to be the same as Medium (0.5). #contrib 10947
Materials and Shaders
Upgrade Notes:
- No changes necessary, but titles for which anti-ghosting is important, consider experimenting with mode 3, to either improve image quality compared to mode 1, or improve performance over mode 2.
New:
- A new TAA mode has been added to r.TemporalAA.Quality, mode 3. This mode has the antialiasing quality of mode 1 coupled with the anti-ghosting of mode 2. The performance is slightly slower than mode 1, but much faster than mode 2, providing a compromise for titles which need the anti-ghosting of mode 2 but with improved performance.
- Existing modes 0, 1, 2 are unchanged.
Nanite
Upgrade Notes:
- Nanite rendering of SplineMeshComponent is now functional and enabled by default. In Unreal Engine 5.3, spline meshes that used a mesh with Nanite enabled would render as non-Nanite using the fallback static mesh. in Unreal Engine 5.4, visual differences may occur with these components. To roll back to previous behavior, configure
r.SplineMesh.RenderNanite=0
.
New:
-
Nanite Spline Meshes
-
Added an optimization to bake spline calculations into a look up texture for speed of access.
-
Various Nanite spline mesh cluster culling and rasterization optimizations.
-
Nanite spline meshes are now production-ready and enabled by default.
Niagara
Upgrade Notes:
- Note that this will change the behavior of existing graphs. Moving back to the original implementation would involve a piecewise compare of the elements.
New:
- Fix for vector version of the != operator in Niagara graphs. Previously was returning true only if all components of the vector differed rather than the conventional result of true if any of the vector components differed.
Simulation
Physics
Upgrade Notes:
-
Existing skeletal mesh clothing assets will be upgraded to retain existing behavior by multiplying Fictitious Angular Scale by Subdivision Count, but it will still respect the clamp of [0,2], so it's possible some assets will still change behavior. Chaos Cloth Assets will not be upgraded.
-
Early in UE 5, a bug was introduced that detached skeletal mesh components automatically from their actor when their root body was set to simulate. This change fixes that, so skeletal mesh components will remain attached to their owning actor when parts are set to simulate. It may now be necessary for projects to explicitly detach components rather than just setting them to simulate (for example, when dropping objects that have been picked up). Note that if components are simulating but not detached, then they may "inherit" the movement of the owning actor.
Bug Fix:
-
Chaos Cloth: Fixed Fictitious Angular forces to use the correct scaling with multiple subframes (Subdivision Count).
-
Fixes problems associated with the skeletal mesh component becoming detached from its actor when bodies are set to simulate. This detachment had been introduced early in UE 5, so care should be taken that the fix doesn't cause a regression in projects that were relying on this.