有哪些新内容?
虚幻引擎5是一个具有突破意义的里程碑,而5.1在5.0的基础上带来了更多的更新和改进,帮助用户更加轻松地创造出次世代实时3D内容和体验。我们的核心目标就是确保功能更强健、使用流程更友善、用途更广泛,并尽可能满足不同行业的需求。
视效性能优化
我们优化了针对次世代主机和高性能PC的支持,以确保你能在这些平台上创建60FPS的游戏。具体改进包括:
- 优化了Lumen、Nanite和虚拟阴影贴图。
大场景创建和团队协作
-
世界分区(World Partition)现在可以创建更大的场景。
-
团队协作更高效,游戏开发流程更便捷。
虚拟制片和ICVFX
我们将一如既往地快速开发虚拟制片和ICVFX相关的新工具,不断简化影视拍摄的流程。
-
在ICVFX编辑器中实现色彩校正,添加发光板,执行常见的舞台操作。
-
通过完善MVR支持改进了DMX配置。
-
Lumen针对nDisplay添加了初步实现。
-
改进了GPULM工作流程。
请在下文中详细了解以上这些工具,并查看有关虚幻引擎5.1内容改动的完整列表。
此版本还包含社区开发人员在GitHub上提交的内容。感谢以下这些为虚幻引擎5.1做出过贡献的开发人员:
AchimTuran, ArmainAP, aidinabedi, aknauermaxon, albinodervall, aldenc98, AlexOteiza, DecoyRS, amuTBKT, andersonbisconsin, derwiath, avudnez, az6667, benraziel, zorbathut, BlenderSleuth, BenSweeneySG, BenAD83, BennyExtreme, BenVlodgi, bestofact, bhickmanl, bitdewy, bmiwcy, Punlord, Bromfitsen, MalikuMane, cbrandtieng, muchcharles, CasperTheCat, ckendal3, cmsinflexion, ColdenCullen, daktor, dbsigurd, loening, Naios, zaki, Diyou, originomeg, vinnik-dmitry07, dyanikoglu, dorgonman, drichardson, douglasjose, douglaslassance, drcxd, dm-tesla, Edstub207, ennorehling, ethiffeault, erebel55, etheranger, ehartNV, FluffyKalashnikov, Temaran, fury22pl, gtnardy, gamergenic, gaurang-ingale, geordiemhall, gpvigano, hgamiel, HSeo, IgnacioFDM, yatagarasu25, igor-kondratiev, Ilddor, jackoalan, JackIsaacs, fieldsJacksonG, kostenickj, TheJamsh, Vaei, jm00517, GoldNotch, JonasKjellstrom, jorgenpt, JSaueressig88, jmgomez, hach-que, jb5n, JustinTether, Ogniok, kaffeewolf, breakstring, aziogroup, Kosai106, KXOC, kedamazigoku, KonstantinKohl, KrisRedbeard, kristjanvalur, kzaher, leobenaducci, Levil0229, lijinlong, LizardThief, losemymind, iniside, MagForceSeven, slonopotamus, EgleM2022, surakin, MarijnS95, Xertor, dapetcu21, hoelzl, melchior-haven, mccartnm, MichaelBell, seesemichaelj, tehpola, mikoto-studio, aknarts, codeonwort, KristofMorva, nathandh13, nteymory, nfrechette, NicholasColotouros, freezernick, nuntax, nutti, galeone, moppius, Phyronnaz, pl-dsk, ppchavan001, ProgC, projectgheist, Qinja, QRare, quentin-dietz, RangeMachine, Rareden, rveilleux, grafikrobot, kihl, RumbleballTheReal, rveilleuxBHVR, ryugibo, slimsons, foobit, seansaleh, SRombauts, Delaunay, SkyXMoon, splatxman, sqexmuelas, Stals, steelixb, sunduk, SungJJinKang, takaokato, Maigo, TWAtGH, djethernet1, ukustra, VesCodes, WinsonSS, pdlogingithub, yashverma, y-azechi, ZioYuri78, SmelJey, zosiu, congyue1977, hui211314dd, kimixuchen
渲染
Lumen改进
Lumen现在支持 双面植被(Two-Sided Foliage) 着色模型。方法是从背面采集光照,通过叶子散射。光照会通过材质的次表面颜色进行衰减。


Lumen的 软件光线追踪 还添加了一种全新方法,能极大提升植被显示效果的准确性。方法是使用随机半透明距离场光线追踪,从而解决植被上的过度遮挡问题。
Lumen会使用时空蓝色噪点(Spatiotemporal Blue Noise)来提升图像的品质和清晰度,尤其是在摄像机静止时使用。当Lumen设置为使用 高全局光照(High Global Illumination) 可缩放设置时,品质优化最明显。该设置主要用于在次世代主机上实现60FPS的目标效果。

Lumen的 软件光线追踪 现在会直接对表面缓存采样,而不是对一个低分辨率且有漏洞的体素进行采样。这能改进较小发光面的次级反弹、反射和全局光照效果。

项目启用 高质量半透明反射(High Quality Translucency Reflections) 后,Lumen反射会在半透明表面材质的最前面一层上产生镜面反射效果。

Lumen反射现在支持 单层水(Single Layer Water) ,其中反射被强制为镜面反射。

此版本中,和Lumen相关的其他功能和改进包括:
-
在 硬件光线追踪(Hardware Ray Tracing) 模式下,反射现在通过从表面缓存对Alpha求值,从而支持快速Alpha遮罩。
-
表面缓存生成算法现在更强大,能够覆盖更多种类的网格体,包括为微小的场景元素配备了表面缓存。
-
在 高(High) 、 Epic 和 过场动画(Cinematic) 可扩展性级别中添加了更多内部设置,支持更好地控制性能与质量之间的权衡。
-
后期处理体积设置中提供了 天空光照泄露(Skylight Leaking) 功能,用作非基于物理的美术设计旋钮,防止室内区域完全变黑。
-
后期处理体积设置中提供了 漫反射颜色增强(Diffuse Color Boost 功能,用于增加场景中反射的光照数量。
-
现在可在场景捕获中选择性支持Lumen,方法是在捕获组件的后期处理体积设置中强制启用Lumen GI和反射。默认情况下,在场景捕获中运行时,表面缓存分辨率减少为默认大小的50%,但你可以在组件的设置中覆盖此设置。
-
现在Lumen在nDisplay中支持多个视口。每个视口将使用独立的Lumen场景。
-
在 Vulkan 中添加了试验性 硬件光线追踪(Hardware Ray Tracing) 支持。
- 仅包含表面缓存反射光照,尚不支持击中照射。
-
许多稳定性和漏洞修复。
有关更多信息,请参阅Lumen技术细节。
Nanite改进
Nanite在该版本中加入了以下功能和改进:
-
现在支持使用以下情况的材质:
-
双面
-
遮罩混合模式
-
世界位置偏移(测试版)
- 剔除的边界尚未更新,因此三角形可能消失,具体取决于使用情况。
-
像素深度偏移
-
有关这些功能的预期性能特征的更多信息,请参考Nanite文档。
-
-
改进了对Nanite植被几何体的支持:
-
为植被启用Nanite静态网格体的新 保留区域(Preserve Area) 选项后,可防止几何体在远处变稀疏。
-
地形草地网格体现在可以启用Nanite。
-
Nanite植被性能是一个复杂的话题,有许多影响因子高度依赖内容。有关更多信息,请参考Nanite文档。
-
-
改进了对混合Nanite/非Nanite工作流程的支持,以便针对支持和不支持Nanite的平台进行创作:
-
你可以在内容浏览器中使用右键点击菜单项 细节级别(Level of Detail)> 高分辨率(High Res)> 导入高分辨率(Import High Res…) 向现有非Nanite网格体添加Nanite表示。使用该工作流,预先存在的网格体和LOD链将成为回退网格体,而不是导入过程从Nanite几何体自动生成回退网格体。
-
在材质中添加了 Nanite开关(Nanite Switch) 表达式,以便你可以在使用Nanite渲染时定义特殊行为。
-
向材质和材质实例添加了 Nanite覆盖材质(Nanite Override Material) 插槽。如果设置此插槽,分配为Nanite的网格体渲染将改用引用的材质。该插槽在材质实例中强制默认为"无(None)",这样在父材质中设置覆盖不会使子材质自动继承它。
-
静态网格体组件现在有 禁止Nanite(Disallow Nanite) 参数,这样可混合使用来自同一个网格体资产的Nanite和非Nanite Actor。
-
-
启用了Nanite的网格体现在支持 隐藏阴影(Hidden Shadow) 标记。这允许自定义阴影代理网格体是Nanite,从而提高虚拟阴影贴图的性能。
-
绘制为Nanite的实例化静态网格体组件现在遵循基于距离的剔除设置。
-
(试验性)你现在可以将地形转换为使用Nanite渲染。
-
(试验性)你可以设置
r.RayTracing.Nanite.Mode=1
,从而为Nanite网格体的原生光线追踪和路径追踪启用初始支持。该方法可保留所有细节,而所用GPU内存比零误差回退网格体少得多。早期测试表明,对低质量回退网格体进行光线追踪有5-20%的性能成本,但结果可能根据内容而有所不同。 -
许多其他质量和性能改进。
从虚幻引擎5.1开始,Nanite要求对DirectX 12启用Shader Model 6。 Vulkan无需设置更改。
有关更多信息,请参阅Nanite虚拟化几何体。
时间超级分辨率改进
在此版本中,现在时间超级分辨率有多个方面的改进:
-
更好地支持动画材质抗锯齿。
-
在半透明几何体或带有不正确运动向量的几何体上提高了质量并减少了重影。
-
更好地检测像素闪烁和云纹,改进了抗锯齿质量并减少了重影。
-
针对60fps目标优化了性能。
有关更多信息,请参阅抗锯齿和分辨率修改。
路径追踪器改进
路径追踪器在该版本中包括以下功能和改进:
-
增加了对各种引擎功能的支持:
-
指数高度雾和天空大气
-
指数高度雾组件需要你启用 体积雾(Volumetric Fog) 。局部光源默认为不投射体积阴影,必须在其设置中启用,这样会将其默认工作流程与实时光照匹配。
-
使用 参考大气(Reference Atmosphere) 后期处理体积设置可支持天空大气。启用此设置时,尚不支持体积云。
-
-
平面贴花
-
水几何体和单层水着色模型
-
逐个实例的自定义数据和逐个实例的随机材质表达式
-
增加了对光源函数的支持。彩色光函数也是可能的,但仅限路径追踪器中,方法是启用 r.PathTracing.LightFunctionsColor 。
-
-
向电影渲染队列添加了 参考动态模糊(Reference Motion Blur) 选项,用于实现更准确的动态模糊,以更高的性能成本获得流畅的效果。在此模式下,不会应用后期处理向量模糊,并且会在所有空间和时间采样累积之后应用降噪。应当应用更高的时间取样数以提高质量。
-
增加了对多GPU渲染(mGPU)的支持。需要SLI。要将其启用,请在虚幻编辑器命令行中传递
-MaxGPUCount=2
,并设置r.PathTracing.MultiGPU=1
,这可在运行时切换。(在.ini
文件中不再需要设置r.AllowMultiGPUInEditor=1
,即可在编辑器中启用mGPU。) -
添加了对Optix降噪器的试验性支持。此降噪器在GPU上运行,缩短了降噪时间。它还包含一个试验性时间组件,试图减少降噪后动画中的闪烁。加载OpenImageDenoise和Optix插件后,使用
r.PathTracing.SpatialDenoiser.Type 0
(默认值 - OpenImageDenoise)或1
(Optix)可选择当前有效的降噪器。请注意,Optix降噪器仅在Nvidia硬件上受支持,并且你必须手动启用该插件。 -
添加了对时间降噪的试验性支持,这可使用
r.PathTracing.TemporalDenoiser 1
来启用 时间降噪应当在启用 参考动态模糊(Reference Motion Blur) 的情况下用于电影渲染队列。Optix降噪器使用NVIDIA的Optical Flow SDK估算动态向量,而OpenImageDenoise降噪器则使用引擎内置算法。请注意,此功能并不保证在所有情况下都能实现理想的时间稳定性,因此可能仍需要高采样率。
有关更多信息,请参阅路径追踪器。
GPU Lightmass改进
GPU Lightmass在该版本中包括以下功能和改进:
-
增加了对以下引擎功能的支持:
-
天空大气
-
固定天空光照(带环境法线)
-
固定光源的体积阴影
-
静态光源的彩色半透明阴影
-
静态光源的IES配置文件
-
逐个光源的阴影投射标记
-
-
改进了辐射缓存和第一反射光线引导的行为,在使用相同设置时质量更高。
-
改进了低光照水平下的降噪器效果,方法是在Intel降噪器之前和之后应用色调映射和反向色调映射,缓解极端动态范围下的褪色问题。
-
改进了体积光照贴图渲染器的质量、性能和GPU内存使用情况。
-
渲染器不会同时渲染整个场景的所有体积光照贴图探针,而是分批次在各个探针中推进。但是,这会中断体积光照贴图的交互式预览。
-
实施这些更改之后,只需要原始GPU内存的四分之一即可烘焙体积光照贴图,并且探针位置也得到改进,这样所需的探针数量减少了大约25%。
-
有关更多信息,请参阅GPU Lightmass。
半透明覆层材质
现在你可以为静态和骨骼网格体分配辅助覆层材质。你可以将其用于实现特定视觉效果,而不需要复制网格体。网格体将渲染两次,一次使用基础材质,一次使用半透明覆层材质。无论有多少材质插槽,每个网格体只有一个覆层材质,可以一次性实现跨越整个网格体的着色效果。

按需着色器编译
使用按需着色器编译(ODSC),仅会编译渲染编辑器中屏幕上显示的内容所需的着色器,并且在使用即时烘焙的迭代式平台开发期间编译。如果开发人员经常同步其版本,并有大量着色器需要编译,经常对材质和着色器迭代,或者无法访问远程DDC获取缓存的着色器,ODSC可以显著减少需要编译的着色器数量。
ODSC默认启用,并可使用控制台变量 r.ShaderCompiler.JobCacheDDC
进行控制。
虽然ODSC可以为处理大项目且经常编译大量着色器的大部分开发人员减少着色器编译工作,但目前并不能减少编辑器初始启动期间编译的"全局着色器"数量。
DX12 PSO编译改进
UE 5.1旨在减少着色器编译导致的停滞,做法是尽早开始编译PSO,在加载组件时就编译,而不是在渲染对象时才编译。这样可减少或消除手动采集PSO缓存的必要,手动采集是个很耗时的过程,并且无法保证完美覆盖。
如果对象必须在加载之后立即渲染,仍有可能遇到停滞的情况。对于远距离对象的背景流送,我们添加了一个选项,用于将渲染网格体的工作推迟到PSO准备就绪时,这可避免停滞,但代价是绘制这些对象时有延迟。类似地,如果一个游戏需要将摄像机传送到全新的位置,或需要同时显示许多新材质,就没有足够的时间编译所有PSO。在这种情况下,游戏代码需要更早加载材质和网格体,并提前提示渲染器去绘制它们。
现有PSO缓存系统仍可以与新系统一起工作。可以设计混合方法,其中有一个手动生成的小型PSO缓存,包含已知随时都需要或将在传送事件之后使用的材质,然后让自动系统负责处理其他大部分材质。
该系统仍在开发中,其性能将在未来的引擎版本中提高。它还将扩展为支持其他RHI,例如Vulkan。
Strata材质(试验性)
Strata 是创作材质的一种新方式,可将着色模型的固定工具(例如默认光照和透明涂层)替换为表现力更强、更为模块化的框架,以提供更大范围的表面外观和更宽的工作参数空间。分层材质的性能可根据项目的复杂度和理想预算进行缩放,旧版材质的成本与之前类似。

你可以在 项目设置(Project Settings) 中的 引擎(Engine)> 渲染(Rendering)> 分层(Strata) 中启用分层。
要详细了解处于试验性状态的分层,请访问Epic开发者社区论坛。
纹理和纹理资产编辑器改进
纹理和纹理资产编辑器在该版本中包含以下改进:
- 现在你可以将纹理导入为32位浮点单通道和四通道格式 R32F 和 RGBA32F 。为实现向后兼容,这些选项可选择加入,并且必须手动开启,即使磁盘上的源文件使用32位浮点格式也不例外。(天空光照目前将 指定立方体贴图(Specified Cubemap) 限制为16位浮点,将最大像素值限制为65,504。这个问题将在未来的引擎版本中得到解决。)

-
维度不是2的幂的纹理现在可以有mipmap。每个维度仍应为4的倍数,以便纹理可压缩。这很适合用于按原生长宽比存储内容,并改进一些功能,例如各向异性过滤,但根据不同的平台,这样做不一定能够相对于向上取2的下一个幂大小节省内存。
-
添加了工具栏选项,用于将Texture2D数组显示为带复选框的切片。
-
添加了工具栏选项,用于将立方体贴图HDR纹理显示为带复选框的 面(Faces) 和 3D视图(3D View) 。
- 查看场景捕获组件中使用的渲染目标时,细节面板现在将显示场景捕获及其所有附属纹理的总GPU内存使用量,如果在捕获中启用了Lumen,则包括Lumen场景。
Lumen关闭:

Lumen打开:

带Shader Model 6的DirectX 12在PC上是新项目的默认值
虚幻引擎5的所有新创建项目现在使用带Shader Model 6(SM6)的DirectX 12,这是PC上的默认启用项。利用DX12,我们可以在关于CPU时间、GPU时间和内存使用量的所有方面都更高效,且它可解锁新功能(其中最突出的是光线追踪)。
Nanite和虚拟阴影贴图未来需要带SM6的DX12。
对于已经在使用DirectX 12的项目,你可以在 项目设置(Project Settings) 中的 平台(Platforms)> Windows > D3D12目标着色器格式(D3D12 Targeted Shader Formats)(带 SM6 复选框)下启用SM6。
在PC上使用DX12时,引擎将按降序尝试每个启用的着色器模型,所以,如果SM5和SM6都已启用,将首先尝试SM6,如果机器不支持,则回退到SM5。如果启用的着色器模型均无法使用,则回退到DX11 SM5,除非它在项目设置中被禁用。如果RHI或着色器模型通过命令行使用 -dx12
、-dx11
、-sm5
、-sm6
(等等)标记强制实施,那么此逻辑并不适用;在这种情况下,如果不支持强制实施的配置,引擎将退出。
请注意,材质编辑器的"平台统计数据(Platform Stats)"中的着色器指令数在SM6和SM5之间不可比,因为SM6中间语言的粒度提高了。SM6指令数在同等复杂程度下看起来更高。SM6指令数仅应该与SM6编译的其他材质相比较。
失真的景深和摄像机裁剪(试验性)
景深增加了对失真的镜头的支持,这些镜头具有垂直拉伸的散景形状。失真的散景提供了高性能的选项,而不必提供对项目的完全自定义纹理支持。此外,现在你可以将摄像机视图裁剪为常用或自定义的长宽比。

你可以在使用 压缩比(Squeeze Factor) 设置的 镜头设置(Lens Settings) 下的 过场动画摄像机(Cine Camera) 和 后期处理体积(Post Process Volume) 设置中找到失真散景设置。
你可以在 裁剪设置(Crop Settings) 下的 过场动画摄像机(Cine Camera) 中找到设置来裁剪摄像机的长宽比。选择常用长宽比或使用 裁剪长宽比(Cropped Aspect Ratio) 来指定。
有关更多信息,请参阅过场动画景深。
材质编辑器内联编辑
我们重新设计了80多个 材质表达式(Material Expression) ,直接在材质图表中的节点上包含了常量值和属性的内联编辑。这是材质编辑工作流的大幅优化,因为许多情况下用户不必再选择节点以及在细节面板中编辑值。
光源混合器(测试版)
光源混合器(Light Mixer) 是新的编辑器窗口,以紧凑表格格式显示场景中的所有光源,用于快速检查和编辑,就像环境光源混合器包含场景环境光照组件那样。

光源混合器的功能:
-
直接从光源混合器创建光源并为其重新设置父节点。
-
以文件夹内的分层上下文显示光源,或显示为没有文件夹的扁平列表。
-
在所有选定光源上同时编辑同一字段。
-
打开称为 集合 的多个选项卡,其中包含用户选择的光源子集。
-
使用 单独(Solo) 按钮隔离单个光源,在其他所有光源上关闭编辑器可视性。
-
启用/禁用 同步选择(Sync Selection) ,自动在视口和世界大纲视图中选择相同光源。
-
自定义显示哪些光照属性进行编辑。
-
显示蓝图中包含的多个光源组件。
虚拟阴影贴图:远光源模式
对于包含远距离渲染的许多本地光源的场景,虚拟阴影贴图(Virtual Shadow Maps) 提高了场景的效率。使用控制台命令 r.Shadow.Virtual.DistantLightMode
将其启用。
虚拟阴影贴图现在需要在 项目设置(Project Settings) 中启用带Shader Model 6(SM6)的DirectX 12。SM6通过 平台(Platforms)> Windows > D3D12目标着色器格式(D3D12 Targeted Shader Formats) 启用。
硬件光线追踪Windows 10版本要求
硬件光线追踪(Hardware Ray Tracing) 现在需要与Nanite和虚拟阴影贴图相同的最低Windows 10版本。有关更多详细信息,请参阅硬件和软件规格。跟以前一样,光线追踪着色器在针对SM5或SM6 D3D12着色器格式时进行编译。
世界构建
世界分区数据层改进
数据层(Data Layers) 可用于在编辑器中以及在运行时切换数据层,有条件地加载和卸载你的世界数据。数据层非常适合用于在编辑器中整理你的世界,处理游戏中的不同场景,并创建相同世界的变体。

此版本中,数据层系统已获得以下改进:
-
数据层功能现在拆分为两个部分:
-
数据层资产(Data Layer Assets) ,用于存储可跨多个世界使用的数据。
-
数据层实例(Data Layer Instances) ,引用数据层资产,并且特定于世界。
-
-
对 数据层大纲视图(Data Layer Outliner) 的编辑流程优化。
-
关卡实例支持(Level Instance support) :关卡实例中的Actor现在可以引用世界中的数据层。
有关更多信息,请参阅世界分区 - 数据层文档。
对水体Actor的HLOD支持
利用虚幻引擎的全套 水系统(Water System) 渲染和网格体工具,可以在关卡中添加各种 水体Actor(Water Body Actor) 类型来表示水。

在此版本中,虚幻引擎的 HLOD 系统现在支持水体Actor。你可以为每个Actor分配一个 HLOD层(HLOD Layer) ,并且每个Actor可根据项目的需要自定义各种HLOD设置。
有关水体系统的更多信息,请参阅水体系统文档。
有关HLOD系统的更多信息,请参阅HLOD和世界分区 - HLOD文档。
Actor编辑器上下文
就虚幻引擎5.1版本而言,现在编辑器会在3D视口右下角显示 Actor编辑器上下文。

这个小方框将显示当前所选的子关卡、世界分区数据层、关卡实例或当前处于活动状态的大纲视图Actor文件夹。放入世界中的Actor会自动添加到当前Actor编辑器上下文。
版本控制中不受控制的变更列表支持
虚幻引擎的 版本控制(Source Control) 系统便于通过版本控制共享资产和代码文件,并提供项目的文件备份和变更历史记录,从而支持开发团队的内部协作。

版本控制与一个Actor一个文件密切合作,因而成为世界分区工作流程的重要一环。
在虚幻引擎5.1中,版本控制获得了多项编辑流程优化,现在可以利用 不受控制的变更列表(Uncontrolled Changelists) 。该功能将跟踪项目中的所有可写文件,提供所有本地变更的流动列表。
-
"跟踪变更(Track Changes)"可以在多个不受控制的变更列表中跟踪变更。
-
"移动文件(Move Files)"可以单独移至受控制的变更列表,或随时恢复。
-
防止测试和调试的排他性签出锁定,减少文件争用。
不受控制的变更列表在虚幻引擎5.1中默认启用。
有关引擎内版本控制的更多信息,请参阅虚幻编辑器中的版本控制文档。
对世界分区的大世界坐标支持(测试版)
大世界坐标(LWC) 在虚幻引擎5中引入了对双精度数据变体类型的支持。就5.1版本而言,系统已扩展,支持世界分区。
大世界坐标世界最大值增加
在此版本中,我们首次将默认世界范围从22千米提高到88,000,000千米,可以创建大得多的世界。
有关大世界坐标的更多信息,请参阅大世界坐标文档。
虚拟制片
摄像机内视效编辑器
我们添加了专用舞台操作员面板,在一个精心制作的UI中收集ICVFX舞台操作的最常用功能按钮。 现在色彩校正、nDisplay调整和发光板在一个地方呈现,可以高效地执行舞台操作。

改进了发光板系统
我们增强了发光板,使用UV投影逻辑,使其在LED墙上表示时保持为设计的形状。 我们还精简了用于创建、编辑和放置发光板的UI,仅呈现对此创意光照任务相关的功能按钮。
改进了ICVFX的色彩校正功能按钮
我们扩展了ICVFX制片的色彩校正工作流程。 色彩校正区域以3D模式工作,你可以将其与2D形状组合使用,构成强大的窗口。 这可补充逐视口的色彩校正。现在你可以选择将给定色彩校正区域/窗口的色彩分级效果限制为属于一组Actor的像素。
媒体板

之前,场景中的流媒体需要使用蓝图手动将元素映射到一起。现在你可以直接将 媒体板 Actor元素添加到场景中,它会负责处理所有底层连接。媒体板按最高质量最大分辨率和色彩深度将EXR平铺和mip用于图像序列。使用媒体板中的预制球体和矩形形状时,虚幻引擎仅流送摄像机当前查看的像素,从而降低流送的预算成本。这样你可以平衡渲染笔记上的负载,并改进每个PC的带宽限制。
新视频架构带来了以下好处:
-
极大简化了视频导入过程。
-
支持媒体播放列表。
-
支持拖放建议的资产和Actor。
-
更新了信息和预览窗口。
-
Sequencer集成。
-
剔除视锥体以提高性能。
-
媒体播放器和纹理管理器。
EXR板性能

未压缩的EXR可提供最佳质量的视频画面,并且拥有最快速路径来使用足够快速的存储设备进行处理。 我们添加了新系统来预处理未压缩EXR,并将其分解为一组图块和mip map级别。 使用媒体板Actor的工作流程,这些EXR经过恰当优化,能以可能的最佳效率在系统中播放,方法是根据视口以及合适的mip级别仅流送和渲染可见的图块,无论是通过nDisplay系统渲染还是独立渲染。
用于摄像机内视效的Lumen(试验性)
现在Lumen在nDisplay中支持多个视口,可用于ICVFX。 每个视口将使用独立的Lumen场景,以消除LED体积中的瑕疵。 除了Lumen之外,虚拟阴影贴图还通过相同机制为nDisplay和ICVFX支持多个视口。
过场动画摄像机近裁剪
过场动画摄像机现在针对每个摄像机有一个 自定义近裁剪平面。
虚拟摄像机
虚拟摄像机的输出现在支持WebRTC像素流送,提供了更可靠、高性能的流送选项,可以在Live Link VCam应用以及任意Web浏览器中查看。虚拟摄像机现在还支持编辑器中的增强输入,允许对使用所有受支持硬件设备的VCam进行可重新映射的控制。这些更改在新的VCamActor上默认启用,它替换了VirtualCamera2Actor,我们还重新设计了默认操作员HUD,它专注于实时动作相机般的体验和干净的帧图像。
此外,虚拟摄像机UI和UX也有改进。

虚拟堪景改进
现在 虚拟堪景 用于OpenXR和增强输入系统。
Live Link Face CSV导入器插件
如果你使用过Live Link Face iOS应用仅在设备上录制脸部捕获(未连接到虚幻引擎并在 镜头试拍录制器 中录制),现在你可以在提取(备份)录制文件后将其导入。设备使用原始时间码和混合形状数据存储 .csv
文件。导入之后,结果是带有Live Link轨道的关卡序列,相当于通过在镜头试拍录制器中录制现场直播所能实现的情况。
多用户服务器UI
我们为多用户服务器添加了UI,用于实时检查服务器的运行状态。 这样操作员和ICVFX舞台经理就可以在多用户服务器操作期间检查、监控和诊断问题。 这相对于控制台服务器有更大优势,后者仅通过控制台命令提供了连接信息的流送,并不提供有关运行中服务器操作的上下文信息。
控制台服务器仍可在无头计算机或无法运行UI的计算机上的操作。 例如,Linux服务器或容器化操作。
电影渲染队列
改进了纹理行为
我们对电影渲染队列(MRQ)处理纹理流送的方式进行了多项改进。改进了启用 纹理流送(Texture Streaming) 时加载不正确mipmap的情况处理。纹理流送在MRQ中仍默认禁用,但可以启用,以在大型项目中节省内存。
过场动画预流送
现在你可以使用预流送录制器创建虚拟纹理和Nanite过场动画缓存。该插件用作渲染通道来构建缓存,供过场动画预流送系统解译。构建之后,你可以在序列中引用该缓存,确保Nanite和虚拟纹理数据在过场动画期间更可靠地流入。

摄像机改进
我们向电影渲染队列添加了新的摄像机相关功能。现在你可以在运行MRQ作业之前启用 渲染所有摄像机(Render all Cameras) ,在同一镜头中从多个摄像机角度渲染。
现在还支持正交摄像机,可以使用非视角摄像机渲染序列。目前,路径追踪器是该选项唯一支持的渲染通路。
运行时API改进
我们简化了电影渲染队列API,极大地降低了在发布项目中使用MRQ的复杂性。现在,你可以直接从子系统请求新作业,设置其配置,然后请求子系统渲染该作业。你不再需要使用队列,手动配置执行器,或在作业上设置基本设置,例如要渲染的世界和作为软路径的关卡序列。
nDisplay

nDisplay 媒体I/O映射系统(试验性)
我们改进了工作流程,使用户能够向ICVFX摄像机、nDisplay视口和应用程序窗口后台缓冲区指定任意时间同步像素源和目标。这意味着,除了原生UE 3D场景渲染之外,用户现在还可以注册IP视频源,例如SMPTE 2110、媒体纹理或从硬件捕获设备向nDisplay视口实时生成的数据。
SMPTE 2110支持(试验性)
我们在虚幻引擎中添加了对SMPTE-2110 I/O(使用Rivermax)的支持。使用新的 媒体I/O映射系统,nDisplay渲染节点将能够直接流送到支持SMPTE-2110的LED墙处理器。这样还可以为nDisplay系统实现不同的硬件配置,其中每个内视锥可以由专用机器渲染。每个内视锥可以共享给合力渲染总图片的所有机器,以便在外视锥上复合。这样就可以提高摄像机的性能和线性可扩展性,以及更加可预测的内容性能。
nDisplay的电影渲染队列支持
用户现在能够使用MRQ将nDisplay视口渲染到磁盘。新设置允许用户选取配置文件和所需视口,按原生和指定分辨率渲染。
nDisplay快速本地启动程序
现在你可以在本地快速启动支持nDisplay的项目,用于在PC上调试和本地试用项目,而无需群集。
开发人员工具
默认Visual Studio版本
虚幻编译工具(UBT)现在为安装的最新版本Visual Studio生成Visual Studio解决方案文件,除非你安装了不支持该最新版本的平台SDK。在这种情况下,UBT为支持相关平台SDK的最新版本Visual Studio生成Visual Studio解决方案文件。首选编译器是Visual Studio 2019。
Clang 13支持
Clang 13现在是为Linux等基于Clang的平台编译时的必需版本。
静态代码分析
虚幻编译工具 现在支持运行多个不同的 静态代码分析器(Static Code Analyzers) 。静态代码分析器将使用各种算法和技术来分析源代码并查找漏洞,而不执行代码。
支持的分析器:
-
默认值:使用所选编译器的默认静态分析器。
-
VisualCpp:使用内置的Visual C++静态分析器。仅支持基于Microsoft Visual C++(MSVC)的平台。
-
PVSStudio:使用PVS-Studio静态分析器。仅支持基于MSVC的平台。此分析器需要许可证,有关更多信息,请参阅PVS-Studio站点。
-
Clang:使用Clang静态分析器。此将强制编译器将Clang用于基于MSVC的平台。此分析器为测试版。
使用虚幻编译工具运行静态代码分析器的语法是:
Engine\Build\BatchFiles\RunUBT.bat TARGET PLATFORM Development -StaticAnalyzer=ANALYZER
例如,你可以在命令行中输入以下内容,用于运行所选编译器的默认静态代码分析器,并以虚幻编辑器为Windows 64位系统上的目标:
Engine\Build\BatchFiles\RunUBT.bat UnrealEditor Win64 Development -StaticAnalyzer=Default
有关更多信息,请参阅静态代码分析文档,其中包含有关支持的分析器和更多命令行选项的详细信息。
C#虚幻标头工具
虚幻标头工具(UHT)已使用C#重新编写,并直接与虚幻编译工具集成。此次重新编写的目的是:
-
提高可维护性。
-
缩短构建时间。
-
缩短构建场时间。
-
删除引擎钩。
C++虚幻标头工具现在已废弃,将尽快删除,但不早于UE 5.2。
C++虚幻标头工具
下面是在从虚幻引擎删除之前继续使用C++ UHT的两大原因,以及有关如何继续使用C++ UHT的信息:
-
你使用的UHT脚本生成器插件目前没有C#版本。
- 如果UBT检测到项目上使用了脚本生成器插件,并且该插件不存在C#版本,则UBT会自动恢复为使用C++ UHT。
-
你对UHT进行了本地更改。
- 在这种情况下,在
UEBuildConfiguration
类别中设置bUseBuiltInUnrealHeaderTool = false
以禁用C# UHT。
- 在这种情况下,在
在任一情况下,请务必在C++ UHT从UE中删除之前,将C++ UHT更改和脚本生成器插件移植到C#。如果你需要对C# UHT做出更改,你可以在 Engine/Source/Programs/Shared/EpicGames.UHT
中找到源代码。
C#脚本生成器插件
我们在 Engine/Plugins/ScriptPlugin/Source/ScriptGeneratorUbtPlugin
中提供了示例C#脚本生成器插件。此外,所有现有UHT导出器都使用相同机制编写,位于 Engine/Source/Programs/Shared/EpicGames.UHT/Exporters
中。下面的简短指南可提供帮助:
-
在现有C++脚本生成器插件所在相同目录树中创建C#项目。插件的扩展名必须是
.ubtplugin.csproj
。 -
在Visual Studio中,生成项目文件。你的插件现在将在
Programs/UnrealBuildTool.Plugins
中列出。 -
将
EpicGames.UHT
添加为程序集依赖性,而不是项目依赖性。 -
使用
ScriptGenerator.cs
作为参考,创建一个类,其中将包含用于导出脚本的进入点。此类必须有UnrealHeaderTool
属性,并且静态方法必须有UhtExporter
属性。 -
最后,C#生成器插件必须支持可用于编译
UE_5_1_OR_LATER
等C#源的相同已定义常量。
提供的工厂对象包含导出UE数据类型所需的上下文。工厂对象包含 UhtSession
。此 UhtSession
包含 UhtPackages
的列表。你可以在 UhtPackages
中 UhtHeaderFiles
中的头文件中找到定义的数据类型。
C# UHT的最佳实践
-
在异步任务中导出文件,以便提高性能。
-
使用
IUhtExportFactory.MakePath
和IUhtExportFactory.CommitOutput
方法导出文件,利用内置的更改检测、引用和验证输出。 -
使用
BorrowStringBuilder
以使用缓存的字符串构建器。 -
尽量避免临时对象和字符串。
-
使用
IUhtSession.GoWide
属性进行调试,确定命令行中是否指定了-nogowide
。如果存在,请勿使用异步任务来生成输出,而是直接调用你的导出代码,因为这样会简化调试工作。
音频
MetaSounds(测试版)

MetaSounds 是我们基于图表的高性能音频系统,在5.1中有多项新的改进。
我们扩展了节点库,提供了新功能,例如音高变化、颗粒延迟、重路由,等等。此外,我们添加了多声道音频输出支持,这样你可以更轻松地创造沉浸式环绕声体验。
要详细了解MetaSounds,请参阅MetaSounds文档。
音频调制
音频调制(Audio Modulation) 插件不再是测试版功能,现已与MetaSound完全集成。该功能提供了调制音频参数的通用方法。现在,任意内容都可以是调制源或目标。你可以定义自己的参数组,并按所需方式进行控制。
音频Gameplay体积(测试版)
音频Gameplay体积(Audio Gameplay Volumes) 是基于几何体的音频管理和控制中的下一迭代产物。音频Gameplay体积系统旨在替换旧版音频体积系统,提供了基于组件的选项,用于虚幻音频引擎功能集成、可扩展性和更紧密的Gameplay集成,包括可移动性和动态变换。
要详细了解音频Gameplay体积,请参阅音频Gameplay体积文档。
音景(测试版)
音景会流程性生成环境声音,例如沙沙作响的植被、啾啾啼鸣的鸟儿、川流不息的车流,这些声音会随着玩家在世界中四处移动而流送。设置之后,该插件会自主管理和构建这些声音系统,不需要手动创建。
波形编辑器(测试版)

波形编辑器是在虚幻编辑器中查看和编辑声波的新工具。它可以修剪、消退、规格化,以及做出其他波形调整。甚至可以改变声波元数据,支持循环区域、提示点,等等。这些修改可以保存到新的资产,以保留原始内容。
UMG/Slate改进
UMG Viewmodel(测试版)
利用 Viewmodel插件 提供的框架,设计师可以在对控件做出结构性更改时,更简单地独立于程序员工作。
之前,主要有两种方法将数据转发到UMG中的控件:
-
属性绑定:控件在决定其某个字段(例如文本字段)的值时,将遵从某个属性或返回值的蓝图函数。该实现很灵活且易于使用,但存在性能问题,因为它会持续更新控件,无论属性本身实际是否更改。
-
事件驱动的更新:Gameplay会调用函数来手动更新UI,或者UI基于事件分发器或委托来更新。这可带来卓越的性能,但需要手动更改代码来反映UI中的更改。
Viewmodel插件同时吸取了这两种方法的优点。启用此插件后,你可以创建 Viewmodel ,用于保存UI中使用的变量,然后将控件绑定到Viewmodel中的属性。

Viewmodel是单独的对象,会保存UI中需要的一组变量的副本。每当你需要更改其中某个变量时,你在Viewmodel中更新,而不是直接在UI中更新。然后,Viewmodel会通知UI中的绑定控件其值已更改,并推送更新。这可消除创建回调和更新函数的繁琐工作,简化了创建数据驱动的UI的过程,并向程序员提供了独立于UI本身的敞口。
有关如何在项目中使用ViewModel的更多信息,请参阅Viewmodel文档。
命名插槽控件

UE 5.1在UMG中引入了 命名插槽控件(Named Slot Widgets) 。这些控件在创建模板时充当其他控件的占位符。正常情况下,当你创建UMG控件的子类时,其层级中的控件会隐藏。
命名插槽会显示在层级中,并且可在 PreConstruct 事件中安全地填充,这样可更轻松地使用测试用例预览你的模板控件。此外,当你向命名插槽插入子节点时,其在层级中的位置和渲染顺序会基于父类保留。
UMG工具控制板插件(试验性)

我们向UE 5.1中的UMG添加了新的 工具控制板(Tool Palette) 插件。利用该工具控制板,可快速访问常用工具、控件和交互。你可以在插件菜单中启用此插件进行试用。
编辑器
更好的资产搜索和筛选
大纲视图(Outliner) 和 引用查看器(Reference Viewer) 现在支持 资产筛选(Asset filtering) 。这些筛选器的行为与内容浏览器筛选器相同,并且它们支持高级搜索语法运算符。
现在你可以在大纲视图、内容浏览器和引用查看界面中将资产搜索保存为自定义筛选器。保存之后,自定义筛选器以及单独的筛选器设置将在所有流和项目中可用于创建它们的用户。
我们对内容浏览器中的搜索和筛选资产进行了以下改进:
-
搜索栏显示了最近搜索的历史记录。
-
筛选器默认按垂直列显示。你可以从内容浏览器的 设置(Settings) 菜单在新(垂直)和旧(水平)筛选器布局之间切换。
-
筛选(Filter) 下拉菜单在至少有一个筛选器处于活动状态时会显示徽章。
大纲视图改进
为了使大纲视图更易于导航,现在当你上下滚动时,标题会堆叠。

我们添加了以下功能,这样可以更轻松地在大纲视图中查找Actor:
-
你可以将大纲视图配置为当你在关卡视口中选择Actor时总是滚动到该Actor。通过切换 总是帧选择(Always Frame Selection) ,从大纲视图的 设置(Settings) 菜单启用该选项。
-
在关卡视口中选择Actor后,按 F 键可在大纲视图中高亮显示该Actor。
-
当前所选Actor的父项目现在会高亮显示,即使当前选择内容已折叠也不例外。
现在你最多可以拥有四个大纲视图实例,并单独自定义每个实例。
你可以选择大纲视图中显示哪些列,方法是右键点击列标题,然后点击列名,切换是显示还是隐藏该列。
引用查看界面工具重新设计
我们重新设计了 引用查看器(Reference Viewer) 工具,支持更多的资产引用和更深的引用图表。引用搜索现在支持的搜索深度是50,搜索广度是1000个资产级别。
查找资产引用现在利用了虚幻引擎改进的搜索和筛选功能,让你能够更好地控制在引用图表中显示哪些类型的资产。
引用图表中的资产节点按资产类型进行颜色编码,并可以自定义为显示更多信息,例如资产的缩略图及其文件路径。
要详细了解虚幻引擎5.1中的所有引用查看器改进,请参阅引用查看器文档。
Python类型提示
Python插件现在可以生成带类型提示的存根文件。类型提示将显示在你的Python IDE自动完成菜单中。要启用类型提示,请从虚幻编辑器菜单栏,转至 编辑(Edit)> 编辑器偏好设置…(Editor Preferences…) 。在其中找到 插件(Plugins)> Python 。启用 开发人员模式(Developer Mode) ,选择你需要的 类型提示模式(Type Hinting Mode) 。这会生成Python存根文件,你可以将其添加到所选IDE。如需详细了解如何启用类型提示和各种可用的类型提示模式,请参阅为虚幻编辑器Python脚本设置自动完成的文档。

本地化管线自动化改进
本地化命令在UE 5.1中有以下改进:
预览采集
在旧版UE中,本地化管线需要编译系统运行编译过程的每个步骤,然后再处理本地化。这意味着,要查看本地化的错误和警告,用户需要重新编译整个项目。在UE 5.1中,本地化命令将运行预检来采集本地化文件,然后检查其中是否有错误和警告。不需要等到完全构建之后再发现本地化错误,极大地方便了本地化调试。此改进通过UAT本地化命令提供。
错误报告的CSV格式支持
虽然旧版UE仅使用 .txt
文件来统计字数和报告命名空间冲突,UE 5.1现在支持使用 .csv
文件,使信息更加清晰、井然有序。此格式在UE 5.1中默认启用,但你可以更改,方法是转至引擎的安装目录,找到 Engine/Config/Localization/Engine.ini
,将 ConflictReportName
和 WordCountReportName
字段设置为使用 .txt
文件扩展名而不是 .csv
。
改进了解析代码
UE 5.1在处理代码中的本地化文本时,增加了多项编辑流程优化。使用 #define LOCTEXT_NAMESPACE
和 #undef LOCTEXT_NAMESPACE
将代码段标记为属于特定本地化命名空间。然后,你可以在这些宏之间使用 LOCTEXT
宏,通过键和默认文本字符串定义本地化文本条目。
#define LOCTEXT_NAMESPACE "Paper2D"
//…
DefaultRule.Description = LOCTEXT("TerrainDefaultRuleDesc", "Top");
//…
#undef LOCTEXT_NAMESPACE
在上述例子中,带默认文本"Top"的键
"TerrainDefaultRuleDesc"会添加到
"Paper2D`"命名空间。此外,本地化文本现在支持使用转义字符。
曲线表编辑器
现在你可以在 曲线数据表编辑器(Curve Data Table Editor) 中编辑 简单曲线(Simple Curves) 和 富曲线(Rich Curves) 。创建曲线表时,你可以打开编辑器,编辑表或曲线视图中的曲线,无需返回你创建它们时所用的外部程序。
- 你可以在内容浏览器中找到"杂项(Miscellaneous)"分段来创建曲线表。你可以通过选择插值类型来选择富曲线或简单曲线。

- 创建新的立方曲线表会创建富曲线表。

- 创建常量或线性曲线表或导入电子表格会创建一组简单曲线,然后你可以在虚幻引擎中进行编辑。

- 编辑简单曲线时,我们会维持所有曲线必须有相同关键帧时间的约束,因此关键帧无法水平移动,添加关键帧会将关键帧添加到所有曲线。

- 现在编辑器支持重命名和删除曲线,同时改进了常量曲线表的渲染。

- 除了编辑曲线键值之外,新的工具栏增强功能还包括能够重新定时、添加或删除键列,以及重新导入。
虚拟资产(测试版)
虚拟资产 提供了更快速、更高效的方法,随着项目的大小开始增长,在团队所有成员之间同步数据。
处理资产时,用户只需要有关其资产的最低限度信息,以便在编辑器中显示。 例如,纹理可能需要缩略图和编辑器属性(例如坐标和比例),但是纹理的 .UAsset
文件的大部分是像素数据,这些可能不需要,让团队将其同步到项目会比较浪费。
这些资产已分拆为各个"核心资产元数据"部分,当资产受到你的版本控制时,这些部分存在,并将"批处理数据"分拆到单独的位置中。如果用户需要批处理数据,可以在版本控制中按需同步。
这些功能包括:
-
按程序包路径、按特定资产类型或按特定资产同时虚拟化整个项目的功能。
-
支持纹理和音频资产。
新的导入框架
虚幻引擎5.1有一个新的 导入框架,旨在为用户提供高性能、可自定义的资产管线。该框架在编辑器中以及在运行时(试验性)工作,以及提供使用蓝图和Python的脚本支持。

这个新的框架与格式无关,并通过以下步骤来运作:
-
转换器(Translator) :将文件格式转换为虚幻引擎中的中间图表结构。
-
工厂(Factory) :从管线输出生成Actor和资产。
-
管线(Pipeline) :将图表结构处理为虚幻引擎Actor和资产的说明。
框架目前支持以下格式:
-
图片格式(Image formats) :BMP、DDS、EXR、HDR、JPG、PCX、PNG、PSD、TGA、TIFF
-
光源格式(Light format) :IES
-
3D模型(3D models) :GLTF、OBJ
-
材质(Material) :MTLX
- 在此初始版本中,MaterialX仅限导入,并且仅支持使用
standard_surface
着色模型平移材质。
- 在此初始版本中,MaterialX仅限导入,并且仅支持使用
虚幻引擎之前支持的文件格式仍可使用旧版框架受支持。
有关更多信息,请参阅"导入/导出交换(Import/Export Interchange)"文档。(链接待定)
建模和塑造工具
UV编辑器(测试版)
UV编辑器(UV Editor) 在5.0中作为试验性的功能引入,在5.1中已移至测试版。之前,UV编辑器可通过插件访问。现在,你可以通过三种方式快速访问编辑器:
-
在 建模模式(Modeling Mode) 下使用 UV 面板。
-
在 关卡(Level) 中 右键点击 你的网格体。
-
在 内容浏览器(Content Browser.) 中 右键点击 你的网格体。
UV创建和编辑继续改进,不仅是默认启用的UV编辑器,还包括以下情况:
-
我们添加了 变换(Transform) 工具,支持的变换行为比小工具所能提供的行为更复杂。此功能按钮包括链式缩放、旋转、平移,以及各种枢轴点选项,用于调整变换UV的相对运动。
-
现在针对 布局(Layout) 和 解包(Unwrap) 工具支持 UDIM 。
- 你可以将现有UV岛固定到当前在经历布局或解包操作时占据的UDIM。
-
分布(Distribute) 工具 ** 基于边界框边缘规则在UV岛之间创建自动间隔。
-
现在支持手动距离调整,用户能够在执行各种分布时精确控制UV选择之间的间隔。
-
提供了最低限度去除重叠的新模式。该模式会酌情将所选区域移开,防止边界框相交。该模式还适用于新的手动距离控制点,允许自定义分隔距离。
-
-
分割(Split) 工具现在支持完整三角形区域、顶点和边缘。我们提供了现有UV的快速选择和分割。
-
对齐(Align) 工具包含额外分组逻辑,其中单独选择的岛可以彼此独立地对齐,也可以将所选内容作为组对齐,保留相对位置。
- 对齐和分布工具现在支持顶点和边缘选择,以便沿边界和内部线条更精准地定位。相应地,这些工具支持将单独的顶点视为独立实体,创建最精细比例的逐顶点对齐和分布。
-
UV编辑器的 3D视口(3D Viewport) 支持摄像机对齐到所选内容。
- 这可以通过视口的工具栏中的新摄像机聚焦按钮来发起,或使用默认摄像机对齐键绑定(Alt+F)来发起。
-
使用 AutoUV 工具基于现有网格体多边形组创建UV。
- 有一个选项可自动根据原点多边形组将生成的孤岛排列为UDIM图块。
其中许多改进功能都模仿了传统的美术师和绘图应用程序。要了解更多内容,请参阅UV编辑器文档。
模式工具
我们扩展了美术师的建模工具包,增加了 模式(Pattern) 工具。沿可移动3D平面上的线条、网格或圆圈平铺一个或多个所选网格体。有各种参数可用于每个平铺模式,包括插值平移、旋转和缩放。将生成的模式输出为合并动态网格体、逐个元素的Actor(静态或动态)或实例化静态网格体组件。
动画
动画合成
机器学习(ML)变形器(测试版)
现在用户可以使用机器学习(ML)变形器系统创建自己的ML变形器模型,近似表示虚幻引擎中的高质量网格体变形。
ML变形器框架(ML Deformer Framework) 打包为插件,使用现有 神经网络推断 框架以及可复用的资产类型和编辑器,供你用于训练、检查和调试ML变形器模型,这些模型通过在运行对神经网络求值来对网格体变形。
ML变形器系统还提供了与变形器图表(Deformer Graph)系统的集成,你可以用于编辑和微调生成的网格体变形。
此外,你还可以启用新的 神经变形模型(Neural Morph Model) 插件,使用预制的高性能变形器模型,对你的角色训练高质量变形,而且内存占用量很低。
- 神经变形模型(Neural Morph Model) 用于替换 顶点增量模型(Vertex Delta Model) 。只需要每个角色增加几个MB的数据,并且配备快速的硬件性能,神经变形模型就能在现代平台上使用基于ML的高质量网格体变形模型。
除了引入 ML变形器框架(ML Deformer framework) 和 神经变形模型(Neural Morph Model) 之外,ML变形器资产编辑器(ML Deformer asset editor) 还获得了多项性能和编辑流程优化。
有关更多信息,请参阅ML变形器文档。
变形器图表(测试版)
变形器图表(Deformer Graph) 插件的编辑器允许用户 创建 和 编辑 变形器图表资产,为蒙皮网格体自定义复杂的网格体顶点变形行为。
你可以利用 变形器图表编辑器(Deformer Graph Editor) 组合使用自定义蓝图逻辑和高级着色器语言(HLSL)脚本,创建和自定义网格体变形器系统,以在运行时使用动态输入修改网格体顶点数据。变形器图表是传统线性蒙皮网格体的强大替代方案,使用变形目标或布料模拟在运行时创建复杂的网格体变形。
有关更多信息,请参阅变形器图表文档。
物理控制点组件(试验性)
物理控制点组件(Physics Control Component) 是一种插件,可用于向蓝图添加简单、直观、强大的基于物理的控制点。通过这些物理控制点,你可以利用静态和骨骼网格体的突现物理运动,同时仍保留艺术和Gameplay控制。
通过物理控制点组件,你可以轻松创建影响全部或部分骨骼网格体的控制点。例如,你可以创建物理控制点,以在 世界空间 中操作,用于你想看到一些突现运动,并仍保留大量控制权的情况。你可以设置物理控制点,以在 父空间 中操作,创建类似肌肉的反应式肢体行为。物理控制点甚至可以在本地或外部 物理形体 之间操作。
此外,你还可以引导物理控制点使用动画、流程性目标或两者的组合。
要查看物理控制点组件的示例应用,例如全身效果、辅助运动和打击反应,请参阅内容示例(Content Examples)项目中的 物理控制点(Physics Control) 关卡。
动画Gameplay
运动匹配(试验性)
姿势搜索(Pose Search) 插件现在包含新的 Motion Matching 动画蓝图节点,作为状态机的动态替代方案,可用于构建角色移动动画系统。
Motion Matching节点使用 数据库(Database) 资产,包含角色的移动动画,根据一组存储的动画明智地选择动画姿势,以在运行时匹配角色的 移动模型(Movement Model) 。使用Motion Matching节点,可以快速高效地设置高质量、快速响应的角色移动动画系统,而无需复杂的状态机逻辑。
要提高角色的运动匹配动画保真度和质量,你只需将更多动画添加到角色的"运动数据库"或"数据库集"资产。每新增一个动画,Motion Matching节点就能够根据更多数据绘制,更准确有效地选择优质输出姿势,匹配玩家的移动模型。
姿势搜索插件还随附倒回调试器的自定义集成,可用于录制和分析运动匹配姿势选择过程,查看已选和未选的姿势及相关原因。接着可以根据项目的需要,使用该信息调整和微调选择过程。

动画运行时
倒回调试器
倒回调试器(Rewind Debugger) 的用户界面已更新,现在包含动画数据轨道的 时间轴 ,将显示可视化信息图表,可用于在调试角色的动画系统时查看动画数据中的关键更新和变化。
倒回调试器时间轴将针对调试主题的每个组件或子对象包含一个动画数据轨道。你可以使用倒回调试器分析和调试动画序列播放、通知、曲线、混合权重(Blend Weights) ,等等。每个动画数据轨道还可以在时间轴中选择,使用所选动画数据的更精确读数填充新的 倒回调试器(Rewind Debugger) 细节面板进行调试。
此外,倒回调试器现在还包含姿势观看集成,可在角色动画蓝图中启用,以便观察Gameplay的录制片段中任意蓝图节点的输出姿势。
有关更多信息,请参阅倒回调试器文档。
Sequencer
层条
要同时辅助多个关键帧的移动和缩放,现在你可以使用 层条(Layer Bars) 在Sequencer中移动关键帧和分段。层条是层级式的,将在Actor、组件和文件夹轨道上显示。在这些点操控层条将相应操控其中的其他层条,从而更轻松地对Actor上的关键帧重新定时,而无需展开每个轨道。

关键帧条
关键帧条(Key Bars) 已添加到Sequencer,用于更轻松地为关键帧的相邻对重新定时。选择并拖动两个关键帧之间绘制的线条,将相对于彼此移动两个关键帧,这可节省逐一多选每个关键帧所用的时间,并保留这些关键帧之间的自定义曲线。

动画约束
现在你可以使用虚幻引擎的新 约束(Constraint) 功能,通过各种方式动态约束你的Sequencer对象。类似于其他动画工具中的约束方法,你可以使用 父约束(Parent Constraint) 约束整个变换,或使用 平移(Translation) 、旋转(Rotation) 、 查看(Look-At) 或 缩放约束(Scale Constraints) 沿各个通道进行约束。
利用约束,可以更轻松地动态、非破坏性地在你的Sequencer动画中将你的 Object 、 Actor 和Control Rig 控制点 附加到彼此。
Control Rig
构造事件
为了提高其他类似蓝图工具的一致性,我们已将 设置事件(Setup Event) 重命名为 构造事件(Construction Event) 。我们还添加了新的生成节点,使构造事件中的流程性rig创建更加快速、轻松。

UX和功能改进
我们向Control Rig进行了多项编辑流程优化和UX更改,以改进你的工作流程。
-
Control Rig编辑器现在支持多个图表,这样你可以将rig逻辑整理并分隔为不同的图表。
-
现在你可以将 自定义事件(Custom Events) 添加到你的Rig图表(称为用户定义的事件),这样你可以创建和执行自己的rig事件。
-
现在控制点可以显示为几何体之上的覆层,类似于其他软件中的"X光(X-Ray)"设置,方法是在 动画模式(Animation Mode) 面板中启用 将控制点显示为覆层(Show Controls as Overlay) 。
-
我们添加了 代理控制点(Proxy Controls) ,它们是新的控制点类型,可以链接到驱动者/被驱动者关系中的其他控制点。
-
现在你可以将Python命令附加到Control Rig编辑器中的引脚,支持自动设置节点。

IK Rig和重定向器
可调整步幅
我们添加了新的属性,当你使用IK重定向器时,可将其用于控制IK目标的长度、宽度和播放。在大部分情况下,你可以将其用于调整重定向角色的步幅和总体站立姿势。
快速栽植
我们提供了新的工具和工作流程,以改进迥异角色的重定向结果。现在你可以使用 快速栽植(Speed Planting) 工作流减少滑步和其他类似问题。如需详细了解此工作流程,请参阅Speed Planting文档。
UX和功能改进
我们向IK Rig和IK Rig重定向编辑器进行了多项用户界面和用户体验更改,以改进工作流程、布局和工具行为。重要的更改包括:
-
源和目标骨架现在都可以在视口中查看,同时会显示重定向编辑器中的骨架层级。更多筛选器、搜索栏和层级排序现在可用于提高你隔离和编辑链属性的能力。
-
现在,IK属性等特定属性在重定向链不需要它们时会禁用。我们还为属性添加了更简单的UI,包括带有非默认值的属性的属性重置指示器。
-
重定向姿势现在可以保存和导入,这样你可以在项目上共享自定义姿势。
-
我们改进了重定向姿势编辑,允许骨骼旋转的数字条目,以实现更轻松、更精确的控制。

DMX

Vectorworks和MVR导入器(试验性)
MVR是用于传输现场活动和影视行业的DMX Fixture和修补信息的关键帧格式。该支持允许使用Vectorworks等CAD应用程序和Grand MA3等光照控制台与团队协作。
为了将Vectorworks文件导入UE进行现场活动或VP舞台预可视化,我们向Datasmith工作流程添加了对GDTF和MVR的支持。
MVR提供了DMX Fixture变换、修补信息和GDTF签名文件,而Datasmith则导入通用网格体和纹理数据。
用于虚拟制片的DMX(试验性)
我们正在改进虚幻引擎和DMX之间的双向工作流程,其中虚幻引擎将触发DMX事件,并且DMX控制台能够控制虚幻引擎Actor。这样可支持虚幻引擎用户与制片团队成员之间使用基于DMX的光照控制台进行更多的协作。
编辑器内实时支持(试验性)
之前,DMX支持是通过DMX插件启用的,并且发送/接收功能仅在播放/预览/游戏或打包模式下启用。我们将添加对编辑器内实时活动的支持,使用户能够使用DMX驱动编辑器内元素。
像素映射器改进(试验性)
我们向DMX像素映射器添加了许多UI调整和工作流程改进,尤其是能够通过之前导入的MVR数据集布局设置2D Fixture映射网格。
虚幻云服务
像素流送
对像素流送的虚拟制片支持
我们引入了支持,可以使用远程像素流送会话导航虚拟摄像机(VCam)。这使用新的 像素流送输出提供程序(Pixel Streaming Output Provider) 实现,后者选为VCam Actor的输出提供程序。
虚拟制片LiveLink改进(试验性)
我们还向虚拟制片 虚拟制片LiveLink(Virtual Production LiveLink) iOS应用添加了试验性支持,以使用像素流送试验性流送和控制iOS设备上的虚拟摄像机。过去,使用LiveLink应用控制虚拟摄像机会带来明显的延迟,但通过像素流送,我们可以在驱动这些虚拟摄像机时大幅降低延迟。对该工作流程的支持是试验性的,尚未准备好投入使用。
像素流送前端改进
像素流送前端、信令服务器、SFU和相关脚本全部都已移至其自己的顶层Github存储库,该存储库与虚幻引擎发布节奏不同步。这样我们就可以更频繁地更新这些组件,而不与虚幻引擎发布周期相捆绑。该存储库可在以下位置找到:
https://github.com/EpicGames/PixelStreamingInfrastructure
未来对于像素流送用户,工作流中应该几乎没有变化。当你打包应用程序时,应用程序会捆绑一个小脚本,它在运行时会基于你的引擎版本下载正确的Github版本。如果在不同版本之间浏览器有重大更改或问题,该存储库将提供一种机制,让我们在这些窗口外部加以解决。此外,我们希望鼓励像素流送用户向该存储库报告前端/服务器问题,这样我们可以更轻松地与用户协作。
UE编辑器/游戏中的像素流送解码
在5.1中,我们引入了在引擎内解码像素流送视频流的支持。这样就可以在多个应用程序之间,甚至潜在地在编辑器之间提供流送。该功能随附新蓝图节点,可支持在引擎中设置流播放,而无需编写C++代码。目前,你可以使用特殊材质播放流。


编辑器视口窗口流送(试验性)
过去,虚幻引擎用户能够流送打包的虚幻引擎应用程序和游戏。随着人们越来越多地远程工作和远程协作,我们引入了对像素流送的试验性支持,以流送整个虚幻编辑器本身。编辑器流送可以使用新的像素流送工具栏进行测试,如今该工具栏在启用了像素流送时可见。如果你要在无人看管的设置中启动,可以使用 -EditorPixelStreamingStartOnLaunch
启动。运行编辑器流送与普通像素流送的工作方式是一样的,仍需要信令服务器。
编辑器体验方面还存在一些局限性。例如,目前尚不支持多显示器流送。一般来说,该功能是试验性预览版,我们打算在后续版本中扩展功能集和用户体验;但是,如果用户要依据该功能进行构建,应谨慎行事,因为该功能可能会变化。
平台
Apple Silicon上的虚幻编辑器(试验性)
旧版虚幻引擎支持针对Apple的ARM-64架构构建项目,但虚幻编辑器本身不是为其原生构建的,在Apple Silicon设备上运行时依赖Rosetta指令转换程序。UE 5.1在虚幻编辑器中推出了对Apple Silicon的原生支持的试验性版本,这意味着,M1设备及更高版本在运行编辑器时,性能应该会有所提高。
这种支持在通过Epic Games启动程序发布的版本中不可用。这种情况下,你需要使用Xcode从基于Apple Silicon的Mac上的源编译虚幻引擎。若在Apple Silicon平台上使用Xcode编译UE,将默认为编译试验性原生版本,目标设备列为 我的Mac(My Mac) 。要编译Rosetta版本,你需要将目标设备更改为 我的Mac(My Mac (Rosetta)) 。

请注意,虚幻商城插件不大可能适用于此配置,因为插件尚不兼容arm64。
Linux IDE工作流改进
在UE 5.1中,我们改进了对VS Code的支持,将其作为Linux中IDE的默认选项。当你有多个IDE,并且代码访问器找不到正确的IDE时,系统还会提供错误处理和消息传递。
Google Stadia支持
在UE 5.1中,针对Google Stadia的支持已经停止维护。在UE 5.2中,该支持将被完全移除。
XR
改进了OpenXR支持
我们添加了对ResetOrientationAndPosition接口函数和像素密度的支持,以及对使用时间分辨率修改的屏幕百分比的试验性支持,以及若干稳定性改进和漏洞修复。
增强了输入(测试版)
在5.1中,你可以使用增强输入为OpenXR项目创建复杂的输入处理。增强输入现在支持兼容OpenXR的控制器和头戴式显示器。
VR模板已更新,包含如何将增强输入用于XR项目的示例。

渲染功能(试验性)
我们添加了针对Nanite、Lumen和时序超分辨率的双目渲染支持。目前,仅在PC上使用延迟渲染器时支持该功能。
HoloLens的OpenXR支持
我们删除了虚幻引擎的Windows Mixed Reality插件,并已迁移到HoloLens的OpenXR。要在5.1中开发HoloLens的项目,你应该安装Windows Mixed Reality OpenXR运行时和Microsoft OpenXR插件。
请参阅OpenXR先决条件文档,详细了解如何使用OpenXR设置你的HoloLens项目。
已废弃Oculus VR和SteamVR插件
我们已在5.1中废弃Oculus VR和SteamVR插件。将OpenXR插件和相关OpenXR运行时用于Oculus或SteamVR项目。
请参阅OpenXR先决条件文档,详细了解如何安装OpenXR插件和运行时。
移动
移动平台开发要求和兼容硬件
下面列出了虚幻引擎5.1支持的移动设备所支持的操作系统版本和最低硬件。有关必需SDK和IDE的更多信息,请参阅平台SDK升级小节。
iOS、iPad OS和tvOS
UE 5.1支持运行操作系统版本15或更高版本的iOS、iPadOS和tvOS设备。下面是最低的兼容设备型号:
-
iOS 15
-
iPhone 6S或更高版本
-
iPod Touch第7代
-
-
iPadOS 15
-
iPad第5代或更高版本
-
iPad Air 2* 或更高版本
-
iPad Mini 4* 或更高版本
-
iPad Pro(所有型号)
-
-
tvOS 15
-
Apple TV HD*
-
Apple TV 4K(第一代)
-
Apple TV 4K(第二代)
-
-
基于Apple A8/A8X的设备(iPad Air 2、iPad Mini 4和Apple TV HD)需要项目设置才能启用支持。
有关必需SDK和MacOS版本的信息,请参阅下面的SDK升级说明 。
Android
UE 5.1支持满足以下规格的Android设备:
-
运行64位Android的Android 8或更高版本
-
64位基于Arm的CPU
-
兼容的GPU
-
Mali T8xx、G71、G72、G76、G77、G78和G710系列
-
Adreno 5xx、6xx或7xx系列
-
PowerVR GM9xxx系列
-
Xclipse 920
-
-
兼容的图形API
-
OpenGL ES 3.2
-
带兼容驱动程序的Android 10或更高版本设备上支持的Vulkan
-
有关必需SDK版本的信息,请参阅下面的"SDK升级说明"。
移动渲染器的延迟着色模式现已可投入使用
移动渲染器延迟着色模式在UE 4.26中作为试验性功能引入,在UE 5.1中现已可投入使用。该模式针对移动设备中常见的平铺GPU进行了优化,启用了在移动正向渲染路径中不支持的多项高质量光照功能,例如光源函数、IES配置文件和光照贴花。移动版UE支持的所有设备都可以运行延迟模式,包括Android上的Vulkan和OpenGL ES模式。
此外,移动延迟路径现在支持以下渲染功能,这些功能之前仅可在使用正向渲染路径的移动设备上运行:
-
距离场阴影投射
-
聚光源阴影
-
屏幕空间环境光遮蔽
不使用预计算的光照时,支持以下功能:
-
皮肤着色模型
-
毛发着色模型
-
薄半透明模型
用于所有移动路径的DirectX着色器编译器
UE 5.0将DirectX着色器编译器(DXC)设置为Vulkan和GLES的默认着色器编译器。在UE 5.1中,所有移动功能级别现在都使用DXC,包括Metal。这可改进每个渲染路径之间的一致性和功能奇偶校验,并将DXC社区的资源开放给虚幻引擎中的所有移动项目。
移动渲染改进
我们将以下功能和改进添加到了UE 5.1中的移动渲染管线。这些功能专注于改进渲染优化。
Arm ASTC编码器
UE现在支持ARM的 自适应可扩展纹理压缩(Adaptive Scalable Texture Compression,ASTC) 压缩标准作为选项。
重构了逐个材质和逐个项目的半/全精度设置
在UE 5.1中,我们添加了一个选项,用于指定移动设备的材质和材质表达式精度模式。三种可用模式如下:
-
适用于每个浮点的全精度
-
仅适用于材质表达式的全精度
-
适用于每个浮点的半精度
主要新增功能是,在引擎着色器使用半精度时,能够将全精度用于材质表达式。这通常比全局设置半精度更可靠,因为我们在内部确定了哪些引擎着色器变量可安全地用作半精度。
移动浮点精度模式(Mobile Float Precision Mode) 设置可在 项目设置(Project Settings) > 引擎 - 渲染(Engine – Rendering) > 移动(Mobile) 下找到。

你还可以逐个材质配置此设置。
移动渲染器上的群集局部光源和反射支持
UE 5.1为移动前向和移动延迟渲染模式添加了对群集局部光源和反射的支持。

PSO缓存改进
之前,UE会将PSO缓存构建为整个应用程序的单一庞大缓存。这会占用大量内存,因为有些资产即使用户可能在Gameplay期间看不到,应用程序也会为其加载PSO缓存,并且编译过程也很耗时。
在UE5.1中,PSO会在烘焙阶段逐个资产分解为缓存,然后仅针对用到的资产加载相应PSO。这省去了为无变化的资产重新编译PSO的需要,减少了加载资产的内存占用量。
并行PSO编译
Android OpenGL和Vulkan RHI现在采用单独的PSO预编译过程(Android服务)。在单独的过程中运行PSO预编译操作,解决了显卡驱动程序的许多并发问题,带来了更高的稳定性,性能也得到大幅提升,预编译时间通常只有原来的1/5到1/3。
编辑器移动预览改进
使用不同渲染设置的平台现在可以在编辑器内平台预览中更好地表示其设置。之前,单个着色器平台用于所有移动预览,这意味着,距离场阴影等功能如果没有换到其他平台上启用,就无法准确预览。每个预览平台现在使用独立的着色器平台,消除了这种局限性。
预览移动平台时,编辑器中现已应用可扩展性和设备描述控制台变量。
Android NDK 25支持
UE5.1添加了对Android NDK 25的支持,这是新的长期支持版本。这带来了新的LLVM 14工具链,进行了优化以实现更快速的代码,编译时间缩短了约15%,二进制文件也更小。
Gameplay框架
蓝图
蓝图头文件视图
类似于蓝图原生化工具,蓝图头文件视图(Blueprint Header View) 是一种新方法,可用于快速将虚幻引擎蓝图类和蓝图结构体转换为C++代码。

在转换期间,蓝图头文件视图会为蓝图的所有变量、函数、Actor组件和事件分发器创建C++样式的声明。
要开始在项目中使用蓝图头文件视图,你可以 右键点击 内容浏览器(Content Browser) 中的 类(Class) 或 结构体(Struct) ,并从上下文菜单选择 预览等效C++头文件(Preview Equivalent C++ Header) 。

蓝图命名空间
通过新的 蓝图命名空间(Blueprint Namespace) 功能,你可以选择性整理项目的蓝图,使其仅在编辑器中打开时加载相关资产和内容。通过使用 命名空间(Namespaces) 委托内容,在打开虚幻引擎编辑器的新实例时,复杂的蓝图可以更快地加载和呈现,并且可以整理大量内容,提高用户工作流程效率。

此外,使用命名空间时,你可以使用 类型选择器 和 右键点击上下文菜单 筛选蓝图内容,减少项目列表加载时间,使工作空间保持有序、有效。
在蓝图的 类设置(Class Settings) 中,你可以使用细节面板中的 蓝图命名空间(Blueprint Namespace) 属性设置和引用蓝图的分配命名空间。

有关更多信息,请参阅蓝图命名空间文档。
增强输入
增强输入(Enhanced Input) 插件为你提供了一种功能丰富的新方法来创建和管理玩家输入和控制点。
使用 输入操作(Input Action) 资产,你可以为单独的输入或轴控制点设置和定义玩家输入方法。输入操作资产在 输入映射上下文(Input Mapping Context) 资产中收集和管理,后者让你能够更全面地控制项目的玩家输入和行为,以便创建可以在运行时根据上下文调整的动态系统。
此外,增强输入系统可帮助你随着项目的增长和扩展而整理和管理玩家输入,其中提供了强大的功能,可辅助创建和管理 在线 、 本地 和 分屏多玩家 输入系统。
有关运行中的增强输入系统的示例,请参阅Lyra示例项目。
有关更多信息,请参阅增强输入文档。
Mass
Mass Entity(测试版)
Mass Entity 系统在UE 5.1中获得了大量改进,现已成为测试版功能。我们预计会对批量的API进一步做出重大更改,并致力于持续开发整个批量框架。
系统结构调整
Mass Entity的共享片段现已从原型层面下移至数据块层面,从而限制原型的分段。
此外,Mass Entity子系统中管理实体的部分已分离为新的类型:Mass Entity管理器(Mass Entity Manager) 。这可促进在自定义用例中创建隔离的实体池,用于测试目的等。
安全多线程
批量处理阶段管理器托管的处理器的多线程执行已针对除了专用服务器之外的所有目标默认开启。
MassEntityQuery现在可以表达子系统要求,这是批量处理的多线程安全性中至关重要的一环。此外,处理器拥有的查询现在用于确定对于确保线程安全性至关重要的其他处理器间依赖性。
改进了调试
Mass Entity在UE 5.1中引入了 批量调试器UI工具(Mass Debugger UI Tool) 。该工具可用于了解所选Mass Entity管理器原型,其中会显示这些原型的构成和实体数量。
该工具还显示了哪些原型正在由特定处理器处理,并直观显示了批量处理阶段管理器所拥有的批量处理图表。
人工智能
智能对象
一般改进
在UE 5.1中,智能对象获得了一般稳定性和工作流程改进,使得设置智能对象定义更加方便了。
API相较于UE 5.0保持一致,这样在迁移项目时就可以向后兼容。
Gameplay交互插件(试验性)
智能对象的一个主要用例是能够在Gameplay期间创建有意义的Gameplay交互。为此,智能对象获得了 Gameplay交互(Gameplay Interactions) 插件的初始试验性支持。我们计划在未来版本中继续改进支持,目标是将Gameplay交互嵌入到将状态树和上下文动画组合起来的智能对象中,并支持复制。
环境查询系统(EQS)支持
利用UE 5.1版本,你现在可以使用环境查询系统为关卡中的AI艾真体或玩家选择最佳匹配的智能对象。
状态树

状态树 是虚幻引擎的通用层级状态机,在虚幻引擎5.0中引入。 对于UE 5.1,状态树获得了重要改进,现已可投入使用。作为该过程的一部分,状态树获得了相较于5.0的重要API更改。
一般改进
该更新包括改进的以Actor为中心和以蓝图为中心的工作流程。你现在可以通过纯蓝图工作流程充分利用状态树。
提高了灵活性
现在你可以将状态树参数化,从而将相同的状态树用于不同的数据。该更新还增加了对基于条件的更复杂表达式的支持。
状态树事件得到了改进,可基于外部逻辑更简单地触发状态变化。
此外,该更新还简化了状态树中任务和条件的使用。现在可更轻松地将条件连接到任务,而不必使用求值器。这样可创建更精简的状态树。例如,你现在可以直接访问Actor数据,而不必使用求值器。
增加了模块化
在UE 5.1中,状态树增加了 子树(Sub-Trees) 的概念。利用子树,你可以复用状态树的通用部分。这可提高可复用性,并可直观地构建复杂的状态树。
子树类似于蓝图宏,你可以使用给定名称创建子树并定义其输入。你可以在状态树中按名称直接调用子树。
内存优化
状态树内部存储获得了多项优化,使每个活动状态树的内存使用量大幅减少。在运行时,只有活动任务存储在状态树内存中。此外,状态树中的大型属性可以作为引用绑定,而不是像UE 5.0那样作为完全副本。
凭借这些改进,《城市示例》Gameplay期间大约35,000个状态树在运行时,内存使用量减少了大约75%。
世界分区中的寻路网格体
动态寻路网格体(试验性)
虚幻引擎5.1引入了在使用世界分区时对动态寻路网格体(Navmesh)的初始试验性支持。
现在可以将 动态(Dynamic) 模式用作寻路网格体的 运行时生成(Runtime Generation) ,在世界分区地图中构建世界分区动态寻路网格体。
在这种情况下,对于作为基础寻路网格体一部分进行加载和卸载的对象,将忽略对寻路网格体的更改。此外,在使用世界分区动态寻路网格体时,动态图块构建仅限于加载的空间。
一般改进
该更新包括将 固定图块池大小(Fixed Tile Pool Size)用于 世界分区(World Partition) 时改进的支持。现在,添加寻路网格体图块时,如果由于已达到图块限制而无法添加这些图块,你将收到警告。此外,使用 UWorldPartitionNavigationDataBuilder 命令构建寻路时,会忽略固定图块池大小限制,从而更快地构建。
现在寻路数据在外部打包,这意味着,构建世界分区寻路网格体不再会弄脏主地图。
此外,在世界分区地图中构建普通寻路网格体时,现在会在构建寻路网格体之前自动加载整个地图。
物理
改进了场景查询和刚体模拟性能
虚幻引擎5.1包含附对刚体和场景查询功能的多项性能改进。下面我们比较了虚幻引擎5.0的各个测试版本与虚幻引擎5.1版本。
我们使用UE 5.1的更新对许多不同的例子进行了测试,并着重考察了UE 5.0中表现最差的例子。第一个例子是一个平底杯测试,我们将512个动态模拟的凸包对象放入一个旋转的凸包对象中。下面显示了此结果,其中UE 5.1测试现在快50%。

第二个例子是有复杂地貌的测试,世界中放置了10万个静态对象,并在高度场地貌上放入了512个动态凸包对象。 下面显示了对该地图进行光线投射的结果,其中虚幻引擎5.1的性能现在是虚幻引擎5.0的两倍。

流体模拟
对涡流模型和小尺度力的改进
虚幻引擎5.1改进了其涡流模型和小尺度力。利用这些改进,可以更轻松地向模拟的前缘增加额外细节。这样模拟看起来更自然,因为形状会更突出地显示。


小尺度力和非小尺度力的对比。
三次立方插值
我们添加了新的三次立方插值模式,你可将其用于添加额外细节,而不会提高模拟的总体分辨率。模拟的细节更丰富,但模拟成本与旧版虚幻引擎类似。
内存消耗改进
虚幻引擎5.1对流体模拟的内存消耗进行了多项改进。在相同的内存预算下,能够适应相较于虚幻引擎5.0更高分辨率的模拟。
破坏
Chaos破坏系统在虚幻引擎5.1中获得了重大改进。
改进了破裂层级
破裂层级获得了以下更新:
-
在骨骼类别中滚动时,父群集现在会自动堆叠。
-
你可以按级别对层级着色,易于辨识。
-
我们引入了新的 列模式(Column Mode) ,它基于以下选项显示上下文信息:
-
状态和大小(State and size) :显示每个骨骼的相对大小、初始状态和锚点信息。
-
伤害(Damage) :显示每个骨骼的运行时伤害信息。这有助于美术师调整资产的伤害阈值。
-
删除(Removal) :显示每个骨骼的"折断时删除"设置。
-
碰撞(Collision) :显示有关从原始静态网格体导入的碰撞的信息。
-
伤害观察器
在5.1中,我们将新的运行时 伤害观察器(Damage Watcher) 添加到了 破裂模式(Fracture Mode) 。你可以在 通用(General) 设置下启用 启用运行时数据收集(Enable Runtime Data Collection) 选项,并点击 模拟(Simulate) 记录伤害结果。
每个骨骼承受的伤害在 伤害列模式(Damage Column Mode) 下显示。此外还将显示伤害阈值以及哪些骨骼折断了(如有)。
改进了工具
虚幻引擎5.1更新包括对多个破裂模式工具的改进。你可以阅读破坏文档并学习可用的破坏学习路径,详细了解这些工具。
GeoMerge工具
我们添加了新的 GeoMerge 工具,用于合并几何体集合中几何体的所选片段。该工具以前称为GeoMerge,现已改名为 TinyGeo ,表示其主要用途是清理额外几何体的微小片段。
凸包工具
利用新的凸包外壳生成设置,你可在所生成外壳的准确性与它们和相邻外壳的重叠之间取得平衡。
默认凸包生成设置(应用于所有新的或重置的几何体集合)现在可以在 破裂模式(Fracture Mode) 项目设置中进行设置。
验证工具
验证(Validate) 工具现在是一种模式工具,其中的复选框用于控制它将验证和修复的确切内容。 它现在可以选择性修复单子节点的群集,这在模拟中不受欢迎。
选择工具
选择工具(Selection) 工具现在包含用于在当前视图级别选择所有叶子或所有群集的按钮。
自动群集工具
自动群集(Auto Cluster) 工具现在包括按 部分输入(Fraction of Input) 群集的功能,可极大提高迭代速度并减少层级。
新的 避免隔离(Avoid Isolated) 选项将确保群集始终包含比单个变换更多的内容。
网格体绘制
网格体绘制(Mesh Paint) 模式现在支持几何体集合。用户现在可以在破裂的几何体上绘制顶点颜色和纹理。
此外,现在顶点颜色将在破裂所产生的新顶点上传播,令使用顶点颜色的材质产生更一致的行为。
导入了碰撞
现在可以使用用于构建几何体集合的原始静态网格体中的碰撞。这样可精细自定义碰撞,尤其是对于非凸包形状。
删除内容
我们改进了现有 休眠时删除 功能,并引入了新的 折断时删除 功能。这两个功能的差异如下:
-
休眠时删除(Remove on sleep):
-
我们添加了 新参数,允许同时删除缓慢移动的片段。
-
部分折断的群集现在将破碎,释放小片段,以便最终删除。
-
-
折断时删除 :
- 现在可以在片段折断时将其删除。你可以逐个骨骼设置这些参数,并且你可以将群集设置为破碎而不是被删除。
连接图表
新的 连接图表(Connection Graph) 方法现在可用,提供了更精确的连接,并减少了片段一直在空中悬浮的问题。


传播系统
新的伤害传播系统可用,带来了更加可预测、受控的折断行为。你可以在实例层面将其参数化,并其提供了折断和冲击引起的伤害传播的控制点。
蓝图节点
我们添加了一组新的蓝图函数,用于对几何体集合的特定片段执行操作。事件和追踪查询现在可以返回项目索引,可用于函数以查询片段的破裂程度,施加内部和外部张力,施加力度,甚至是请求群集破碎。
这样用户就可以非常精准地瞄准几何体集合的特定部分,而无需场。

性能
UE 5.1随附了多项性能改进,包括在运行时和创作过程中的改进。
运行时(Runtime) :我们进行了多项优化,允许在关卡中放置更多数量的几何体集合。
创作(Authoring) :我们为大量几何体集合优化了破裂模式中的多个工具。此外,破裂工具现在将在费时的计算期间显示进度条,并提供取消操作的选项。
布料模拟
布料模拟在UE 5.1中获得了多项改进。

布料缓存
你现在能够在Sequencer中录制和播放布料模拟。
布料压力
我们向布料配置添加了新的 压力(Pressure) 功能按钮,并在蓝图Chaos布料交互器中添加了新的 Set Pressure 函数。这些功能按钮可以向模拟布料的每个三角形施加恒定压力。
你可以通过 压力(Pressure) 可绘制遮罩在整个网格体中调制该效果。压力始终沿三角形的法线方向施加,因此使用负值将沿相反方向推送三角形。

皱折
我们向 弯曲元素(Bending Element) 约束添加了新的 皱折(buckling) 功能。此功能允许弯曲元素约束视 皱折率(Buckling Ratio) 和 皱折刚度(Buckling Stiffness) 参数而弱化或强化。利用这些参数,用户可在模拟期间更好地控制布料材质的皱褶。
皱折率
当元素弯曲到从静息角度弯折的程度超过此比率("皱折")时,它会切换为使用 皱折刚度(Buckling Stiffness) 而不是 弯曲刚度(Bending Stiffness) 。皱折率 = 0时,绝不会使用皱折刚度。当皱折率 = 1时,弯曲程度一超过静息配置就会立即使用皱折刚度。
皱折刚度
布料皱折(即弯曲程度超过特定角度)时,弯曲将使用皱折刚度而不是弯曲刚度。通常,皱折刚度设置为小于弯曲刚度。皱折率确定了使用弯曲刚度和皱折刚度之间的切换点。

你可以在配置中启用 UseBendingElements 复选框来激活此功能。
自碰撞改进
在UE 5.1中,布料模拟获得了对自碰撞的多项总体改进。
额外解决步骤
现在通过 使用自相交(Use Self Intersections) 参数提供了额外的自碰撞解决步骤。此外,自碰撞摩擦现在有自己的 自碰撞摩擦(Self Collision Friction) 参数。
自相交
你可以调整自相交解决方法,更正碰撞排斥未处理的布料相交。
自碰撞摩擦
我们向布料模拟添加了新的 自碰撞摩擦(Self Collision Friction) 参数。此参数指的是布料与布料间交互的摩擦系数。
使用较小的值时,布料会在自身上平滑地滑动。使用更大的值时,将对交互施加更多摩擦,并且布料围绕与自身的接触点移动的程度也更小。

机器学习布料(试验性)
在UE 5.1中,新的 最接近的相邻值模型(Nearest Neighbor Model) 插件可用于虚幻引擎。该插件提供了工具,用于创建带有丰富的褶皱和皱纹的游戏内布料,运行时开销和内存占用量相对较小。
在插件编辑器中,你可以对神经网络进行训练,在小型预模拟数据集(通常在50到100帧之间)内查找给定姿势的最接近的相邻值。然后将最接近的相邻值用于将几何体细节传输到给定姿势的布料上,从而产生高保真度运行时模拟。
Niagara
GPU条带
GPU上现在支持 条带(Ribbons) 。在之前的版本中,条带渲染器(Ribbon Renderer) 只能添加到CPU发射器。根据游戏的需要以及你想使用的功能,现在你可以选择是在GPU还是CPU上渲染。
可扩展性模式
在Niagara编辑器中打开 可扩展性模式(Scalability Mode) ,预览不同的可扩展性设置。这样做,你就可以微调效果,在不同的平台上播放。可扩展性设置已从默认视图中删除,并添加到可扩展性模式,这样更清晰。

发射器版本控制
从4.27开始,如果要创建自定义模块,你可以使用版本控制将新模块推送给团队,而不会破坏现有效果。
5.1现在为发射器添加了相同功能,你可以对整个发射器进行版本控制,以将其部署给团队。利用版本控制,你可以更新或修改模板,而不会创建新资产或失去现有行为。

图像序列视图烘焙器(测试版)
UE 5.0引入了 图像序列视图烘焙器(Flipbook Baker) 的第一个版本,该工具用于烘焙效果的光栅化图像序列视图。UE 5.1引入了更优化的用户体验,以及更多选项。现在你可以烘焙以下类型:
-
2D纹理
-
体积纹理
-
模拟缓存(试验性)
渲染依赖性图表
现在 渲染依赖性图表(Render Dependency Graph) 中支持Niagara。有关更多信息,请参阅渲染依赖性图表。
异类体积渲染(试验性)
UE 5.0中曾引入了Niagara流体渲染。初始实现比较有限,仅允许你向流体模拟中添加2个定向光源。而且也无法在流体上投射阴影。
异类体积渲染(Heterogeneous Volumetric Rendering) 旨在将场景中已经设置的光照应用到流体模拟渲染。这种渲染适用于所有类型的光源,而不仅仅是定向光源。虽然你可以使用的光源数量没有限制,但目前来说,随着每个光源的添加,该实现的成本会呈线性增加。
如果你的关卡中有其他对象,它们也可以在流体体积上投射阴影。这会造成更逼真的外观,使流体效果更加融入场景。
要启用此试验性的功能,请启用项目设置中的"启用异类体积(Enable Heterogeneous Volumes)"。然后将材质 MI_HeterogeneousVolumes_GasExplosionCine
应用于流体模拟中的网格体渲染器。
流体质量改进(测试版)
在该版本中,Niagara流体的质量和性能有多项改进:
-
我们改进了涡流模型。
-
我们还改进了小尺度力,有助于在模拟的前缘上增加细节。
-
我们实现了三次立方插值,添加了额外细节,而不会提高分辨率,不过性能有所下降。
-
我们改进了流体的总体性能。
UX / UI 改进
Niagara编辑器的新布局的UX/UI改进
Niagara编辑器(Niagara Editor) 有新的简化布局。参数(Parameters) 面板已移至左下角,为中间的 系统概述(System Overview) 腾出更多空间。曲线编辑器(Curve Editor) 和 日志(Log) 现在停靠在底部,时间轴(Timeline) 旁边。

"参数(Parameters)"面板或"选择(Selection)"面板等面板现在已具备上下文,这些面板会根据你选择的内容进行更新。
关卡编辑器中的用户参数
之前,你在关卡编辑器中选择Niagara Actor时,会出现一个名为"覆盖参数(Override Parameters)"的分段。此分段已重命名为 用户参数(User Parameters) 。
暂存脚本管理器
我们已将之前的暂存区界面替换为新的工作流程,以直接在Niagara编辑器中创建暂存模块。你可以根据需要添加任意数量的暂存模块,并可将每个模块显示在Niagara编辑器中的单独选项卡中。

参数的层级编辑器
如果你创建许多自定义用户参数,可能很难在参数面板中使其保持井然有序。利用 层级编辑器(Hierarchy Editor) ,你不仅能够分类和整理变量,还能设置其默认值。

关卡编辑器中的效果分段
在关卡编辑器中选择Niagara系统时,现在你将在"细节(Details)"面板中看到称为 效果(Effects) 的分段。这有助于你快速隔离需要为Niagara系统编辑的参数。

调试系统或参数
你可以使用新的方法来打开 Niagara调试器(Niagara Debugger) 和追踪你想分析的元素。
要在特定系统上快速打开调试器,请在关卡编辑器中点击Niagara组件,并从细节面板选择"调试(Debug)"。这将打开Niagara调试器,其中已设置系统信息。

你还可以调试特定参数,例如粒子的时长。从Niagara编辑器中的"参数(Parameters)"面板,右键点击你想追踪的参数,然后选择 在Niagara调试器中观察参数(Watch Parameter in Niagara Debugger) 。

这会自动在调试器中打开你需要所有相关选项,显示该参数的信息。
更多详情,请参见Niagara调试器。
无障碍改进
我们在UE 5.1中进行了以下无障碍改进:
多用户屏幕朗读器支持
屏幕朗读器(Screen Reader) 插件现在可以同时支持多个用户,这样多个视力不佳的用户就可以同时玩游戏。如果用户的输入设备提供了特殊的音频端口,例如游戏主机控制器上的端口,每个用户可以连接一组头戴式耳机,单独输出其屏幕朗读器的语音。或者,对于PC用户和没有头戴式耳机的用户,屏幕朗读器将为每个用户输出不同音高的语音。屏幕朗读器用户通过 FScreenReaderUser
类表示,它可以请求语音公告,保留有关它当前聚焦的无障碍控件的信息,并使用新的寻路策略定义用户的寻路方式。
寻路策略
你现在可以定义 寻路策略(Navigation Policy) ,为视力不佳的用户提供精细的屏幕寻路控制,类似于商业屏幕朗读器的运作方式。要创建寻路策略,请创建实现 IScreenReaderNavigationPolicy
的类。之后,你可以使用 FScreenReaderUser::SetNavigationPolicy
并提供对你想使用的策略的共享引用,为屏幕朗读器用户设置寻路策略。
Unreal Insights
Unreal Insights是虚幻引擎的伙伴应用程序,用于分析和剖析游戏的CPU和内存性能。有关通用信息,请参阅Unreal Insights文档。
热门菜单
提供了新的热门菜单命令:
-
导入表(Import Table) :你现在可以从 Timing Insights 导入任意
.csv
或.tsv
表进行分析。你可以对任意表应用分组和层级路径分解功能。 -
会话浏览器(Session Browser) :如果你关闭了 会话浏览器(Session Browser),可以从打开的追踪文件将其重新打开。
-
打开追踪文件(Open Trace File) :如果你已经在Timing Insights中打开了追踪,可以打开不同的追踪文件,它将替换你的当前会话或打开第二个会话。
-
自动打开实时追踪(Auto Open Live Trace) :启用时,当前会话将自动更改为实时追踪。
会话浏览器
现在你可以在Unreal Insights中筛选和排列追踪会话,更好地分析你需要的特定数据。
你可以按名称或按命令行搜索追踪。

现在可以直接从会话浏览器右键点击追踪来重命名和删除追踪会话。通过上下文菜单删除或重命名时,它将删除或重命名追踪文件和所有关联的缓存文件。
Memory Insights
要捕获内存追踪,必须从命令行启动会话。要开始录制,请从命令行使用额外参数 trace=default,memory
运行编辑器或游戏。你需要从命令行使用这些参数启动的原因是,追踪信息需要在引擎初始化后立即进行追踪。
资产名称和类名
现在你可以从命令行使用额外追踪通道 metadata
和 assetmetadata
启动Memory Insights。这将向Memory Insights会话提供资产名称和类名,用于额外的筛选选项。例如,你可以计算每个资产或每个类名的内存分配成本。
改进了树状图
现在提供了一个 路径分解(Path Breakdown) 选项,用于分组字符串列,选择该选项会创建可折叠的层级视图。你可以通过这种方式对低级内存(LLM)标签、资产和热门源文件分组。
通过这种方式分组不仅有助于视觉上井然有序,还能让你看到父组的成本。
在Visual Studio中打开
在旧版Unreal Insights中,你可以右键点击按调用堆栈分组的项目,然后从上下文菜单选择 在Visual Studio中打开(Open in Visual Studio) 。在该版本中,即使未按调用堆栈分组时,也提供了该选项。例如,如果你按标签分组了项目,可以右键点击分配,然后选择"在Visual Studio中打开(Open in Visual Studio)"。
模块视图
Memory Insights中的模块视图将显示所有.dll
文件的列表。在该版本中,我们已将统计数据信息分拆为不同的列,便于排序。现在你会发现一些列,用于表示以下情况的符号数量:发现(Discovered)、缓存(Cached)、解决(Resolved)和失败(Failed)。

失败的列表项目以红色高亮显示,正确解决的列表项目以绿色高亮显示。黄色表示一些符号已解决,一些符号失败了。
Networking Insights
数据包视图
现在你可以在 数据包视图(Packet View) 中高亮显示事件,帮助你查看特定事件使用了数据包中的多少位。这样就可以快速查看事件相对于其他数据使用了多少带宽。
你可以选择高亮显示:
-
事件的所有实例的聚合位数;或者
-
单个事件使用的最大位数。
NetStatsCounters
你可以使用新选项卡NetStatsCounters,查看与所选数据包或数据包范围的复制系统相关的统计数据计数器。统计数据分为两种:
-
FrameStats :整个帧的统计数据计数器。这通常用于针对在所有连接之间共享的工作,报告与网络相关的统计数据计数器。例如,有多少对象当前在此帧上更新。
-
PacketStats :与每个特定数据包相关的统计数据计数器。例如,有多少对象已安排序列化,以及有多少实际可放入该数据包。
NetTrace
你现在可以使用宏 UE_NET_TRACE_PACKET_STATSCOUNTER
和 UE_NET_TRACE_FRAME_STATSCOUNTER
追踪与网络追踪数据相关联的简单统计数据。使用任一宏追踪的数据将显示在Network Insights中的NetStatsCounters选项卡中。
Timing Insights
Task Insights
我们添加了对 ParallelFor
任务的支持。
Cooking Insights
Cooking Insights 提供了分析方法,用于采集和显示有关程序包烘焙方式的信息。要录制烘焙会话,请从命令行使用参数 -trace=default,cook
开始。
启用烘焙通道时,这会向Timing Insights添加名为 程序包(Packages) 的面板。其中将显示与该烘焙事件关联的所有程序包的列表。对于每个程序包,都提供了统计数据,包括:加载时间(LoadTime)、保存时间(SaveTime)、开始缓存(BeginCache)、缓存是否已烘焙(IsCacheCooked)、资产类(Asset Class)。其中每项都显示在可以分组和排序的列中。

使用选项 分组(Grouping)> 路径分解 - 程序包名称(Path Breakdown - Package Name) 可生成数据的可折叠层级视图。你还可以按资产类分组。
协程
如果你的游戏使用协程,现在你可以在Timing Insights中查看协程。协程是指某个任务在一个线程开始执行,而在另一个线程完成执行的情况。现在我们会显示特定于协程的时序事件。
屏幕截图追踪
现在你可以在Timing Insights中启用屏幕截图。启用 屏幕截图追踪(Screenshot Tracing) 时,你可以获取屏幕截图,Timing Insights时间轴中将显示一条红色垂直线。你还将看到屏幕截图的缩略图。这有助于你在Timing Insights中直观地调试。
要启用屏幕截图追踪,请从命令行使用参数 -trace=default,screenshot
开始。
启用屏幕截图追踪后,从控制台命令输入 trace.screenshot
在该帧拍摄屏幕截图。
资产加载时间
从命令行启动Timing Insights时,你可以添加名为 资产加载时间(Asset Load Time) 的新通道。该通道执行两个操作:
-
为
UObject::Serialize
启用命名CPU定时器。 -
切换蓝图名称的追踪。
过去,追踪蓝图名称默认启用,这为追踪运行时事件带来了大量成本。现在,如果你想启用蓝图名称追踪,必须在命令行中开启此参数。
要从命令行启用资产加载时间追踪,请使用参数 -trace=default,AssetLoadTime
由于在开启蓝图名称时会添加许多定时器,所以蓝图名称在Trace Insights中默认隐藏。启用资产加载时间追踪后,你可以添加参数 -statnamedevents
来显示蓝图名称。
复制和粘贴
在UE 5.0中,当你复制时序事件时,只会复制名称。现在,当你使用Ctrl+C复制时序事件时,会复制Timing Insights面板中所显示的名称、时长和关联的元数据。
在不打开UI的情况下执行命令
Timing Insights可以在不打开UI的情况下直接从命令行运行。你可以直接在命令行中指定单个命令,也可以使用响应文件执行一系列命令。在每种情况下,都会将一组数据导出到 .csv
或 .tsv
文件。
-
TimingInsights.ExportThreads
:该命令会导出GPU和CPU线程的列表。 -
TimingInsights.ExporTimers
:该命令会导出GPU和CPU定时器的列表。 -
TimingInsights.ExportTimingEvents
:该命令会导出GPU和CPU时序事件的列表。导出的事件列表可以按线程、定时器或时间范围筛选。 -
TimingInsights.ExportTimerStatistics
:该命令会导出GPU和CPU定时器及其聚合统计数据的列表。
这些命令很适合用于运行自动测试。
有关直接从命令行执行命令的更多信息,请参阅Timing Insights文档。
Trace
控制台命令
在运行Unreal Insights时,你可以从UE使用一些现有控制台命令,例如,用于启动和停止追踪文件的 trace.start
和 trace.stop
。我们在5.1中添加了两个新的控制台命令:
-
Trace.SnapshotFile <filename>
:这会将当前内存中追踪缓冲器的快照写入文件。如果你已经在积极追踪,这不会中断进行中的追踪,而是会仅为该快照并行录制第二个追踪文件。 -
Trace.Bookmark <name>
:这会发射给定字符串名称的书签事件。书签在录制时在Timing Insights中显示为垂直线。之前,这只能通过API作为TRACE_BOOKMARK()
提供。 -
Trace.Screenshot <Name> <bIncludeUI>
:如前所述,你可以运行此控制台命令,生成垂直线并可选择包括UI,方法是为Timing Insights中的屏幕截图指定true或false。
命令行参数
追踪自动启动
你可以选择是在项目开头自动启动追踪,还是等待从控制台命令发起追踪命令。UnrealInsights.exe
的默认行为是启用自动启动。
如果启用自动启动,运行时会在检测到Unreal Insights会话浏览器在运行时,自动尝试连接本地追踪服务器。
无追踪线程
你可以在运行时使用工作线程执行追踪,这是专用于捕获所有追踪信息的线程。你也可以在普通帧末尾直接在游戏线程上执行追踪。使用游戏线程会影响游戏的性能。
默认情况下,我们使用工作线程,这是推荐的设置。但是,对于服务器来说,采用工作线程有时行不通。你可以通过使用命令行参数 -notracethreading
禁用工作线程,并改用游戏线程。
Datasmith
新的3ds Max插件
我们彻底重新编写了Datasmith 3ds Max插件,在3ds Max的新条带工具栏中整合了所有Datasmith功能。这个新插件可提高性能,并带来多项新功能和改进。

Direct Link支持
3ds Max的新Datasmith插件支持 Direct Link。现在你可以将3ds Max项目连接到虚幻引擎项目,并手动将其同步,或通过Direct Link自动同步功能自动同步。
全新和改进的插件兼容性
3ds Max的新Datasmith插件改进了对以下事项的支持:
-
VRay :支持更多材质参数,以及代理网格体
-
Corona :支持PBR材质和代理网格体
-
Railclone :改进了导出,并支持Railclone5
-
Forest Pack :改进了导出,并支持Forest Pack 7
对烘焙纹理分辨率的控制
烘焙的3ds Max纹理不再自动按4096分辨率导出。现在你可以将最高分辨率设置为64到4096之间的值。这可提高带有复杂材质的大型场景的导入/导出性能。
XRef场景导出切换开关
XRef场景是从外部3ds Max文件加载到当前文件的场景。使用Datasmith导出3ds Max项目时,现在你可以决定是否同时导出XRef场景。XRef场景导出切换开关位于新的条带工具栏中。
改进了光源导出
Datasmith现在支持将更多参数用于支持的光源类型,包括:
-
ArnoldLight
-
CoronaSun
-
PhotometricLight和TPhotometricLight
-
VRaySun
纹理贴图转换
3ds Max的新Datasmith插件会自动转换位图、烘焙、法线、凹凸和流程性纹理贴图。
Revit插件改进
在该版本中,我们为 Revit Datasmith导出器 添加了Direct Link自动同步。如果启用自动同步,你的虚幻项目会在你更改链接的Revit项目时自动同步。
Datasmith设置现在存储为Revit项目文件中的自定义数据。
该版本还增加了对从Revit导出以下信息的支持:
-
视图(Views) :无论你当前在处理哪个视图,你都可以指定要从Revit项目导出的视图。
-
自定义原点(Custom origin point) :你可以将Revit中的基点或调查点定义为自定义原点,以用作虚幻引擎中的插入点。
-
贴花(Decals) :Datasmith现在将Revit贴花导出为虚幻引擎贴花。
Sketchup插件改进
就该版本而言,我们着重优化了Datasmith的 Sketchup 插件。
我们改进了Datasmith导出复杂层级的方式。Datasmith会自动合并组和组件中的网格体,而不是每个组头或组件头导出一个Actor并为组或组件中的每个网格体导出一个Actor。因经虚幻引擎中会产生更简单的层级,结果更接近Sketchup大纲视图中显示的内容。
如果你使用 按标签涂色(Color by Tag) 功能设置Sketchup中对象的颜色,现在Datasmith会导出这些颜色。
我们还增加了图片支持。Datasmith的Sketchup插件现在将图片导出为带纹理的网格体Actor。
Solidworks插件改进
Datasmith的Sketchup插件现在支持更多 Solidworks 功能。现在你可以导出Solidworks配置显示状态,作为关卡变体集的变体。你还可以导出用户创建的定向光源、聚光光源和点光源,并包含位置、椎体角度、亮度和颜色的数据。
改进了Visual Dataprep的元数据处理
Visual Dataprep是创建可复用导入"配方"的系统,在虚幻引擎项目中创建最终资产和Actor之前,它会重新整理、清理、合并和修改场景元素。
就虚幻引擎5.1而言,我们做了一些易用性改进,以便更好地处理Visual Dataprep中的元数据。
元数据键和值现在更易读,并且可选择,你可以将其复制粘贴到筛选器字段中,而不是手动复制。
我们还为键增加了新的字符串匹配选项。当你按元数据筛选时,现在可以使用 包含(contains) 表达式,它很有用,比如可以处理带有类似前缀或后缀的所有键。当你为模型编写导入过程时,如果模型来自的应用程序为相同键使用稍有不同的名称,这可节省时间。
通用场景描述(USD)文件工作流
虚幻引擎5.1有多项新功能和工作流改进,可更好地处理USD文件。
LiveLink集成
现在你可以使用Live Link将外部源与虚幻引擎中的USD文件中的内容同步。使用USD舞台窗口中的新 设置Live Link(Set up Live Link) 选项可将Autodesk Maya等DCC应用程序与虚幻引擎中包含角色的USD场景相连接,并且你可以使用DCC驱动角色。Link/USD集成也很适合用于处理运动捕获。使用USD可将带有角色的场景加载到虚幻引擎中,并让运动捕获驱动USD场景中的角色。
Control Rig集成
USD舞台窗口中的新 设置Control Rig(Set up Control Rig) 选项可用于将Control Rig连接到虚幻引擎中USD文件中的角色。你可以使用Control Rig创建和编辑骨骼动画,并将动画数据保存回USD文件。你可以设置 Control Rig资产或生成FK Control Rig。
图元编辑选项
我们在USD舞台窗口中添加了用于编辑图元的多个选项。包括:
-
用于剪切、复制和粘贴图元的命令。
-
用于以各种方式复制图元的选项。例如,你可以创建构建的图元的扁平化副本,或复制单个层。
-
隔离模式。你可以隔离并处理特定层,这很适合用于查看或修改编辑历史记录。你在隔离模式中做出的更改会应用于隔离的层。
-
当你在USD舞台中添加引用时,现在可以在引用的文件中指定目标图元。
-
现在你可以按照添加引用的相同方式向USD舞台添加负载。
Groom支持
我们在USD文件中添加了对Groom的支持。现在你可以将Groom缓存和静态Groom文件导入为资产,像使用通过Alembic导入的Groom资产那样加以使用。你还可以在USD舞台上加载它们。
USD导入器会使用自定义Groom API模式从USD BasisCurve导入Groom。导入器还支持采用Alembic Groom规格的Alembic Groom,因此你可以导入USD文件中引用的Alembic Groom。
我们还添加了新的Groom绑定API模式,可用于将Groom绑定到骨骼网格体或几何体缓存。你可以在角色上设置Groom,将结果加载到USD舞台,并在虚幻编辑器中一起播放模拟和角色动画。
其他数据格式
glTF
Khronos Group的GL传输格式(glTF™)是一种可扩展的开放标准文件格式,设计用于紧凑文件大小、快速加载和完整场景表示。它用于在Twinmotion中导入和导出模型,并且是Sketchfab工具和库的首选交换格式。
在该版本中,我们改进了glTF支持,并将其更紧密地集成到虚幻引擎中。
-
我们在新交换框架中集成了glTF导入器。 现有glTF导入器和Datasmith glTF导入器插件计划在未来版本中删除。
-
glTF导入器现在支持:
-
无光照材质。
-
使用骨骼网格体、骨架和动画序列资产导入绑定的模型。
-
-
glTF导入器之前作为外部插件提供,现已成为虚幻引擎的一部分。它目前必须单独启用,但将在未来整合到交换中。
-
我们改进了角色编码,现在Actor和资产的非英语名称和标签可正确导出。
CADKernel
CADKernel 是对你导入虚幻引擎中的CAD模型进行曲面细分的替代算法。它使用与默认算法相同的曲面细分参数,但在一些情况下会产生更好的结果,尤其是对于带辐射功能的模型。CADKernel还能更好地限制曲面细分之后的开放边缘数量。

Left: CAD model tessellated with the default Unreal engine algorithm. Right: The same model tessellated with CADKernel
要激活CADKernel,请将 ds.CADTranslator.DisableCADKernelTessellation
控制台变量设置为 False 或 0。你可以从控制台变量编辑器更改变量。
激活CADKernel后,虚幻引擎会在你导入CAD模型时默认使用它。如果你已经导入CAD模型,请执行完全重新导入,让虚幻引擎使用CADKernel重新对其进行曲面细分。
MaterialX
MaterialX 是一种开放标准,用于表示丰富的材质和外观,并在平台和应用程序之间轻松传递。虚幻引擎5.1中的新MaterialX导入器支持以下MaterialX节点:
-
Autodesk标准表面材质的所有输入。
-
点光源、聚光光源和定向光源。
-
MaterialX标准数据类型和节点的子集。
LiDAR点云改进
就该版本而言,我们已将 LiDAR点云资产编辑工具 迁移到虚幻引擎5框架。现在你可以从新的LiDAR模式访问所有点云编辑工具,该模式可从主工具栏中的 选择模式(Select Mode) 下拉菜单获取。
此更新使点云编辑工作流符合其他虚幻编辑器工作流,例如网格体编辑。你可以在点云资产上选择、合并、编辑和构建碰撞,并在关卡中预览结果。
工作流程改进
现在你可以使用点云选择工具(例如,套索工具或多边形选择工具),在所选内容中加减点。除了从云中提取点之外,你现在还可以根据所选点创建静态网格体。
点法线的新选项
点云Actor现在有一个"点方向(Point Orientation)"设置,可用于沿计算的法线对齐点卡片,而不是总是面向摄像机。面向法线的卡片会产生更满意的视觉效果和更好的光照交互。
LiDAR点云插件现在可以从包含法线数据的ASCII文件和E57文件导入法线。
新的点颜色选项
利用点云Actor的新颜色 源(Source)> 带分类Alpha的数据(Data with Classification Alpha) 属性,你可以基于点分类混合使用自定义alpha值的点的RGB颜色。这很适合用于基于分类显示、隐藏或消退整组的点。
变体管理器
就该版本而言,我们已将变体管理器工具迁移到虚幻引擎5框架。外观体验现在与虚幻引擎5.1x中的其他工具一致。我们还基于设计反馈全面修改了用户界面,使其更加美观、更易于使用。


顶部:UE5.0中的变体管理器。底部:UE5.1中的新变体管理器。
RAD工具
Oodle纹理2.9.7
-
所有平台上相同的位输出
-
更快速的arm64编码器。
共享纹理编码
- 适用于所有平台
Bink
- 支持标准SRT字幕文件
在线
在线服务插件
虚幻引擎的新 在线服务(Online Services) 插件现在拥有完全定义的接口,并已从试验性状态转移到测试版。这些插件将与现有在线子系统插件并存,两者都可供使用。
新在线服务插件的用户将发现:
-
更一致且更强大的API。
-
强制执行的安全调用模式。
-
改进的类型安全。
-
简化的委托绑定。
-
可以轻松扩展现有实现。
现在,使用共享的通用框架,可以更轻松地开发你自己的插件,用于你自己的在线后端。在线服务插件中的框架提供了:
-
异步操作结果缓存
-
按顺序进行的异步操作
-
逐个后端的配置
-
执行命令处理程序
-
极简样板
-
日志记录
该版本中包含了以下实现:
-
EOS在线服务插件实现,用于使用EOSSDK。
-
NULL在线服务插件实现,用于开发用途。
-
OSSAdapter在线服务插件实现,用于通过新API使用现有OnlineSubsystem。
以下接口在新在线服务插件中可用:
-
成就
-
身份验证
-
商业
-
连接
-
排行榜
-
大厅
-
在线状态
-
会话
-
社交
-
统计数据
-
作品文件
-
用户文件
-
用户信息
有关更多信息,请参阅在线服务文档。
Lyra
- 玩家现在可以使用Epic在线服务(EOS)覆层邀请和加入好友到其匹配会话。
网络和多玩家
Iris(试验性)
Iris 是虚幻引擎的新复制系统的试验性实现。Iris的目标是实现更丰富的多玩家体验,带来更大、互动性更好的世界、更多的玩家人数和更少的服务器成本。Iris实现相对于当前复制系统的性能改进的方式是:
-
去除了反面模式的约束,释放了可扩展性
-
通过分离复制和游戏线程数据,启用了并发性
-
为多个对象和连接共享尽可能多的工作,提高了效率
Iris是一种选择加入的系统,将在可预见未来与当前复制系统并存。现有游戏代码将像以前一样继续生效。选择加入Iris就需要游戏代码使用新的引擎API,但是,C++和蓝图中的现有复制属性和远程程序调用(RPC)定义保持兼容。
子对象复制改进
利用虚幻引擎中的 复制子对象(Replicated Subobjects) ,可以复制从UObject派生的类及其包含的复制属性。之前用于复制组件和子对象的系统采用了虚拟函数 AActor::ReplicateSubobjects
。
利用新系统,Actor现在有方法将子对象注册到所属Actor或Actor组件上的列表,并由Actor通道自动处理这些注册子对象的复制工作。利用该过程,可更好地控制何时将子对象复制到何处。
注册子对象列表是一种选择加入的功能。要启用注册子对象列表,请在Actor或Actor组件类中设置属性 bReplicateUsingRegisteredSubObjectList = true
。然后在 ReadyForReplication
、 BeginPlay
中或在创建新的子对象时调用 AddReplicatedSubObject
。最后,每当你修改或删除子对象时,请务必调用 RemoveReplicatedSubObject
。
在可预见的未来,旧系统将继续与新系统并存。有关启用注册子对象列表和使用新系统的更多信息,请参阅复制子对象文档。
模板和示例内容
模拟模板

虚幻引擎5.1添加了新的 模拟(Simulation) 模板类别。模拟模板提供了为各种企业模拟应用程序提供了范围广泛的起始点,并预配置了以下内容:
-
户外环境的特定设置。
-
逼真的天空和光照。
-
地理配准工具。
有关更多信息,请参阅虚幻引擎模板参考页面。
平台SDK升级

-
Windows
-
Visual Studio 2019 v16.11.5、Visual Studio 2022
-
Windows SDK 10.0.18362
-
LLVM clang 13.0.1
-
.NET 4.6.2 Targeting Pack
-
.NET 6.0
-
-
构建场编译时面向的IDE版本
-
Visual Studio - Visual Studio 2019 14.29.30146工具链和Windows 10 SDK (10.0.18362.0)
-
Xcode - Xcode 13
-
-
GDK
-
Windows SDK: 10.0.19041.0
-
GDK: 2022年6月更新2
-
固件版本:恢复2022年9月10.0.22621.2216
-
支持的IDE:Visual Studio 2019
-
-
Android
-
Android Studio 4.0
-
Android NDK r25b
-
Android SDK
- 推荐:SDK 32
- 编译UE的最低版本:SDK 30
- 在设备上运行的最低目标SDK:SDK 26
- 如果你使用AGDE调试,需要AGDE v22.2.69+。
-
-
ARCore
- 1.22
-
ARKit
- 4.0
-
Linux
- 原生Linux开发
- 推荐操作系统:Ubuntu 22.04或CentOS 7
- 编译器:clang 13.0.1
- 跨平台开发
- 交叉编译工具链:v20基于clang-13.0.1 (CentOS 7)
- 原生Linux开发
-
Oculus
- 33.0
-
OpenXR
- 1.0.22
-
Google Stadia(停止维护)
- 1.82.0.102432
-
Steam
- 1.47
-
SteamVR
- 1.5.17
-
Switch
-
SDK 14.3.0 + 可选的NEX 4.6.7
-
最低固件版本: 14.1.2-1.1
-
Nintendo Dev Interface 2.5.5
-
支持的IDE:Visual Studio 2019、2022
-
-
PS4
-
Orbis SDK 10.008.001
-
系统软件:
- 10.008.001
-
支持的IDE:Visual Studio 2019、2022
-
-
PS5
-
Prospero SDK 6.00.00.38
-
系统软件:
- 6.00.00.42
-
支持的IDE:Visual Studio 2019、2022
-
- macOS
- 推荐
- 最新macOS 13 Ventura,最新Xcode 14
- 最低
- macOS 12 Monterey,Xcode 13.4.1
- 机器架构说明
- 原生Apple Silicon支持可用于编辑器和项目编译的macOS目标。Apple Silicon的编辑器支持是试验性的。
- 一些第三方SDK和插件尚未包含ARM64切片,并可能存在兼容性问题。
- 推荐
-
iOS / tvOS / iPadOS
- 推荐
- 最新的Xcode 14
- 最低
- Xcode 13.4.1
- 支持的目标SDK版本:iOS 15或更高版本
- 图形API:Metal 2.4和Metal 3.0
- 推荐
Release Notes
Animation
New:
- Control Rig now has additional properties exposed to Blueprints and scripting.
- Added support for in-between Morph Targets when importing FBX files.
- The in-betweenMorph Targets are now imported as standalone Blend Shapes with their animation curves baked accordingly to preserve the original animation.
- You can now select things below the ground in preview scene viewports.
- The floor shown in the preview scene within each persona editor no longer blocks selection of items below ground.
- You can now set custom bone colors using the Bone Color property in the Editor Preference.
- Added a new
UE_ANIM_REMOVE_DEPRECATED_ANCESTOR_TRACKER
definition to remove large deprecated members fromFAnimationUpdateSharedContext
. - Added a new asset information section for Animation Montages when working with blueprints.
- Added a looping flag property to Animation Sequences and Blend Spaces. This is used to set the default loop value when creating asset player nodes
- Blend Masks and Blend Profiles can now be organized in different categories under the Skeleton Tree view.
- The City Sample's AnimToTexture plugin is now available as an experimental Engine plugin.
- Fixed a bug that caused an Animation Sequence's cache stats and debug name to not register.
- Added the new experimental Curve Expressions plugin, that you can use to copy to Skeletal Meshes' animation curves. You can also make adjustments to the copied animation curves using simple text expressions.
- Added a Copy Context Menu option to copy Curve names from the Timeline editor to the clipboard.
- The Pose Driver node is now production ready.
- Added a
GetMeshDNA
function toSkelMeshDNAUtils
inRigLogic
.
Improvement:
- Bone rendering has been consolidated across all Animation Editor viewports.
- Animation Sequence compression is now asynchronous during cooking.
Crash Fix:
- Fixed a crash that could occur when playing Animation Montages when the owning Actor is destroyed while executing one of its Animation Notifies.
- Fixed a crash that could occur by debugging while live coding.
Bug Fix:
- Fixed a bug that could cause wrong values being set when pasting a bone transform in the Skeleton Editor.
- Added missing implementation to
UMovieScene3DConstraintTrack::RemoveAllAnimationData()
. - Fixed a bug that could cause root motion modes to not be selectable in the animation viewport.
Deprecated:
- The
USkeletalMesh
pointer of theUSkinnedMeshComponent
has been replaced with the newUSkinnedAsset
base type pointer enabling Unreal Engine to utilize new types of skinned asset components.
Gameplay
New:
- Motion Warping: Added support when using the animation warping plugin for injecting translations when there is no translation to warp in the animation.
- Added an animation modifier within the AnimationModifierLibrary to reorient the root bone in an animation while maintaining mesh position and rotation.
- Added an animation modifier to the AnimationModifierLibrary to copy transforms from one bone to another.
- Added a new simplified framework within the Motion Warping plugin by removing the node's
bInLocalSpace
option.- Root motion is now always warped in mesh space.
- The Motion Warping plugin has transitioned from the Experimental stage and is now in the Beta production phase.
- Added support for Blend Spaces within the Pose Search plugin.
- Added a new experimental Foot Placement locomotion node within the Pose Warping plugin.
- You can now disable the Pose Warping plugin's Orientation Warping node when sufficient Root Motion data isn't available to calculate good warping results.
- Montages played from Linked Animation Blueprint Graphs and Layers will now behave correctly when using Inertial Blending after enabling the debug command:
bUseMainInstanceMontageEvaluationData
. - Montages using Inertial Blends now support Blend Profiles.
- Added experimental root bone offset property to the Animation warping plugin's Orientation Warping node, that can be used to follow Root Motion rotation more closely during forward-facing turns.
- The Animation Warping plugin is now production ready.
- Added a new State Machine Function Library that allows you to query the active state, as well as dynamically transition between states.
- Added a new experimental Offset Root Bone node within the Animation Warping plugin
Improvement:
- Animation Notify States can now check if they have reached the end or were canceled before completing, using the new
UAnimNotifyLibrary
NotifyStateReachedEnd
function in the Event Reference data. - Improved the behavior of the Stride Warping node at low character movement speeds.
- Improved the Stride Warping behavior on manual mode when stride scale is 1 and interpolation is also enabled.
- Improved the Stride Warping behavior for 3x interpolation speed while using manual mode.
Bug Fix:
- Fixed a bug that could cause the animation graph to avoid updating the entire graph from the game thread when only using root motion from an animation montage asset.
- Fixed bug that could occur within the Motion Warping plugin that could cause root motion occurring outside the warp window to be stomped during the last tick.
- Fixed a bug that could occur when using the Motion Warping plugin that would abort warping if the user jumps to a different point in the animation sequence while the warping window is active.
- Fixed a bug that could cause erratic behavior in Montages during section loops under very specific timing and frame rate conditions.
- Fixed a bug that could occur with Montage Notifies that would not show the assigned name on the notify tracks.
- Fixed a bug that can cause sudden flips to existing Orientation Warping angles, when adding Root Motion data to nodes that did not contain any previously.
- Fixed an issue where the Apply Root Motion Ability Task could restore a movement mode without also restoring the custom movement mode.
- Fixed a bug that could cause Transition Events to not fire from Conduits.
- Fixed a bug that could disrupt the prediction behavior of the Motion Trajectory Component when the character is turning on the spot.
Rigging
New:
- Added an aggregate node type in Control Rig, which will concatenate multiple unit nodes of the same type to allow for a dynamic number of input pins.
- Added Parameter At Length Percentage Control Rig node, which can be used to return the U parameter of a spline at a given length percentage.
- New Control Rig Template nodes offer a new way to organize sets of nodes in manageable groups. After grouping a set of nodes with a Template node you can take advantage of wildcard pins which can pass an input into each of the supported nodes' respective compatible input.
- Setup Events are now called as Construction Event New: You can use new Construction events to spawn Bones, Nulls, Controls and more.
- You can now create and invoke your own Control Rig Events custom triggered logic.
- You can also invoke Control Rig Events using Python commands or within Unreal Engine Blueprints.
- Control Rig nodes can now be updated to their latest version with the Upgrade Node(s) context menu option in the graph.
- Added a new type of execution callback called the Dispatch Factory.
- A Dispatch Factory can rely on lambdas to generate a callback based on the types passed to it.
- The Control Rig hierarchy now supports Metadata storage directly within the elements of the hierarchy. The metadata is then readable and writable in the graph using the metadata nodes, Blueprints, or Python using the hierarchy's API.
- You can now use Profiles when working within the IK Retargeter to store, edit, and apply retarget settings at runtime using Blueprints.
- You can now invoke events from the top toolbar and context menu in Control Rig.
- You can now manage Control Rig events in Action Palette.
- You can now enable Debug Drawing during Control Rig interaction.
- You can now use the new IK Retargeter hierarchy view to quickly manage and edit bone transforms with a clear visualization of the full skeleton chain.
- Using the new Control Rig Overlay mode, controls can now be drawn on top of a Skeletal Mesh in the level viewport.
- Control Rig now supports creating and managing Aim Bones and Two Bone IKs using Python.
- The IK Retargeter's source and target IK Rigs _and _meshes are now fully swappable with no need to create separate retarget assets for different source IK rigs.
- You can use new Control Rig Proxy Controls to interact with animatable, keyable controls, through helper controls. Proxy Controls can not be keyed and are invisible to Sequencer, but offer you the flexibility of using the Interaction even in Control Rig.
- You can now set a Control Rig component's class in Blueprints.
- You can now create Control Rig and Rig VM workflows using Python. These workflows can then be registered to operate a specific node or a set of nodes. You can see example workflows in the Control Rig plugin.
- You can now convert any data type to and from a string using the
ToString
andFromString
nodes. - The Control Rig's Spherical Pose Reader node has been optimizatized and now operates with a 5-15% increase in performance.
- You can now store Metadata within the Control Rig Hierarchy using the new Dispatch Factory system. Metadata can be read and written to and from elements in the Control Rig's hierarchy.
- By storing Metadata in the Control Rig Hierarchy you can use that data during construction or with blueprints to drive the Control Rig during runtime.
- You can now index an array in Rig VM using negative values.
- When indexing with negative values, -1 represents the last element, -2 represents the second to last element, ext.
- You can now get and set a control shape transform when working with Control Rigs.
- You can now use new Stride Warping Settings when working with the IK Retargeter. You can use the Stride Warping properties to adjust a character's stride length across retargeted animations.
- You can now enable a debug visualization of the Rigid Body Animation Blueprint node, that will display the node's physics bodies and constraints.
- The RigidBody node's physics bodies will be drawn in the Animation Blueprint Editor's viewport when the node is selected. You can enable a visualization of the node's constraints using settings in the node's Details panel.
- You can now toggle the visualization of individual physics bodies in the Physics Asset Editor's hierarchy tree panel.
- To toggle the visualization, first enable the option in the Skeleton Tree's Settings menu.
- After enabling the visualization toggle, you can enable or disable the visualization for each physics body using its associated checkbox.
- You can now view a synchronized debug visualization of a character's physics bodies and constraints between the Physics Asset Editor and the Animation Blueprint Editor.
- This unified view also means any debug visualization options are universally set across both editor environments.
- You can now upgrade Rig VM from struct to dispatch.
- You can now assign per-element tags within the Control Rig hierarchy.
- A useful application of tags in the Control Rig hierarchy could be to delineate if an element is on the Left or Right side of a character. These tags can then be used to quickly search for elements later during the Control Rig's execution.
- You can now use the new Set Default Parent Control Rig node to change an element's parent or identify it as the new default node in a chain.
- Rig VM now uses a new low-level mechanism for a node's upgrade path, enabling the API to allow nodes to describe their own upgrade path.
- You can implement
FRigVMStruct::GetUpgradeInfo
to enable RIG VM nodes to be upgraded automatically.
- You can implement
- You can now use new Boolean Toggle nodes with Control Rigs.
- Control Rig now provides you with feedback when changing initial transforms during a forward solve.
- If you then change the initial transform of a hierarchy element during the forward solve a note will now be issued on the node in question.
- The first execution index of each node can now be displayed on nodes using the Show Node Instruction Index on any node in the Control Rig graph editor.
- By enabling the Show Node Instruction Index, it can assist you when debugging a Control Rig graph, by revealing which nodes are being executed by the graph.
- Added introspection on function arguments to Rig VM.
- You can now use the
FRigVMRegistry
's access toFRigVMFunction
to list the function arguments for each registered callback function or dispatch.
- You can now use the
- When selecting objects in the Control Rig hierarchy, the hierarchy relationship of the elements is retained if copied or moved.
- IK Rig and Retargeter assets now have custom icons.
- You can now use Python getters for shape transform in Control Rig.
- You can use new Root Settings in the IK Retargeter to control the motion of the retargeted root bone, with the added ability to adjustments to the retargeted root bone independently of the character's feet.
- You can manually change the pin types on the new wildcard pins in Control Rig.
- The IK Retargeter now features the new Speed Planting property, that you can use to create retargeted animations without foot sliding, regardless of the size difference between the source and target character.
- You can now enable debugging watches within Control Rig functions.
- You can now import poses from pose assets or animation sequences to the IK Retargeter.
- Additionally you can export retargeted poses as pose assets.
- Control Rig now supports preferred Euler angles.
- Euler angles set on Controls or Bones are now preferred over potential quaternion representations during the solve.
- Using the Advanced Tab on the Control Rig Animation Blueprint Node you can now choose which Events to run during execution.
- You can now set up multiple connections to the same source variable node in Rig VM.
- Using the IK Retargeter you can now control any Pole Vector twisting on any retarget chain without needing to set up an IK.
- Unreal Engine will now issue warnings for unconnected execute pins in Control Rig.
- The Retarget Pose From Mesh animation node now also copies curve values from the source mesh component.
- You can now mirror IK Rig retargeted chains.
- Added the ability to see when an IK Rig retargeted chain's settings have been modified.
- Deformer Graph node Pins can now specify data sizing that is a multiple of a given execution context. You can also use expressions to fully customize the pin's data sizing.
- Deformer Graphs can now receive input, bind to, and receive data from, multiple Actor components as inputs.
- Deformer Graphs now support the execution of multiple graphs. Each Deformer Graph can contain and execute a Setup Graph to perform initialization functions, an Update Graph to perform functions every rendered frame, and Trigger Graphs that can be queued to perform specialized functions and can be called using Blueprints.
- The Skeletal Modeling tool has been relocated to the new Skeletal Modeling Tools plugin.
- Exposed the
ActorToTrack
andControlRigClass
properties to Cinematics.
Improvement:
- Variable nodes in Control Rig can now reference an input parameter inside a function.
- Rig element names now support spaces in Control Rig.
- Improved the performance of Control Rig's Hermite spline.
- Updated the MLDeformer readme file to clarify install instructions for other non-windows platforms.
- Control Rig's
TypeIndex
now operates in typedef for easier debugging. - When using the IK Retargeter you can now edit the retargeted pose on _both _the source and the target skeleton.
- The IK Retagreter now provides precise numerical input for bone editing and a reworked interface for pose management.
- Convert debug breakpoints from TSharedPtr to guid based struct
- The Control Rig outliner for FKControlRig has been improved.
- Control Rig and RigVM asset loading performance has been Improved.
- The Control Rig's performance for cycle checking transforms has been improved.
- The Print String node can be used to print any data type value to the screen at runtime, for debugging purposes.
- The Rig VM's Refactor template data-type system now operates using Integers rather than string comparisons.
- Rig VM has received an API performance increase due to a more efficient registry lookup mechanism.
- When editing retargeted poses, you can no longer make direct horizontal translations on the retargeted skeleton's root bone.
- You can instead use the new Horizontal Scaling property to achieve more reliable results.
- The performance of Control Rig's Constraint nodes has been improved.
- Rig VM nodes that used to be represented as many different instances and supporting different data types can now be represented as a
FRigVMDispatchFactory
.- See the Print node's improvements for an example of this implementation.
- Increased the default number of Control Rig nodes that can run concurrently from 64 to 256.
- The Control Rig Editor hotkey shortcut, used to perform a duplication, has been changed, and is now Ctrl+D.
- The default Control Rig naming convention has been changed to
TemplateName
.- Additionally, the
PrototypeName
metadata tag used forFRigVMStruct
specializations has been renamed toTemplateName
to match the API feature.
- Additionally, the
- The visibility of Proxy Controls affects the visibility of other proxies sharing the same driven controls.
- The Retarget Pose from Mesh node now outputs the character's reference pose when no source component is found.
- IK Retargeter now auto-populates the Skeletal Mesh property when applying an IK Rig.
Bug Fix:
- The Category field of Control Rig functions can now be cleared after it is given a value.
- Fixed Control Rig Blueprint compilations causing the right-click context menu to get slower over time.
- Fixed the Control Rig AnimGraph Node not being able to accept array pin connections.
- Fixed Aim nodes causing flipping when the primary and the secondary targets are at a certain angle.
- Control Rig's template collision message has been changed to a display rather than as a warning.
- If two collision templates are defined with the same arguments, the second collision will fail during registration, and issue a warning to the log.
- Fixed a bug that could cause IK Rig retargeted chain to unexpectedly rest to default values.
- Fixed a bug that could cause bone and name filters within the IK Rig and IK Retargeter hierarchy panels to not function properly.
- Fixed a bug that could cause the IK Retargeter viewport to not properly frame selections when pressing "F" key.
- Fixed a bug that could cause vectors in a Control Rig to not export correctly when used on Animation Blueprints.
- Fixed a bug that could cause a delay in the seamless editing of IK Rig and Retarget assets.
- Changes to the IK Rig are now immediately reflected in any open Retarget asset.
- Fixed bug that could cause an IK Rig retarget chain name to add an unwanted suffix when trying to rename the asset.
- Fixed bug that could occur in the IK Retargeter when editing the translation of a target skeleton's root bone, that would push the character too far if the character was scaled up.
- Fixed a bug that could cause the IK Retargeter to not properly register Vicon skeletons and other skeletons where the root bone is the pelvis.
- Fixed a bug that could prevent the renaming of a single item with a case change.
- It's important to note that both
FString
andFName operator
are case insensitive resulting in misunderstanding when renaming items with altered cases.
- It's important to note that both
- Fixed a bug that could cause IK Retargeter chains using Globally Scaled translation mode to incorrectly apply scaled root motion when retargeting root motion between characters of different sizes.
- Fixed a bug that could occur with exported retargeted animation sequences that would not update the Retarget Source Asset without manually updating the asset using the context menu.
- Fixed a bug that could cause a case-change when renaming goals in an IK Rig.
- Fixed a bug that could cause curves contained within a Control Rig to not retain the validity flag, and target curves to be declared as invalid if it writes a zero-value.
- Fixed a bug that could cause Control Rig Display actors to behave unstable.
- Fixed a crash that could occur when working with spawnables in a sequencer project that contains a Control Rig.
Deprecated:
- Deprecated bezier nodes in Control Rig.
- Deprecated Static Mesh Control node in Control Rig. Instead, you should use the Rig Hierarchy panel to create new controls manually or use the new Spawn nodes.
- Deprecated Transform Constraint node in Control Rig. Instead, you should use the new Constraint nodes.
- Deprecated the forced tick order dependency between Control Rig component and its mapped Skeletal Mesh components. Instead, you should use tick prerequisite related Blueprint APIs to ensure the mapped Skeletal Mesh components tick after the Control Rig Component.
- The Deformer Graph Compute Kernel's Parameter array has been deprecated, and its functionality has been implemented into the Input bindings.
Runtime
New:
- Added the new
bUpdateMeshWhenKinematic
parameter to Skeletal Mesh Components, that updates Skeletal Meshes using physics bodies when they are set to kinematic simulation, rather than only when set to dynamic or simulated. - Added a set of preload dependencies on sparse class data and its archetype for blueprint CDOs.
- Added track filtering to the Animation Sequence timeline.
- Added the ability to blend regular animation sequences in mesh space as an option in the Blend Space properties, under Sample Smoothing.
- Improved the Skeleton Tree children default ordering behavior.
- The new behavior now lists sockets, preview meshes, and virtual bones ahead of a bone's children.
- A Skinned Mesh Component's Predicted Level of Detail Level is now accessible from Blueprints.
- The right-click context menu for Animation assets now has an option to Replace Skeleton, that you can use when a Skeleton asset has become orphaned.
- The Compatible Skeletons feature is now accessible from the Skeleton Editor's Retarget Sources tool.
- Added the ability to enable Pose Watching with Aim Offsets and Blend Masks.
- Skeletal Meshes with a configured Leader Pose Component now will not tick the Animation Pose by default.
- This default can be changed when calling
SetLeaderPoseComponent
with the newFollowerShouldTickPose
parameter.
- This default can be changed when calling
- Added a new orbit camera mode to the Animation Editors camera widget.
- Additionally you can now set a 'Lock Camera Rotation' and 'Pause On Orbit' options in the Editor Preferences.
- When creating a new asset in the Content Browser, Level Sequence, Template Sequence, and Camera Animation Sequence asset types are now accessible in a new Cinematics top-level asset category.
- The Pose Watch icon, that appears on animation blueprint nodes in the blueprint graph, that have been pose watch enabled, has been updated.
- You can now create event-based transitions within State Machines.
- The Rewind Debugger, packaged in the Animation Insights plugin, now has Pose Watch support.
- You can now assign a Skeleton to an Animation Blueprint using the new context menu option Assign Skeleton in the Content Browser.
- Added the option to strip Additive Base-Poses during cooking to save memory, This function is disabled by default and can be enabled using the console command
a.StripAdditiveRefPose
. - Relocated the Pose Asset editor's Update Source button below the asset field, as it was often hidden, depending on the width of the details panel.
- Fixed a bug that could cause Notify states to re-trigger erratically when a montage is re-played.
- Added a new tooltip for the Rewind Debugger curve tracks to preview curve value at cursor position.
- Added a new
TraceFiltering
trace channel.- Note, the
TraceFiltering
trance channel will not be enabled by default on builds with the Trace Source Filtering plugin installed.
- Note, the
- You can now save animation curves from the animation timeline editor in the clipboard.
- Added new keyboard shortcuts for Rewind Debugger playback controls.
- Added a new Project Settings section for Rewind Debugger.
- Double-clicking a Linked Anim Layer node, now also attaches the newly opened Animation Blueprint editor to the corresponding AnimInstance for seamless debugging.
- Added new Teleport flags to the Rewind Debugger that will return a skeletal mesh component to its original location when resuming the project.
Improvement:
- Add support for LWC promotion when copying TMap properties via their property access, this change fixes issues experienced when supplying curve values via a node pin on Modify Bone animation blueprint nodes.
- Improved animation blueprint re-instancing by removing the special case instance in the Blueprint re-instancing pipeline for animation blueprints. This allows linked animation graphs to persist across live-recompilations.
- The new compiling behavior is opt-out using a console variable, in case your project relies on the old compiling behavior.
- Improved Blueprint variable permissions filtering.
- Added a critical section to the Property Access Library to prevent race conditions.
- The
HideBoneByName
command now does not stopBoneAnim
when TickOption isAlwaysTickPoseAndRefreshBones
. ShouldTriggerAnimNotifyState
is now public.- Template Animation Blueprints can now be used with Skeletal Meshes as a standalone asset.
- The Animation Budget Allocator can now be used in Blueprint-only projects.
- Refined the animation asset's Create Asset submenu in the Content Browser, for increased organization and user efficiency.
- Added expanded filtering options within the Animation Blueprint interfaces.
- Added the adoption to prevent physics asset creation on import, this functionality is enabled by default.
- The process of copying the final output pose for animation playback has been optimized by removing any redundant copies of the reference pose.
- If incorrect pose results persist, you can traverse the bone index array in increasing order and fill in any gaps with the reference pose.
- Enabled drag and drop functionality to support dragging pure functions from the MyBlueprint panel to AnimGraphs in Animation Blueprints.
- Blocked all drag and drop functionality of dragging impure functions into AnimGraphs to prevent incompatibility errors.
- Additionally blocked drag and drop functionality for all functions into State Machines to prevent incompatibility errors.
- Replaced the message log readout, Compressing Animations with Preparing Animations.
- Replaced the Animation Blueprint RigidBody node's MasterAlpha property with the new WorldAlpha property.
- The Morph Target implementation workflow has been significantly optimized. The improvement can be most notably felt when setting up a Skeletal Mesh with many Morph Targets, where there are multiple active simultaneously.
Crash Fix:
- Fixed a crash that could occur while deleting a blendspace node.
- Fixed a crash that could occur by canceling an in progress animation sequence export.
- Fixed a crash that could occur in EDL (Edit Decision Lists) builds caused by accessing sparse class data in
Link()
before it is serialized. - Fixed a crash that could occur when re-instancing
UAnimInstance
. - Fixed a crash that could occur when customizing an Animation Blueprint node that is no longer associated with a valid Blueprint.
- Fixed a crash that could occur when compiling an animation blueprint that contains an empty state machine.
- Fixed a crash that could occur when compiling linked Animation Blueprint graphs.
- Fixed a crash that could occur while working in Asset Editor Mode Manager, by closing Unreal Editor with an open Animation Blueprint editor on screen.
- Fixed a crash that could occur when opening Animation Sequence in the editor, when the Sequence relies on a compatible skeleton.
- Fixed a crash that could occur while packaging a project containing a character using a remapped skeleton.
- Fixed a crash that could occur when using the Rewind Debugger to trace object properties and the object contained a property of type Map.
- Fixed crash that could occur when loading a Layered blend per bone node that has empty blend mask entries.
- Fixed a crash that could occur by re-instancing clobbering the size of 1EditFixedSize1 arrays in Animation Blueprint nodes
- Fixed crash that could occur when trying to re-instance post-process Animation Blueprint instances on components with no mesh.
Bug Fix:
- Fixed an issue that could cause property access nodes to report an erroneous error when using split pins in functions.
- Fixed a bug that failed to allow you to apply permissions to Physics Assets and Control Rigs in the Skeletal Mesh context menu.
- Fixed a bug that prevented users from enabling smoothing for BlendSpaces.
- Fixed a bug that could occur while compiling an animation blueprint that contains a Control Rig node that caused a memory stomp.
- Fixed a bug that could cause users to be unable to set defaults on interface pins.
- Fixed a bug that caused a blueprint function's thread safe property to not update after a user performed undo and subsequent redo commands.
- Fixed a bug that could occur causing asset overrides to not work correctly for blendspace and sequence playback nodes that use identical defaults.
- Fixed a bug that caused the display of the animation compression progress to not occur.
- Fixed a bug that caused leaking linked animation instances when reinitializing animation.
- Fixed an issue that could cause LOD issues when baking an animation in Sequencer, including stretched and deformed geometry.
- Fixed an issue that could cause compiling irregularities with child animation Blueprints.
- Fixed a bug that could prevent editing of input parameters on input pose nodes in the main animation blueprint graph.
- Fixed a bug that could cause nested structs that are bound to animation node pins to not display their child values.
- Fixed a bug that could cause non-editor-ticking skeletal meshes to produce unexpected animation LOD results after compiling.
- Fixed a crash that could occur in cooked builds where references to editor-only properties were left in the animation blueprint bytecode.
- Fixed an issue that could occur to a characters reference pose when linking in a new linked anim graph and compiling.
- Fixed a bug that could cause animation compression settings to preload before any load of game content in editor builds.
- Additionally Fixes have been made to prevent warnings about calling
LoadObject
inPostLoad
of animation sequences.
- Additionally Fixes have been made to prevent warnings about calling
- Fixed a crash that could occur from Layered Animation that are linked from initialization and added runtime warnings for situations when this could cause issues.
- Fixed a bug that could cause erroneous warnings to occur regarding child animation blueprints.
- Fixed a bug that could cause a display of animation layer interfaces on content browser tiles.
- Fixed a bug that could cause renaming issues with linked animation layers where some layer nodes would not correctly pick up the rename.
- Fixed a bug that could cause a duplication of animation blueprints with custom property bindings producing internal compiler errors.
- Fixed a bug that prevented ticking of animation instances during reinstancing.
- Fixed a bug that could cause per-bone sample smoothing to not affect the correct bones.
- Fixed a bug that could occur when adding or removing an animation layer graph's input pose, the instance will now refresh instances without requiring a manual refresh.
- Fixed a bug that could occur with the animation blueprint interface falsely displaying in the asset creation menu.
- Fixed a bug that could produce incorrect collisions when using the URO / budget allocator interpolation combined with the
SkipKinematicUpdateWhenInterpolating
flag. - Fixed a bug that could cause the Layered blend per bone node's Blend Masks to fall out of sync with any present Blend Poses.
- Fixed a bug that could cause Animation Blueprints that contain Pose Handlers to behave improperly by expanding the asset override tree.
- Fixed a bug that could cause the blend profiles submenu to not appear on a subsequent opening of a skeleton asset.
- Fixed a bug that could occur when using mesh-space blending in Blend Spaces, in particular additive or offset Blend Spaces.
- Fixed a bug that could cause animation node functions to be bound in Layered Animation interfaces.
- Fixed a crash that could occur when reverting an added bone socket or virtual bone to a Skeleton asset.
- Fixed a bug that could cause deleted Skeleton assets to still be listed in the Compatible Skeletons list of other Skeletons.
- Fixed a bug that could cause an Undo/Redo command to not function when performed on a BlendSpaces' "BlendSpaceDetails Axis" properties.
- Fixed a bug that could cause a tracepoint break from triggering when frame-stepping in the editor with an active Animation Blueprint preview.
- Fixed a bug that could cause erratic behaviors when attempting to create comments in any Animation Blueprint graph.
- Fixed a bug that could cause irregular behavior with the Blend Profile slider when making minor adjustments.
- Fixed a bug that could cause the Pose pin attribute connections to not display properly when routing through a reroute node in Animation Blueprints.
- Fixed a bug that could occur when copy-pasting nodes dependent upon a source State Machine state to carry over their existing dependencies.
- Fixed a bug that could cause tags to not display on State Machine nodes.
- Fixed a bug that could open the 'Create Animation Blueprint' window off-screen when using Windows scale window.
- Fixed a bug that could cause the Retarget Pose from Mesh node to display an error when compiling, stating the exposed IK Retargeter Asset input binding has not been defined when an asset is assigned using the node properties or graph interface.
- Fixed a bug that could cause incorrect asset menu actions to appear for Animation Blueprints.
- Fixed a bug that could cause pin type colors to only appear white in state machines.
- Fixed a bug that could cause blend profile entries to persist after their parented bones have been removed from a skeleton.
- Fixed a bug that could cause blend profile names to be reset if you clicked off of the field, rather than committing the name using Enter.
- Fixed a bug that caused the AnimationStreaming library to use incorrect Low-Level Memory Tracker tags, designated for audio tracking.
- Fixed a bug that could cause incorrect behavior in Spline IK node.
- Fixed a bug that could cause the Sequence Player node's start position description to not match its functionality.
- Fixed a visual bug that could cause Animation State Machine UX to display trailing dots at each option.
- Additionally, the Add New State Machine option has been renamed to State Machine.
- Fixed a bug that could cause errors with the auto-wire functionality for non-pose pins on nodes in Animation Blueprints.
- Fixed a bug that could cause a Skeleton's defined preview mesh to be reset if it comes from a compatible skeleton.
- Fixed a bug that could cause the Animation Notify Panel to not display the notify selection correctly when working with custom window display scaling.
- Fixed a bug that could cause Sync Groups to not work correctly during zero-duration/inertial blends.
- Fixed a crash that could occur if an Animation Sequence is deleted while in use in a Blend Space preview editor.
- Fixed crash that could occur when Pose Watch has been enabled on a Skeletal Mesh Component.
- Fixed a bug that could cause the Inspector Panel to not update a node's properties if not explicitly selected.
- Fixed a bug that could cause a mesh's details text overlay to block mouse selections in the Animation Editors.
- Fixed crash that could occur when changing an Composite Animation segment's start time, end time, or play rate.
- Fixed a bug that could cause the Animation Blueprint's Random Sequence Player node to not transition out when an automatic transition rule is active.
- The
FAnimNotifyEvent::IsBlueprintNotify()
now supports metadata filtering using theAnimNotifyList
. - Fixed a crash that could occur after duplicating a State Machine in the MyBlueprint panel, within the Animation Blueprint editor.
- Fixed a bug that could cause issues when remapping a character's skeleton including incorrectly adding or removing virtual bones.
- Fixed a bug that could cause Blend Space Evaluators to not generate Animation Notifies during playback.
- Fixed a bug that could cause proportionally-linked Animation Notifies to not move when the length of the Animation Sequence is edited.
- Fixed a bug that could cause incorrect clipping behavior of Animation Notifies when the length of an Animation Sequence is edited.
- Fixed a bug that could cause sync groups to not function properly when using a Transition Leader group across non-zero-length transitions.
- Fixed a bug that could cause a Skeleton's associated assets to not load properly.
- Fixed a bug that could cause Sequence Evaluator nodes to not be displayed in the Rewind Debugger's Blend Weights view.
- Fixed a bug that could cause weapons and other attached objects to not stay attached to the character when scrubbing in Rewind Debugger.
- Fixed a bug that could occur in Rewind Debugger and Animation insight where, Inertialization node properties were not shown under the correct node in the Anim Graph Debug view.
- Fixed a bug that could cause the Make Dynamic Additive node to incorrectly respect the
ExpectsAdditive
flag. - Fixed a bug that could cause bone transforms stored on the clipboard to not correctly paste.
- Fixed a bug that could cause the UI in the animation timeline editor from adding float and metadata curves.
- Fixed a bug that could cause single frame discrepancy between the information shown by the Rewind Debugger and the previewed Skeletal Mesh on the editor viewport.
- Fixed a bug that could cause some untagged memory allocations in
GameplayInsights
andSourceFiltering
to include a proper LLM tag - Fixed a bug that could cause a camera Feild of View (FOV) to not replay correctly when scrubbing in Rewind Debugger.
Deprecated:
- Deprecated the unused
bRaiseMaxErrorToExisting
with theUAnimationSettings
. - Deprecated all master and slave terminology, to indicate dependent relationships in the codebase, the new terminology is now Leader and Follower respectively.
Sequencer
New:
- Added blueprint functions to get and set Control Rig parameter section masks.
- Animation Sequence sections now contain the Swap Root Bone property, where you can choose to apply root motion animation to the Actor or Component in Sequencer.
- You can now include or exclude Bones or Curves from being recorded in Take Recorder by using Include Animation Names and Exclude Animation Names.
- Added several Blueprint functions to LevelSequenceEditorSubsystem:
- ConvertToPossessable
- ConvertToSpawnable
- Copy/Paste Tracks
- Copy/Paste Sections
- CopyPaste Bindings
- Copy/Paste Folders
- AddActors
- CreateCamera
- Added Start at Current Timecode to Take Recorder. If enabled, this makes Take Recorder start recording at the current sequence time as opposed to restarting at the playback start time.
- Added Swap Buffered Curves which stores the current curve to the buffer and restores the buffer to the current curve. The Store/Swap/Apply options can be accessed when right-clicking on keys or curves in the Curve Editor.
- Added a new toggle to show or hide Buffered curves in the Curve Editor if the curve is selected.
- You can now specify a specific bone in a skeletal mesh to record timecodes onto using Animation Attributes. If the bone name doesn't exist, it will fall back to the root.
- Added functions for evaluating the root bone timecode and subframe attributes in Editor Utility Widget Blueprints.
- Curves will now automatically frame when pasted in the Curve Editor if Auto Frame is enabled from the Curve Options menu.
- FMovieSceneGeometryCacheParams is now exposed as a BlueprintType.
- Mass Scale can now be animated in Sequencer.
- Added a recording speed field in Take Recorder, where you can set the Time Dilation of the engine when recording.
- Added SetMaterialIndex and GetMaterialIndex Blueprint Functions for PrimitiveMaterialTrack and ComponentMaterialTrack.
- Added new commands that can be bound to keyboard shortcuts for Control Rig Controls filter, Control Rig Selected Controls filter and Reset filters.
- Subsequence and Shot Tracks can now be filtered in Sequencer.
- Added SetDefaultParameters Blueprint function for Take Recorder.
- Timecode Subframe values will now display on Animation Sequence sections in Sequencer as a suffix when present in animations.
- Added an option to Snap Time to Selection in the Curve Editor.
- Added a tooltip to the Object Binding Track in Sequencer to show the object class that it is bound to.
- Added the ability to toggle jobs in Movie Render Queue.
- Added Sequencer GetByteTrackEnum and SetByteTrackEnum Blueprint Functions.
- Added new marker hotkeys to Curve Editor
- Step to Next Mark: Ctrl + Shift + Period (.)
- Step to Previous Mark: Ctrl + Shift + Comma (,)
- Create / Delete Mark at current time: M
- Added an option to TakeRecorderActorSource to show or hide the progress dialog.
- Added functionality into TakeRecorderSourceHelpers to add or remove Actor sources.
- Enhanced the Frames Per Second tooltip with the names of the Level Sequences that are not matching when there is a frame rate mismatch between Subsequences and their parent.
- Added support for the new property setter functions, for example,
UPROPERTY(Setter = MyPropertySetter)
. When evaluating a property keyframe, Sequencer will call this function if it exists. - Added an option to show or hide the status bar in Sequencer's View Options menu.
- Added an option in the View Options menu to automatically expand nodes in the Sequencer Outliner upon the child being selected.
- Added an option to gather child bindings on FBX export from Sequencer when using Python.
- You can now render multiple cameras in a scene at the same time. When the experimental feature is enabled, the main camera used for the sequence, in addition to all other camera components rendered in the scene, will be rendered simultaneously as additional passes.
- Added a new experimental Cinematic Prestreaming plugin that you can use to record certain types of asynchronous streaming requests, such as Nanite and Virtual Textures. You can then playback these streaming requests in a Level Sequence after the initial scene render, but in advance of when the scene is visible to the player.
- The experimental Cinematic Prestreaming plugin is designed to improve cinematic quality offline rendered cinematics.
- Offline rendered cinematics are able to avoid Texture resolutions from being visible in the final frames, but requires rendering two passes. The first pass to generate the request list and the second to use the generated data
- Added a new experimental flushing mechanism to the sequencer texture streaming system to remove any blurry textures that would be visible when using texture streaming.
- Using texture streaming significantly reduces VRAM usage when rendering large scenes. This will automatically be enabled if you use the Game Overrides setting to set
Texture Streaming
to Don't Override. This feature can be disabled by settingbFlushStreamingManagers
tofalse
.
- Using texture streaming significantly reduces VRAM usage when rendering large scenes. This will automatically be enabled if you use the Game Overrides setting to set
- Added a new lookup table to channel proxies for finding channels by name.
- Added new Sequencer commands to clear selections in Sequencer and Curve Editor using the Escape key.
- Added a new Lazy-create for the camera's animation sub-system linker. This simplifies debugging by creating less linkers in simple test levels.
- When rendering a shot, you can now specify the render to only include the shot in the context of the root sequence.
- You can now specify Data Layers instead of Editor Layers in the Stencil Layer feature.
- Sequencer Channels can now be overridden with other types of channels.
- For instance, you can now change the
Rotation.X
channel of a transform section, which is normally a keyframed curve channel, to make use of a perlin noise generator channel.
- For instance, you can now change the
- Added more system information categories to EXR metadata such as total memory available, total memory used by all processes, cpu vendor/name, and more.
- It is important to note, not all metadata is supported on all hardware.
- Added a simplified API for creating renders using Movie Render Queue in game at runtime.
- Added a new role to sequencer's Entity Component System (ECS) linkers to make it easier to set debug breakpoints in linker code.
- Added more descriptive statistics for each property type, instead of using Apply Properties for all property types.
- Added finer control over which systems are included or and which are excluded in a given linker.
- With the Debug Options property, you can now automatically capture an Unreal Insights trace for the duration of the render.
- This makes it easy for artists to capture a trace file to send to programmers for further analysis when they see unexpectedly slow performance.
- The example Python Runtime executor has been updated with a corrected command line argument, and printed warnings about how the script is meant to function as an example and will need editing to be usable in a project.
- Added a root sequence's name to sequence instance classes for easier debugging.
- Added a menu extender to sequencer, and to sequencer context menus, so that multiple channels can extend their menus.
- You can now copy and paste related controls between multiple Control Rigs in the Curve Editor.
- You can now toggle the
IsEnabled
state of sequencer properties using Python scripting. - The
version
token can now come aftershot_name
in the format list and will be treated as a local version of the per-shot folder, instead of a global version, which is shared by all shots. - The
Exposed UMovieSceneSection::GetAutoSizeRange()
property is now exposed to scripting using theUMovieSceneSectionExtensions
.- For tracks that support auto-sizing, such as animation and audio, you can now query if the auto-size data has a start and end frame, as well as if it receives the data. This simplifies adding assets using Python as you can use a unified function, for all tracks that support
GetAutoSizeRange
, regardless of underlying asset type. This addition simplifies the need to use a unique way of determining how long an asset is for each type.
- For tracks that support auto-sizing, such as animation and audio, you can now query if the auto-size data has a start and end frame, as well as if it receives the data. This simplifies adding assets using Python as you can use a unified function, for all tracks that support
- Added a system to check for valid players in camera cut tracks to fix edge-case crashes when saving a level sequence.
- You can now add Sequences to Sub-Sequences with the
InsertSequence
command, similar to theInsertShot
command for adding Cinematic Shot tracks. - You can now save the UI width percentage between the Sequencer Timeline and the Outliner in Sequencer settings.
- You can now drag-and-drop Data Layer assets from the Data Layer window or the Content Browser into existing Data Layer sections.
- Added the new console variable
Sequencer.DuplicateLinkedAnimSequence
, that you can use to toggle an animation sequence's duplication behavior when the level sequence is duplicated. - Added new Tween Tool modes:
- Push / Pull
- Blend to Neighbor
- Added Linked Anim Sequence functions to Blueprints and Python:
- Create Linked Anim Sequence
- Get Linked Anim Sequences
- Get Source Level Sequence
- Sequencer playback hotkeys now will always function in Animation Mode regardless of panel focus.
- Game View will now hide Control Rig Controls in that viewport.
- Added an editor preference to enable drag selection on left mouse click instead of moving the camera: Left Mouse Drag Does Marquee.
- Created a new Project Setting category for Cinematic Camera where you can set defaults for Lens, Filmback, and Aspect Ratio Crop.
- Indirect manipulation using Ctrl now works with Control Rig objects.
- The Orbit camera around selection editor preference now correctly works for Control Rig Controls.
- Marked up LevelSequenceEditorSubsystem with _API macro to allow for usage outside of the module.
- Added an option to disable reacting to playback replication changes on the sequence player.
- Added a native interface for controlling whether the effects of a UMovieSceneSequencePlayer can be observed.
- Added IgnoreFitlersWhenCollapsed setting so if a section is collapsed and there is a filter, it will only show filtered key areas when that flag is false. Defaults to true to keep existing behavior.
- Changed template sequence actors to use asynchronous updates.
- Added a scripting method for deleting root folders from a sequence.
- Exposed LinkAnimSequence function to scripting.
- ALevelSequenceActor::LevelSequenceAsset is now a replicated property and initializes the player if it changes.
- Exposed movie scene sub section / focused sequence navigation to scripting:
- Focus section
- Focus parent
- Get hierarchy
- Added a GetDescendantSubSections function to MovieSceneCommonHelpers.
Improvement:
- Moving a keyframe to the same time as another keyframe in the Curve Editor will now remove and replace the old keyframe.
- The Look at Tracking Interp Speed property on Cine Camera Actors is now animatable in Sequencer.
- Buffered Curves are now consistently called Buffered Curves in the Curve Editor instead of Stored Curves.
- Buffered curves now can only apply and swap to the curve it was made on.
- You can now cancel a Take Recorder recording that is in progress.
- The Cinematic Viewport timeline range is now synchronized to Sequencer's timeline. This change helps prevent cases where the timeline padding could appear very large and unusable, due to a large working range.
- You can now add an animation track to the top level Actor binding if the root is a Skeletal Mesh component. This loosens previous restrictions to make it more convenient to add animation without also needing to add Component Tracks first.
- Added Play/Pause/Stop functions to the Actor Sequence Component.
- The Track filter button now has a red dot to indicate if any filters are active.
- Camera Cut tracks are now included in the Cameras track filter.
- Sequencers main toolbar has been converted to use the Tool Menus framework.
- Several color changes have been made to curves and keyframes in the Curve Editor.
- Keyframes are now the same color as the curve.
- Selected keyframes are white, which can be changed in Editor Preferences.
- The default color for non-axis curves is now a darker gray.
- The blue channel for Z and B channels is now brighter to contrast better against the dark background.
- Locking and unlocking camera cuts can now be performed with Shift-C.
- Added MOVIESCENETRACKS_API to some MovieScene3DTransformSection Functions so they can be used by other Plugins.
- MovieScene::SetComponentTransformAndVelocity can now be used by other Plugins.
- Actors referenced in Sequencer now no longer forcibly show in the Outliner, unless it is a Spawnable.
- The ExportLevelSequenceFBX Python command is now able to export a Subsequence within a Master Sequence.
- Added hotkey support for selecting all keyframes forward and backward in the Curve Editor. Ctrl + ] and Ctrl + [.
- Dragging and dropping Movie Render Queue assets now appends the jobs in the queue to the active queue.
- The Sequencer tab will now display with an asterix if the asset has unsaved changes.
- Sequencer Bezier interpolation now occurs on doubles instead of floats.
- Sequencer can now handle cases in which multiple ECS entities are driving a single transform section. This is a new situation that arises from overridden channels.
- Sequencer now passes its owning section when evaluating a channel. Some new channel types, such as perlin noise, need the section pointer to look up contextual data, like tick resolution.
- The Use Camera Cut for Warm Up range detection behavior is now the difference between the Camera Cut Section start, and the first evaluated frame of the Camera Cut section itself. This improvement was made to better handle sub-sequences being clipped by parent ranges.
- Reduced the amount of concurrent memory required for panoramic blending, by blending it into the final output texture as soon as each sample is done in order to free up more memory.
- Cloth behavior, when using temporal sub-sampling, has been improved by automatically increasing the sub-step count when needed.
- It is important to note that Cloth will still present a different result than in viewport due to the increased number of chances to resolve collisions and have physics forces applied.
- You can now have multiple Control Rig's active at the same time. Using the Outliner, you can now observe and manage all Control Rigs in the active level sequence.
- Linked Anim Sequences will now save when the Level Sequence is saved.
- Parent and Child definitions in the Snapper tool will now reset when switching Shots or Subsequences.
- You should now only be able to snap to a single parent when using the Snapper Tool.
- Added Evaluate All Skeletal Mesh Components option to AnimSequenceLink.
- Linked Animation Sequences will now be dirtied at the same time you dirty your Level Sequence.
Crash Fix:
- Fixed crash with ReplayTracks plugin.
- Fixed a crash that would occur when modifying a parent asset while recording with Take Recorder.
- Fixed a crash that could occur when using the Command Line Encoder option if the output directory tree did not fully exist before encoding started.
- Fixed a crash that would occur when keying onto additive sections with different number of controls due to the hidden track editor variable.
- Fixed a crash when unresolved bound objects in Sequencer were being deleted.
- Fixed a crash when calling FindOrGetDefaultSettingForShot when InMasterConfig was null.
Bug Fix:
- Set Curve Color For Selected now only changes the color for selected and not all curves.
- Fixed an issue where repeatedly setting custom curve colors would result in broken keyframe coloring in the Curve Editor.
- Changing curve colors in the Editor Preferences menu now correctly applies the color change immediately.
- Fixed still being able to add and move Marks if Sequencer was locked.
- Fixed subtitles appearing even when Suppress Subtitles is enabled in the Audio track section.
- Fixed a bad cast error when trying to cast to a MovieScenePropertyTrack.
- Fixed a bug where all Control Rig controls would be selected if you selected the Folder Track that contained them.
- Fixed an issue where the Sequencer editor menu extensions were shown for sequence types other than Level Sequences.
- Fixed synchronization issues where curves would not appear in the Curve Editor if you had Selected Control Rig Controls enabled.
- Fixed an issue where dragging a Control Rig into Sequencer would create a duplicate Control Rig track for the actor and all of its skeletal mesh components.
- Sequencer: Clamp to playback range before snapping to frames, otherwise the scrubbed to frame could be a subframe when snapping is on.
- Fixed a bug where all Animation Notifies would fire at once at the loop point when looping animations in Sequencer.
- Fixed an issue with adding keyframes in the Curve Editor using Ctrl + MMB would still cause slight disturbances to the curve shape if snapping was enabled.
- Fixed Curve Editor snapping to occur in all view modes: Absolute, Stacked, and Normalized.
- Fixed an issue with Camera Rig Rail where the mount visual would rotate if Lock Orientation to Rail was disabled.
- Fixed an issue where muted tracks could be muted forever when deleting tracks.
- Fixed smoothed replicated playback causing desyncs during looped playback.
- Fixed an issue when copy and pasting attached spawned objects not correctly binding to the newly pasted bindings.
- Fixed an issue with Curve Editor bindings for Zoom To Fit All, Zoom To Fit Horizontal, and Zoom To Fit Vertical not working.
- Fixed an issue where if you select a control in the Anim Outliner or in Sequencer, the transform gizmo wouldn't appear because the Control was not considered selected.
- Convert to Spawnable now creates a transform track that takes the transform origin into account.
- Fixed an issue when recording Spawnable Actors in Take Recorder that are children of other Actors not being recorded resulting in the recorded Actor appearing at an incorrect transform.
- Fixed a crash in Sequencer when dragging "Animation Mode" keyframes.
- Fixed an issue that caused the playhead to not follow the cursor consistently when dragging it at low speeds.
- Fixed an issue where deleting a recorded Actor after a Take Recorder recording would cause all Actors to be removed from the source list.
- Removed interp from RelativeScale3D, which fixes an issue where meshes would flicker between their initial Transform Scale Values and the Relative Scale 3D values on playback.
- Fixed an issue where not all keyframes would be selected when clicking on a curve in the Curve Editor.
- Fixed an issue for the Control Rig Snap Tool not taking full world transform into account.
- Fixed a bug with Control Rig selection where if you select a keyframe on a Control Rig element, the corresponding element would get deselected.
- Fixed a bug where changing a color on a keyframe using the Color Picker would also reset the keyframe tangent.
- Fixed an issue where if you select a Control in the Anim Outliner, the transform gizmo won't be updated so you can't click on a gizmo to move it immediately.
- Fixed an issue where sometimes the clicking and dragging would drag the playback ranges instead of the playhead.
- Fixed an issue where OnStop would not always fire.
- Fixed an issue where Spawnable objects can't be retrieved immediately after opening Sequence
- Fixed a case where Take Recorder would get confused over which Camera to bind to the Camera Cuts track if another Camera was a Component of an Actor.
- Fixed an issue with Camera frustum visualizations not updating when lens values update in Sequencer.
- Fixed an issue where undoing in the Curve Editor would change the current time.
- Fixed an issue where the Snapper Tool would not correctly work when snapping backwards from your current time.
- Fixed an issue where deleting the last keyframe would not reset the property to the previously unkeyed value.
- Fixed an issue where pasting keyframes in the Curve Editor would paste to all curves in view and not the selected one.
- Fixed an issue where Muted track sections could still have their data changed
- Fixed ExponentialHeightFog.SecondFogData properties not dirtying render state when set from Sequencer evaluation.
- Fixed an issue that prevented saving a Control Rig animation to an Animation Sequence that was currently being referenced in Sequencer.
- Fixed an issue when copy and pasting tracks with multiple bindings on it.
- Fixed a bug that could use name-lookups for channels, instead of assuming their type and index.
- name-lookups is now a potentially invalid assumption when channels can be overridden.
- Fixed a bug that could cause cloth simulation to not occur if a render was started long after the level was first loaded.
- Fixed a bug that could cause Control Rig to mark a section as changed when the channel proxy changes.
- Fixed a bug that could create an arbitrary section range when a new section is created past the playback end.
- Fixed a bug that could cause high temporal sample counts to have their delta times clamped during Level Tick which created mismatches between calculated component velocities and render thread delta times.
- Fixed a bug that could cause clamping of looping subsequences.
- Previously, a compilation's range was clamped by the containing section's range, so some of the sub-sequence's animation would not be taken into account after the last loop and still play.
- Fixed a bug that could incorrectly initialize a camera's animation sequences upon creation.
- Previously, sequences were only initialized when the asset was opened in Sequencer for the first time. This could lead to problems if the asset was added to something else, like a camera shake or a level sequence, before edits were made..
- Fixed a bug that could cause a regression in
jpeg
orpng
file's writing times that significantly slowed down large resolution renders. - Fixed a bug that could cause a widening of old, single-precision floating point properties on Blueprints
- Fixed a bug that could cause an issue with setting default values when the binding ID changed for actor reference sections.
- Fixed a bug that could cause a visible seam on the right edge of the editor.
- Fixed a bug that could cause png alpha channels to only register as partially transparent.
- Fixed a bug that could cause erratic behavior with alpha-in-tonemapper warnings.
- Fixed a bug that could cause a Trigger Cameras to cut changes between camera cut sections even if the camera actor is the same.
- This restores a previous edge-case behavior that users relied on for their projects.
- Fixed a bug that would register the same tick client multiple times.
- Fixed a bug that could cause default-construct components created by a mutation to prevent corrupted memory from making it into the sequencer evaluation.
- Fixed a bug that could cause code from getting a component writer to a single entity.
- Fixed a bug that could cause non-layered EXRs from using the wrong Alpha Allowed property which prevented the property from writing out to alpha channels.
- Fixed a bug that could cause a project's aspect ratio constraints to not correctly restore.
- Fixed a bug that could prevent selected infinite sections from being moved or dragged.
- Fixed a bug that could cause an issue when trying to use
png
files in combination with the Command Line Encoder failed with some third party encoding software. - Fixed a bug that could fail to try and resolve bound actors with component possessables.
- Fixed a bug that could cause the Command Line Encoder to not use
version
tokens in the filename. - Fixes a bug that could clear delegates tied to destroyed objects that should not be left in the latent actions list.
- Fixed a bug that could cause the additive-from-base blend type to not perform when recomposing values for keying.
- Fixed a bug that could cause the project settings class for Render (Local)/Render (Remote) to not properly store references to late-loaded class types such as those defined in Python or in a game's Plugins.
- Fixed a bug that could cause the 'Write all Samples' to not respect the
project_dir
format string. - Fixed a bug that could cause separately composited Burn In/Widget Renderers to not actually write an alpha channel when the main output was as
JPEG
orBMP
file. - Fix bug that could cause a section-preroll to be ignored for camera cut tracks.
- Fixed a bug that could cause the
DetailLighting
render pass not apply the correct view modes causing reflections to not display. - Fixed a bug that caused the float and double channel context menus to not merge into a single "curve channels" context menu.
- Previously, the float channels, specifically the channel for transform sections, was not affected by any context menus.
- Fixed a bug that could cause multiple custom movie renderers to be displayed at once, instead of just the current one.
- Fixed a bug that could cause the template sequence property multipliers to not always be reliably being taken into account.
- Fixed a bug that could cause high temporal sample counts being artificially clamped by overriding the minimum timestep for Chaos Physics to zero during renders.
- Fixed a bug that could cause Tick Resolution migration code to not successfully migrate locked sections and not migrating Marked Frames.
- This fix also adds the ability to recursively apply the time migration to all child sequences.
- Fixed a bug that could occur when trying to add a job through the Sequencer UI, then disabling a setting, and then adding the job again, which could result in the disabled settings to duplicate and become active again.
- Fixed a bug that could cause formatted strings that come from shots to provide the incorrect values, from the Master Configuration, when used in filenames.
- Fixed a bug that could prevent the use of the job initialization timer when using the
year
,month
andday
tags, which would cause files to go into separate folders when a job rolled over midnight in UTC time. - Fixed a bug that could cause Video Codecs to function when the Overwrite Existing property was disabled.
- Fixed a bug that could prevent a saved Queue from showing the correct names for jobs that used Presets for their settings.
- Fixed jobs with modified presets having the wrong name after being duplicated in the queue.
- Fixed a bug that could cause the
MoviePipelineInProcessExecutor
to crash if provided with a bad Sequence path. - Fixed a bug that could cause the
date
andtime
tags to not resolve in output paths when clicked on in the UI. - Fixed a bug that could cause the full path name of template sequences' bound actor classes to not register if only its short name was saved.
- Fixed a bug that could cause the Animation Custom Mode and Swap Root Bone properties to not be exposed to Blueprints.
- Fixed a crash that could occur by calling
DeleteAllJobs
immediately after callingRenderWithExecutor
. - Fixed a bug that could fail to include a sequence's play rate when computing sequence shake pattern duration.
- Fixed a bug that could generate duplicates from bindings when first resolved.
- Fixed a bug that could cause motion blur to get stuck when the Camera Cut track stopped evaluating.
- This was only an issue if the Motion Vector Simulation system was enabled and the camera being returned to was not a Cine Camera Component.
- Fixed a bug that could cause an incorrect upkeep of property stats when upgrading floats to doubles.
- Fixed a bug that could assert on exit if the runner's linker is pending kill.
- This could happen if the linker is flagged for destruction before whatever owns the runner.
- Fixed a bug that could cause alpha channels to be speckled due to dithering when using
png
andjpeg
file outputs. - Fixed a crash that could occur in the Animation Sequencer animation selection filter, by adding Montages to animation tracks.
- At this time, only animation sequences are currently supported.
- Fixed a crash that could occur with Video Codecs when they failed to initialize due to an invalid output file path, such as writing to a hard drive that did not exist.
- Fixed a bug that could cause mapped Skeletal Mesh to not update the Skeletal Mesh accordingly to the controls
- Fixed a bug that could cause all linker evaluations to start with an un-clean capture source, even in cases when there are nested linkers running.
- This fixes asserts caused by mismatched pre-animated states.
- Fixed a bug that could cause a custom range for Move Render Queue renders in shipping builds to be incorrectly set.
- Fixed a bug that could cause a baked Control Rig to include all of the rig's Compatible Skeletons.
- Fixed a bug that could cause only select Control Rig Controls to deselect when a control isn't clicked.
- Fixed a bug that could cause Network Level Authentication (NLA) issues with root motion not blending correctly when there are multiple skeletons blending.
- Fixed a bug that could cause drag-and-drop functionality, when adding animation sequences to the Sequencer timeline, to create a new dedicated track rather than adding the sequence to an existing track.
- Fixed an issue where copy and pasting Control Rig data would not paste correctly if the Selected Control Rig Controls track filter was enabled.
- Fixed an issue where orbiting (Alt + LMB) the camera around a selected Control Rig would sometimes duplicate it.
- Fixed an issue where orbiting (Alt + LMB) the camera around a selected Control would sometimes move the Control instead of the camera.
- Fixed an issue where duplicating Linked Anim Sequences would point to both the original and the duplicate.
- Fixed a case where sequencer bindings could be resolved using the wrong PIE instance ID.
- Fixed replicated sequences that begin at a non-zero start time causing a jump on the first frame.
- Fixed an issue where Motion Trail keyframes would appear at the level origin, instead of hiding.
- Fixed derived Cine Camera data not updating when modifying properties from Blueprints.
- Fixed an issue where very small marquee selections would sometimes select all Control Rig Controls.
- Fixed an issue with Motion Trail ticks not drawing correctly in multi-viewport scenarios.
- Curve Editor selection no longer changes which Controls are selected in the Viewport.
- Fixed bound object pointers not being available to child entity instantiators
- Fixed an issue that would cause an Actor with a Control Rig to continuously pop back to its default position in Sequencer when moving the Actor.
- Ensured that the current Level Sequence closes before opening the next one when switching Level Sequences.
- Fixed an issue that would cause recorded animations from the Take Recorder to be invalid if spaces were in the name.
- Fixed an issue where if Selected Control Rig Controls was enabled, Curves would not show up in the Curve Editor.
- Fixed an issue where undoing keyframe changes on multiple Control Rig Control would have to be done by undoing each keyframe operation per Control.
- Fixed Actor properties controlled by Actor Reference Tracks not being restored correctly if they were null.
- Fixed an issue where compression would reset to default compression in Sequence Recorder.
- Fixed an issue where scrubbing in the Viewport by pressing B and dragging would not cause audio to play from Audio Tracks.
- Fixed an issue where if you called
Job->SetConfiguration(Job->GetConfiguration())
it would remove all of the settings from the MRQ job. - Fixed an issue where Sequencer Attach tracks would dirty actors in levels.
- Fixed an issue where recording into Subsequences using the Take Recorder wouldn't save them if Save Recorded Assets was enabled.
- Fixed looping point indicators not being correctly positioned on Media Track sections that don't start at 0.
- Fixed an issue where creating Takes would not respect number padding in your Shot name.
Deprecated:
- Sequence Recorder is now hidden in favor of Take Recorder. If necessary, it can be re-enabled with the
SequenceRecorder
console command. - Deprecated GetSelectedObjects()/SelectObjects in favor of GetSelectedBindings/SelectBindings which operates on FMovieSceneBindingProxy for consistency with all other Blueprint and Python functions.
- Deprecated SequencerBindingProxy and typedef it to MovieSceneBindingProxy.
- Removed the Export to Camera Anim... feature as it is unable to perform any actions without the deleted Matinee Asset Factory.
Removed:
- Completely removed Matinee from the codebase including the data types and runtime evaluation code.
- The "InterpEdit" editor mode, asset factories, and other editor support for Matinee.
- CameraAnims and their sequencer tracks.
- FBX import/export for Matinee assets is removed. Sequencer is now used for all cinematics and camera animation needs.
Synthesis
New:
- The new experimental Physics Control Component plugin allows you to add simple, intuitive, and powerful physically-based controls to a Blueprint. With these physics controls, you can take advantage of the emergent physical motion of Static and Skeletal Meshes, while retaining artistic and gameplay control.
- Added a new frame based animation timeline setting for the ML Deformer editor.
- Use the new command
TSoftObjectPtr
for training related properties, and only load them when needed. - By defining what parts of the character's mesh will be deformed using a Geometry Cache file, you can now use Skeletal Meshes with more meshes than geometry tracks when generating models using the ML Deformer framework. For example, a Skeletal Mesh character could contain teeth, eyes, etc, while the geometry cache file does not contain those meshes.
Improvement:
- Added function libraries missing for Mac builds and NumPy to PythonFoundationPackages. This fixes training errors in the ML Deformer on Mac.
- The Machine Learning (ML) Deformer system has been redesigned as a framework that can handle different models using a new unique editor, assets and components. You can explore this new framework by installing the ML Deformer framework plugin.
- Improved and simplified the model training process for the MLDeformer VertexDeltaModel.
- Improved the Neural Network model by switching rotations from Quaternions to 2 columns of the 3x3 rotation matrices.
- You can now store extra per-individual mesh information from FBX scenes when importing FBX files to Unreal Engine.
Bug Fix:
- Fixed a bug that could occur if a site packages directory on Mac was not named correctly in
PythonFoundationPackages
. - Fixed a crash that could occur due to a ML Deformer Model that failed to locate and identify a GPU device.
- Fixed a bug that could cause pose generation to fail when using Python code to generate poses for the ML Deformer poses in AutoDesk Maya 2022.
Editor
API Change:
- The UAssetToolsImpl::ImportAssetTasks function now properly sets the imported Assets in the FAssetImportTask::Result member of the passed ImportTasks parameter.
- Any code that was checking for EPropertyChangeType::Unspecified for movement of array items in the property details panel should now use EPropertyChangeType::ArrayMove instead.
New:
- Adding a UI wrapper around the CSV to SVG Tool command line tool.
- The arguments are stored as a UObject with reflected properties so you can get a "free" UI by using the property window. Also, this lets you use serialized arguments so you can potentially re-use the settings. You can also programmatically generate the arugment list to pass to CSVtoSVG by iterating the relfected properties.
- Added SCSVtoSVG widget which contains/owns the arugment UObject, a property window to edit it, and a SStatList.
- When the CSV file property on the arugment changes we infer an output directory and output file name from the input csv file. These can be overriden.
- The tool also parses the CSV file to find all the available stats in it to populate a SListView.
- When you click generate to make the SVG graph we automatically open the graph in a web browser.
- Save the current arugments to config when you close the editor.
FEditConditionContext::GetIntegerValue
can now fall back on the underlying property if it is an enum. This allows for bitwise comparison in UProperty EditConditions with enums.- Added support for multiple Level templates using the same map package.
- Added a new DDS loader with better support for D3D10-format DDS files.
- Added support for loading RGBA8-format DDS files.
- Added a CanEditChange signature that takes a full property chain to the property in question.
- You can now use multiple console commands in the editor by using FParse::Line to allow commands to be split with newlines or pipe characters ( | ).
- You can now add a newline in the console command entry box by using Shift + Enter.
- Many Anim Dynamics Animation node parameters can now be edited with a widget in the viewport. New: Parameters for physics bodies in a chain can be edited independently.
- You can no longer copy/paste bone names in the chain bone array.
- Added per-level coloring option for the fracture editor outliner and stats details.
- Allowed colliding body settings are now copied and mirrored when physics bodies are mirrored in the Physics Asset Editor. This means that a mirrored body can now collide with the mirror equivalents of its source's allowed colliding bodies.
- Bone mirroring in the Physics Asset Editor now recognizes bones that have an "l" or "r" pattern anywhere in their names as 'left' or 'right' bones and will mirror them correctly.
- The Asset summary text displayed in the Physics Asset Editor viewport now includes the number of potential colliding pairs of bodies, the number and type of each primitive shape, and the number of cross constraints in the current Asset.
- Added additional editor scripting APIs to modify Blueprint variable flags and metadata in BlueprintEditorLibrary.
- Added an option to disable collisions with the floor when simulating in the Physics Asset Editor. This option is located in the overflow menu of the Simulate toolbar button.
- Added a new column mode parameter to the Fracture Editor outliner that displays various information per bone depending on the the selected mode.
- UBlueprintAsyncActionBase - Made WorldContextObject parameter const in RegisterWithGameInstance.
- UEditorUtilityBlueprintAsyncActionBase - Made WorldContextObject parameter const in overridden RegisterWithGameInstance.
- Add an option to use the P4Config in the Unreal Editor.
- Exposed Asset Migration command to scripting.
- Added a new GetSelectedFolderPaths function to get the currently selected folder(s) path in utility widgets and Python.
- Added a new GC section to the Details panel UI which displays properties specific to the geometry collection component.
- Sounds are now loaded and compressed asynchronously in the Unreal Editor whenever possible.
- Ctrl + Console Key (` by default) now iterates through active Console Command Executors so you can switch between Cmd and Python using the Ctrl + ` shortcut.
- Added a new Texture property, ForceRecompressDDCUID, that you can use to manually change the DDC key to force a rebuild.
- Implemented Python Type Hinting when generating the Python stub.
- Exposed to Python the option to set a minimum width/height dialog when calling the unreal.EditorDialog.show_object_details_view function.
- DDS texture import now supports most pixel formats, and all variants of 2D, cube, cube array, and volume textures, with mips.
- Added access to debug color texture encoding for Oodle from the command line.
- Added log information for enabling and disabling debug color texture encoding for Oodle.
- Mip maps are now supported on non-power-of-two textures.
- Added Conv_StringToInt64 to Kismet string library.
- VT and UDIM can now export to all supported output image formats.
- UAssets that store their imported image data as JPEG can export those JPEG bits directly to JPEG output format without decompression.
- More image formats import floating point data as F32 and store losslessly in UAssets. Floating point data is no longer converted to F16 at import time.
- Added changelists support to PlasticSCM source control plugin (v1.6.2).
- Added TRACE_CPUPROFILER_EVENT_SCOPE to Perforce integration plugin to be able to capture some performance metrics.
- Exposed UStaticMesh::GetNumTriangles as a Blueprint function
- Exposed UEnum display name to Python through method get_display_name. For example: print(unreal.TextureCompressionSettings.TC_GRAYSCALE.get_display_name())
- Unreal Engine now supports reading the enum entry display name set in C++ as well as the one injected from Python with the
@uenum
annotation. - Added Shared Linear Texture Encoding. When enabled (r.SharedLinearTextureEncoding), an encoded texture for a console that would tile a base texture will detect if it can use the same base texture as windows, avoiding re-encoding the base texture. This greatly speeds up multi-platform encoding.
- Created a new enum entry, EPropertyChangeType::ArrayMove, to signify movement of items within an array by the property Details panel and other callers to UObject::PostEditChangeProperty.
- Added a new Texture property, Editor Show Final Encode. Use this property to see the Final-mode encoding of the texture (for example, with Oodle RDO) in the current Editor session, rather than the Fast-mode encoding without RDO.
- Exposed IAssetsTools::DiffAgainstDepot and IAssetTools::DiffAssets functions to Python
- Added a warning dialog when performing a blocking operation.
- Constraint position and orientation in the Physics Asset Tool (PhAT) can now be viewed and edited in the Details panel.
- Parent and child transform values in the PhAT can now also be displayed relative to the default (snapped) transforms (set when the Physics Asset was created).
- The position and orientation components of the parent or child transforms can be independently snapped to defaults using right-click menu options or the reset buttons in the Details panel.
- You can now manipulate only the child frame transform via a viewport widget by holding down Shift + Alt.
- Fixed the warning and error message boxes using all the spaces of the source control submit confirmation dialog if too many errors or warnings were present.
- Added a Keep Checked Out button to the source control window.
- Added an array of delegates called ShouldDisableCPUThrottlingDelegates in UEditorEngine that can be used to disable CPU throttling for the editor when it doesn't have focus.
- The Pose Watch Manager in the AnimBP editor has been extended to allow control of other areas of debug visualization. Each pose watch now contains one or more elements which represent different aspects of an anim node's debug visualization, including the output pose, physics bodies, etc. where relevant. Those aspects can be hidden or shown individually, even when a node is not selected, by creating a Pose Watch for a node and toggling visibility of the elements in the Pose Watch Manager window. At present, the Rigid Body Animation Node (RBAN) is the only one to take advantage of this new feature.
- Added new Texture bool bDoScaleMipsForAlphaCoverage to clarify the feature AlphaCoverageThresholds for older textures.
- Added a new memory.WindowsPlatformMemoryGetStatsLimitTotalVirtualGB cvar that simulates a lower memory system to lower the chances of out of memory crashes during cooking.
- Exporting a Level to FBX will now use Actor labels instead of Actor names for improved clarity.
- The Base Shape Material's Base Color was changed from 1 to 0.9. This change affects all base shapes (sphere, box, cylinder, cone, etc.)
- Added ASSETSEARCH_API to Asset Indexer classes.
- Changed default arcball behavior to act more like other DCCs.
- Added a limit cvar to extend the size of the arcball.
- Added a Disable Preview Menu option.
- Added FriendlyNames to all ShaderPlatforms in DDSPI.
- MenuText now comes from FriendlyNames in DDSPI.
- Added Units and ForceUnits to ObjectMacros.h for discoverability.
Improvement:
- The Material Editor now only compiles a fixed number of shaders (fewer than 10 per platform) with WorldGridMaterial. The shader compile process is now 10 to
- Drastically improved editor performance when selecting a very large number of Static Meshes using the marquee selection tool.
- Improved job scheduling for parallel texture compression.
- Increased cut-offs for number of pixels per Oodle Texture encode job to reduce number of tiny worker-thread tasks generated.
- Restoring expanded items in very large Detail panel hierarchies is now faster.
- Typing a character while an Asset picker menu is open will now focus the search box if it is not already focused.
- Added support for calculating chain bones immediately without waiting for the Anim Dynamics Animation node to be compiled.
- Changing bound bone names no longer resets physics body parameters.
- PaintedVertices are no longer serialized when collecting object references to avoid needless operations when launching PIE.
- The Check Out Files dialog now displays the type of Actor and no longer displays just "Actor".
- The Unreal Editor now supports textures up to 32768x32768.
- Texture UDIM import now allows mismatched formats.
- Texture UDIM export preserves naming convention and allows choice of export format.
- Implemented an 'Unsaved' Editor status bar button that displays the number of unsaved Assets (dirty packages) in the project. Click this button to open the Save Content dialog.
- Unreal Engine now warns about potential source control issues when saving unsaved Assets.
- Instrumented Python plugin loading time and saved about 500ms to the total module startup time.
- Source control changelist window now works better with large changelists (One File Per Actor).
- Changelist window now supports text search, filtering, and 2-column sorting.
- You can use two new keyboard shortcuts in the changelist window: Enter to submit the currently selected changelist, and Delete to delete it.
- P4 changelists are now sorted in ascending order.
- Operations that don't directly affect Assets, such as creating and deleting a changelist, are now asynchronous.
- When submitting a changelist to source control, you can now edit and save the changelist.
- If you add a description to the default P4 changelist while files are checked out, the description and all files attached to that changelist are moved to a new changelist.
Crash Fix:
- Duplicating array entries in the Details panel containing a null
UObject*
/TObjectPtr
will no longer cause a crash. - Fixed an editor crash when removing the last texture source in a texture array.
- Limited sparse data properties to the common base class when multiple objects with potentially unrelated types are selected into the property editor to avoid a potential editor crash.
- Improved the memory estimate for building textures, making out of memory crashes during cooking less likely.
Bug Fix:
- Fix property display in the Details panel for Levels with the ReadOnlyKeys metadata.
- Editor notifications now only start fading out once the editor starts ticking and no longer disappear when loading takes longer than the expiration time given.
- Improved FInstancedStruct property editing stability.
- Fixed a bug where PIE didn't respect editor FeatureLevel Settings when having PIE MapOverride set up.
- Fixed an issue where modules tab wouldn't reliably be available.
- FDirectoryPath properties now correctly update the Enabled state of the "..." button.
- Fixed an issue that caused the Blueprint diff tool to potentially call IsChildOf on nullptr for newly added classes.
- Components panels now show correctly in the Blueprint diff tool for newly added Blueprints.
- Scene Outliner selection no longer resets when changing the Level.
- Fixed an issue where, under certain circumstances, multiple child entries representing the same object could be added to a Scene Outliner tree item.
- Fixed a visual gap in the header of nested categories in the Details panel, notably in a Blueprint's Class Defaults.
- Fixed an issue where certain old texture versions had the incorrect compression format set in their internal UAsset data structure.
- Fixed an issue where the editor would sometimes not create or update the thumbnail of an Asset when requested.
- Fixed rendering issues with geometry collection for Materials using vertex color when the ShowBoneColors option is disabled.
- Fixed a bug that caused text boxes created by property row generators to fail to accept multi-line input.
- Editing a vector using the spinboxes in its vector no longer causes stuttering due to Blueprint reinstantiation.
- Fixed an editor bug where Actors attached to a static mesh socket inside a blueprint actor weren't updating when the mesh was moved.
- Fixed ActorFactory overriding custom names given with PostSpawnActor.
- Fixed initial dynamic state not being properly serialized when set via the outliner context menu in the Fracture Editor.
- Fixed a bug that caused failures for automated processes (cooking) when the connection to the SCM failed even if the actual process did not need the connection.
- Focus now correctly returns to the Unreal Editor if the Zip Project command is canceled.
- Texture stats memory is no longer reported after async texture compilation has finished.
- Fixed a warning regarding usage of banned words.
- Upgrade ISPC ASTC encoder to fix a bug where solid-color blocks with very low alpha values would sometimes revert to all black.
- Fixed a missing FActorInstanceHandle::InstanceUID initialization in Actor.
- Fixed an issue where CreateNewStreamingLevel scripting function would ignore the NewLevelPath argument.
- WhitelistConfigFile is now enough to allow for staging individual configuration files from Restricted folders, without having to also specify WhitelistDirectories for that folder as well.
- WhitelistDirectories now works properly for restricted directories in distributed builds.
- Fixed FSlowTask automatically canceling when dialogs were created with a delay and ShouldCancel was called before the dialog spawned.
- UAssetToolsImpl::ImportAssetTasks function now properly adds imported Assets to the FAssetImportTask results.
- Fixed the source control history window not properly displaying multi-line submit descriptions.
- Fixed a bug that caused some operations made in the Editor to not be reflected in the changelist window.
- Fixed a bug that caused validation warning and error messages to show a scroll bar for long messages rather than wrap around.
- Fixed Python calling the wrong delegate if the same delegate name or type was declared in two different UObjects.
- Duplicating Assets will no longer keep a Perforce relationship to the original file
- Fixed JSON warnings with reference container values in the project launcher.
- Fixed the Delete operation not getting called for source control other than Perforce.
- Changed the source control changelist widget tab spawner to a nomad spawner to allow restoring the widget dock position on next Editor restart.
- Fixed a bug that caused content cooking to hang when TextureFormatOodle was disabled for DXT format.
- Implemented a workaround to declare valid Python methods when the corresponding UFUNCTION has default parameter values declared in the metadata, but also has further parameters that don't have default values, which is illegal in C++ and Python.
- The Change Source Control Settings dialog accessed from the Unreal Editor top menu bar now behaves consistently when saving the new settings or canceling.
- Fixed argument parsing for the HighResShot command.
- Fixed the RemoteSession message handler proxy calling the wrong function.
- Fixed AlphaCoverageThresholds that were accidentally enabled for all textures with thresholds = {0,0,0,1}.
- Added
https://
conditions to links in the Plugin Browser. - Fixed nested submenus closing unexpectedly, when opening one by clicking it (instead of just hovering it) and then navigating in submenus.
- Redirected Python stdout/stderr to a buffered text wrapper.
- The PYTHONUNBUFFERED environment variable now correctly prevents stdout/stderr from buffering when set.
- Fixed deadlock in the splash screen happening when the main thread goes faster than the splash screen and tries to hide the splash before the splash screen thread even created the window.
- Fixed Python files being filtered out by the Content Browser.
- Fixed a Python GIL (Global Interpreter Lock) deadlock that could occur while loading an Asset.
- Fixed variables named X64 to avoid collision with preprocessor definition X64.
- Fixed FUpdatePendingChangelistsStatus operation that did nothing if a specific set of changelist was requested.
- Fixed an issue when serializing an incoming concert transaction in FConcertSyncObjectReader where object pointer properties would get set to null incorrectly if Skip Assets was true.
- Marked the FAssetData::AssetClass, FARFilter::ClassNames and FARFilter::RecursiveClassesExeclusionSet as 'Deprecated Property'.
- Changed a Python glue generation error into a warning when a make or a break function signature doesn't comply with Python requirements. Downgrading from an error to a warning, with a message saying that the default make/break will be used instead to make/break the Python object, will prevent licensees from hitting a UE_DEBUG_BREAK every time the debugger is attached.
- Fixed a memory leak when a long source control operation blocks the main thread while the rendering thread renders to animate the source control feedback popup.
- Exposed
TFieldPath<T>
as 'FieldPath' to Python. - Removed outdated #define SourceCodeNavigation preventing proper source code navigation if the editor was compiled with clang.
- Fixed Analytics asserting and crashing the editor when the analytics property store files contained empty key names.
- UActorEditorContextSubsystem is now validated when unbinding in the SActorEditorContext Destructor due to a race condition where the subsystem may not exist by the time the destructor is called.
- When importing a FBX file through Import Into Level, the Static Meshes will now have DistanceFieldScale set to 1 instead of 0.
- Several bugs in the HDR image loader have been fixed.
- The HDR image loader now uses much stricter validation.
- When importing a glTF file, the tangent space handedness (w component of the glTF tangent vector) will now be taken into account for meshes.
- Fixed Asset Search indexing for FSoftObjectPtr representing references to non-Assets (that is, AActor instances).
Removed:
- Access to the built-in editor VR Mode has been removed. Virtual Scouting is the recommended alternative for all users going forward.
- Removed GetFriendlyShaderPlatformName.
- Deleted RHIShaderPlatformDefinitions.inl.
Datasmith
New:
- Enabled Nanite support on Opaque Std Datasmith Materials.
- 3ds Max Exporter: sorted material slots to make them appear in the same order in Unreal as in the source Multi/Sub-Object material.
- Removed the "Reuse identical assets" import option from the USD Stage.
- Added some example Python scripts that describe some of the new features implemented in Unreal Engine 5.1, and how to interact with USD, for example to import or export. We will continue to add new scripts. You can find all available sample scripts in the "Engine/Plugins/Importers/USDImporter/Resources/PythonExamples" directory.
- The Level Sequence generated by AUsdStageActors now binds not only the components that the Actor generates directly, but also the Actors that own those components.
- Exposed the USD.GeneratePhysicsAssets console variable, which controls whether to generate physics Meshes for Static and Skeletal Meshes by default.
- Added options to the File menu for exporting the open USD Stage to a new set of files. This is analogous to a "Save As" command.
- When the open USD Stage's framesPerSecond attribute is updated, the generated Level Sequence now automatically updates its Display Rate to match.
- Alias Import: Added the ds.CADTranslator.Alias.LayersAsActors console variable to convert Alias Layers to Actors on import. When you use the console variable, each Layer is added as an Actor, directly under the Datasmith Scene Actor in the hierarchy. Previously the importer only converted group nodes.
- Hidden layers are no longer included in the import.
- [SketchUp] Starting from SketchUp 2020.2, exported Static Mesh names are now persistent, meaning they do not change between exports of the same Component.
- USD: The import options menu that Unreal Engine displays when you import a USD Stage now contains a tree view, which displays the prim hierarchy of the stage to import. Use the tree view to select and import only a selection or subset of the prims in the stage.
- USD: Added support for the usdMtlx plugin on Windows and Linux The usdMtlx plugin included with USD adds a file format plugin for reading MaterialX documents and translating them into UsdShade shading networks.
- [glTF] The Vertex data ByteStride attribute is now supported. This fixes issues that occurred when importing glTF files exported from Autodesk 3ds Max 2023.
- USD: added support for the usdAbc plugin on Windows, Mac, and Linux.
- The usdAbc plugin that is included with USD adds a file format plugin for reading Alembic files.
- USD: added basic support for importing Materials with diffuse driven by displayColor.
- Added the "USD.MaxInstancesPerPointInstancer" console variable to limit the maximum number of instances parsed from each PointInstancer USD prim.
- The USD Stage editor now emits a warning when muting USD layers with unsaved changes. Unsaved changes are lost when layers are muted.
- Disabled Skeletal Mesh sections are now ignored when exporting Skeletal Meshes to USD.
- Added support for collapsing PointInstancer USD prims into Static Meshes when importing or opening a USD Stage.
- Improved parsing of USD Materials to better extract the intended textures, especially if there is indirection or additional shader connections.
- Added partial support for handling the "!resetXformStack!" xformOp when it is specified on the transforms of USD prims.
- Fixed an issue where Materials baking to USD emitted the "ambientOcclusion" Material input instead of the standard "occlusion" input. The Unreal UsdPreviewSurface base Materials are now used when parsing the "occlusion" material input from USD materials, and support Ambient Occlusion.
- Attributes parsed from USD prims are now be considered animated even if they contain only a single time sample. This means these prims are bound to the generated Level Sequences, instead of being ignored.
- All Mesh prims exported to USD now specify no that subdivision scheme should be used to parse them. This ensures that DCCs that can subdivide meshes still display normals as they were exported from Unreal.
- Enlarged the Actor picker menu in the top right of the USD Stage editor window.
- PhysicsAssets are now generated automatically when parsing Skeletal Meshes from USD. You can disable this behavior with the "USD.GeneratePhysicsAssets" console variable.
- The USD Stage editor now prompts you to save any modified USD layers to disk when you close a USD Stage with unsaved changes.
- Improved handling of Skeleton poses parsed from USD. We now use the restTransforms attribute for the reference USkeleton pose, but account for the USD bindTransforms attribute on the USkeletalMesh itself.
- Added an option for picking which USD Material purpose is used to parse Material bindings. The option is available from Options menu in the USD Stage editor, as a property on the AUsdStageActor, and as USD Stage import option.
- [SketchUp] Classification Types are now exported to metadata.
- [SketchUp] Reduced Actor counts in exported scenes.
- Adjusted the export options used to export Levels and Level Sequence Assets, and reordered them for clarity. They should now have better defaults.
- [SketchUp] Component geometry is now merged into single Mesh instead of spawning separate Meshes for every disconnected group of faces.
- [SketchUp] Image Entity is now supported.
- When an Asset, Level or Level Sequence is exported to USD, new additional metadata identifies the export and source Asset. The exporters check the metadata when re-exporting the same file to prevent re-exporting identical, unchanged assets unnecessarily. New export options for all Asset types allow you to disable this behavior.
- The USD Stage editor now emits a warning whenever an opinion is authored and it is not the strongest opinion for that property in that stage.
- You can now specify which USD layer is the current edit target by clicking the checkmark icons in the "Edit" column in the bottom panel of the USD Stage editor.
- Right-clicking a layer in the bottom panel of the USD Stage editor now allows you to clear, save or export the layer.
- MaterialX: upgraded MaterialX to version 1.38.5
- Implemented drag and drop support to allow reordering or reparenting the layers displayed in the bottom panel of the USD Stage editor.
- Added an option called "RootMotionHandling" for using transform animations on Skeleton and SkelRoot prims as additional skeletal animation root bone motion when opening or importing an USD Stage. The option is available from the Options menu in the USD Stage editor window, as a property on the AUsdStageActor; and as a USD Stage import option.
- Added support for new file formats to Datasmith import:
- CATIA version 5: .CATSHAPE
- CATIA version 4: .exp, .session, . dlv
- .sab (ACIS)
- IFC format is now managed by Datasmith CAD import.
- The ds.IFC.EnableNativeTranslator console variable enables the deprecated native IFC translator.
- To prevent the import of CAD files with tessellation parameters that can generate huge meshes, we defined the following limits:
- Chord error: - 0.03
- Max angle: - 5 degrees
- We could not limit edge length because 0 equals no Edge length. If the edge length value is not equal to 0, edge length is limited to 0.5, and a warning message is logged.
- To set smaller values for metric parameters, use the ds.CADTranslator.MeshingParameterFactor console variable.
- CAD faces are sometimes duplicated. The sew option sews the duplicated faces together. Because their meshes are identical, all triangles are sewn and then disconnected.
- To prevent that, you can add a process with the option RemoveDuplicatedTriangle
- The ds.CADTranslator.RemoveDuplicatedTriangle console variable, which is set to "false" by default, enables the process.
- Because duplicate CAD faces are rare, removing duplicate triangles is resource intensive, the option is disabled by default. To fix a StaticMesh with duplicated triangles, you can re-import it with this option.
- Enabled the glTF exporter plugin by default.
- Added support for CastShadow property in Actor Elements.
- The Microstation .dgn file format is no longer available for Datasmith import.
- Alias import with the Stitching option set to Sew allows the merged boundary representation (BRep) to have more than one material assigned (for multi-material surfaces).
- The ds.CADTranslator.Alias.SewByMatrial console variable allows you to choose to sew BReps by material (only one material per staticMesh) or not (multi-materials on the staticMesh).
- Added fallback behavior for UGLTFExporter::ExportToGLTF to export current playing UWorld if no specific object is passed.
- [3ds Max] The Datasmith 3ds Max Exporter plugin keeps the aspect ratio of baked procedural textures.
- [3ds Max] The Datasmith 3ds Max Exporter plugin version is now displayed in the Datasmith Messages window.
- [3ds Max] You can now toggle XRef Scenes on and off when you export or Direct-link sync 3ds Max content.
- With USD, it is now possible to import basis curves or referenced Alembic grooms as groom Assets or caches by applying the GroomAPI schema. Furthermore, the GroomBindingAPI schema can be applied to a mesh prim to bind a groom prim to it in Unreal.
- [SketchUp] Parent non-uniform scaling of a rotated sub-component is now enabled in some cases.
- [3ds Max] There is now a Limit Texture Resolution option for export of baked procedural texmaps.
- [MDL Importer] Updated the MDL SDK.
- [3ds Max] Max UV channel ids are now remapped to Unreal UV indexes.
- [3ds Max] Corona Light Material is now exported as UEPbr Material.
- [3ds Max] Approximated export for ForestColor texmap.
- [3ds Max] More stable Static Mesh ID by using the smallest handle value among instance nodes. Reduces needless reimports of Static Meshes.
- [3ds Max] MentalRay Arch & Design and VRay Light Materials are now exported as UEPbr Materials.
- [3ds Max] Datasmith 3ds Max exporter plugin provides export diagnostic information. For example, statistics about exported/synced scenes, nodes, Materials, and textures.
- [3ds Max] Support for CoronaPhysicalMtl with ClearCoat.
- [3ds Max] XRefMat and VRayBlendMtl are now exported as UEPbr Materials.
- [3ds Max] Max's Physical Material is now converted to a UEPbr Material.
- Added a post process to the CAD import process to sew cracks in the mesh.
- This process can be disabled with the ds.CADTranslator.SewMeshIfNeeded console variable.
- The sew tolerance is the same as the one use in the stitching step of the CAD import (the StitchingTechnique is Heal /Sew). It can be set with the ds.CADTranslator.StitchingTolerance console variable.
- [Solidworks] Improved Parts configurations export.
Bug Fix:
- Fixed a crash that occurred when trying to parse some types of USD scenes with nested SkelRoot prims.
- The USDImporter plugin now displays a warning and cleans invalid normals found when parsing Mesh prims. Previously, it would silently discard all normals and recompute them. The console variable "USD.MeshNormalRepairThreshold" has been introduced to configure this behavior.
- Fixed an issue where Level Sequence exports to USD were missing animation tracks when Actors and root Components were bound separately.
- [SketchUp] The Datasmith Messages window is now localized.
- [SketchUp] Direct Link: Added layer folder (group) visibility synchronization of individual faces
- Fixed an issue where the "Selection Only" Level export option had no effect when exporting Level Sequences to USD. Also added an option to the Level Sequence export options that allows exporting animations of only the selected Actors and Components.
- Datasmith: Initialized custom node values in the MFAttr_FrostedGlass in the M_StdTranslucentFrostedGlass.
- [SketchUp] Camera changes are now updated via Direct Link.
- Fixed an issue where the right panel of the USD Stage editor window wouldn't refresh on some operations, such as clearing the prim selection on the left panel, or switching to another Unreal level.
- Fixed a color styling issue on the lower pane of the USD Stage editor window that made it difficult to see whether the currently selected Layer was the edit target or not.
- Fixed missing or incorrect Material assignments when exporting some types of Skeletal Meshes to USD.
- Fixed an issue where it was not possible to duplicate an AUsdStageActor with a loaded stage.
- [SketchUp] Transparent Materials that use textures with no alpha are no longer translated as opaque
- [SketchUp] Opacity scalar and texture alpha are now properly combined to calculate Material opacity.
- [SketchUp] The proper texture channel is now used as opacity source.
- Added support for PointInstancer USD prims that have other PointInstancer prims within their prototypes. We now collapse the prototypes into Static Meshes.
- Fixed an issue where it was not possible to animate the Preview Actor on the Blueprint editor for a Blueprint class that derives the AUsdStageActor, after an instance of said Blueprint was placed in the Level.
- Fixed an issue where skeletal animations baked into a Control Rig were not exported when you exported their Level Sequences to USD.
- Fixed a crash that occurred when opening the Level Sequence generated by a Blueprint that derives the AUsdStageActor class, while the Blueprint editor for that class is open in the editor.
- Fix build errors that occurred when building monolithic editor targets with the USDImporter plugin enabled, but no global ANSI allocator specified.
- [SketchUp] Fixed normals when baking transforms into a mesh.
- [SketchUp] The Datasmith Export Plugin for Sketchup now displays a warning message when the version of SketchUp 2020 is unsupported. The plugin for SketchUp 2020 requires at least version 2020.2.
- [SketchUp] Fixed Component/instance name change synchronization.
- [MDLImporter] Fixed crash with baked textures.
- [SketchUp] Modified the title, tooltip, and status text for toolbar commands to conform to SketchUp guidelines.
- Fixed an issue where foliage instances marked as "invalid" in Unreal were not exported to USD when the Level was exported.
- Fixed a crash that could potentially occur when importing using the Actions > Import command in the USD Stage editor windowmenu, and having the corresponding AUsdStageActor's Level Sequence open in the Sequencer.
- Fixed an issue where toggling visibility on the USD Stage editor for prims with animated visibility opinions did not show/hide child prims.
- Fix an issue where the AUsdStageActor overwrote its Time with its stage's StartTimeCode whenever its Level was loaded.
- Fixed an issue where skeletal mesh components generated when you open a USD Stage via an AUsdStageActor didn't animate when going into Play In Editor mode.
- Fixed an issue where skeletal animations failed to import from USD when the skel:animationSource relationship was specified inside of the Skeleton prim itself.
- [SketchUp] Removed global variables, and fixed use of chdir.
- Fixed an issue where glTF variants were not loaded in some scenarios due to name collisions.
- [3ds Max] Fixed a crash that occurred when exporting RailClone while using a renderer other than the default 3ds Max renderer, for example, Corona.
- Fixed a crash that occurred when importing a USD Stage with SkelRoot prims, and using the ExistingActorPolicy and ExistingAssetPolicy import options to append Actors but replace Assets.
- Fixed support for UTF-8 character encoding in the glTF exporter.
- Fix an issue where right-clicking and deleting a prim with a reference in the left pane of the USD Stage editor could cause the referenced prim to be deleted with it.
- Fixed an issue with the glTF exporter determining texture coordinates for certain combined material properties (Metallic/Roughness and Clear Coat Intensity/Roughness).
- Fixed a crash that occurred in some scenarios when exporting skeletal meshes to USD.
- Fixed a crash that could occur when logging multiple import errors or warnings during a multi-threaded step.
- Fix an issue where values for Light elements were skipped when they were very high or very low
- DatasmithContent: Updated triplanar mapping, normal fixup, and parallax occlusion mapping.
- DatasmithContent - Changed the default Opacity Mask Clip Value from 0.333 to 0.5 to support path tracing.
- Fix an issue that occurred when importing or opening a USD stage, where no animation tracks would be generated for animated cameras if the Camera prim had both animated transforms as well as animated camera attributes.
- Fixed issue that prevented cameras with infinite projection from exporting correctly in glTF exporter.
- Fix an issue where materials generated when importing or opening USD Stages used non-virtual texture samplers, even when the textures used were imported as virtual because they had high resolutions.
- [Solidworks] Assembly configuration export fixes.
- [Solidworks] Lights export fixes for light names and spotlight direction.
- [3ds Max] Various fixes for CoronaLight Cylinder orientation, Photometric light attenuation, Arnold light intensity, CoronaSun color/temperature, and VRaySun color/temperature.
- [3ds Max] Updated the Forest Pack API to the latest version, and fixed some stability issues.
- Groom and groom cache import settings specified in Python scripts are now applied properly. If you want to import a groom Asset and groom cache from the same file, and you need to specify their respective import settings, you must import them in separate import tasks..
- [Solidworks] Display state change now correctly updates Materials via Direct Link.
- [3ds Max] RailClone object transform math fix.
- [3ds Max] Fixed export of animated transforms when the parent of an animated node is hidden.
- Fixed a loading issue with groom caches that were imported in UE4.
- Fixed a quantization issue on groom with guides groom cache with large displacement.
- [3ds Max] The Datasmith 3ds Max Exporter plugin no longer changes the names of Max Materials.
- [3ds Max] Fixed crash for Blend Material with null input Material.
- Fixed an issue where the import options window was missing when re-importing an Asset from Alembic.
- Fixed a playback syncing issue between groom cache and geometry cache when rendering in Movie Render Queue.
- [3ds Max] Only textures referenced in exported Materials are exported.
- [Solidworks] Default directional lights are excluded from export.
- [3ds Max] Fixed export of camera parameters for standard cameras.
- Alembic files imported as Skeletal Meshes are no longer imported if the Meshes are too big or the animations are too long. Both issues caused crashes during import.
- Fixed an issue where groom caches were not being updated when rendering through remote MRQ.
- Fixed an issue where Alembic geometry caches imported without "Flatten Tracks" had broken Meshes because the time offset computation was wrong.
- [3ds Max]: Fixed reimport of RailClone objects.
Deprecated:
- Removed support for custom extensions EPIC_animation_hotspots and EPIC_camera_controls from glTF exporter.
- Removed support for creating proxy materials from runtime in glTF Exporter.
Framework
New:
- Added support for redirecting DataTable row structs in the DataRegistry.
- Actors can now change which Asset they browse to.
- Actors can now only browse to Assets who only have an alias exposed.
- Added a config option to disable the enable / disable checkbox for plugins in the plugin browser.
- Updated plugin templates to be driven from data.
- UEditorLevelLibrary::GetGameWorld now returns the editor world instead of the game world.
- Added delegates in EdModeInteractiveToolsContext that allow UEdModes to receive Render and DrawHUD calls.
- Added a new UInteractiveToolManager::PostActiveToolShutdownRequest function that allows a Tool to request that it be shut down (for example, a Tool that wants to apply an action and exit on-click).
- Added a new UInteractiveToolManager::OnToolShutdownRequest delegate. If bound, PostActiveToolShutdownRequest will call this delegate first to allow higher-level code to handle the shutdown request (for example, by forwarding to EdModeInteractiveToolsContext::EndTool).
- Added Toolstack support to tool menus.
- Added PIE callbacks to the editor utility subsystem.
Crash Fix:
- Fixed a crash if no group Actor is selected when attempting to add Actors to a selected group.
Bug Fix:
- Fixed a bug that caused UEditorLevelLibrary::GetGameWorld to return the editor world instead of the game world.
- Fixed bug with conflicting GameInstanceIDs used by NetTrace when running multiple sessions in PIE.
- Fixed a problem when using iris replication where a NetConnection's ViewTarget was not properly updated.
- Actors and components that aren't in the current editing context can no longer be selected.
- Actors are no longer considered initialized when running deferred construction scripts due to pending Asset compilation.
- The editor now forces outstanding Static Mesh compilation when saving a world to prevent construction scripts to be deferred.
- The editor now tests if the world is valid before running deferred Actor construction scripts.
- When considering compilation for games specifically, the editor now force compiles Static Meshes of unregistered components. This also prevents unnecessary deferring of construction scripts
- Fixed an issue where child Actor components were unable to be selected in the viewport when a user is selecting components inside an Actor.
Deprecated:
- Deprecated the typed element selection set on the tool builder state. This can be replaced with the context object that exposes the typed element set within an asset editor. This fixes CIS errors and sets us up to remove this next release
UI
API Change:
- The
FGenericAccessibleMessageHandler::RaiseEvent()
function no longer takes a list of parameters and instead need to take a FAccessibleEventArgs struct. Users that use this API must upgrade the parameters to the new struct params.
New:
- UStructs can now provide a
CanEditChange
override by setting theTStructOpsTypeTraitsBase2::WithCanEditChange
trait. - The Reset to Default button is no longer hidden when a details row is disabled. Instead, it is grayed out.
- Exposed SBorder's protected methods
GetBorderImage()
andGetBorderBackgroundColor()
. - KiB/MiB/GiB/TiB are now accepted spellings for the Units/ForceUnits metadata.
- Added
TAttribute::CreateStatic()
to disambiguate in cases whereCreate()
does not correctly detect that additional arguments are meant to be forwarded to the function. - You can now drag EQS queries from the content browser and drop them into the editor world. Additionally, the EQSTestingPawn will be auto-created and set up with the selected EQS query.
- Added Widget List to Widget Reflector, which lists all currently active widgets, grouped by the location where they were created. This can be useful for pinpointing
SWidget
leaks. This requiresUE_WITH_SLATE_DEBUG_WIDGETLIST
to be defined, since it makes use of the functionality inFWidgetList
. - Created a global name filter for asset paths that external code can assign.
SBorder
now can be constructed with the.Padding(1,2,3,4)
declarative style, just likeSBox
and widget slots.- Added
SBox
overrides for settingPadding()
without constructing anFMargin
, as is the case with slots. - Details view's
IsPropertyReadOnly
delegate is now evaluated every frame instead of only when refreshing the tree, similar to howIsPropertyVisible
now works. - Added support for changing value of a
SSpinBox
using the mouse wheel. This can be enabled using theEnableWheel
argument.- Added a new metadata property called
WheelStep
to specify the step value. The default step is either 1.0, or 0.1 if clamp range is less than or equal to 10.0. - Step can be modified by holding Control (1/10) or Shift (10x)
- Both the internal
SSpinBox
ofSNumericEntryBox
andSPropertyEditorNumeric
now use this new feature.
- Added a new metadata property called
- Added the owning struct name to EditCondition error messages to make it easier to find which property is breaking.
- Changed
UWidget::GetRenderTransform()
to return a const reference instead of a copy. - Added a filtering mechanism to MainFrame's MRUFavoritesList and LevelEditorMenu's 'Open Recent Level' through an optional
DoesMRUFavoritesItemPassFilterDelegate
. - Timecode properties in details panels now support partial entry.
- Fixed the SetRowFill RowIndex parameter name.
- Editor Utility Widgets now use theirDisplay Name in the menu.
- Section buttons have been changed from a segmented control to a wrap box of buttons instead.
- Sections can now be multi-selected by holding down the Ctrl key.
- Section selector visibility can now be toggled from the options dropdown.
- Exposed
SVirtualJoystick::FControlInfo
to Slate API. UWidget::IsVisible
now checks for render opacity to determine widget visibility.- WidgetNavigation Resolve and TryRename now allow for customization of navigation behavior in a plugin for UMG.
- Added a GetTextLineCount to
SMultiLineEditableText
andSlateEditableTextLayout
to be able to get text line count. - Added AddVerifiedEditableText to
FMultiBoxBuilder
to exposeSEditableTextBlock::OnVerifyTextChanged
. - For list views, created a new delegate called OnFinishedScrolling that fires when an animated scroll finishes.
- Added new blueprint nodes to set font materials for all types of text, the default style for rich text, and editable text blocks.
- Added new options for Common Text Blocks to start and stop scrolling text through blueprint such as when a widget becomes hovered and unhovered. This also works with the overflow policy of ellipsis to turn on and off ellipsis when scrolling is active or not.
- Added new blueprint node to create a dynamic material from a rich text block's default text style.
- Refactored
FGenericAccessibleMessageHandler
to raise accessible events that include user Id and additional arguments. This allows more information to be passed around for modules that require more accessibility information, such as User or Controller Id. This creates the basis for multiple users to use the screen reader at the same time. - Added SlateScripting plugin, SlateScriptingCommands module and UICommandsScriptingSubsystem.
- Enables registering commands dynamically within existing UI Command Lists through scripting.
- Sequencer, Curve Editor, Content Browser, Main Frame, Level Editor and Level Viewports are currently the only systems exposing the command lists.
- New methods have been added to
SOutputLog.h
andSOutputLog.cpp
to create a new timestamp menu item and submenu in the output log settings menu. - The screen reader plugin can now support multiple users at the same time. Developers can provide key bindings to allow players to opt into the screen reader framework for accessibility functionality.
- Introduced screen reader navigation policies. This allows the screen reader to navigate around UI elements on the screen separate from regular Slate navigation similar to how commercial screen readers behave.
- Screen reader plugins refactor to use the new accessible focus API to support multiple simultaneous users.
Improvement:
- Menu searching now works for Material attribute properties.
Crash Fix:
- Fixed a case in the DrawLine Blueprint API where a crash would occur when points overlapped.
- Prevented a crash when opening the Static Mesh Editor when using
nullrhi
- Fixed a crash that occurs when using "Replace With" in the Hierarchy panel. This occurred when selecting a Blueprint that extends a Widget class in the Library.
- Division by zero in
SScaleBox::OnArrangeChildren
is now prevented. - Fixed
nullptr
dereference when the level editor module is being unloaded since the tab's parent is already de-allocated if the engine is exiting. This bug is also prevented in Slate altogether. - Fixed a crash that would occur when auditing static meshes with no static lighting enabled.
Bug Fix:
- Increased Content Browser item description width to 700 in tooltips.
- Property matrix now correctly displays EditCondition checkboxes only when applicable to the row. Property matrix rows also hide if the EditConditionHides metadata is set.
SEnumCombo
now only dismisses its own menu when an option is selected.- Expanding the Advanced subcategory no longer causes previously collapsed nodes to re-expand.
- When multiple components of an actor are multi-selected and edited at the same time, all of them will now receive a
PostEditChangeProperty()
call. - Details row TitleProperty values are now retrieved recursively. This was a regression from UE4 that caused issues in cases that should have worked, such as with an array of instanced objects, because the category node would cause the search to end.
- Viewport overlay widgets are now visible even when rendering a full-screen UMG widget.
- Color picker for color properties on externally added
FStructOnScope
properties now resets and cancels correctly. - Show Only Modified now accounts for the visibility of a custom reset to default handler provided to
FDetailWidgetRow::OverrideResetToDefault()
. - Scrolling a row out of the visible region of the Details view now commits any changes that were being made to that row.
- Numeric properties can have ForceUnits metadata specified for them even inside containers.
- The
FPrimaryAssetId
selector now respects DisplayThumbnail metadata. - Removed the Create menu's "Blendables" category.
- The
UObject::IsSelected
onUVisual
is now hidden to avoid confusion with UI selection state - It is no longer possible to dock tabs into docking areas that are contained inside the tab.
- Added Bengali, Gujarati, Odia, Kannada, Malayalam and Tamil to the list of character ranges that require complex text shaping.
- You can now search for basic shapes in the Add Component list.
EditDefaultsOnly
properties onUUserWidgets
now appear in the UMG Designer details panel.- Fixed an issue preventing edits to Timecode properties in the Details panel from being correctly recognized in the undo system.
DefaultGameMoviePlayer
now makes sure that a loading screen shows the User Widget until the end of the loading screen.- Fixed a case where
ContentBrowserDrawer
is not marked as the primary content browser when selected inChooseNewPrimaryBrowser
. - Correction to SceneViewport to use the cached display metrics instead of the Initial ones which could cause issues when monitor settings or resolution changes when the engine is running.
- Correction to BP node Play Animation with Finished Event to correctly trigger the finish event on the next frame even if the game is paused and prevent from triggering it if the widget no longer exist.
- Fixed issues when multiple Widget Interaction Components focus on the same widget.
- When replacing a binding with new widgets, UMG will move the content of the old binding to the new one rather than reuse the existing binding. This fixes issues where UMG would incorrectly keep old possessable bindings.
- Curve Editor Stacked View now properly renders labels.
- Re-enabled color override for the Editor window title bar.
- The Rendering > Advanced > TextureStreaming/LOD/etc. categories now use the correct display name.
- NameContent in Details panel rows now correctly respects user-defined HAlign, allowing for labels to contain a HorizontalBox with both left and right aligned slots.
- Details value widgets are no longer stretched due to property rows having a minimum height.
- Advanced dropdowns in the Details panel no longer randomly disappear when scrolling.
- Fixed a bug that caused some calculations with shadow offset not to consider font scale.
- Fixed an issue where nested utility widgets could cause the open Level to be dirtied since they wouldn't properly be marked transient like the outermost utility widget.
- Fixed issue where string table selection combobox wouldn't show the filter text box anymore if there were no results, making it impossible to clear.
- Fixed a bug that would occur in List Views when changing the Consume Mouse Wheel setting to "When Scrolling Possible". This bug caused mouse wheel input to fail being consumed when scrolling up.
- Fixed an issue where timestamps in asset auditor would use month instead of minute.
- Fixed an issue where timestamps in the asset auditor would incorrectly clear when a custom audit is cancelled.
- Fixed typos in "toggle screen messages" outputs.
UX
New:
- Projects and plugins can now provide enhanced tooltip content for the editor, and they can override the default tooltip content.
- If you use the
SDocumentationTooltip
widget, or standard UI items such as menus that createSDocumentationTooltip
widgets, you can provide content for enhanced tooltips in theDocumentation/Source
folder of your plugin or project. - You can override default enhanced tooltip content by providing files with the same path and excerpt names as the default ones in
Engine/Documentation/Source
. - If an enhanced tooltip excerpt contains a variable named
[VAR:ToolTipOverride]
, the content of that variable overrides the default content for the initial simple tooltip. - If you have documentation that you want to link to from editor widgets or enhanced tooltip content, you can now provide your own custom base URLs. You can define these programmatically by calling
IDocumentation::RegisterBaseUrl()
, or in the*Editor.ini
file as follows:[/Script/Documentation.DocumentationSettings] +DocumentationBaseUrls=(Id="ID",Url="http://myBaseUrl/{PAGEID}")
- You can specify the base URL ID any time you provide a page ID for a documentation link. For links in code, the methods in
IDocumentation
now accept an optional parameter. For links in enhanced tooltip files, specify the ID in the tooltip file in either theBaseUrl
metadata at the top of the file, or in the[VAR:BaseUrl]
variable within the excerpt.
- If you use the
- VR Editor: Added a dropdown menu to the VR Mode toolbar button which you can use to quickly change between the standard VR Editor Mode and specialized modes such as Virtual Scouting.
- Rather than specifying VR interactor or teleporter class overrides directly in editor preferences, these are now determined by selecting a blueprintable subclass of VREditorMode.
- The "experimental" warning popup no longer displays if the Virtual Scouting class is active.
- You can now use Shift+ left-click to duplicate-drag a pin connection.
- Scene Capture render targets now start with the alpha channel disabled.
- Created the experimental Landscape Texture Patch Component to apply repositionable, texture-based landscape height and weight map edits (editor-only).
- Added proper support for property change type in the spline component visualizer (interactive changes when manipulating spline points, non-interactive change at the end of the drag operation).
- Added Project Settings to deactivate landscape or water mesh updates during interactive changes of water body or island splines.
- Reorganised Water Editor Project Settings.
- Unified landscape brush command shortcuts with other modeling tools
- Added a command to change both the brush size (left-right mouse move) and falloff (up-down mouse move). The default keyboard shortcut is Ctrl + Alt + right-click drag.
- Added a DoesCommandSupportInput function to the editor viewport client in order to centralize copy/paste logic.
- Improved formatting of landscape notifications.
- Added BP setters for ForcedLOD and LODBias on landscape components.
- SetLOD can now be called both at runtime and in-editor.
- Added buttons to select all landscape spline segments or control points.
- UWaterMeshComponent::ShouldRenderSelected is now editor-only.
- Added visual logs for when the cache data is accessed and when the cache is expanded.
- Cache area is now aligned on the whole landscape to avoid expanding the cache when expanding the cached area within the limits of an already sampled landscape component.
- Decoupled the rendering of the water information texture (flow, depth, and shape data) from the landscape.
- Implemented separate render passes leveraging the SceneRenderer interface to draw the water data at runtime.
- Added a new optional Water LOD system which replaces water mesh tiles at a distance with simplified, non-dynamically tessellated meshes. This allows the water rendering system to scale for large worlds without needing to increase the resolution of the Water Info texture.
- Added functionality to open other Content Browser instances by right-clicking on the tab of a Content Browser.
- Changed the Close Tab keyboard shortcut from Ctrl + F4 to Ctrl + W.
- Checkboxes in filter menus now show an indeterminate state when items in the sub-menu are a mix of enabled and disabled.
- The Details Panel now shows a modified badge when any view option that filters down the results is active.
- Renamed Select Mode in the Level Editor toolbar to Selection Mode.
- Add functionality to the Outliner to see the current hierarchy of items stacked at the top. This can be enabled by enabling the Stack Hierarchy Headers option in the Outliner.
- Exposed a function to sync to the current folder in the Content Browser to scripts.
- Added a notification for when all Content Browsers are locked and the user tries to open one.
- Redesigned the Physics Asset Profiles panel to be aligned with the UE5 style.
- Added functionality to scroll to the current selection on pressing the F key in the Outliner.
- Updated the column view in the Content Browser to use similar workflows as other column views in the editor (like the Outliner).
- Water bodies with null materials can now cut holes in the water mesh quad tree.
- When an item in the Outliner is selected and collapsed, the parent items are now highlighted.
- Updated async notifications to be consistent with the UE5 style for all notifications
- Added support for collision view mode for landscape heightfield collision components. The collision data is displayed when the CVar ShowFlags.Collision is set to 1. The CVar "landscape.ShowCollisionMesh" is used to determine which heightfield is displayed: 1 corresponds to the complex heightfield, 2 to the simple heightfield, and 3 to the editor-only heightfield.
- Added a one-time popup for a user's industry for analytics. This popup can be suppressed either by turning off all analytics or specifically with bSuppressIndustryPopup on UAnalyticsPrivacySettings.
- The Level Editor now supports up to 4 Outliners that can be enabled from the main menu (Window > Outliner).
- Added a dedicated set of icons for Plastic SCM.
- Added an edit layer insertion dialog prompting the user to choose where a new edit layer should be inserted in the current edit layer stack.
- Added options to expand or collapse all items to the Outliner Settings menu.
- Changed the Save and Browse buttons on Asset editor toolbars to icon-only.
- Added filters for Material Layer Instances and Material Layer Blend Instances to the Content Browser and Reference Viewer
- Disabled the Pinned Column and Context Menu options in the Outliner on maps with World Partition disabled.
- Renamed the Level Column to Package Short Name in the Outliner on World Partition-enabled maps.
- Adding BoldItalic and Italic font style to FStyleFonts. These are used in the AnimCurve viewer and Class Viewer respectively.
- You can now use the Shift + Click shortcut to copy / paste in the Details panel.
- Added support to copy / paste between different color types.
- Added AllowCreate to
SObjectPropertyEntryBox
/SPropertyEditorAsset
to prevent creating new Assets from the asset picker. This behaves similarly to NoCreate metadata onUPROPERTY
, but allows on a non-property based customization. - The editor now allows painting on the edges of landscape components.
- Added option to export a single file for grid-based worlds.
Improvement:
- Landscape scene proxies are now only refreshed if CVarLandscapeShowCollisionMesh has changed from the previous value. This prevents hitches when unrelated CVars are modified.
- The details section API has been rewritten so that categories can now be part of multiple sections simultaneously.
- Sections are now sorted alphabetically. General and All are special-cased to be the first and last categories respectively.
- Reference Viewer now indicates when the breadth limit has been reached.
- Reference Viewer Overflow nodes can now be expanded by double- clicking.
- Reference Viewer UI is more responsive when changing the search depth on large scenes.
- Edit layer heightmaps and weightmaps are now properly deleted when deleting landscape components.
- Landscape notifications have been reworked for better readability and to improve notification clutter issues.
Crash Fix:
- Fixed a crash that happened when trying to access the visibility landscape mask on mobile: when the mobile mesh path is enabled, there's no such texture. This means that GlobalDistanceField will not support landscape visibility.
- Fixed a crash that occurred when deleting components because the deleted components were still referenced in the shared weightmap texture usages.
- Fixed a crash that occurred when using an invalid scale factor on the landscape copy/paste gizmo.
- Fixed a crash that occurred when invalidating the lighting cache on landscape components.
- Fixed a crash that occurred when adding spline points to oceans with non-zero shape dilation.
- Fixed a crash when saving an existing, already-saved map containing a dirty landscape using Save As to rename it.
- Fixed a crash when loading some Landscapes with ES3.1 preview render mode enabled.
- Fixed a crash that occurred when copy/pasting landscape and water bodies across levels.
Bug Fix:
- Fixed multiple issues with highlighting and deleting links using Alt + left-click when both ends had multiple links.
- Ctrl + mouse wheel in Foliage editing mode now correctly adjusts size in 5% increments per mouse wheel click.
- Fixed
GetCompleteBounds
calculation in World Partition worlds when the Landscape is composed of only a single streaming proxy. - Fixed a bug that caused Scene Capture render targets to display as a checkerboard in Texture Editor.
- Fixed the "change landscape brush size / falloff / strength" commands that couldn't work with default chord values nor secondary key bindings.
- Fixed "cmd" modifier not being taken into account all the time in copy/paste logic.
- Fix an empty notification being shown when all remaining undo / redo transactions expired.
- Fixed missing render dependency in Landmass (noise texture), which could lead to blockiness when the brush was running without the texture being fully loaded.
- Fixed viewport not updating when switching landscape visualization modes.
- Fixed Painting Restriction not appearing when there's no active paint layer.
- Fixed "Use target value" in the landscape UX being displayed for sculpt tools while it's only valid in paint mode.
- Sanitized suggested landscape layer info package name when creating a landscape layer info file associated with a layer name (which doesn't have the same restrictions that package names have)
- Added support for non-square heightmaps in landscape edit layers local merge
- Landscape edit layers local merge fixes.
- Fixed assert when updating heightmaps of different sizes
- Protected double-click behavior in the Outliner against deleted actors.
- Fixed incorrect removal of IsGameWorld check in world partitioned-worlds.
- Fixed a bug where ActorDescReferences was incorrectly used for PIE worlds.
- Fixed various places where components within the LandscapeComponents member of ALandscapeProxy could potentially be null (they are null in the dedicated server).
- Unified text formatting of double properties on set.
- Fixed a delay of many frames while the landscape BP brushes were asynchronously waiting for the required materials to be compiled.
- Added support for subsections in landscape edit layers local merge.
- Fixed bHasLayersContent not being set properly for the main ALandscape actor in distributed landscape setups (One ALandscape, multiple ALandscapeStreamingProxy actors), which incorrectly dirtied the Level.
- Fixed water brush letting the user change the list of affected weightmap layers while it's actually automatically populated by the list of layer names specified in the water bodies.
- Fixed weightmap changes on water bodies not triggering the appropriate water brush updates.
- Fixed landscape tools using ShowForMode not displaying properties when in weightmap mode with no active paint layer (Use Target Value and Painting Restriction).
- Made landscape edit layers read-only, removed related context menu and prevent layer reordering in non edit layers- related landscape tools (Component Add/Delete/Move/Select,Mask,New/Resize Landscape)
- Don't use a modal error message box when the currently selected edit layer is locked in those tools (since they're not edit layers-related)
- Fixed transaction localization for landscape resolution change * Fixed New Landscape - Fill World not being transacted
- Fixed assert when iterating over components from a parallel (game) thread.
- Delayed the call of CustomBrush_Landmass's GetBlueprintRenderDependencies so that it doesn't start updating it until the brush is ready.
- Memory reports now properly account for landscape collision.
- The editor now logs an error when reading inavlid texture data on the CPU with SplineFalloffModulationTexture for Layer Info Object and doesn't apply modulation.
- The editor now logs an error and reverts to the default texture when reading invalid texture data on the CPU for the alpha brush's AlphaTexture.
- Fixed undo/redo for Layer Info Object not triggering an update of the landscape splines.
- Landscapes no longer incorrectly start updating before their textures and materials are streamed in and compiled.
- Landscapes with Landmass no longer flatten the first time they update when On Demand Shader Compilation is enabled.
- Fixed data caching function used in the Smooth and Flatten tools when using combined layers.
- Fixed ASan issue with dirty data (weightmap/heightmap texture resolving debugging code) by removing usage of lambda in favor of direct call to the dirty function.
- Fixed redundant ifdefs and invalid comments.
- Removed overallocation of material instances array (was previously done to account for hardware tessellation which doesn't exist anymore).
- Renamed FLandscapeEditLayerReadbackResult to FLandscapeEditLayerComponentReadbackResult to better match what it actually is and changed the output type of readback results from ResolveLayersTexture from a map to an array.
- Water Body components now have custom scene proxies which contain the geometry describing that water body as well as a small dilation region to solve undersampling issues with the water info texture.
- Fixed an issue with resizing of new or imported landscapes by dragging the boundaries not working.
- Fixed a bug causing no visual indicator highlighting the current selection when using arrow keys to navigate dropdown menus.
- Fixed default water brush and water zone spawn behavior to more intelligently choose the correct landscape, support multiple landscapes, and set the zone bounds to properly match the landscape.
- Fixed a bug where top-level menus would draw over tabs in certain situations.
- Fixed curl noise being applied in both jump flood and cache distance field materials for water bodies, causing deep pockets near the shorelines.
- Z scaling and non-Z rotation is now allowed for water bodies not rendered by the water mesh.
- Fixed issue with lingering river mesh components after performing an undo operation.
- Fixed missing Water in Water Waves Asset Editor.
- Added a minimum size to the Sources Panel headers in the Content Browser to prevent overlap.
- Fixed an issue causing drag on the splitters to fail in certain situations
- Fixed Landscape.DumpLODs console command not producing output.
- The editor now correctly sets the ParentTab for StaticMeshEditorViewport on spawning that tab, and also checks SEditorViewport::IsVisible for StaticMeshEditorViewport visibility, as it takes into consideration last time on screen.
- Fixed a bug causing search text in the Content Browser context menu to disappear sometimes.
- Fixed a bug in the Outliner causing an item to get deselected if it was collapsed.
- Fixed an issue where frame notifications couldn't be dismissed if they would also time out because the pointer would reset.
- If dismissing a toast created by the message log, the toast's expire duration is now correctly set to 0.
- Fixed a bug that affected single-file export for heightmaps/weightmaps.
- Fixed a problem where users couldn't import a single heightmap/weightmap file if it was named with the same prefix as the grid-based ones located in the same folder (for example,
Heightmap.png
withHeightmap_x0_y0.png
, etc. being present in the same folder). - Fixed an assert when generating grass while there's actually no grass data.
- Altered the ContentPadding of the WrapButton ComboButton so that the button appears as a circle, instead of the football shape that appeared previously.
- Added the access specifier to Variables under the My Blueprint view.
- Landscape preview settings no longer affect actual Landscape rendering.
- The editor now checks that LastOuter is valid before dereferencing.
- Fixed a bug where a map load triggered navmesh rebuild.
- Fix an Asset importing error after deleting
MobileStarterContent.upack
. - Fixed an issue with water textures being generated in-editor at insufficient resolution.
- Fixed landscape not updating on changes to water on Mac and Linux.
Deprecated:
- The old WaterVelocityTexture has been deprecated and no longer contains data.
- Renamed EditorViewport.SubMenu.Layouts in StarshipStyle to Icons.Layout and moved it to StarshipCoreStyle.
Foundation
New:
- A Force reload option has been added for the AutomationOpenMap function.
- Support for individual test exclusion for different RHI when parent suite does not exclude all RHI Enhanced management of RHI through the UI If a RHI is specifed, any child test can be excluded on an additional RHI by clicking on edit exclusion.
- Made AFunctionalTest's Author and Description public properties.
- Used dot syntax to name Blueprint functional tests instead of using the full package path. (replacing / by .)
- Added an option to keep Play-In-Editor(PIE) open in the advance settings of the Test Automation Window.The Default behavior is off, however this behavior can be changed through project config settings.
- Improved test exclusion list mechanic.
- Renamed blacklist to excludelist.
- Support has been added for the section exclusion rule to be able to exclude entire section of tests.
- Marked excluded test as skipped in the report instead of entirely removed for test list. A check has been added for exclusion just before running the test.
- Added support for exclusion management from the Test Automation window and added a column at the end of each row.
- Exposed device information to the UE test report.
- Added support for metadata in Gauntlet test report for Horde Limitations.
- Management through the UI is limited to which tests are available through the active worker node. This means Runtime only tests are not listed from a worker that is Editor and platform specific, and are not clearly identified.
- Added support for Blueprint Editor Utilities in UE functional tests
- Added a SetFilter command to the Automation framework.
- Debug Hud - Stat rendering optimizations. This cuts the cost of DrawStatsHUD by about half.
- Added Draw text effects (shadow, outline) in same pass as main text draw to avoid calling draw several times.
- Updated the CharacterList to cache the FCharacterEntry's directly to avoid creation/copying of them.
- Updated FBatchedElements::AddVertex function to takes float vectors to avoid expensive LWC conversions.
- Only set SImage MouseDown and DoubleClick event if bound. This can save memory when there are many widgets.
- Added bAutoCollapseWithEmptyText to UCommonRichTextBlock to mirror UCommonTextBlock.
- Adding ForEachLoadedAsset to FStreamableHandle. This allows for operations on the loaded assets without creating an intermediate array.
- Tabs can now be inserted into the tab list.
- Added the TabIndex parameter to RegisterTab. If a new tab is being inserted before the end of the list, the tab list will rebuild the tabs in correct order.
- Added the option to defer rebuilding till next tick.
- Added GetTextStyleSet function to URichTextBlock.
- Set ConfigCache GetXOrDefault to return value from the config or default value.
- Set OodleDataCompression to use one OodleScratchBufferCount per core in tools. It will still default to 2 Buffer counts per core for game runtimes. This results in a significant speedup in iostore compression at fast compress levels.
Bug Fix:
- Avoided duplicates of Screenshot comparison artifacts when producing automated test html/json report.
- Automated Test report path will now log only if it was generated.
- Fixed Previously Excluded Test from not inheriting exclusion settings from the parent suite.
- Added a Fix for incorrect return values for FUntilCommand.
- Fixed Functional test from not running when the Navigation System is disabled.
- Validated that the item at the tail of the automation latent command is the item that is completed before removing it.
- Fixed Automation Worker Instance Name from not being unique for some console platforms.
- Fixed const in FAutomationTestBase::TestEqual function signatures.
- Fixes for UCommonActivatableWidgetSwitcher. If the switcher has an owning activatable widget, only activate switcher child if the owning widget is active.
- Fixed issue in UPlayerInput where analog values weren't cleared when flushing pressed keys.
Deprecated:
- Deprecated FAutomationTestBase::SetSuccessState and FAutomationTestBase::GetSuccessState functions.
Removed:
- Disabled exclusion editing on remote sessions.
- NotEnoughParticipant state in favor of Skipped.
- Implicit conversions from large world coords to floats by explicitly using float vector types.
- Direct index cache from the CharacterList as it didn't actually make it faster due to the complex logic when getting a character.
- Unnecessary include libraries.
Build
New:
- Added .so and .dylib as files to consider as library files to help reduce relinking on Mac and Linux.
- Added the ability to compile specific files while a live coding session is active. The output is sent to a different location to prevent conflicts with overwriting object files for the live coding session.
- Updated EpicGames.Build to be a .NET 6 project.
- Added Unreal Build Tool plugin support. It is currently only used by C# UHT.
- Added XGE config bUnavailableIfInUse to allow falling back to a different executor if XGE is in use.
- Added XGE config MinActions to avoid using XGE for small groups of tasks.
- Modified assembly cache to not include "ref" or "refint" directories which contain the reference dlls.
- Added an option to include the CPP/WinRT language projection headers and set the TargetWindowsVersion to the configured value when using Windows 10 SDK.
- Deprecated bCompileForSize UBT Target option and replaced with OptimizationMode enum to fine tune a balance between speed and code size.
- Rewrote the GenerateClangDatabase mode in UBT to work with the clang tools like IWYU.
- Updated the unity file logic in Unreal Build Tool to merge generated cpp files and module cpp files into the same unity files to improve compile times. This can be disabled globally by setting bMergeModuleAndGeneratedUnityFiles in the target to false or in a module by setting bMergeUnityFiles to false.
- Extended BuildLibForMac.command with more options and better option parsing.
- Added support to inline the generated cpp files into the module cpp files using a new macro UE_INLINE_GENERATED_CPP_BY_NAME. This improves compile times because less header parsing is required.
- Added support for targeting arm64 on Win64 with VS2019 in the UAT BuildCMakeLib command.
- Added a mode called PrintBuildGraphInfo to Unreal Build Tool. This mode prints out build information that can be used to help guide compile time improvements.
- Added the ability to override the NumIncludedBytesPerUnityCPP from the module rules. This can be used to improve compile times by breaking up large unity files into smaller pieces.
- Updated several modules to use shared precompiled headers to improve compile times.
- Added support for targeting the Unix platform group in the UAT BuildCMakeLib command.
- Added a "deprecation" path for engine includes to allow types to be moved without breaking licensee module builds.
- Non-engine modules and targets will have to specify the version of includes from IncludeOrderVersion in TargetRules or ModuleRules. This setting will control the value of UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX where XXX is the version of the engine.
- When moving types out of a header, Users will need to include the new location of the type in the header it was removed from but only if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX is set.
- If a target does not change its IncludeOrderVersion to the latest version, UBT will print out a message telling users how to upgrade.
- This change introduces a new set of SharedPCH permutations to make sure modules with older versions get the PCH with UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX set correctly.
Improvement:
- Updated several modules to compile with unity files to improve compile times.
- Updated several modules to use shared precompiled header files to improve compile times.
- Optimized Unreal Build Tool's startup time.
Bug Fix:
- Enabled the reference assembly to be generated in the old location for all projects that include the UE C# props file.
- Marked UnrealBuildConfiguration to be serialized to json as a string.
- Ignored compile actions that aren't using the C++ compiler when doing live coding. Resolves issues where changes that would contribute to the resource file would cause live coding to fail.
- Fixed issue where compiling script modules in UAT where all modules were up-to-date would result in extra assemblies being returned.
- Properly exclude build records which fail to parse from the active set of build records.
- bStressTestUnity will now supersede adaptive unity.
- Fixed an issue where the generated cpp files were not including the needed headers for the types that were marked in the header file.
Removed:
- Removed several private precompiled headers to improve compile times.
Core
API Change:
- FMath::Min/Max now rely solely on a definition of operator
<
instead of needing overloads for operator<=
and>=
respectively, so uses of these functions with custom types will now require operator<
to be defined. - Experimental support for C++ Coroutines which can be used by setting bEnableCppCoroutinesForEvaluation to true
- The default type for all integer types remains int32.
- The base-global-module argument is now expected to be in the format --base-global-module=ModuleName.
- The API previously allowed names up to 256 characters. Callers using longer names will need to use shorter names to avoid a failed assertion.
- Replaced PanicFlushThreadedLogs with Panic when the program will be forced to terminate, and with Flush otherwise.
New:
- Added the trace.bookmark console command which emits a TRACE_BOOKMARK. You can provide the argument with a single string which then becomes the bookmark name.
- Added descriptions for various stat EngineStat commands. The stat description has been added to the output of
stat help
. Using the command -stat detailed
will display the build string version (which includes changelist). - Added support for symbols such as "%c" width formatting in FGenericWidePlatformString. Supports "+" and "-" followed by digits as well as "*" for integer value argument.
- Changed definition of FMath::Min/Max to be based on less-than comparisons. This both improves code generation in certain situations and makes it easier to use them with custom types.
- Implemented a quick workaround to allow munmaps to happen with Mutex unlocked. Currently, We can't define UE_ALLOW_OSMEMORYLOCKFREE on Linux as we'll deadlock with the OsAllocatorCacheLock.
- Mutex locks Munmap calls on Linux can take quite a bit of time (few ms in some cases). This should allow these to happen without the Mutex and remove some hitching.
- Added context to PostCDOCompiled and call it for skeleton-only compiles
- Support for serialization of TVariants has been added.
- You can now optionally allow Blueprint class property GUIDs to be included in a cooked build.
- Added "OnConfigSectionsChanged" delegate to FCoreDelegates, notifying bindees when the config is updated.
- Added boolean bIsRegeneratingOnLoad to PostCDOCompiled context.
- Allowed the meta-data for generated types to be cooked as optional data, for use with cooked editors.
- Added FCoreUObjectDelegates::OnObjectPostCDOCompiled.
- Added debugger visualizer for FIoStoreTocCompressedBlockEntry.
- Refactored reference chain searching to handle multiple objects at once to reduce time spent scanning all objects and creating/deleting temporary structures.
- Added ShortestToGarbage option to prevent duplicate reference chains by the root reference and the first garbage object encountered.
- Added Special cases for the FGCObject referencer to avoid unhelpful deduplication.
- Defined a new Tag for PluginBrowser allocations.
- Added a struct FTopLevelAssetPath to represent the path of an object whose direct outer is its containing package. For example: /Path/To/Package.AssetName
- Improved support for TVariant visitors that use rvalue-reference function parameters.
- Added tagging for unassigned allocations.
- Added TEnumFlagsRange which enables iteration over each flag set in an enum flags variable.
- Unified a Play-In Editor(PIE) world leak that was reporting with LoadMap leak reporting.
- Added metadata to crash context for hung thread or present hangs.
- FNames containing full object paths have been deprecated across the engine. These strings are redundant and can take as much as 30mb of memory in a large project.
- Added a
TIdentity_T<>
alias for typenameTIdentity<>::Type
. - Added Peek to TSpscQueue and TMpscQueue.
- Added append to FString overloads for BytesToHex[Lower], FSHAHash, FGuid and optimized them.
- Added a command line argument for underrun mode.
- Added automatic bool-to-integer property conversions.
- Added UE_ prefixes to math macros, and conditionally deprecated the old macros with a preprocessor switch.
- Added TArray::Append which takes a parameter for any contiguous range.
- Added a IsEmpty function to TSpscQueue and TMpscQueue.
- Always log out config console variable settings when the last write to the console variable was from the constructor.
- Added FGCObjectInfo::IsGarbage function to check Garbage and PendingKill flags.
- Renamed garbage streaming levels before GC so that new copies of them can be reloaded when leaks occur with GC reference elimination (pending kill) disabled.
- Moved TIsCharEncodingCompatibleWith, TIsFixedWidthCharEncoding and TIsCharEncodingSimplyConvertibleTo traits into their own header files.
- Added conversions for UTF32CHAR-to-UTF8CHAR to FGenericPlatformString::Convert.
- Windows memory mapping improvements have been added.
- Added extra information to fname.stats command for hash table memory usage.
- Fixed units for fixed overhead.
- TArrayView is no longer passed by a const reference in TSet::Append
- Added a TSet::Append overload for TArrayView of const argument type.
- Added a component-wise multiplication operator to FIntVector.
- Added Support for RotationVector conversions to Quat.
- Added additional
TCString<UTF8CHAR>
functionality. - Added GET_VARARGS_RESULT_UTF8 macro.
- Moved TMakeSigned and TMakeUnsigned into their own header files.
- Added TasksInsights visualization for parent tasks.
- Updated UE::String::Find* to accept UTF8CHAR views.
- Added
TCHAR<->UTF16
andTCHAR<->WCHAR
support in StringConv.h for UTF-8 mode. - Added support for FGenericPlatformString::Convert and ::ConvertedLength with null-terminator.
- Added UTF16TEXT macro.
- Added MakeUniqueForOverwrite.
- Added MicrosoftPlatformCrashContext and MicrosoftPlatformStackWalk to share code between Microsoft platforms.
- When sync loading a package, Zen Loader will only execute nodes required for that package to finish loading.
- Enabled interface support for AddDynamic and BindDynamic on delegates.
- Added a minor improvement to deadlock detection in Tasks System. It will now detect waiting for task completion from inside that task execution, even if inside its inner task.
- Added functionality to Tasks Insights tracing task destruction and a context menu item to jump to task's DebugName in IDE if it's a source location.
- Added a mode for garbage collection to report a sample of garbage references rather than all of them. This mode can be enabled by setting gc.GarbageReferenceTrackingEnabled to 2.
- Renamed leaked packages in in LoadMap during GC reference elimination. pending kill is disabled so that new copies of those maps can be loaded as free memory allows.
- Fixed a missing log in LoadMap when ensures are compiled out.
- Added ConstCastWeakPtr and StaticCastWeakPtr functions to match the SharedPtr and Reference equivalents.
- Added nodiscard to relevant sharedptr-related functions.
- Downgraded failure to obtain package name from file name to a warning in IoStore.
- Platforms can now opt-in to all-thread backtraces, defaulting to on for Windows and Mac.
- Fixed WaitUntilTasksComplete function to tolerate null tasks to TaskGraph.
- Moved support for adding all thread callstacks to crash context from Windows to Microsoft.
- Added TObjectPtr support to delegates.
- Added FORCEINLINE to TIndexedContainerIterator dereferencing operators.
- Added missing LLM tracking tags. Untagged Allocations went from > 40000 untagged allocations to 4400.
- Instrumented new ParallelFor tasks for Tasks Insights. Markers for ParallelFor tasks now show task lifetime events, and point to which ParallelFor they belong to.
- Added Extra GC logging from gc.GarbageReferenceTrackingEnabled . Logging will be completely removed in shipping builds regardless of the settings of the console variable.
- New updates for TasksInsights. When selecting a ParallelFor timer it will draw arrows to and from its ParallelFor tasks.
- DepletableMpscQueue - a multi-producer/single-consumer concurrent atomic queue that consumes all items at once, atomically, and leaves the queue in a usable empty state.
- Added support for custom allocator for TSpscQueue and TMpscQueue.
- Added Math constant constexprification and outlining to reduce massive code bloat.
- Added delegate FCoreUObjectDelegatess::GetGarbageCollectReportGarbageReferencers for adding additional debug information to garbage reference tracking in GC.
- Added GarbageObjectsToVerify function to world context to verify that important objects are cleaned up on world transitions.
- Added commands -DebugCoreRedirects and -FullDebugCoreRedirects to the command line parameter that writes to the log when reading and applying core redirects.
- Included referencing property information in HandleGarbageReference since it's guarded by a console variable. Allow ENABLE_GC_OBJECT_CHECKS to be overriden outside of GarbageCollection header file.
- Added command-line options for -EnablePendingKill and -DisablePendingKill to override config setting.
- Added ForwardAsTuple function as a mirror of std::forward_as_tuple.
- Added C++ Coroutine Task implementation and support classes.
- Added support to cross-compile editor plugins through the runUAT BuildPlugin.
- Improved struct packing for TCounter from 32 to 20 bytes, and FScopedDetailTickStats from 32 to 24 bytes.
- Added a lower case digits mode for FGuid::ToString.
- Improved scoped cpu timers for FEngineLoop.
- Added cpu timers for FEngineLoop::Tick, HeartBeat, TickHotfixables and TickRenderingTickables.
- Added a scoped cpu timer for FStats::AdvanceFrame.
- Made TVector2::Normalize function return a bool indicating whether the normalization was successful, matching the TVector::Normalize function.
- Added FloatCastChecked and FloatFitsIn for runtime validation of acceptable precision loss when casting between floating point types.
- Added support for signed and unsigned variants of FIntVector, FIntPoint, and FIntRect types.
- Added support for 32 and 64 bit variants of FIntVector, FIntPoint, and FIntRect types.
- Added functions ToHostLineEndings and FromHostLineEndings for FString converting between different platform line endings.
- Updated Oodle to version 2.9.8. Several Oodle Texture encoder improvements to quality and performance, much faster encoding on M1 Macs.
- Added log highlighting, based on log category and log search string. It uses the following Command line commands: -LogHighlights="LogNet Cyan, LogTemp Green" -LogStringHighlights="UNetConnection::Close=Purple, NotifyAcceptingConnection accepted from=DarkGreen"
- Added AssetSizeQuery commandlet for rapidly getting asset size breakdown by class. The class summary and assets can now be saved to a .CSV.
- Assets can be filtered by a wildcard match. This requires the compressed size to have been written back to the asset registry after staging.
- Added FTopLevelAssetPath struct to represent the path of an object whose direct outer is its containing package.
- Moved utility functions related to linker tables from FLinker to FLinkerTables to be able to have access to these functions from the AssetRegistry code
- Garbage Collector can now store information about traversed references which can then later be searched through with FReferenceChainSearch.
- FReferenceChainSearch will no longer store raw pointers to UObjects when constructing reference chains, instead it will only preserve basic information about UObjects that are separate from UObjects themselves so that FReferenceChainSearch objects can be used more than one frame.
- Expanded LoadMap world leak tracking to add configurable severity and separate console variables for shipping configuration. This reduces memory usage and adds a low memory usage option for approximate direct reference and outer chain checks.
- Added support to writing platform specific tags to the asset registry during cook by the book.
- Allow command line arguments to the engine in LowLevelTests.
- Added ParallelForWithExistingTaskContext, which is similar to ParallelForWithTaskContext except it takes a pre-allocated array of task contexts and launches one task per context.
- Limited derived data cache bucket names to 63 characters.
- Updated FSoftObjectPtr values stored in the asset registry tags to match the current format returned by FSoftObjectPtr::ToString.
- Added IRequestOwner::LaunchTask to DDC to easily chain together tasks and cache requests.
- Updated Mac and Linux to use libcurl 7.83.1.
- Added a partial derived data cache record propagation to the hierarchy.
- FEditorBulkData can now attempt to read payloads from package files without a valid attachment to the file on disk.
- Added specializations of TValueOrError for void value and error types.
- Added TryReadLock and TryWriteLock to FRWLock.
- Added functions to serialize derived data cache types to and from compact binary, including strings wherever appropriate.
- Serialized PKG_Cooked and PKG_ContainsNoAsset in the package flags in the FPackageFileSummary.
- Restricted the giant FGCCSyncObject and FUObjectHashTables locks to the reachability analysis phase.It is possible to toggle to the previous legacy behavior with the command gc.LockBehavior=1.
- Changed the CppStructOps registration code to use struct path names instead of short names. This allows identically named native structs to be registered in different modules
- Printing references to stale objects will now take into account GarbageCollectorKeep flags that can prevent an object from being Garbage Collected even though it's not referenced.
- Added UStruct::GetStructPathName and UClass::GetClassPathName functions that return an FTopLevelAssetPath type instead of an FString. This means that the engine is now enforcing UClasses and UStructs to be 'top-level objects'. Their Outer object can only be a UPackage object which has a null Outer object.
- Added new utility functions that can be used to fix ANY_PACKAGE deprecation warnings. These functions include - UClass::TryFindTypeSlow, - UClass::TryFindTypeSlowSafe, - UClass::TryConvertShortTypeNameToPathName, and - UClass::TryFixShortClassNameExportPath.
- Converted hardcoded short class and enum names to pathnames due to ANY_PACKAGE deprecation.
- Added EPropertyFlags::CPF_NonNullable that can be used with FObjectProperty to ensure that setting nullptr to the property is a no-op and the set has no effect.
- Added empty directory deletion to derived data file system cache store maintenance
- Added automated startup tests to check if class / struct / enum / property metadata contains values with short type names to help with deprecating the ANY_PACKAGE macro.
- When an assertion fails, logs will now be Flushed to provide more details in the debugger and log files.
- Per object config sections can now also contain class path names.
- Added the Packaging Reference Chunk Database system. This allows projects with iostore containers that have already been deployed to customers to upgrade or change packaging compression settings and avoid re-deploying content to end users.
- This provides the previously deployed containers, and chunks containing the same data will be re-used instead of re-compressed.
- Added Asset Bulk Data Diff Commandlet.
- Added "Diff Tags" support. Commandlet and Diff Tags provide a way to understand why the bulk data for a given asset has changed. Changes are grouped by which diff tags caused the change which allow for rapid understanding of large patch sizes.
- Added LoadFromCompactBinary as a standardized way to load from compact binary.
- Added derived data cache replay functionality A cache replay can be created from any program that uses the cache, and can be replayed through any cache graph in any program that uses the cache.
- You can save a cache replay by adding -DDC-ReplaySave=PathToReplay.ddr to the command line.
- You can load a cache replay by adding -DDC-ReplayLoad=PathToReplay.ddr to the command line one or more times.
- You can modify the cache priority on loaded replays with -DDC-ReplayLoadPriority=Priority. - For example, -DDC-ReplayLoadPriority=Lowest will queue replayed requests to execute asynchronously.
- You can modify the cache policy on loaded replays with -DDC-ReplayLoadAddPolicy=CachePolicy and -DDC-ReplayLoadRemovePolicy=CachePolicy.
- -DDC-ReplayLoadAddPolicy=SkipData will make the replay prefetch into the cache stores earlier in the cache hierarchy.
- -DDC-ReplayLoadRemovePolicy=QueryLocal will make the replay query only remote cache stores.
- You can Filter, save, or load operations by combining arguments. -DDC-ReplayMethods=Get+GetValue+GetChunks will process requests of the corresponding methods.
- -DDC-ReplayTypes=Type1[@Rate1][+Type2[@Rate2]...] will only process requests of the corresponding types.
- -DDC-ReplayRate=Rate will only process Rate% of the requests that do not match one of the type filters.
- -DDC-ReplaySalt=Salt configures the salt used to filter by type and rate, which makes them match consistently between sessions instead of being random.
- You can Load a cache replay with the console command: DDC.LoadReplay ReplayPath [Priority=PriorityName].
- Added a compact formatting mode to the conversion of compact binary to JSON.
- Added FindObject function overloads that accept FTopLevelAssetPath struct as the object path name.
- Extended -DDC-MissTypes with more options to simulate cache misses. In the examples below,
is the name of a node in the cache store graph, or you can use All to apply to every node. -DDC-<Node>-MissTypes=StaticMesh+Texture
will simulate a miss on every access to to static mesh and texture keys.-DDC-<Node>[email protected]+Texture
will simulate misses on 12.5% of accesses to static mesh keys and every access to texture keys.-DDC-<Node>-MissRate=5
-DDC-<Node>-MissTypes=Texture
will simulate misses on every access to texture keys and 5% of other keys.-DDC-<Node>-MissRate=5
will simulate misses on 5% of keys.-DDC-<Node>-MissSalt=PositiveInt32
will set the salt used to match keys to simulate misses on. A key always has the same simulated miss behavior with the same salt.- Added EngineConsoleCommandExecutor to provide IConsoleCommandExecutor outside of the editor.
- Set UnsafeTypeCastWarningLevel to Error for several widely-used modules. Projects with changes to these Epic-provided modules will need to fix any of these warnings in the modified code in order to build.
- Unreal logging functionality is now used in LowLevelTests instead of LocalPrint.
- Upgraded to BLAKE3 1.3.1.
- Enabled the experimental Unreal Cloud DDC on Mac and Linux.
- Added FCompositeBuffer::EqualBytes function to compare the contents of two composite buffers.
- Added ConvertLegacyCacheKey to construct new cache keys from legacy cache keys.
- Added a commandlet to export an asset registry database to a sqlite database, which allows sql queries of assets, types, and asset tags. This commandlet is in the plugin AssetRegistryExport and must be enabled to be used.
- Updated zlib to 1.2.12.
- Added IsInheritedInstance to exports.
- Added missing generated public hash entries to ArchiveStackTrace.
- Added support for writing back compressed asset size to an asset registry during or after iostore packaging.
- Added iostore chunk hashes to the asset registry during cook.
- Added a dedicated thread for logging.
- Added -DDC-Verify arguments to control cache determinism verification.
- -DDC-Verify will verify determinism on every access to the cache.
- -DDC-Verify=StaticMesh+Texture will verify determinism on every access static mesh and texture keys.
- [email protected]+Texture will verify determinism on 12.5% of accesses to static mesh keys and every access to texture keys.
- -DDC-VerifyRate=5 -DDC-Verify=Texture will verify determinism on every access to texture keys and 5% of other keys.
- -DDC-VerifyRate=5 -DDC-Verify will verify determinism on 5% of keys.
- -DDC-VerifySalt=PositiveInt32 will set the salt used to match keys to verify. A key always has the same verification behavior with the same salt.
- Added AppendChars(TStringBuilderBase&) to allow string builders to work as the output of algorithms.
- Reduced stack usage of assertions, crashes, ensures, and fatal logs by between 8 and 24 KiB.
- Replaced
PanicFlushThreadedLogs()
with the newGLog->Panic()
that switches logging into a mode that the panicking thread takes over log flushing and only redirects logs to panic-safe output devices. - Utility functions like FindFirstObject or UClass::TryFindType have been introduced to provide similar to ANY_PACKAGE functionality in scenarios where providing an Outer object or object path name is not possible.
- Added String/RemoveFrom.h
- Cleaned global Engine header dependencies by removing includes of "Engine/NetSerialization.h" from global headers.
- Minor dependency cleanup in ComponentSourceInterfaces.h
- Added a softobject path table to the package summary header This is to felicitate validation by inspecting the header and allow asset patching by using the header without export loading.
- Dependency cleanup in Chaos focused on removing includes from ChaosSolverConfiguration.h.
- Added FStringView constructor to FStringFormatArg.
- It is now possible to override system guids, which are often used for derived data versions, on a per stream basis allowing the guids to be changed in separate streams without causing merge conflicts.
- Modified FlushTree to FlushRequest. It will now Automatically propagate explicit package load request association to package dependencies which allow flush requests to process only related packages while skipping others.
Improvement:
- Optimized the FGCObjectInfo::TryResolveObject function to use only FNames instead of FStrings to search for objects.
- Improved performance for FLinearColor to sRGB and UNORM conversions.
- Refactored to store book keeping and allocations separately, including matching allocations to pools with pointer arithmetic.
- Improved Blueprint API for soft object paths. They can now be easily created from path strings and loaded objects.
- Renamed related Blueprint functions for clarity.
- Optimized AssetDataGatherer cache load.
- Optimized performance by limiting a contention between consumer and producers.
- Improved AssetRegistry loading optimization.
- Optimized macro WITH_CASE_PRESERVING_NAME FName loading to help editor startup time.
- Core constexprification pass to reduce code bloat, improve performance and simplify searching for non-constexpr constants.
- Optimized BuildCacheKey using FAsciiSet.
- Improved several TArray comments.
- Optimization in the LinkerLoad, when it has many bulk data loaders. Turned the TArray into a TSet. This speeds up loading certain geometry caches significantly.
- Optimized the output redirector to process concurrent logging about 25 times faster
- Optimized the derived data file system cache for network file shares.
- Optimized formatting FDateTime to be about 7 times faster.
- Optimized formatting of log messages to be about 3 times faster.
- Refactored compiled-in FProperty constructors so that they have the same signature.
- Improved ensure error message during package save when a name isn't mapped.
Crash Fix:
- Fixed an unbound delegate crash in the directory watcher.
- Added crash fixes with small iostore containers by changing the calculation of number of partitions for iostore containers to use the end of the last block rather than the start of last block.
- Fixed a crash during package reload when failing to purge the old package.
Bug Fix:
- Blueprint object and field names can now be used with core redirects.
- Used pass by reference instead of pass by value for TArray to eliminate a copy in the UNetDriver::ServerReplicateActors_PrioritizeActors function.
- Memory image determinism fixes: When building name patches, compare names case sensitively.
- Fixed UObject::GetPreloadDependencies not gathering from C++ classes
- Reserve byte array for FUniqueNetIdRepl::ReplicationBytes to minimize allocations and wasted space
- Garbage Collection locks are no longer acquired when GIsInitialLoad is true.
- Fixed an overflow issue where very large float A values would sometimes results in pixels with A=0 on FLinearColor to sRGB conversion.
- Allow methods that can only be invoked from a constructor be available when fetching vtable addresses for HotReload and Live Coding.
- Fixed FInstancedStruct edits not propagating to instances when editing a Class Default Object.
- Fixed bugs in crash malloc. When a small pool was exhausted it became impossible to free any allocations in the pool, because Free used the same search function as Malloc which only considered pools with space available.
- Fixed FName debug visualizers on clang and gcc platforms.
- Fixed divide by zero in vectorized
TTransform<T>::InverseTransformPosition
andTTransform<T>::InverseTransformVector
functions that were causing floating point exceptions. - When the engine renames a garbage package that cannot be freed because of GC reference elimination pending kill is disabled, removed those packages and their exports from the async loading thread's caches.
- Fixed a compile error in static analysis builds when copy constructing a 2-tuple of different, but compatible types.
- Marked packages as garbage in PrepareStreamedOutLevelsForGC so that weak pointers to them in the net driver's guid object cache become invalidated even if they are not freed because of dangling references when GC pending kill is disabled.
- Fixed LaunchFixProjectPathCase assuming that TCHARs are WIDECHARs and fixed FOutputDeviceStdOutput::Serialize in UTF-8 mode.
- Fixed memory corruption when converting a null-terminated string via
StringConv<UTF8CHAR>
where the string ends with two high surrogate pairs. - Give DEFAULT_SERVER_FAKE_FORKS a default value for all games/builds.
- Fixed many invalid uses of TCHAR and TEXT in UTF-8 mode.
- Fixed FString and TStringBuilder appending UTF8CHARs.
- Made FFilteredActorCollector keep weak pointers to Actors in order to support disabling GC pending kill reference elimination.
- Fixed FMapProperty::IsPermutation and FSetProperty::IsPermutation functions.
- Replaced nullptr_t with TYPE_OF_NULLPTR to prevent errors being reported in IDEs utilizing clangd, like QT Creator.
- Fixed UTF-8 decoding from emitting multiple chars for a correctly parsed codepoint but invalid value.
- Fixed TNonRelocatableInlineAllocator leaking heap allocations.
- Various Niagara class fixes for compiling under C++20.
- Release pointers to components in FParticleSystemWorldManager when they are marked as garbage.
- Fix EGuidFormats::Short so that it uses Base64 encoding as the documentation states
- Fixed compile error in TIsInvocable when given a member function pointer and an incompatible target type.
- Made TTransform trivially-copyable in vectorized mode.
- Removed useless ANSI->UTF8 conversions. Fixed incorrect sign extensions during to-UTF8 conversions.
- Fixed FGenericWidePlatformString asserting and going into an infinite recursion when setting PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION=1 in Windows.
- Marked LocalPlayer as garbage when removing it from GameInstance to track outstanding references when GC reference elimination (pending kill) is disabled.
- Disabled the use of PersistentGarbage flag because for removing reported garbage references.
- Fixed TNonRelocatableInlineAllocator leaking heap allocations.
- Fixed output when converting a string with an orphaned high surrogate at the end of the input.
- Added UObject::GetImplementingOuter, an interface counterpart to UObject::GetTypedOuter.
- Added header with state of editor-only-data-stripping to saved asset registry to allow properly loading cooked asset registries from a WITH_EDITORONLY_DATA binary.
- Fixed a hang on shutdown of UELibrary caused by the trace thread not being shut down.
- SceneCaptureComponent releases pointers to garbage Actors pre-GC.
- Fixed broken assert strings in TArray64 and TArrayView64.
- Made formatting functions FString::Printf capable of taking
char*
formatting strings in UTF-8 mode. - Fixed incorrect memory ordering in TSharedPtr::IsUnique in ThreadSafe mode.
- Remove FAndroidPlatformString::Strncmp, which read out of bounds for unterminated string, and fall back to the faster FGenericPlatform algorithm.
- Inserted dummy values into memory images for names like vtable pointers.
- Fixed archetype flag from not being set during object duplication during text import of a UObject property preventing serialization and PostEditProperties from reading it.
- FThread now supports the -nothreading command-line argument.
- Fixed reversed ordering of mounted containers in the FilePackageStore.
- Unified the alignment behaviors of FMallocTBB::TryMalloc and FMallocTBB::TryRealloc functions.
- Made UClass::Implements private to prevent accidental misuse.
- Added a scope object IModularFeatures::FScopedLockModularFeatureList to easily lock and unlock the list of modular features when accessing it.
- Fixed render capture provider from firing an assert when accessing IModularFeatures from outside the game thread.
- Avoid locking the modular features list when calling GetEngineCrypto, since the IEngineCrypto is only accessed once and stored in a static member.
- Check the IsValid flag when comparing Tboxes, and more generally take the flag more often into account.
- fixed implicit 64-bit to 32-bit conversion in ParallelTransformReduce.
- Added CORE_API to FComplexStatUtils struct for games usage.
- Fixed forwarding of
-DDC=<Graph>
to child processes to avoid initializing DDC and only forward non-default graph names. - Refactored initial load in AsyncLoading to remove the Zen loader dependency on the prebaked script object blob located in the global.ucas. This will rely on NotifyRegistrationEvent callbacks.
- Made initial loading more robust when Blueprints are referenced by native Class Default Objects.
- Fixed missing logging of callstacks for failed assertions.
- Restored the functionality of the command DEBUG OOM. By default the command will leak 1MiB of memory per frame in 64KiB chunks, but these values can now be overridden by entering additional values after the command.
- FAutomationTestBase::bSuppressLogs will now default initialize to false and keep its value if a derived class change it.
- Nested subobjects that have overridden properties in a Blueprint are now initialized correctly from their archetype, and not the native default values.
- Nested subobjects that are part of Objects created from a template will now correctly initialize their properties from the supplied template.
- Fixed a regression that incorrectly flagged nested template objects as inherited instanced subobjects in the package export map.
- The correct object will now be looked into when determining if the inherited instance should be instantiated.
- Fixed CreateFileReader to respect the flags passed to it.
- We now propagate the necessary object flags when duplicating an instanced subobject to another owner.
- Calling Rename on a UPackage will no longer reset the loaders for all currently loaded packages which caused memory bloating in the editor.
- Added support for structured bindings to UE_LOG, checkf, ensureMsgf.
- Ensure that editor-only subobjects are instanced on load for cooked packages when running on platform targets that include editor-only data.
- Fixed FObjectPtrProperty::Identical from not respecting deep comparisons.
- DirectoryWatcherWindows will now handle ERROR_INVALID_PARAMETER when buffer size is too large to watch a network file share.
- pendingkill flags will now properly clear to prevent asserts when duplicating Actors.
- Fixed a data race in FAsyncWriter that was in the file output device.
- AsyncLoading will no longer reconstruct existing destination subobjects in cooked packages, they should always have been created from the correct up-to-date template.
- Fixed the console command obj refs -history=1 from not looking in Garbage History when it's enabled.
- Fixed AssetManager ModifyCook to correctly apply cook rules to asset bundles so it handles labels properly.
- Added ensure to set GIsGarbageCollecting=true for the complete IncrementalPurgeGarbage phase since we always want BeginDestroy to behave the same even if it is called from a full blocking Garbage Collection or from an incremental Garbage Collection step.
- Fixed destroying a ChildActorComponent from failing an assert in the UObjectBase destructor that was checking for NAME_None.
- Made GetTransientOuterForRename more available. This can be used to fix a crash when changing a class if that class needs to be within.
- Fixed the use of FORCENOINLINE and UE_DEBUG_SECTION macros for logging and assertions.
- Class verification is now being deferred to package import creation time on load whenever appropriate, so that load linker warnings don't emit false positives.
- Fixed code generation for TFieldPath property in UFunction params.
- Added propagation of derived data cache records that contain metadata with no values.
- Fixed deadlocks during crash reporting by avoiding allocations in the FAsyncWriter::SerializeBufferToArchive function on platforms that use FPlatformMallocCrash.
- Fixed IsDefaultObject to not return true for Class Default Objects.
- Fixed compilation manager duplicating a subobject when one of the same name already exists.
- Fixed instanced variable defaults from not duplicating on copy paste.
- Moved exported symbols from TokenizedMessage to the .cpp file.
- Fixed data loss that was caused by a failure to look up component templates during reinstancing.
- Fixed incorrect assignment of GIsConsoleExecutable that caused performance degradation when stdout is redirected to a file or pipe.
- Removed non-suppressible warnings from SetTimeStamp.
- Fixed String Tables from not loading Metadata.
- Fixed an edge case where objects could be post loaded during async loading without having been deserialized.
- When saving an ini file, the SourceIniHierarchy wasn't being configured correctly, causing things like array clearing to not be handled correctly.
- Previously an errant heartbeat present hang could be triggered if the macro PLATFORM_PRESENT_HANG_DETECTION_ON_BY_DEFAULT was disabled. This change resolves the initialization of present hang detection settings preventing a race condition that triggered the errant hang.
- PLATFORM_PRESENT_HANG_DETECTION_ON_BY_DEFAULT can now be safely disabled.
- Fixed a compile error when STATS is disabled.
- Fixed potential deadlocks when serializing objects while holding the object hash lock and async building meshes.
Deprecated:
- Removed out of date CEF content.
- Deprecated FDateTime plus FDateTime operator.
- Delegate nested binding types.
- Deprecated UE_SECURITY_LOG and CLOSE_CONNECTION_DUE_TO_SECURITY_VIOLATION macros.
- FBlueprintContextTracker::GetScriptStack which returned a TArray copy of the script stack is deprecated in favor of FBlueprintContextTracker::GetCurrentScriptStack and FBlueprintContextTracker::GetCurrentScriptStackWritable which return a TArrayView of the script stack
- Deprecated PLATFORM_COMPILER_HAS_IF_CONSTEXPR.
- Replaced DEPRECATED_MACRO with UE_DEPRECATED_MACRO.
- Deprecate and remove the usage of FUntypedBulkData. Users should use the generic FBulkData or the typed TBulkData.
- Deprecated StartAsyncLoading and CreateStreamingRequestForRange.
- Deprecated and replaced the usage of StartAsyncLoading and CreateStreamingRequestForRange with a new batch API for requesting bulk data. The new API fits better with the I/O dispatcher API and does not assume that the bulk data resides in the same I/O chunk. The new API also removes state handling away from the bulk data instances.
- Bulk Data - deprecate GetPackagePath/PackageSegment
- Deprecated the public string view literals _SV, _ASV, _WSV, and _U8SV. which have been changed to TEXTVIEW, ANSITEXTVIEW, WIDETEXTVIEW, UTF8TEXTVIEW.
- Removed aggressive subobject replacement. Replaced with a toggleable audit to report any cases where the aggressive replacement was in use from the replacement archiver.
- Deprecated ANY_PACKAGE macro support for looking up UObjects using the ANY_PACKAGE macro. Programmers are encouraged to provide the Outer object or object path names when upgrading their project, such as
FindObject<UClass>(nullptr, TEXT("/Script/Engine.Actor"))
whenever possible. - Deprecated FolderName in UPackage and replaced it in PackageSummary with the PackageName.
Removed:
- Ensure from FName about unfreezing names that were created for a case-insensitive target. We rely on the archive used for serialization to save names with their case intact.
- References to Actors to help ensure partial GC when there are outstanding references.
- Removed ignored calculated values from TBigInt::ToInt, FGenericPlatformMallocCrash::InitializeSmallPools and FArchive::SerializeCompressedNew functions.
- Deleted SavePackage1. It has been replaced by SavePackage2 and is no longer supported.
- Removed TObjectPtr.IsNull, TObjectPtr.IsNullNoResolve, FObjectPtr.IsNull and FObjectPtr.IsNullNoResolve.
- Removed deprecated PackageGUID and Dynamic Type from FObjectExport
- Removed rendering includes from PhysicsPublic.h in favor of forward declarations.
Dev Tools
New:
- Added commands to open File History, Revision Graph, and Timelapse views from the UnrealVS.P4 menu.
- UHT will now warn the user if any form of GENERATED_BODY is used in code that is being skipped.
- Added warnings when C++ UHT is used. These warnings include the reasons why C++ UHT is being used. The warning is currently disabled but informational messages will still be generated.
- Console feedback is now provided when starting live coding fails packaged builds.
- Added compile PCH with -fpch-instantiate-templates in Unreal Build Tool if compiling with clang 11+. This flag has shown to improve compile times by 10-20% when using PCH.
- Added support for deprecation macros for enum values in UHT.
- Added support for final keyword on structure definitions.
- Added
--include
argument to sync subcommand to limit the files synced in Unsync. - Added
--files
flag to info subcommand to list files in manifests in Unsync. - Added support for syncing subsets of files in a directory in UnsyncUI. File group is activated by finding any file that matches the regex, then groups from the regex can be used to populate the
--include
argument to Unsync CLI. - Added option to CSVInfo to extract specified stat values from the CSV.
- Added
-showAllStats
which outputs all stat samples to the json file as an array. - Added
-statFilters
which lets you specify what stats to output values for. - Added additional info to the help text. + Added option to write events with their frame numbers.
- Added the name of the platform when dumping the Manifest into
FinalCopy_XXX.txt
. - Added a new delegate to the CSV profiler that fires once on frame 0 of the capture so we can send the pause event as soon as valid.
- The PerformanceTrackingSubsystem now handles sending the pause/resume events.
- Added option to remove programs when generating project files.
- Generate a .vsconfig that recommends Visual Studio components to be installed, this will prompt the user to run the installer in the Solution Explorer.
- Allow custom output directory using -OutputDir= in Generate Clang Database with Unreal Build Tool.
- Added support for specifying the C Standard when compiling plain C files.
- Added the ability for an individual UObject class to change how its name is reported in stat IDs. This allows us to change stats like PlayerPawn.NiagaraComponent to PlayerPawn.FootstepFX.
- Added a few implementations of the ANSI overload of FExternalProfiler::StartScopedEvent. This enables using the ANSI external profiler on all platforms.
- Added import_text / export_text to wrapped structs in the PythonScriptPlugin. Any struct can now be exported to text or imported from text — similar to what you can do in C++ using the UScriptStruct.
- Changed "named events enabled" text to render regardless of which path enabled it, instead of only when using the "stat namedevents" path.
- Added metric for percent of frames where the game thread is over some budget in PerfReportTool. This metric can be added to summary tables.
- Added OnCSVProfileEndRequested delegate that is called immediately before ending a capture that allows any final information to be written.
- Added FVector4 support to Unreal.natvis so the W component appears in preview windows without manually expanding.
Improvement:
- Improved support for contextual logging in UHT.
- Updated Live Coding to Live++ 1.6.10.
- Cleaned up formatting in both C++ and C# UHT.
- Improved logging to show the object type being reloaded.
- Updated PerfReportTool to treat extra links starting with '/' as links instead of link templates.
- Changes to the Histogram summary table in PerfReportTool:
- Removed the hitch table since the tool has a separate hitch summary.
- New option to suppress the averages table.
- Reversed from under to over budget.
- Improved support for PreBuildSteps generating files.
Crash Fix:
- Fixed a reliability issue with Live Coding where it could crash on startup.
- Fixed a crash issue when LiveCodingConsole is run independently.
Bug Fix:
- Fixed net enabled properties when would prevent properties from finding their getter/setter methods.
- Classes that are detected by live coding that do not change in structure will no longer invoke the reinstancing system since it isn't needed. Changes to default values will be mantained.
- Fixed an issue where project plugins would not compile with an installed engine.
- Fixed wrong API macro from being used in C# UHT.
- Fixed an issue where C# UHT was not catching some Blueprint properties contained in editor only sections.
- Fixed UHT from failing to add enum metadata to a fixed array when a space appears in the array size.
- Fixed an issue with LiveCoding reload where a fatal error would be generated even if a class had not changed.
- Fixed issue where packaged Blueprint builds would not be able to start live coding without first having to clear the live coding source project variable.
- Fixed a C# UHT issue where unterminated strings were not detected properly and could result in an infinite loop.
- Fixed an issue in C# UHT where if an old style enum was returned from the "Implementation" method, the zero value would not be wrapped in the TEnumAsByte.
- Fixed issue where Live Coding could remove properties from a class that contained delegates.
- Fixed UHT error when class name contains only a prefix.
- Fixed an issue where C# UHT would not declare shadowing errors where C++ UHT would.
- The CoreNet header file will now be automatically included in UHT generated code when needed.
- Fixed an issue where live coding would warn that a plugin was not enabled for live coding. This would happen if the plugin was not explicitly enabled by the project, but was loaded by another plugin.
- Refactored HotReload/Live Coding re-instancing to re-instance classes more orderly and support the referencing of the new default object prior to the class being re-instanced.
- Initialized UseShellExecute to the default of the .NetFramework to avoid issues. The default used to
- Added ShortNames to Code Access plugins to reduce the pressure on path length.
- Fixed the creation of multiple packages\platforms in a single call in BuildCookRun. The upluginmanifest file needs to be platform specific. It will prevent some of the packages from running otherwise.
- Fixed csv profiler pause event not firing at start of capture.
- The skipClient option in Unreal Automation Tool resulted in internal exceptions and infinitely looping test runs. Fix includes:
- NullAppInstance only completed on WaitForExit, but some tests have completion criteria other than exit. To resolve this, NullAppInstance tests are now considered complete upon creation.
- IDeviceUsageReporter now takes a platform reference and correctly handles a null platform. No events will be logged when given a null platform.
- Fixed a C# Unreal Header Tool issue where struct properties were not performing all required validations.
- Fixed a C# Unreal Header Tool issue where struct serializers were appearing in the wrong place.
- Fixed the Rider project generator in the presence of platform extension specializations in Unreal Build Tool.
- Added all files under Unreal Build Tool output directory to fix an issue running build setup on linux builders.
- Fixed HelmTask in BuildGraph:
- No longer modify the global kubecontext, but rather pass the context to use into helm.
- Added an option to specify which kubeconfig to use.
- Fixed an issue with values not being handled correctly.
- Fixed an issue with HelmTask in BuildGraph not handling the situation when there were no values files.
Deprecated:
- Enabled C# UHT by default. Set UEBuilderConfiguration bUseBuiltInUnrealHeaderTool to false to force C++ UHT to be used. C++ UHT will automatically be run if ScriptPlugins are enabled when a C# UBT plugin isn't detected in the same module.
Insights
API Change:
- Added TraceAnalysis LLM tag which captures all memory allocated by the FAnalysisProcessor.
- Added Trace/CpuProfile LLM tag which captures allocation of per-thread buffers used by the cpu profiler trace.
- Unreal Insights: Added Exec function API to IUnrealInsightsModule and to IInsightsComponent.
New:
- Added "FVirtualWinApiHooks::" and "./ConcurrentLinearAllocator." to symbol filters.
- Added support for stats counters with the ShouldClearEveryFrame flag to reset to 0 at the beginning of each Game frame during analysis.
- Added separate counters for frame variants of stats counters with a ShouldClearEveryFrame flag.
- Added Open Source in Visual Studio option for any callstack frame of any allocation item, in the Allocs Table/Tree view.
- Added the Trace.Screenshot command to that creates a screenshot and sends it to the trace file.
- Added TraceAnalysis and Trace/CpuProfile LLM_SCOPEs to reduce Untagged allocations.
- Extended the command line argument -ExecOnAnalysisCompleteCmd to be used without AutomationTesting and to run custom commands exposed by Insights components.
- Added custom response file support for -ExecOnAnalysisCompleteCmd command line argument.
- Added Tag column to the 4K Page Breakdown view preset.
- Set the initial sorting mode to Descending for most numeric columns in Timers, Counters, Net Stats, Mem Allocs, and generic table/tree views.
- Added Auto Open Live Trace toggle option in the main menu. If enabled, the analysis starts automatically for each new live trace session, replacing the current analysis session.
- Added time limit for updating metadata for a trace. If the time limit is exceeded, the current metadata analysis stops, allowing other traces to update metadata, then it will retry with an increased time limit.
- Added infinite symbol for End Event Index and Event Distance table columns in Allocs Table.
- Added sorting for all columns in the trace sessions list view.
- Changed Ctrl+C when copying the selected CPU/GPU timing event to copy the duration and the metadata of the timing event.
- Added custom commands exposed by the TimingProfiler: - TimingInsights.ExportThreads file, - TimingInsights.ExportTimers file, - TimingInsights.ExportTimingEvents file [-columns="..."] [-threads="..."] [-timers="..."] [-startTime=...] [-endTime=...], The "..." params defines filters for list of columns, threads or timers; it supports *?-type wildcards.
- Added Platform, AppName, Build Config, and Build Target of trace session being analyzed to the application title name.
- Added LLM_SCOPE in FSlateApplication::OnSizeChanged in an effort to reduce untagged allocations.
- Split the "Stats" column into 4 separate columns: Discovered, Cached, Resolved and Failed.
- Added sorting for all columns.
- Added Rename option in the context menu for a trace session. Allows renaming for the selected utrace file. The ucache file is also renamed automatically.
- Added Delete in option context menu for a trace session. Deletes the selected utrace file. The ucache file is also deleted automatically.
- Added Insights.Enumerate10K and Insights.Enumerate100K tests that can be run from Unreal Insights on any utrace files.
- Added filtering for the list of trace sessions by Name, by Platform, by App Name, by Build Config, and by Build Target.
- Added stats.NamedEvents 0/1 and stats.VerboseNamedEvents 0/1 console commands to be able to force enable or disable the NamedEvents. The existing stat NamedEvents and stat VerboseNamedEvents are still available with toggle state behavior.
- Added error checking for large memory traces.
- Added Insights memory scope in various places to capture untagged memory when Insights is running in the Editor.
- Enabled SameValue aggregation for the Memory Tag column of the Memory Allocations table/tree view. The Aggregated value is equal with it's children value if all children have exactly same value, otherwise the aggregated value is empty.
- Added Class Name column to the Allocs Table together with a custom view preset.
- Added more UObject memory scopes to reduce the Untagged allocations.
- Added F5 key shortcut to refresh the list of trace sessions.
- Added the console command Trace.SnapshotFile. This command saves a utrace file with content of the trace tail buffers.
- Added Empty Callstack for callstacks traced/resolved with zero stack frames.
- Added Asset column and Asset view preset to the Memory Allocations table view.
- Added "Path Breakdown" grouping for all string columns.
- Added a toggle button to choose between searching and filtering the list of trace sessions by Name or by the Command Line. Added highlights for searched text.
- Added LLM_SCOPEs in PythonScriptPlugin to reduce the Untagged allocations.
- Added TraceUtilLibrary to control Insight traces from Blueprints.
- Added MemoryTrace function name prefix to ignore callstack frames when detecting the top function of a callstack.
- Updated icon for the UnrealTraceServer.exe.
- Added new TimingInsights.ExportTimerStatistics command to the ExecOnAnalysisComplete parameter. This will export statistics for all timers to a CSV file and supports specifying a range inside the trace file through bookmarks.
- Added "Session Browser" in the main menu. Opens the Unreal Insights Session Browser window.
- Added "Open Trace File / Open in New Instance..." in the main menu. Starts analysis for a specified trace file, in a separate Unreal Insights instance.
- Added "Open Trace File / Open in Same Instance..." in the main menu. Starts analysis for a specified trace file, replacing the current analysis session.
- Added "Top Source File" and "Callstack Size" columns in Mem Allocs table and improved tooltip for "Top Function" column.
- Updated description of some memory rules to avoid confusion.
- Added LLM_SCOPEs to each analyzer in TraceServices and Insights plugins to reduce the Untagged allocations.
- Added memory tracing for D3D11 and D3D12 using the "video memory" root heap / address space to match LLM stats.
- Added GetTraceDestination, IsConnected and GetActiveChannelsString to public interface.
- Added tracing for the cooking profiler.
Improvement:
- Memory insights performance fixes for a large hash bucket in the backtrace.
- Improved the performance and memory usage for sorting the Function column in the Allocs Table and in the sorting of text columns.
- Implemented micro-optimizations to sorting code for Timers and Counters.
- Improved coloring to highlight modules with failed status.
- Improved performance of sorting,filtering, and grouping operations involving the top function of an allocation's callstack.
- Improved performance of memory analysis (processing of live allocations in AllocationsProvider) with up to 50%.
- Switched the short living allocations to use only the linked list, with a reduced size.
- Improved metadata update by prioritizing the newer trace sessions. enabled parallel update for metadata.
- Improved analysis of scoped memory events by avoiding a "strlen" for each scoped event.
- Improved analysis of mem tag events.
- Improved performance of filtering and grouping.
Crash Fix:
- Fixed a crash in Unique Values grouping for string columns.
- Fixed a crash when closing Unreal Insights while having a minor tab undocked in Timing Insights, Memory Insights, Asset Loading Insights or Networking Insights.
- Fixed TraceStats crashing when the stat name is a wide char FName.
- Workaround for crash in TRACE_LOG_MESSAGE when encounters string arguments are not null-terminated.
- Fixed a crash when a CPU timing event has metadata with zero fields.
- Fixed crash in the analysis of timing events emitted just before EndThread trace event.
Bug Fix:
- Fixed the command line argument -AutoQuit to work without AutomationTesting.
- Fixed a bug where changing a preset resulted in hiding the Hierarchy column.
- Fixed "Audio" LLM child tags for Audio_Analysis, Audio_MetaSound and Audio_SpatializationPlugins.
- Multiple fixes and improvements to TPagedArray and its iterator.
- Fixed trace analysis to continue reading at least one more loop after encountering a SYNC point.
- Fixed case where SourceCodeAccessor remains in a started state and does not respond anymore to more requests.
- Fixed support for unicode file names for trace files in the UnrealTraceServer.
- Fixed session name when a trace name contains a dot char.
- Fixed deadlock for analysis thread when session completes.
- Fixed issue where the number of Discovered symbols for a module was lower than Resolved and Failed.
- Disabled Profiler if STATS is not enabled.
- Fixed the order of GPU and GPU2 tracks.
- Merged tags that had the same name but different id, when grouping by Tags in Memory Allocs table.
- Fixed grouping by Tags in the Memory Allocs table when all tags are unknown/untagged.
- Fixed StatsTrace from incorrectly tracing disabled stats.
- Fixed callstack tracing not capturing correct backtrace for majority of allocations in Editor Win64 Debug.
- Fixed analysis of timing events with metadata.
- Fixed the full name of LLM tags to include parent names when there are multiple levels of inheritance.
- Fixed track invalidation when a track filter is changed.
- Fixed TextureProfiler to emit the inline stat spec events only once. The spec events are "important" trace events. These events are cached by the trace system, so they should not be emitted continuously.
- Fixed Important Events cache stats displayed by Trace.Status console command.
- Fixed allocations analysis to safely ignore errors re invalid MemoryScopePtr scoped events.
- Fixed max width for the search boxes.
- Fixed initialization of Platform Events.
- Fixed missing tree items when multiple groupings are added in a generic Tree Table view. Groupings are now recursively applied correctly when a grouping creates a hierarchy of node.
Removed:
- Removed Unique Values grouping for StartEventIndex, EndEventIndex and Count columns.
- Removed Path Breakdown grouping for Top Function column.
Framework
New:
- Added support for multiple concurrent devices in RawInputPlugin. (problem reported on UDN) Increase the number of Axis to 24 and the number of buttons to 96.
- Added support for objects being managed by the Significance Manager without reference elimination.
- Cleaned up references between scene components when Actors are destroyed or streamed out, to avoid holding reference to garbage objects. On destruction, attachments are cleared between components owned by different actors. On un-initialize component, attachments are cleared between components in different outer hierarchies, i.e. different streaming levels. Note that this changes behavior so that attachments between scene components in different levels will be broken when either level is streamed out (made not visible) even if the level is not unloaded and garbage collected.
- Added query functions for Blueprints to check if there were modifier keys held (Alt, Shift, etc.) given a key state struct.
- Added logging to indicate when log levels have been raised to verbose levels to help track down log spam.
- Unified how we modify GCycleStatsShouldEmitNamedEvents so that we guarantee it won't drop below zero.
- Made FAssetData ~16 bytes smaller (technically 20, but there's an odd number of 32-bit structures now, so we'll shrink 8 when deprecated AssetClass is deleted). This saves about 5MB if the project has 300K+ assets. Ensure you switch any manual manipulation of ChunkIDs to use the helper methods.
- Optimized code size and overhead for Insights markers generated for scope cycle counters. Down from 213 bytes per marker, to 142 bytes.
- Added UE::LWC::NarrowWorldPositionChecked run time validating narrowing cast for FVector world positions.
- Enabled ISPC on more supporting platforms and subsystems.
- Added a UStruct-type parameter to TStructTypeBitSet type to further improve its type-safety.
- Added Blueprint Graph Support for FInstancedStruct.
- Added an "index iterator" to TStructTypeBitSet, allowing iterative retrieval of non-empty indices of a given container.
- Added UPropertyBag and FInstancedPropertyBag, which allow users to configure and edit custom structs inline via UI or code.
- Added a function to TStructTypeBitSet to fill an instance with an amount of
false
ortrue
values corresponding to the number of known types tracked by a given bitset specialization. - Extended TStructTypeBitSet to support UClasses as well.
- Added SetLineThickness() to UBoxComponent.
Bug Fix:
- Fixed incorrect parent class in data only blueprints if parent class was changed without compiling.
- Fixed crash after using LiveCoding to remove an interface function while the blueprint editor was open.
- Fixed an issue where the SceneComponent hierarchy on component destruction was attaching the to-be-destroyed child components to new parents, and did not attach living child components to to-be-destroyed parents.
- Fixed an issue where there was a possible division by zero in FHistogram::GetAverageOfAllMeasures.
- Fixed an issue where strong pointers for UGameFrameworkComponentManager::AllReceivers were being stored, so failure to remove actors prevented world cleanup after PIE when GC reference elimination (pending kill) was disabled.
- Removed the reference from Player to PlayerController when PlayerController removes its reference to Player in OnNetCleanup.
- Fixed an issue where there was duplication of implemented interfaces in parent Blueprint classes.
- Fixed an issue where references from LODActor where not being released when SubActors were destroyed.
- Fixed an issue where user widgets were not being allowed to remove themselves from the player layers in the viewport even if the associated player controller was destroyed.
- FComponentReference::OtherActor was converted to a weak object reference.
- Fixed an issue where StructTypeBitSet.StructTracker was not being instanced per module.
- Converted serialized external actor/component references to weak object references in the debug camera controller so that they don't prevent garbage collection.
- Fixed the Reset to Default button behavior on Instanced Structs.
- Fixed several truncation warning to the Engine module and its dependencies.
- Fixed several issues with MassReplication when adding and removing clients.
AI
New:
- In MassEntity, shared fragments have been changed from being unique per archetype to unique per chunk.
- Added MassEntity optimization when new archetypes are added to the system. When a new Archetype is added, the queries will now only check against the newly added Archetypes, instead of running against all available Archetypes.
- Removed the MassEntity Archetype filter because the system no longer shares fragments per archetype (fragments are shared per chunks). Users should now use Chunk filters on shared fragments.
- Added a button in the property grid that validates the Mass Entity Config asset.
- Added code that detects an infinite loop in BTDecorator_ConditionalLoop, just like in BTDecorator_Loop.
- Added a new console command that freezes any Mass Movement. This helps users debug Mass Movement.
- Added functionality to Mass Trait to allow users to specify fragment ownership and dependencies.
- Added option where the user can specify to incur most of the Mass Fragment initialization cost in the first frame, instead of spreading the cost throughout the first period.
- Added a pop up toast that informs the user that no errors were detected during the MassEntityConfig validation process.
- Stopping a Behavior Tree during processing is now supported. The request is queued until the Behavior Tree processing is completed.
- ANavigationData now supports external packaging. This prevents sublevel navigation data from being discarded when using OFPA.
- Added a warning to UNavigationSystemV1::GetNavDataForProps when using invalid FNavAgentProperties.
- The NavMesh tile pool can now be resized when being built through the UWorldPartitionNavigationDataBuilder (ignoring bFixedTilePoolSize).
- A warning will now appear when tiles cannot be added to the NavMesh because the tile limit has been reached.
- The NavMesh debug display property bHeightfieldSolidPostRadiusFiltering has been renamed to bHeightfieldSolidPostInclusionBoundsFiltering. In addition, several properties were given descriptions.
- The initialization of dtNavMesh parameters have been moved to the init() and the parameters are now serialized in ARecastNavMesh. This provides safer initialization flow and fixed potential mismatches between the NavMesh Actor and the serialized NavMesh data.
- Changed bAutoDestroyWhenNoNavigation to be false by default in the NavMesh.
- The NavMesh FGameplayDebuggerCategory_Navmesh can now display navigation data name, even if not a ARecastNavMesh.
- Added log tracking to FRecastNavMeshGenerator RebuildAll(), independently of hte loading time.
- Changed OnNavigationGenerationFinished() to display the Actor label and full name, instead of the package name.
- Extracted FNavigationDirtyElement from NavigationTypes.h and removed all include dependencies.
- Copying cache data when filling navigation data chunk actors for Navmeshes using the Dynamic Modifiers Only mode.
- Upgraded to use FVector::FReal rather than floats.
Improvement:
- The NavMesh will only include the navigation relevant components when computing UNavModifierComponent navigation bounds.
- Navigation will only update Actors and its components in the Navigation Octree if the Actor has been initialized.
Crash Fix:
- Fixed a bug in ARecastNavMesh::InvalidateAffectedPaths where a pointer could be pointing to an invalid memory location resulting in a crash.
- Fixed a bug that would result in a crash when the EQS Details panel was closed while selecting a Test or Generator in an EQS query.
- Fixed a bug in FEditorBuildUtils::TriggerNavigationBuilder() where a missing package would cause a crash.
- Fixed an issue where using the World Partition Static Navmesh would cause a crash.
Bug Fix:
- Fixed an issue where a new stimuli was added while processing the existing ones and this was causing issues.
- Fixed an issue in the Behavior Tree where a search would result in a Decorator or Service being ticked twice in the same frame.
- Fixed a bug where the range loop of the AI Perception component would change while iterating through stimuli.
- Fixed a bug where a Behavior Tree would crash when the Actor destroyed itself while inside a Behavior Tree notification (e.g.: Tick, BecomeRelevant, CeaseRelevant, etc).
- Fixed a bug where UAIPerceptionSystem UnregisterSource(Actor, SenseClass) would not do anything if a null SenseClass was passed in. Now it correctly unregisters the source Actor from all senses.
- Fixed a bug where sometimes a Behavior Tree would select the wrong node, if the selected node was a subtree.
- Fixed an issue in the Behavior Tree where a queued request during a transition would be executed, even if the requestor was not active anymore.
- Fixed a bug where the Mass Processors Config values that are edited via the Project Settings were not saved correctly.
- Fixed a bug in the Visual Logger cone macro where the Origin parameter did not match its function definition.
- Fixed the low height span filtering during navmesh generation (Fixed bugs where the NavMesh would not be generated under low height objects).
- The World Partition NavMesh builder will now avoid saving empty packages, as the delete operation is already saving them.
- Updated dtClosestHeightPointTriangle() to check the denominator to prevent NaN results. In addition, this change improved precision and calculation speed.
- Fixed a bug where the World Partition NavMesh would not generate because of incorrect settings.
- Recently added Hierarchical Instanced Static Meshes log will not be displayed to reduce clutter.
- Fixed a bug where the transformed convex collision was generating an incorrect NavMesh.
- Fixed a bug where the NavMesh would not generate correctly for Landscape Mesh Collision Components.
- Fixed a bug in dtRandomPointInConvexPoly() where it would return an incorrect value when the s parameter is equal to 1.
- Fixed an issue where RecastNavMeshGenerator was dirtying tiles if dirty areas overlapped them.
- Fixed a navigation issue where using bShouldBuildNavigationData and UResavePackagesCommandlet would check out non-navigation data-related assets.
- Fixed an issue in World Partition Navmesh where WorldPartitionNavigationDataBuilder was checking out packages that were being deleted, overriding their delete status.
- Fixed an issue in the Navmesh where using int32, instead of FNavTileRef for updated tiles would result in tiles being reused from the tile pool while still being referenced in the updated tile lists
- Fixed an issue in the Navmesh where using the bShouldDiscardSubLevelNavData property was not working in some use cases. This property now takes effect in ARecastNavMesh::PostLoad(), instead of ARecastNavMesh::PostInitProperties().
- Fixed an issue where Foliage instance static meshes were not affecting the Navmesh.
- Fixed an issue where UResavePackagesCommandlet was not waiting for Static Meshes to be compiled before generating navigation data.
- Fixed an issue with the Gameplay Debugger Navmesh rendering where using bRestrictBuildingToActiveTiles and GetDebugGeometry() would gather data for all active tiles for each tile in the TileSet, instead of doing this once. This was causing high framerates.
- Fixed an issue with Hierarchical Instance Static Meshes where they were not modifying the Dynamic Navmesh if there were no instances on the component register and the instances were added later on.
Deprecated:
- Remove some deprecated methods and members in navigation.
AI Debugging
Crash Fix:
- Fixed an issue where the GameplayDebuggerPlayerManager's editor-time ticking was getting its game-world tick via the tickable object mechanic. This was causing a crash in cases where GameplayDebuggerPlayerManager tried accessing UWorld.
Bug Fix:
- Fixed an issue where users were not able to summon VisualLog while in the '-game' mode. This still requires ENABLE_VISUAL_LOG to be true.
AI EQS
New:
- Changed the EQS Test's Reference Value to have the opposite effect matching its description and designed function. This change ensures the proper fix up of existing assets in PostLoad.
Crash Fix:
- Fixed an issue with EQSTestingPawn where undoing editor-time actor movement from a "No EQS query results" location to a "some results" location was causing a crash.
Bug Fix:
- Fixed an issue where EEnvTestScoreOperator::Multiply was not initializing the ItemScore value.
AI Navigation
New:
- Added the ability to build navigation for runtime data layers.
- Added options to select and display internal Navmesh tile generation steps by setting properties on a Navmesh actor.
- Added the OnNavigationInitDone delegate to UNavigationSystemBase.
- Added the FindOverlappingEdges() method to get wall edges that intersect a convex polygon.
- Added debugging code to track when Navmesh regeneration is taking longer than the desired maximum time allocated per frame during the time-slice operation. Slow time sliced tiles are logged both in normal log files and the visual logger. See FNavRegenTimeSlicer::TestTimeSliceFinished().
- The Navmesh recast ledge span filtering code now supports time slicing.
- Removed dtOffMeshSegmentConnection::height because it was not being serialized. This variable is currently unused.
Improvement:
- The corridor now caches navigation data around the path and allows smoother path following, with less access to the navigation data during the path following.
Bug Fix:
- Fixed an issue with client-side dynamic Navmesh generation.
- Fixed an issue where the bounds passed to FNavigationOctree::AddNode were not being validated properly.
- Fixed an issue where the Navmesh rendering colors were not displaying correctly when originating from a recast.
- Fixed an issue where building the Navmesh by using the chunky region partitioning included the remaining non-divisible cells into the last split.
- Fixed an issue where CalculateMaxTilesCount() was not changing correctly per platform and target.
- Fixed an issue where the Navmesh rendering was not displaying some triangles.
- Fixed an issue where the warning "Can't load actor" would appear when building a World Partition Navmesh. This was caused by Actors being deleted but World Partition not being notified and trying to load deleted Actors.
- Fixed an issue where the message "The Navigation Mesh needs to be rebuilt" was appearing when running a Listen Server and Client.
- Fixed an issue where building the NavMesh with disconnected single cells would not build contours.
- Fixed an issue where the message "The Navigation Mesh needs to be rebuilt" was appearing when there was no navigation being built.
- Fixed an issue where UInstancedStaticMeshComponent's navigation relevancy could result in removal from the Navigation octree if UNavigationSystemV1::UpdateActorAndComponentsInNavOctree was called after the first ISM instance got added.
- Fixed an issue where cell size was clamping incorrectly in the RecastNavmesh.
- Fixed an issue where some memory in FNavigationMemoryStat was not being tracked correctly. We were calling FDefaultAllocator::ForAnyElementType instead of FNavigationMemoryStat::ForAnyElementType and we were not logging memory used via STAT_NavigationMemory.
- Fixed an issue where the navigable areas were not checking that their recast tile indices would fit into an int32.
- Fixed an issue where a missing Crowd Manager would result in a nullptr de-reference.
- Fixed an issue where collision boxes would have their Navigation Area Class reset to NavArea_Obstacle on project load.
- Added a fix for Server Assert at FNavRegenTimeSlicer::TestTimeSliceFinished upon initializing a session.
AI Perception
New:
- Added a log message to make it clearer when a perception component is not attached to a controller.
- Added the ReportTouchEvent() function for touch sense.
AI Smart Objects
New:
- Added a method to retrieve a Behavior Definition from a request result.
Crash Fix:
- Fixed an issue with the SmartObjectSystem where trying to register a SmartObjectComponent without a SmartObjectDefinition set would result in a crash.
Bug Fix:
- Fixed an issue with SmartObjectCollections and Smart Object registrations not working correctly when Smart Objects were placed in a persistent map before the collection was built. The collection building keeps its role as a component-independent Smart Object entity collection.
Audio
New:
- Added the AudioMotorSim plugin that provides a generic way to compose vehicle behaviors from a set of tunable, reusable components.
- Added a Source Effect variation of Convolution Reverb.
- Added a new Reverb AudioGameplayVolume Component, which controls reverb effects upon entering or exiting the associated volume.
- Added a new Submix Override AudioGameplayVolume Component, which controls submix effect chain overrides upon entering or exiting the associated volume.
- Added the Absolute Value MetaSound node.
- Added OnListenerEnter and OnListenerExit Blueprint events for AudioGameplayVolumes.
- Added the QToBandwidth MetaSound node that converts filter parameter values for ease of use with the Biquad Filter node
- Added a name field to Audio Gameplay Volume Filter Proxy.
- Added a name field to Audio Gameplay Volume Attenuation Proxy.
- Added timecode rate and drop frame data reading from RIFF iXML for Sound Waves.
- Added the
au.Debug.Streaming
console command to support audio stream profiling. - Added the Ring Modulation MetaSound node.
- Added the ability to default AudioModulation ModulationControlMix stages to the value of a bus' parameter when changing a mix stage's associated ModulationControlBus.
- Added the Trigger Select MetaSound node to support passing input triggers to output triggers based on given input indices.
- Added Trigger On Threshold MetaSound nodes for Float and Integer types.
- The WavePlayer MetaSound node now supports surround sound audio channel configurations.
- Constructor pins have been added to allow you to set constant values for the lifetime of a MetaSound asset.
- Added Bink Audio decoder libraries for Stadia.
- Added low-level memory tracking for audio spatialization plugins.
- MetaSound Sources now support surround sound audio output.
- SoundWave Cue Points can now be accessed from Blueprints.
Improvement:
- AGVListener tracks active proxy mutators to allow for a removal step.
- AGVListener tracks owning audio device ID (instead of world ID).
- Added detail customization to the AudioGameplayVolume Reverb component.
- Renamed FillMutator to CopyAudioDataToMutator in the AudioGameplayVolume system to better reflect functionality.
- Restructured creation code path in the AudioGameplayVolume system to remove the need for Super calls.
- Renamed AudioGameplayVolumeProxyComponent to AudioGameplayVolumeComponent to reduce name length and to better reflect intent.
- Renamed UAudioGameplayVolumeComponentBase to UAudioGameplayVolumeMutator.
- AudioGameplayVolume Components may now be added at runtime.
- Added profiling information for Audio Gameplay Volume Proxy types.
- Reduced the baseline runtime memory footprint for MetaSounds.
- Source Data Override plugins can now be implemented for all of our supported platforms.
- Improved low-level memory tracking in audio-related code to provide more accurate data for analysis and debugging.
- Re-enabled support for visualizing sound source attenuation shapes with the
au.3dvisualize.attenuation console
variable. - Renamed UMetaSound to UMetaSoundPatch for clarity and in response to community feedback.
- Audio Modulation destinations now support sets.
- Audio Modulation sources now support unions and can be mixed with each other at runtime.
- Audio parameter transmitters will no longer be generated for SoundWave asset types which do not support parameters.
- Improved support for 3rd party and plugin-defined DataTypes within MetaSounds.
- Submix sends can now be performed before or after attenuation.
Crash Fix:
- Fixed a crash that occurred when calling certain Audio Bus Blueprint nodes without input assets.
- Fixed a crash that occurred in AudioCapture when no audio devices were enabled.
- Fixed a crash that occurred when undoing changes to AudioVolume assets.
- Fixed a crash that would occur when using the submix spectrum analyzer with an unclamped hop size.
- Fixed a crash caused by the Flanger MetaSound node.
Bug Fix:
- Adjusted Audio Gameplay Volume Proxy activation timing so that other components have a chance to initialize first.
- Fixed an AudioGameplayVolume issue concerning an uninitialized listener at the origin.
- Fixed an issue where Audio Gameplay Volume Listener Enter and Exit messages would propagate to disabled components.
- Fixed errors in several tooltips.
- Fixed an issue in GameplayStatics involving ownership assignment of new Audio components.
- SynthComponent will now avoid taking destroyed component pointers when creating audio components.
- Fixed unexpected Actor lifecycle behavior due to Sound Library holding strong references.
- Generator nodes in MetaSounds will no longer behave incorrectly when given negative frequencies.
- Fixed a frequency modulation issue in MetaSounds that would result in frequencies going above the Nyquist frequency.
- Fixed an issue where the submix buffer listener would erroneously receive audio with sibling submix audio mixed in.
- Fixed an overflow warning in the Soundscape system.
- Changes made to virtualized MetaSound parameters from Blueprints or C++ will now be respected.
- Fixed an incorrect calculation of real values of spectrum in AudioFFT.
- Fixed an issue where setting the Wet/Dry value on the Compressor MetaSound node would introduce phasing.
- Mixed values will now be properly passed in the associated parameter's units when using the Normalized Boolean option on a MetaSound Modulator Mix node.
- Importing a 16-bit .wav file will no longer send a warning to the output log.
- Fixed an issue where a Modulation Parameter's unit would not display correctly when used in a Control Bus Mix.
- Undo and redo actions will now function properly when adding and removing MetaSound interfaces.
- Fixed streaming seek failures in LPCM decoder.
- Fixed a bug where MetaSounds did not properly virtualize if the WaveInstance's Volume Modifier value is set to 0.
- Fixed a bug where putting large values in the Bitcrusher MetaSound Node's Bit Depth value would occasionally produce unexpected distortion.
- Sample count in the Bink decoder is now properly updated when seeking.
- Correctly modulating a parameter on a SoundWave or MetaSound will no longer display a mismatch warning.
- The Parameter and Destination mismatch warnings now display all mismatches on the SoundWave or MetaSound.
- The MetaSound Editor meter values and channel count now display correctly for mono MetaSound Sources.
- Fixed an issue where MetaSound input nodes would create unexpected connections when renaming.
- Fixed an issue where using multiple submix spectral analysis delegates would produce incorrect output values.
- Fixed an issue where MetaSound nodes contained within comment nodes could produce unintended movement.
- MetaSound assets with non-spherical attenuation will now virtualize properly.
- SoundWave asset thumbnails will no longer disappear when dragging and dropping.
- Fixed an issue where enabling the base submix toggle would not affect previewed MetaSounds.
- Fixed an off-by-one error causing looping SoundWaves within MetaSounds.
Deprecated:
- The MatchDevice option for Sound Wave Sample Rate Quality has been deprecated.
Blueprint
New:
- Minor QoL improvements for Blueprint stack traces.
- Warnings will always display the name of the function that tripped the warning.
- Complete stack traces have an additional
<---
to highlight the top of the stack. - Full paths are used, which helps track down the package that has the Blueprint.
- Exposed UCurveBase class to Blueprint.
- Move Blueprint extensions to private and exposed getters and setters.
Crash Fix:
- Fixed crash in the script disassembler.
- Fixed CompileAllBlueprints from crashing on a Blueprint function that contained a delegate input.
Bug Fix:
- Tooltips for floats were not the same in the My Blueprint window for floats, the display should now include either a single-precision or double-precision next to the float type.
- Event Dispatcher Inputs will now inform and warn the end-user when there is an existing matching input name.
- Fixed a missing warning when macro pins have a name conflict.
- Updated code comment on FScriptMapHelper and FScriptSetHelper FindInternalIndex functions. The API will now redirect potential callers to the more efficient method for iteration.
- Exposed on spawn properties which use a BlueprintSetter if available.
- Fixed Loss of precision with String to Float Real conversion.
- Fixed a regression which caused the root transform to be discarded on a serialized Actor-based Blueprint's instanced component hierarchy after inserting a new root component into its native parent class.
- Fixed FAssetData from reporting that a UBlueprintGeneratedClass is a UBlueprint which was causing the wrong ActorFactory to be selected.
- The tooltip for float map values in Blueprint Structures will now show precision Similar to GetToolTipForComboBoxType and GetToolTipForComboBoxSecondaryType.This ensures that we can see the precision of the float type when it's a map value.
- Fixed an Infinite Loop that was caused from Macros setup not being detected.
- Fixed a regression that could block property value serialization of import text from creating a placeholder linker object in lieu of a deferred Blueprint class asset at editor load time.
- Fixed a legacy pin default value mismatch warning check on node reconstruction to handle string diffs that convert to identical values.
- Blueprint Class Default Object package export creation is now deferred on load so placeholder dependencies can be resolved prior to invoking the native base class Actor. This allows for proper component type override support at the Blueprint editor level.
- Fixed a CIS Content Error where unhandled implicit casts were found during compilation of a function. The BP compiler had erroneously reported that python nodes might be missing implicit casts.
- Delegate fixup was not working when bound functions are not in the current Blueprint. A consequence of using doubles in Blueprints is that delegate binding can fail if a native delegate signature uses floats. The proxy function graph will now read this property when it calls the original function.
- Vector literal pins had lacked precision with high values Similar to other numerical Slate widgets. SGraphPinVector now has a template so that it can choose between a float and double representation. Currently, only the BP editor will use the double variant, while other tools continue to use a float.
- SGraphPinVector2D and SGraphPinVector4 have been updated to use a template.
- Fixed FBasicTokenParser::GetToken function to support double literals.
- Added support for resolving weak references to placeholder linker objects created in deferred Blueprint object serialization paths on editor load.
Deprecated:
- Deprecate Make Literal Double node Instead of having two float-related literal nodes, we should only have one.
- Deprecated ClassNames and RecursiveClassesExclusionSet pins on make and break nodes for the native ARFilter struct type.
- Deprecated UBlueprint::bHasAnyNonReducibleFunction.
Removed:
- Removed engine plugin test assets that were no longer in use.
Blueprint Compiler
Crash Fix:
- Fixed a crash when adding or removing variables from a Blueprint that inherits from another Blueprint.
- Fixed a Blueprint compiler crash that occured after deleting a default instanced subobject element from a set or map variable.
- Removed a redundant second-stage compilation pass after duplicating a Blueprint with a missing or invalid parent class, which could lead to a crash in certain scenarios.
- Serializable data is now purged before consigning child function objects to the trash container during Blueprint class compilation. This avoids crashes related to serializing object references after they may have been freed.
- Fixed a Blueprint compiler crash that occurred when struct type dependencies were missing
Bug Fix:
- Delegate bindings are now fixed after renaming a custom event node without requiring a full Blueprint compilation pass.
- Fixed the Blueprint compiler to generate a well-formed bytecode expression for a struct literal term when the struct type declares one or more fields of a type that does not have Blueprint support.
- Fixed regression when reinstancing Blueprints that have complicated child object graphs.
- Updated cache dependent lists prior to reloading and/or unloading a Blueprint's outer package.
- No longer attempt to re-instance artifacts from a previous re-instancing pass when reloading a Blueprint asset.
- Inherited component template overrides are now being included in Blueprint data validation.
Removed:
- Removed the Blueprint editor project setting: "Force All Dependencies to Recompile". The command BP.bForceAllDependenciesToRecompile 1 can be used at the console for debugging if still needed.
Blueprint Editor
New:
- Added a Break This Link command to graph editor, which is displayed instead of the Break Link submenu when there's only one link to display.
- Exposed enum EAssetEditorOpenLocation to Blueprint
- Blueprint namespace editor features are now enabled by default.
- Blueprint graph pin value inspection tooltips are now expandable by default when debugging in PIE.
- Reportedadditional context to the log without crashing the editor.
Crash Fix:
- Fixed the source of a potential editor crash during Blueprint namespace harvesting.
- Fixed a regression that led to an editor crash when right-clicking a Blueprint delegate variable without an active function graph tab.
- Fixed an editor crash that would occur when replacing one or more references to a conflicting variable name after reparenting a Blueprint class.
- Fixed a crash that occured when undoing an Add Event operation in the Blueprint Editor.
Bug Fix:
- Enabled external DLL linkage for SFindInBlueprints (and related) Blueprint editor APIs.
- Unloaded type assets are now included in the member type selector in the User-Defined Structure asset editor.
- Blueprint-added component names are now validated on entry to conform to UObject naming conventions.
- We now defer re-running construction scripts until after we fix up the template hierarchy when duplicating a component in the Blueprint editor.
- Removed some unnecessary computations in FEdGraphPinReference::GetTypeHash.
- Excluded override flag members from the optional input pin set on MakeStruct nodes. An "override flag" is an inline toggle-style Boolean edit condition.
- Inline toggle edit conditions can no longer be exposed directly as an input on a MakeStruct node. This brings the MakeStruct node UX closer to parity with the Property Editor UX.
- Composite nodes can no longer be pasted into Blueprint graphs that aren't schema-compatible with the node's subgraph.
- Fixed a regression that could trigger an ensure when editing inherited variable default values in the Blueprint editor.
- Fixed a regression that caused subobjects instanced from non-native archetypes to fail export creation, which led to some data loss on load.
- Added guard code to catch invalid Blueprint node spawner references during Garbage Collection.
Blueprint Runtime
Bug Fix:
- A stub function is now emitted if the Blueprint compiler backend raises an error during translation of compiled script statements to bytecode. This avoids a potential ICE report at runtime.
- Blueprint execution will now bypass development-only nodes in a Blueprint function graph when a project is configured to compile them out at cook time.
- Fixed latent call site targets in a compiled Blueprint ubergraph to avoid re-entry when the latent info term is declared as the first argument in the native API signature.
Gameplay
API Change:
- Now Ability Tasks should make sure to call Super::OnDestroy only after they do anything needed to the Ability pointer, as it will be nulled out after calling it.
New:
- Added support for Gameplay Effects to add blocked ability tags.
- Exposed APlayerState::IsSpectator to Blueprints.
- Added console variable for Blueprint Action Filter Caching. (set BP.EnableActionMenuFilterCaching to true to speed up right click menu in Blueprint graphs)
- Converted FGameplayAbilitySpec/Def::SourceObject to be a weak reference.
- Made a Ability System Component reference in the Ability Task a weak pointer so Garbage Collection can delete it.
- Added WaitGameplayTagQuery nodes. One ia based off of the UAbilityTask and the other is of UAbilityAsync. This node specifies a TagQuery, and will trigger it's output pin when the query becomes true or false, based on configuration.
- Added a templated version of the GetCharacterMovement function.
- Added color coordinated outlines to changed nodes/pins in the Blueprint diff window to reflect their diff state.
- Added virtual method to controllers to control if they participate in seamless travel.
- Modified AbilityTask debugging in Console Variables to enable debug recording and printing to log by default in non-shipping builds (with ability to hotfix on/off as needed).
- You can now set AbilitySystem.AbilityTask.Debug.RecordingEnabled to 0 to disable, 1 to enable in non-shipping builds, and 2 to enable all builds (including shipping).
- You can use AbilitySystem.AbilityTask.Debug.AbilityTaskDebugPrintTopNResults to only print the top N results in log (to avoid log spam).
- STAT_AbilityTaskDebugRecording can be used to test perf impact from these on-by-default debugging changes.
- Added the ability to override the list of default Blueprint categories. These can be configured in the Blueprint Editor settings.
- Exposed functions for fetching a scalar material parameter index and then setting the parameters by index to Blueprint in order to optimize cases with extreme amounts of material parameters where many are set each frame.
- Made UDataAsset types diffable in editor rather than from text.
- Removed redundant enum EWaitGameplayTagQueryAsyncTriggerCondition.
- Removed AActor::DetachFence reducing size of AActor by 16 bytes. It's not necessary to prevent the Actor from being deleted before the component finishes its destruction. In Garbage Collection all objects must complete FinishDestroy before any objects can be freed, and UPrimitiveComponent's fence will ensure both objects live long enough.
- Added a new Initialization State System to the Game Framework Component Manager. This system allows individual components to register with a global subsystem for handling initialization state changes for an Actor without requiring that the Actor knows about all possible components.
- Components can broadcast their state during initialization and other components can listen for callbacks on state changes. This is designed to be used with Game Feature Plugins to build game-specific initialization flows that work properly in multiplayer situations.
- Fixed typos with type name, FMinimapReplicationTagCountMap to match the type name FMinimalReplicationTagCountMap.
- Added a new PreLevelRemovedFromWorld callback for cases where the handler needs to act on the level while it still has its OwningWorld.
- Added support for preloading data registries and sources in the editor when a game feature is registered instead of waiting for full activation. This will show the valid keys in the picker UI but can result in missing errors for invalid accesses in PIE. This is currently opt-in with PreloadInEditor on the game feature action.
- Updated the SignificanceManager which maintains lists of objects to update rather than rebuilding each frame. Previously we would build up the lists of objects to update, and the list of objects requring sequential post work each frame. We now update these lists in Register/Unregister to keep them in sync with ManagedObjects.
- GameplayTasksComponent and AbilitySystemComponent now support the registered subobject API
- Moved some replicated members to private access. Derived classes should use the Get/Set functions instead. By default these components keep replicating their subobjects from the ReplicateSubObjects function.
- Added support for removing plugin-added gameplay tags when a gameplay feature is unregistered. With default settings this will only happen in the editor as removing tags at runtime is much riskier.
- Added the Blueprint Header View plugin, a new tool to assist developers in converting Blueprints to C++.
- Create the Platform Input Device Mapper. This provides an interface that platforms can use to create a map of Input Devices to their owning PlatformUser. This will allow for granular control of how many input devices are mapped to a single user, which some platforms want to do differently than others.
- The API can be used to query what devices are mapped to which user, so that you can easily determine which controller should recieve a force feedback event, or which user has pushed a certain button.
- Created the FInputDeviceID struct, which represents a single input device such as a gamepad, keyboard, or mouse. These are globally unique, and allocated by the Platform Input Device Mapper. This struct will replace the old "int32 ControllerID" that is used in various places to provide some type safety and maintainability.
- Added Functions to query all the currently connected devices on a given platform, as well as get their current state and owning platform users. These can be exposed to Blueprints from the local player, game instance, or a subsystem in the future.
- New delegates for the ConnectionChange and PairingChange of a gamepad device that utilize the new FInputDeviceId and FPlatformUserId.
- Added functions to the GenericApplicationMessageHandler for the "OnController_X" functions.
- Added visibility for local function variables inside the Blueprint diff tool.
- Added debug recording of camera shakes.
- Added a debug command to filter GameplayCue events.
- Fixed Typo and format in K2Node_IfThenElse.
- Added a showdebug Devices command that will display debug info about all current platform users and their connected input devices. This will display some basic information on the screen that will be useful while testing on different platforms.
- Added an Input Setting to toggle motion controls. This can be useful if you want to enable/disable any logic inside of UPlayerInput::InputMotion. Adding this setting in the Input Settings will make it a config variable that you can simply set per-platform from the DefaultInput.ini, which will be useful when shipping on multiple platforms.
- Added this flag on the player controller so that you can enable or disable motion controls per player if desired.
- Added a boolean bShouldFireDelegatesInEditor property to the Enhanced Input Component. This will make sure that only Input Components that have the flag specifically set when they are created will fire in-editor delegates with an Editor Script Guard. This ensures that no game-only input actions will be fired as editor delegates while keeping the implementation details hidden from the editor users.
- Added Register and unregister camera stand-in property accessors on module load and unload.
- Added GameplayStatics functions for getting the player's platform user id instead of the older int32 controllerID.
- Added a ShouldFlushKeysWhenViewportFocusChanges function to the player controller, which allows the GameViewportClient to check if the PlayerController keys need to be flushed when the viewport changes depending on the Input Mode you are in.
- Blueprint Debugger's search field will now search for actual variable names as well as display names
- Renamed UMatineeCameraShake to ULegacyCameraShake.
- Added ability to check if a UInputComponent is in an APlayerController's input stack.
- Added Override properties for the Player Input and Input Component classes on the Pawn and Player controller. This will give you the capability to override the input classes at the Blueprint level so that you don't need native C++ to override it.
- Created accessors on the Enhanced Player input for the currently applied mapping contexts and mappings. These functions will make it easier for users to extend this class, while still keeping the AppliedInputContext and EnhancedActionMappings properties const and non-mutable.
- Added the Enhanced Input Editor Subsystem. The Enhanced Input Editor subsystem will allow you to bind to Input Delegates in Editor Utility Actors or other Editor-time objects. The input is driven by an InputProcessor, and this subsystem will only incur any cost to the user if they manually enable it.
- Added an input component to the Editor Utility Actor so that you can bind to enhanced input and other runtime input delegates in editor utilities outside of PIE. This will make it easier for virtual production teams to bind input of physical camera equipment to Actors in the level. Listening to input is opt-in per utility, and would currently only be triggered if you create an associated Input Action that is available to the Editor.
- Made the TickForcedInput function protected on the EnhancedInputSubsystemInterface. Without this, the only place that you can tick the input on the Enhanced Input subsystem would be from the Enhanced Input module itself.
- Added Degree ATan and Degree ATan2 to the k2node_mathexpression, as well as DegreeToRadian and RadianToDegree functions.
- Added UTimelineComponent::GetScaledTimelineLength function, which returns the timeline's length divided by the play rate.
- Changed the default behavior for variable name collisions with a native parent class, Blueprint variables will now be removed and all references in Blueprints will point at the native variable.
- Added Enhanced Input developer and Platform settings which will allow you to specify per-platform input data. Created a "UEnhancedInputPlatformData" base class that can be subclassed in a Blueprint and placed on specific platforms. By default, this object has a map of Input Contexts that will "redirect" one context to another. This makes it possible to swap out Input Mapping Contexts on specific platforms, with an asset that will simply be added to the input ini of the game.
- Added Gameplay cameras world subsystem for an easier way to start and stop animations.
- Added a flag for flushing input when you change the UI mode on a player controller. This will ensure that any input actions get properly canceled and have their key state reset if desired.
- Added new debug commandsAbilitySystem.DebugAbilityTags, AbilitySystem.DebugBlockedTags, andAbilitySystem.DebugAttribute to the Gameplay Ability System.
- Automatically upgrade projects with the default input class to use Enhanced Input when the project starts. Enhanced Input is fully backwards compatible and users that were previously using the DefaultInput classes will not see any behavioral change. By default this behavior is on, but it can be turned off with the console variable EnhancedInput.bEnableAutoUpgrade.
- Added a function to allow you to get the mapping context priority from the Enhanced Input subsystem.
- Added a Scale by delta time input modifier. This can be useful if you wanted to have your look input implemented, then you don't need to add an additional deltatime call in your input code every time.
- Added a ControlMappingsRebuiltDelegate delegate to the Enhanced Input local player subsystem. This allows you to listen for changes to control mappings or bindings for the UI and rebuild them.
- Added support for input pins with multiple connections to the PinValueInspection tooltip.
- Allow Debugging of Transient Blueprint object instances.
- Added functions on the game instance and local player to create players based on a platform user id instead of the older int32 controllerId.
- Fixed the Enum to String Node to not display as a compact node, which was making it look different from a Byte to String for clarity.
- Added a menu bar to Blueprint Debugger for opening closed tabs.
- Added better logging to indicate why Gameplay Abilities failed to be activated.
- Added a project setting to suppress deprecation warnings for specific properties or functions in Blueprints.
- Added helper methods in the engine to get the local player from a FInputDeviceId.
- Added an FText action description to UInputAction.
- Changed the category of the Input Mapping Context description field to be consistent with the input action's.
- Created a new UnmapAllKeysFromAction function to be more explicit.
- Added a Blueprint function to get a debug string representation of a Gameplay Attribute.
- Allow calls to CreateChildActor to supply a function to manipulate properties before the construction script is run.
- Extended Enhanced Input with a combo Input Trigger. This allows users to trigger an Input Action through the completion of a series of Input Actions that are specified by the user. Users can specify times to complete Input Actions and Input Actions that cancel/stop the combo.
- Added support for dragging variables onto pins to automatically convert/promote them.
- Added a new Gameplay Task resource overlap policy to cancel existing tasks.
- Fixed a comment in the Gamemode class when ending the match.
- Made action mappings within an input mapping context reorderable in Enhanced Input.
- Added new ObjectIsA method that is Blueprint pure.
Improvement:
- Optimized padding in AActor to reduce size from 664 bytes to 640.
- Improved diff messages for local function variables inside the Blueprint diff tool.
- Optimized sequencer camera animations by excluding unnecessary systems from the linker, and by using a much simpler bound object instantiator.
- Refactored component instance data cache to be able to store actor or component instance data
Crash Fix:
- Fixed a crash that occurred when opening a collapsed node after undoing the creation of a second execution pin.
- Fixed a crash that occurs when splitting then recombining connected pins.
- Fixed a potential crash in FBluepirntEditorUtils::FindAndSetDebuggableBlueprintInstances.
- Fixed a crash when expanding Set Properties in the Blueprint Debugger.
Bug Fix:
- Fixed issue where replicated loose gameplay tags were not replicating to the owner.
- Fixed AbilityTask bug where abilities could be blocked from timely garbage-collection.
- Fixed inconsistencies in the Blueprint diff tool where graphs wouldn't move together when you click a diff entry.
- Fixed a bug where hovering over variables in the Blueprint diff tool caused them to jump around
- Fixed a bug where the Add components list search didn't compare non-beautified component names.
- Fixed an issue when a gameplay ability listening to activate based on a tag would fail to be activated. This would happen if there were more than one Gameplay Ability listening to this tag, and the first one in the list was invalid or didn't have authority to activate.
- Destroyed the smart object collection Actor rather than using MarkAsGarbage so the level doesn't keep a garbage reference to it.
- Variables marked EditInstanceOnly inside UStruct variables are no longer visible in the Blueprint details view.
- Fixed a bug where changing a variable type inside of a Blueprint Structure caused a cannot parse value error.
- Fixed bug where characters were repeatedly enter falling mode during lateral root motion due to gravity being inverted.
- Members of structs in instanced objects in components are now correctly displayed.
- Added an option to the game feature plugin creation template to allow setting EnableByDefault and properly show that in the plugin UI. This is used in Lyra to create default enabled game feature plugins.
- Fixed a warning about the simulate options of the character's arrow component not being valid.
- Fixed an issue where Blueprint callable functions on native interfaces were incorrectly detected as invalid.
- Changed Game Feature plugins to load the DefaultPluginName.ini using the same method as normal plugins so it works on arrays. The old code to load PluginName.ini still runs with a log message.
- Moved some Gameplay plugins with Blueprint hooks to initialize in PreDefault so they are ready for early Blueprint loads referenced by native code.
- Changed the Common UI game viewport to check the override delegate before letting the UI block input.
- Fixed a memory leak that occured when composite data tables have sources with conflicting rows.
- Fixed editor UI when adding the first game feature plugin to a project, validation would always fail if Plugins/GameFeatures didn't already exist.
- Fixed GameplayEffects that use Data Registries correctly from warning on load and improved the warning text.
- Removed code from UGameplayAbility that was incorrectly only registering the last instanced ability with the Blueprint debugger for breakpoints.
- Fixed NetworkPredictionCVars cmd description mismatch so that the commands match up with their proper functions.
- Fixed a bug where UAnimDataModel would cause the debugger to hang while generating debug info.
- Stop and discard camera shakes that are getting recompiled while they're in the previewer tool.
- Only create a new default subobject when destroying a component if the owner's class is not native. Native owner classes do not have to have a DefaultSceneRoot when you drag in the C++ class directly from the content browser into the level.
- Fixed BindAction function from not accepting additional function parameters.
- Added a default console key for Hungarian keyboard layout.
- Changed FCachedKeyToActionInfo::PlayerInput pointer to a WeakObjectPtr. In order to be Garbage Collected on level transitions.
- Added a null check on the PlayerInput in OnInputOwnerEndPlayed because it is a weak pointer and not guaranteed to be there.
- Do not allow pass by reference to be changed for array properties as they are implicitly always pass by reference.
- Align Client names in Blueprint Debugger with PIE window titles.
- Created camera shake instances using the world. The parent sequence is running in. This fixes missing context for camera animation sequences inside camera shakes.
- Fixed SetupAttachment false positive ensure that occured when called on a component that already had an AttachParent.
- Added a special case to FKismetDebugUtilities::FindClassPropertyForPin for reroute nodes.
- Fixed Gameplay Ability System Ability getting stuck if EndAbility was called during the lock inside ApplyGameplayEffectSpecToTarget.
- Fixed BP Debugger Step Over not behaving correctly with Sequence nodes with a branch as the end of the exec line.
- Fixed a bug where delegate pins in LatentGameplayTaskCall nodes were not correctly compiled with delegates from super classes.
- Fixed a bug where Debugging mode was not ended if the PIE Window was closed.
- Fixed a jump resimulation issue that occured on the character movement component.
- Input Action instance data that is flagged to trigger with StartedAndTriggered will now ensure that the Started delegate will always get called before the Triggered delegate.
- Fixed sequence camera shakes not being torn-down correctly in some situations.
- Fixed a bug where MultiLine metadata was applied to all new Blueprint variables.
- Prevented abstract classes from being used by create object from class nodes
- Fixed a bug where Step Over would sometimes break inside the function you're trying to step over.
- Fixed a bug where the Blueprint Debugger would not find debuggable objects in a WorldPartition sublevel.
- Fixed incorrect documentation of the FNodeHandlingFunctor function.
- Fixed camera manager's BlendParams keeping outdated information.
- Changed Make and Break nodes for the FInputActionValue struct in Blueprints to correctly take in a EInputActionValueType enum instead of the incorrect FInputActionValue struct.
- Call the correct "OnController" function from the SVirtualJoystick. Before it was only calling OnControllerAnalog, which will result in normal FKey's never having their "Released" input be triggered. This fix calls OnControllerButtonPressed and OnControllerButtonReleased for non-analog keys, which will give the correct behavior.
- Fixed the wrong serial on the first camera animation handle.
- Fixed character movement data that could be left with dangling UObject references.
- Fixed a bug in Network Prediction Examples plugin where locally-predicted Actors could exhibit stuttering motion.
- Fixed deprecated Event Dispatchers on components that do not throw a warning on their attached Actors.
- Fixed a bug that could allow stale Root Motion Source objects to stay in memory indefinitely.
- Fixed issue where player pawns would not be spawned from the function RestartPlayerAtTransform.
- Fixed a bug that prevented Network Prediction Insights tool from showing trace data samples.
- Clamp the local pixel mouse position to the range of an int32 to prevent invalid casting bounds.
- Fix to allow users to coerce a BlueprintImplementableEvent with no return value to treat the override as a function rather than an event.
- Fixed a bug where the jump apex height could vary if root motion was active while a character jumped.
- Fixed an ensure in FPreviewScene when using a GameMode that derives directly from AGameModeBase.
- Fixing issue where private functions could be overridden in the "My Blueprint" tab.
- Collision visibility option in the Blueprint editor.
- ChildActorComponent now registers to the ChildActor's OnDestroy event. This allows the component to clean up its references if the ChildActor is destroyed through a path that doesn't involve the component itself.
- The Blueprint callstack will now be dumped when the MostRecentPropertyAddress is null.
- Fixed empty Actors having a root component with an Edit in Blueprint hyperlink.
- Fixed issue where Enhanced Input Action node trigger events were incorrectly flagged as unsupported.
- Updated icons for Enhanced Input assets so they display correctly.
- Made ClearActionBindings and ClearBindingsForObject virtual on the UInputComponent and overrode the UEnhancedInputComponent to ensure the additional Enhanced action bindings are cleared. Previously calling ClearActionBindings on an EnhancedInputComponent would still leave some bindings uncleared.
Deprecated:
- Demoted BlueprintSnapNodes plugin to Experimental.
- Deprecated the IsPrimaryPlayer function on the APlayerState. This function always returned "True" incorrectly. Instead of using this function on the player state, you can use the Player Controller or ULocalPlayer's Platform User ID and check if that is the platform's primary user in the IPlatformInputDeviceMapper.
- Deprecated UInputMappingContext::UnmapAction.
- Deprecate the core delegates for OnControllerConnectionChange and OnControllerPairingChange in favor of the new IPlatformInputDeviceMapper versions that will allow you to get info about what gamepad specifically has sent input events.
- Update SlateApplication and the message handler to take in FInputDeviceId and FPlatformId instead of the old int32 controllerid for controller input.
- Deprecated the old version InputKey on the base UnrealClient. All Input functions on the client have been upgraded to take in a FPlatformUserId and FInputDeviceId in favor of a single int32 ControllerId.
- Deprecated the GetPawnPhysicsVolume query in favor of new GetPhysicsVolume query that can be called on any Actor.
- Made rerun construction scripts editor only.
- Moved UCSModifiedProperties into sparse storage as only a small percentage of all components stored data in it.
Removed:
- Removed the UEnhancedInputEngineSubsystem. This will be replaced in favor of a World subsystem after the player input has been separated from the player controller.
- Removed "Within=PlayerController" on the Enhanced Player Input. This allows you to spawn a new player input without an owning player controller, such as with the editor input subsystem.
- Removed AbilitySystem.Debug.NextTarget and PrevTarget commands in favor of global HUD NextDebugTarget and PrevDebugTarget commands.
- Deprecated 5.0 functions from Enhanced Input. Enhanced Input was experimental when these functions were deprecated.
- Old version of AddMappingContext.
- Old version of RemoveMappingContext.
- Old version of RequestRebuildControlMappings.
- Removed float result components and the float blender system. Implemented double precision and handled float to double conversion during property instantiation.
- The Default value to the name of the action with the common "IA_" prefix and replaced underscores with white spaces.
- Removed MultiLine metadata tag instead of setting it to false in Blueprint variable details customization.
- Unused local variables in Blueprint graph nodes.
Mass
API Change:
MASS_DO_PARALLEL
is now enable for all non-UE_SERVER
builds.- All the
FMassEntityQuery
hosted as properties by processors need to be registered at construction time.
New:
- Made Mass's multithreading enabled by default.
- Introduced a MassDebugger UI tool. The tool contains information on:
- all registered Processors.
- at runtime shows all Archetypes present at the time of data gathering (which can be manually instigated).
- archetypes display their compositi
- comparisson between archetype compositions is supported.
- summary information is displayed when multiple archetypes are selected including total number of entities and memory allocated.
- Mass Processing Phases' processing graphs along with dependency information
- The views are synchronized meaning clicking an archetype or a processor in one view will reflect in other views marking relevant elements.
- Marked a number of Mass or Mass-used systems as save to be accessed off-game-thread. Also added a dedicated traits template for shared fragments.
- Added a
TSharedPtr<FMassEntityManager>
member to MassExecutionContext. This change has long been coming, we always use given execution context with only a single entity manager instance, and the lack of connection between context and the manager required some use cases to cache the manager. - Mass's original procedural Farm Test has been brought back and can be found in MassEntityTestSuite module.
- Modified FMassArchetypeSubChunks to support archetype-less entities (i.e. built but not created).
- Enriched MassEntityQuery with capability to declare USubsystem requirements, that then can be fetched at runtime via the MassExecutionContext. MassEntityQuery requirements are declared just like other requirements with a dedicated AddSystemRequirement call. MassExecutionContext supplies functions for fetching subsystem instances checking if active query declared them as dependency in a given mode (ReadOnly or ReadWrite).
- Added another flavor of FMassEntityManager::GetOrCreateConstSharedFragment that makes for more consistent hash calculation (the function itself is calculating it).
- Exposed parts of MassEntityTestSuite for reuse in other test-focused plugins.
- Mass's gameplay debugger category now displays fragment composition of a selected entity.
- Added
mass.LogKnownFragments
console command that prints out all "known" tags and fragments. - Added API functions to batch-change entity collection's tags.
- Separated "entity management" and USubsystem elements of UMassEntitySubsystem. Now UMassEntitySubsystem hosts a shared ref of newly created FMassEntityManager type, and users are free to create their own FMassEntityManager instances to create isolated entity pools.
- Added a way to mark up MassEntityQueries as owned by a processor and auto-registering such queries. Also added some verification code that ensures all queries run as part of processors are properly marked up as such. This change supports automated, resource-based processor dependencies.
- Switched UMassEntitySubsystem.FlushedCommandBufferQueue from
TQueue<T, EQueueMode::Mpsc>
to more efficientTMpscQueue<T>
. - Resource-based Mass processor dependency solving resulting in finer-grain dependencies resolution. The main change is that if a processor P in group A depends on a processor R in group B we no longer infer group A depending on group B (which was the case previously). In fact, groups are no longer represented outside of dependency solving step - once dependencies are solved we end up with a list of processors ordered in a way respecting both declared "execute after" and "execute before" dependencies but also dependencies resulting from requirements declared by Processors' queries.
- Added debug name to Mass archetypes.
- Made Mass gameplay debugger category's use of UMassDebuggerSubsystem optional and instead require UMassEntitySubsystem.
- Changed how we treat missing dependencies in Mass dependency solving - used to be an error, now we create dummy temporary nodes to maintain before-after dependencies even if used in reference to a non-existing item.
- Cut UMassDebuggerSubsystem's capability to host entity handles to be debugged and replaced the only use case (in Mass gameplay debugger category) with a custom query to fetch location-owning entities. The old approach had the downside of allowing to pick only entities that had a special debug fragment in their composition, which resulted in confusion while trying to pick entities.
- Added MassProcessor.ProcessorRequirements to track subsystems (and potentially other elements) accessed by a given processor outside of MassEntityQuery.ForEachEntityChunk.
- Added support for declaring subsystem requirements to MassEntityQuery and fetching subsystem instances from MassExecutionContext using TSubclassOf.
Bug Fix:
- Made UMassSignalProcessorBase::OnSignalReceived thread safe.
- Made MassEntityQuery.ForEachEntityChunk's path for entity collections utilize stored requirements mapping if given archetype is "known" by the query (i.e. its one of the cached archetypes). This is the most common case and reusing mapping save nontrivial of work.
Deprecated:
- Renamed GET_MASS_CONFIG_VALUE macro in MassSimulationSettings to GET_MASSSIMULATION_CONFIG_VALUE to avoid confusion with the MassEntitySettings' one
- Renamed FMassCommandAddFragment and FMassCommandRemoveFragment to FMassCommandAddFragments and FMassCommandRemoveFragments respectively.
- Mass batching-focused API changes. "Old" mass commands completely removed and reimplemented as batched commands using the new batched API. Other renamed types:
FMassArchetypeSubChunks
toFMassArchetypeEntityCollection
FSubChunkInfo
toFArchetypeEntityRange
FArchetypeChunkCollectionWithPayload
toFMassArchetypeEntityCollectionWithPayload
- Extracted MassExecutionContext into a separate header/cpp files.
- "System" and "Subsystem" names' use has been made consistent across Mass's code, favoring "Subsystem". A number of function and parameter names has been affected.
- UE::MassEntity namespace has been renamed to UE::Mass, for consistency with overall Mass namespace naming.
- Renamed MassProcessingPhase.h/cpp files to MassProcessingPhaseManager.h/cpp
- MassSchematic and MassSimulationLocalCoordinator have been removed due to no longer being used.
- Removed UMassLODProcessorBase due to it not serving an actual purpose.
- Got rid of DECLARE_ENUM_TO_STRING-declared
EnumToString
functions declared for Mass enums. UseUEnum::GetValueAsString
instead. - Constified FMassReplicationContext's LOD subsystem access
- Cut FMassEntityQuery::ParallelForEachEntityChunk as defunct and no loner being used. We consider bringing it back, but it will be a brand new reimplementation to match current subsystem requirements accessing model.
- Switched MassEntity from supporting interaction with USystems over to UWorldSubsystems. The main reason for the change is to avoid non-UWorldSubsystems special cases we don't utilize nor test at this time. The change is reversible once we have a non-UWorldSubsystem use case.
- Introduced a FMassDebugger struct to host all debug-time API and avoid polluting other Mass classes with those. Existing debug-time functions will be moved over with time.
- Renamed FMassExternalSubystemBitSet to FMassExternalSubsystemBitSet
Networking
New:
- Updated to openssl-1.1.1n on all platforms. The Mac version contains arm64 support.
- Enabled explicit base names when creating graph nodes in ReplicationGraph. This can improve readability when using logging and debug cmds like RepGraph.PrintGraph.
- Added -forkautostatsport command-line option that automatically sets a unique port for each forked child with PerfCounters. Ports used will start at statsPort+1.
- Setting net.AllowPIESeamlessTravel 1 will now enable experimental support for seamless travel in Play in Editor networking.
- Added cheat to validate the old and new methods of replicating subobjects. Enabled via net.SubObjects.CompareWithLegacy. The comparison is run only for actors that converted to the new list. This calls the ReplicateSubObject virtual so the method still needs to be implemented for the validation to work.
- Actor classes can officially control which of their ActorComponent get replicated or not.
- Classes that want to control component replication need to override AllowActorComponentToReplicate to do so.
- Classes can also return a ELifetimeCondition in the new function and set a net condition to specific components.
- The override and net condition only work for classes that set bReplicateUsingRegisteredSubObjectList to true.
- Added option to manually control untracked class reporting in ReplicationGraph.
- Added optional config that will prevent Actors from replicating if they are not in the BeginPlay state.
- Enabled via the net.ReplicateOnlyBeginPlay console variable.
- The only exception is if a RPC is called on an actor before BeginPlay and opens the ActorChannel. This is because when opening the channel to send the RPC, we need to serialize the actor entirely for the client channel opening. If the actor has not begun play yet we will set up their components for replication and serialize them anyway. Note that sending RPCs this early is not recommended if the BeginPlay on the authority sets replicated variables that the client needs in his BeginPlay also.
- Implemented optional support for assigning a TransactionId for LevelStatusUpdate and ServerUpdateLevelVisibility requests. This is used in multiplayer to allow servers to rely on level visibility status reported by clients to know what data to replicate to clients. Behavior is controlled by two CVars (by default, both are disabled):
LevelStreaming.ShouldClientUseMakingInvisibleTransactionRequest
— if enabled client will send a request to server and wait for an ack before making a streaming level invisibleLevelStreaming.ShouldServerUseMakingVisibleTransactionRequest
— If enabled server will associate a transaction id to each call to ClientUpdateLevelStreamingStatus and wait for the response from the client of that particular request before updating LevelVisibility for replicated data. This is to solve some issues where we might have multiple requests in flight.
- Added
ActorComponent::ReadyForReplication
virtual function to ActorComponent initialization flow.- This function will be called between
InitComponent
but before the component'sBeginPlay
. - It can be used to register pre-existing replicated subobjects or set up replicated properties early.
- This is useful in situations where a component might call an RPC on itself very early inside BeginPlay and trigger the first replication of all its network properties.
- This function will be called between
- Added a console variable that controls if actors and actor component classes use the new subobject replication by default or not.
net.SubObjects.DefaultUseSubObjectReplicationList
needs to be enabled to opt-in to the new method by default.- Classes can still choose their own method by setting
bReplicateUsingRegisteredSubObjectList
in their constructor.
- Added multiple console variables to control how much time is spent on each step of the replay recording process per frame.
- demo.ForcePersistentLevelPriority: always record the persistent level first when using level streaming fixes and prioritization
- demo.DestructionInfoPriority: allow destruction info be to prioritized lower than max int32
- demo.LateDestructionInfoPrioritize: prioritize destruction info after the active actor set
- demo.ViewTargetPriorityScale: scale view target replay priority
- Demo.MaxDesiredRecordTimeMS: update MaxDesiredRecordTimeMS on the current world's demo driver
- Demo.CheckpointSaveMaxMSPerFrame: update CheckpointSaveMaxMSPerFrame on the current world's demo driver
- Demo.ActorPrioritizationEnabled: update ActorPrioritizationEnabled on the current world's demo driver
- Demo.SetLocalViewerOverride: update SetLocalViewerOverride on the current world's demo driver
- demo.MaximumRecDestructionInfoTime: cap the percent of a budgeted frame that can be spent replication destruction info
- Added additional recording metadata to replay headers:
- CheckpointLimitInMS
- FrameLimitInMS
- MinRecordHz
- MaxRecordHz
- Platform
- BuildConfig
- BuildTarget
- Added -skipreplayrollback to not generate startup actor rollback state.
- Added network granular memory tracking to multiple replay data structures.
- Added networking granular memory tracking to multiple data structures.
- Provided a delegate for game code to listen to for Replay ID updates.
- Added support for using poll instead of select in BSD sockets. Sockets will use poll by default (if supported by the platform), but this can be toggled with the USE_SOCKET_FEATURE_POLL macro.
- Added configurable limits for replay event sizes when loading save game replays.
- Added configurable limits for the maximum number of network exports to read from a replay file during playback.
- Added net.AllowPIESeamlessTravel to control seamless travel in single process PIE.
- Added random data to handshake packets in an attempt to work around potential ISP packet-filtering issues.
- Exceeding the maximum allowed replication size for an object now generates an ensure for improved visibility.
- Make servers send close-reasons/NMT_CloseReason to client, for log-info/debugging.
- Added more NetDriver/Beacon close reason coverage.
- Added logging to help debug amortized replay replication times.
- Added an API to retrieve the changelist a replay was recorded on while playing back the replay.
- Use UWorld RemoveNetworkActor instead of directly calling NetDriver RemoveNetworkActor during seamless travel tick in case there is no NetDriver.
- Improved LLM tag coverage for networking memory.
- Added a compile time option for inclusion of the sub-object replication key feature.
- Added a compile time option to remove usage of the replication graph ForceNetUpdate delegate.
- Added checks for unsupported nested NetDeltaSerialize structs.
- Added more comments and a warning around dependent actors in RepGraph.
- Added Session ID's and Client ID's (Connection ID's) to packet protocol.
- Added net.QueuedBunchTimeoutSeconds to replace a hardcoded value.
- Added logging when the value of net.QueuedBunchTimeoutSeconds is exceeded.
- Added a network driver setting for the maximum number of channels per connection.
- Added a connection flag to control whether replication size limits can be ignored.
- Prevent world settings for temporary transition maps from replicating in order to prevent warnings during seamless travel.
- Exposed NetworkProfiler API for linking.
- Added '-LogDebug=MatchStr' command-line parameter and 'LogTrace AddDebug MatchStr' console command to NetcodeUnitTest to trigger debugging on a particular log line pattern.
- Added logging to assist in debugging actor channel failures.
- Added replay result codes for failure to decrypt and missing event data.
- Set an engine default for the net.PartialBunchReliableThreshold console variable to improve network performance of large bunches when there is packet loss.
Improvement:
- Statsport/exec listener now returns a different error message when the exec callback is not registered, the cmd itself was not processed by the exec or the cmd is missing the 'c=' param.
- Clamped replay priority into a valid range before rounding.
- Adjusted recording CSV stats around actor vs destruction info.
- Modified custom property replication conditions to be stored outside of any active network driver, and provided an API to modify them at any time.
- Cleanup of sub-object references in replay recording.
- Improved memory usage of shared serialization data.
- Improved the memory usage of fast array replication states.
- Adjusted the replay streamer interface to make it easier to add common analytics attributes.
- Modified replay scrubbing to reduce memory allocations.
- Improved memory allocation of the local file replay streamer.
- Increased default value for NetPackedMovementMaxBits.
- Refactored log tracing and added ability to trigger console commands on certain logs.
- Command-line example: -LogCommand="ReadContentBlockPayload failed=obj list class=ShooterGameState"
- Console command example: LogCommand Add ReadContentBlockPayload failed=obj list class=ShooterGameState
- Changed subobject outer ensure to a log, so it now falls back to the default behavior (actor as outer) if outer is unavailable.
Crash Fix:
- Fixed issue with ConnectionId assignment that could cause server crash.
- Fixed multiple crash issues with asynchronous replay recording property validation.
- Fixed handling of replication history when the maximum replicated size was exceeded for an object, which would often lead to a crash.
- Fixed crash referencing spectator controllers when loading replay checkpoints.
- Fixed a crash when using out parameters in RPC calls.
- Fixed a replication graph crash in the ShooterGame sample when seamless traveling.
- Fixed a replay crash when attempting to load a map that no longer exists.
Bug Fix:
SupportsMultithreadingPostFork
will not assert if the command-line has not been set when called, instead, it will return true/false based on the DEFAULT define and hope the cmdline override will not break anything later.- Export
FStreamingLevelActorListCollection
to external modules. - Prevented actors outside the destruction radius but inside the current OutOfRange radius check from being added to the OutOfRange list in ReplicationGraph, and, instead keep actors in the PendingDestructionList until they get inside the send radius or outside the OutOfRange radius.
- Marked NetDriver and related objects as garbage as much as possible when destroying the net driver. Released references to objects from open channels on clients during net driver shutdown.
- Fixed grid cell node doubling child node actors.
- Invalidated replicators on the client as soon as their object becomes garbage.
- Cleaned up the replicator so it doesn't leak through AllOwnedReplicators. Handled the case where subobjects are marked as garbage during the channel update, or where the ability system marks a replicated subobject as garbage on the client.
- Explicitly enforced
bReplicateUsingRegisteredSubObjectList
to false for classes for which we will not convert theirReplicateSubObjects
function to the new method. - Actors flagged for serialization will now be serialized just before we call destroy on them with Replay Recording. This allows them to be serialized in a state where they still have most components and properties intact.
- Fixed off by one bug in
DisableAllReplicatedPropertiesOfClass
which did not properly disable all properties. - Fixed an issue where
NetConnection->ViewTarget
was not properly updated prior to replicating data. - Released object references from dormant replicators when levels are streamed out or actors are destroyed.
- Fixed NMT_Failure early disconnects from missing NMT_CloseReason.
- Reduced the number of forced property comparisons when using SetReplicates.
- Fixed a replay checkpoint recording issue when using push model dirty state tracking.
- Fixed servers not ignoring the destruction info net messages.
- Fixed uninitialized vector data when receiving new replicated actors.
- Fixed a case where replicated sub-objects would not be recorded into replay checkpoints.
- Fixed handling of invalid package paths received from clients that could cause a crash.
- Use Owner instead of AttachmentRoot Actor for AttachParent when replicating attachment.
- Fixed handling of actors destroyed in the middle of an amortized replay checkpoint save.
- Fixed an issue where replicated scene components could be added to the AttachChildren array at the indices of unmapped references, leading to the component being overwritten when the reference was mapped.
- Have UActorChannel::KeyNeedsToReplicate check if the subobject is pending dormancy in order to prevent cases where an unchanged key prevents the channel from going dormant.
- Fixed potential package map name mismatch warnings in PIE.
- Prevent stale/garbage LastViewTarget actor being added to Replication List.
- Fixed missing call to PostReplicatedChange on the fast array serializer, when mapping previously unmapped objects (Items PostReplicatedChange calls were not affected). Fixed for both 'net.SupportFastArrayDelta' on/off paths.
- Fixed a race condition in replay recording of torn off actors.
- Fixed a case where recording a new replay would not stop an existing recording first.
- Fixed a missing level name remap in PIE that prevented seamless travels from succeeding.
- Changed the ensure for destroying a NetDriver during its tick to not trigger for PendingNetGames.
- Fixed incorrect timestamp check, preventing disabling of challenge ack resend code path server side.
- UNetReplicationGraphConnection::PrepareForReplication now checks if the connection is in the correct world.
- Fixed RemoteViewPitch being generated incorrectly.
- Fixed levels unnecessarily tracking destroyed actors during replay playback.
- Fixed replays recording multicast RPCs from only relevant to owner actors.
- Call NotifyControllerChanged from ClientRestart in case it is received with the valid pawn before APawn::OnRep_Controller is called.
- Handle emptying the map name if CurrentMapName == DestinationMapName when no transition map is specified in order to prevent issues when seamlessly traveling to the same map.
- Fixed compiling in shipping with stats enabled.
- Fixed an issue where tracking and validating replicated subobjects would be skipped if custom subobject replication was used.
- Replicated FSoftObjectPtrs to dynamic, spawned-at-runtime replicated objects now resolve properly on clients.
Deprecated:
- Removed support for replay network smoothing mode in network playback data.
- Deprecated the AES ECB packet handler component in favor of the AES GCM handler.
Removed:
- STAT_RepLayout_AddPropertyCmd
- Removed a strong level reference from replay scrubbing state.
- Removed replay backwards compatibility handling for versions prior to the minimum supported version.
- "LastCompletedSeamlessTravelCount == SeamlessTravelCount" check was removed from APlayerController::HasClientLoadedCurrentWorld to prevent issues when client finishes travel before the server.
Level Design and Art Tools
Bug Fix:
- Fixed an issue when computing the distance of a full spline segment that uses constant interpolation. Function incorrectly returned a distance of 0 for all partial distances, however when computing the "full" distance with p=1 it should have returned the true distance between the points. This fixes another issue with generation of the Spline Curve's Reparam Table where spline keys would map to incorrect distances if a spline had any number of constant interpolation points.
- Implemented an actionable message on load to create the water collision profile when it is not defined, rather than checking the DefaultEngine.ini on load.
- Fixed default-enabled Editor modes showing up in random order, by giving the modes prescribed priorities.
- Fixed an issue where the spline visualizer wasn't taking into account the list of enabled/supported spline point types for the given spline component.
- Fixed Actors being attached to a Level Instance that is not being edited.
- Fixed metallic, specular, and roughness being packed into a single texture.
- Fixed import descriptor not refreshing when toggling Flip Y Axis setting from ImportExport tool. Also made option to flip coordinate on Y axis available when exporting tiled landscape.
Geometry Core
New:
- Created a 'contain(other interval)' function to TInterval1.
- Add a "prevent tiny triangles" option to Remesher. Currently the area threshold matches the threshold used when creating a cloth simulation mesh.
- Exposed an optional second importance weight to the FPriorityOrderPoints class
- Added FColliderMesh::FindNearestHitTriangle() and FColliderMesh::FindNearestTriangle() wrappers around mesh AABBTree functions.
- Renamed ::GetAABBTree() to ::GetRawAABBTreeUnsafe() to discourage usage.
- Added new oriented box fit variant that starts from the fast DiTO box and optimizes the fit iteratively, and changed modeling tools oriented box fits to use the new algorithm.
- Improvements to the FMeshBevel operation, which resolves many failure cases in higher-level Beveling operations in Modeling Tools and Geometry Scripting.
- Updated Degenerate triangles to now be filtered out when creating Complex Collision geometry for UDynamicMeshComponent, to avoid warnings in the physics system.
- Added a new FMeshPlanarSymmetry class for detecting and applying planar symmetry to mesh vertices.
- UDynamicMeshComponent now supports the Visible In Ray Tracing Component setting. However this does not currently override the UDynamicMeshComponent-specific Enable Raytracing flag.
- Added FDynamicMesh3::EnumerateEdgeTriangles() function, which has the same API as ::EnumerateVertexTriangles().
- Added function UE::Geometry::TrianglesToOverlayElements() in MeshIndexUtil.h which collects elements from triangles in a mesh attribute overlay.
- Added FDynamicMesh3::EnableMatchingAttributes() function to expose FDynamicMeshAttributeSet::EnableMatchingAttributes() at the Mesh level.
- Updated UDynamicMeshComponent to now support a separate "transient" flag for disabling collision updates, configurable via SetTransientDeferCollisionUpdates(). This setting allows C++ code, such as code that implements a live 3D transform of mesh vertices, to temporarily disable collision re-generation without modifying the serialized bDeferCollisionUpdates UProperty.
- Added a new FMeshResolveTJunctions class that attempts to fix situations in meshes where a boundary vertex lies on the interior of some other boundary edge (a "T-Junction"). Exposed this capability in the Weld Tool in Modeling Mode.
- Updated Morphology.h to use sparse SDF due to memory savings over the dense SDF. The AutoLOD tool and the Morphology tool use this class, but the behavior shouldn't change.
Bug Fix:
- Made GteMinimumVolumeBox3 robust to failing to find a convex projection for some faces.
- Fixed a bug that made the fit always ignore results from the ProcessEdges pass, and added an option to always skip that pass (for a faster method that matches the previous behavior).
- Fixed incorrect float casts in FAxisAlignedBox3d and FAxisAlignedBox2d when casting to FBox and FBox2D, making this cast function correctly at large world coordinates.
- UDynamicMeshComponent now supports overrides to the color/material and normals, allowing display of vertex colors, group colors, or a (configurable) custom color, as well as facet normals (flat shading). These settings can be configured for any such Component in the Actor properties. The wireframe color is now also configurable.
- Added an fp:precise pragma to the MSVC compile of XAtlas, giving more consistent results across platforms and build settings.
Deprecated:
- We deprecated the timestamp on TDynamicPointSet3, as it was unused.
Geometry Script
New:
- Added InvertMeshSelection function.
- Added Geometry Script function SetMeshSelectionVertexColor, sets vertex color on selected faces/vertices, optionally creating "creases" in the vertex color overlay around the selection border
- Added ThickenShells option to ApplyMeshSolidify function.
- Added AppendMeshTransformed function that appends N copies of a mesh to another mesh, with a custom Transform applied for each.
- Added ExpandContractMeshSelection function, which can grow or shrink a Mesh Selection based on mesh connectivity.
- Added ApplyUniformRemesh function, which applies remeshing algorithms to a UDynamicMesh similar to the Remesh Tool in Modeling Mode.
- Added ApplyMeshOffsetFaces function.
- Added ApplyMeshInsetOutsetFaces function.
- Added a 2D Voronoi diagram generation function.
- Added ResolveMeshTJunctions function that exposes the new T-Junction Resolution algorithm.
- Added AppendSweepPolygon function which takes the sweep path/curve as a list of FTransforms, instead of FVectors, giving the caller more control over rotation and scaling along the sweep. This function should replace usage of AppendSimpleSweptPolygon.
- The CopyMeshFromStaticMesh Geometry Script function now works on UStaticMesh assets at Runtime, if the bCPUAccess flag was enabled on the Asset at cook time.
- Added "Frozen" flag on GeneratedDynamicMeshActor. Users can disable expensive mesh recomputations when not editing procedural mesh generation parameters/settings.
- Add support for optional Mesh Selection to:
- TranslateMeshUVs
- ScaleMeshUVs, RotateMeshUVs
- SetMeshUVsFromPlanarProjection
- SetMeshUVsFromBoxProjection
- SetMeshUVsFromCylinderProjection
- Add support for optional Mesh Selection to RecomputeMeshUVs.
- Add a new GetMeshUVSizeInfo function that can be used to get UV Area/Bounds, and 3D Area/Bounds, for a given selection.
- Added support for optional input Mesh Selection to ComputeMeshConvexHull function.
- Added a new ComputeMeshConvexDecomposition function that exposes new automatic convex decomposition strategy.
- Added SplitMeshBowties function.
- Added RepairMeshDegenerateGeometry function.
- Added GetMeshInfoString function.
- Added support for optional Mesh Selection to:
- ApplyPerlinNoiseToMesh
- ApplyIterativeSmoothingToMesh
- ApplyDisplaceFromTextureMap
- ApplyDisplaceFromPerVertexVectors
- Added ApplyMeshDisconnectFaces function.
- Added ApplyMeshDuplicateFaces function.
- Added a new ApplyMeshLinearExtrudeFaces function that supports linear extrusion of entire mesh or selection. Redirect previous ApplyMeshExtrude function to ApplyMeshExtrude_Compatibility_5p0.
- Added a new ApplyMeshBevelSelection function, which supports various ways to interpret the MeshSelection as set of faces or edges to bevel
- Added ComputePolygroupsFromPolygonDetection function that exposes new quad-detection algorithm (currently only quad polygons are detected).
- Added an Auto-Compact option to Simplify and Remesh functions, that when enabled will automatically Compact the output mesh. This new setting is enabled by default, to reduce the chance of users hitting errors when passing the output simplified/remeshed mesh into downstream functions.
- Added CopyMeshUVLayerToMesh and CopyMeshToMeshUVLayer functions. These can map a UV layer to a separate mesh, editing it, and then transferring the edited positions/topology back to the UV layer of the source mesh.
- Added SampleSplineToTransforms function that computes a set of FTransforms at points along a USplineComponent, using various sampling strategies.
- Added AppendSweepPolyline function, similar to AppendSweepPolygon but sweeps an open 2D profile curve instead of a closed 2D polygon.
- Added a new FGeometryScriptMeshSelection type that can store/represent Vertex, Triangle, and Polygroup "selections" on a UDynamicMesh.
- Add various functions for working with this new type, including:
- CreateSelectAllMeshSelection
- ConvertMeshSelection
- CombineMeshSelections
- ConvertIndexArrayToMeshSelection
- ConvertIndexSetToMeshSelection
- ConvertIndexSetToMeshSelection
- ConvertIndexListToMeshSelection
- ConvertMeshSelectionToIndexList
- SelectMeshElementsInBox
- SelectMeshElementsInSphere
- SelectMeshElementsWithPlane
- SelectMeshElementsByNormalAngle
- SelectMeshElementsInsideMesh
- ExpandMeshSelectionToConnected
- GetMeshSelectionInfo
- DebugPrintMeshSelection
- GetMeshSelectionBoundingBox
- GetMeshSelectionBoundaryLoops
- Add various new Geometry Script functions for editing a mesh based on a mesh selection:
- DeleteSelectedTrianglesFromMesh
- TransformMeshSelection
- TranslateMeshSelection
- RotateMeshSelection
- ScaleMeshSelection
- SetPolygroupForMeshSelection
- SetMaterialIDForMeshSelection
- Added CopyMeshSelectionToMesh, which copies triangles identified by the selection to a new UDynamicMesh.
- Added Geometry Script functions for manipulating FGeometryScriptIndexList, UVList, and ColorList objects, to bring up to parity with functions for Scalar and Vector lists.
- Added options for the Geometry Script AppendMesh node's attribute handling.
- Now by default, if meshes do not have the same attributes enabled, any attribute enabled on either mesh will be enabled on the result mesh. The caller can optionally make the result only enable the attributes on the source or the target mesh.
Bug Fix:
- Added Geometry Script function CopyCollisionMeshesFromObject which extracts meshed collision shapes, or the complex collision mesh, as a UDynamicMesh from various object types (StaticMesh, Volume, and DynamicMeshComponent).
- Updated Geometry Script functions that read or sample from a UTexture2D to now work at runtime, but only if the texture format is VectorDisplacementMap.
- If this is not the case, errors are now gracefully handled instead of hard crashing.
- The Geometry Script function AutoGeneratePatchBuilderMeshUVs now gracefully handles a non-compact input mesh, and prints a warning if such a mesh is passed.
GeometryCore
New:
- Added a vertex-based connected components class that can be used with any TriangleMeshType and supports connecting based on spatial proximity as well as triangle topology.
- Made FMeshBoolean's automatic mesh simplification code optionally avoid simplifications that would noticeably change the vertex normals. We also enabled this feature when computing fractures, to prevent the fracture code from generating results with incorrect normals.
Bug Fix:
- Fixed failure cases in the exact predicates library.
- Adjusted FindNearestCurveToRay when processing segments in a curve, to balance the distance-to-ray-origin against the ray-segment distance to find the optimal segment.
- Fixed issues with the GeometryCore FPriorityOrderPoints class:
- It now uses the SpatialLevels argument.
- The early-stopping optimization is fixed, so it no longer causes spatial 'clumping' of points when enabled.
- The code no longer incorrectly refers to some of the importance weights as "curvature," as the class is general-purpose and other features are often used for importance weights.
- An 'OffsetResFactor' (Offset Resolution Factor) parameter was exposed, to allow more control of how clumpy the distribution is; we recommend a value of 1 or 2 to best distribute the input points.
- Fixed instability in initializing GeometryCore's TQuaternions almost aligned to -Z axis, or generally rotating almost 180 degrees with a TQuaternion::FromTo() call.
- Fixed a few unsafe typecasts.
GeometryScript
New:
- Added a Async Physics build for Dynamic Mesh component.
- Added SRGBToLinear node for transforming vertex colors of dynamic meshes in GeometryScript.
- Added LinearToSRGB node for transforming vertex colors of dynamic meshes in GeometryScript.
- Added CopyMeshToSkeletalMesh node to GeometryScript.
- Added CopyMeshFromSkeletalMesh node to GeometryScript.
- Added BakeTexture node to GeometryScript.
- Added BakeVertex node to GeometryScript.
- Added CreateNewTexture2DAsset node to GeometryScript.
- Updated Geometry Script functions to automatically fix mesh orientation when transforming meshes with negative scales.
- Adjusted LineSegmentGenerators to use the given box center when computing box lines.
- Added a PolyPath class to Geometry Script, which provides an (optionally-closed) polyline/polygon with 3D vertices, and a set of associated utility functions. The utility functions include one to generate a PolyPath from a USplineComponent.
- Added the Spectral Conformal UV Solver option to the Geometry Script RecomputeMeshUVs function.
- Added the Spectral Conformal UV Solver option to the Geometry Script RecomputeMeshUVs function.
Bug Fix:
- Fixed transform handling in Geometry Script functions, by making them use ApplyTransformInverse() and InverseTransformPosition() rather than trying to invert an FTransform.
Modeling Tools
New:
- The BakeAll tool now supports skeletal and dynamic meshes as source meshes.
- Added sample filter mask support to the BakeTexture tool.
- Added sample filter mask support to the BakeAll tool.
- Added Object Space Normal bake support to BakeAll tool.
- Added Position bake support to BakeAll tool.
- Added Selective Tessellation Options to the Displace Tool to only tessellate and displace those triangles that belong to a specific material.
- Added a Random Colors option to the collision geometry visualizations in the PInspct and Msh2Coll tools.
- Initialized implementation of optional boundary constraint projection for the Remesh tool.
- Constrained edges along a boundary can collapse, and vertices can move, but they are projected back to the original boundary curve geometry.
- Vertices at boundary "corners" (defined using an angle threshold criterion) are constrained to not move or be deleted.
- DynamicMesh3: Add comments to AppendTriangle functions saying the vertices must exist and the indices must be distinct
- Added a Detail Customization class for AutoLOD properties to enable HintText to be used in some text entry fields when the field is empty.
- Updated AutoLOD tool's UI to validate group layer name and weight map layer name when specified by the user. Issues a warning if the specified layer doesn't exist
- Adjusted AutoLOD tool's UI to not clear the warning area if there is a non-empty result.
- Turn selection checkboxes into buttons in PolyEd and TriEd modeling tools.
- Added the Spectral conformal parameterization option to the Unwrap UVs tool.
- Support running various tools only on limited selections in the UV editor, and support multi-asset selections.
- Support seam edges to be collapsed by the remesher if Preserve Sharp Edges in unchecked in the Remesh tool.
- Added a Smooth Boundary operation to the Mesh Selection tool.
- Added convex decomposition options to Msh2Coll tool and Geometry Script collision functions.
- Updated PolyEd to work better on many common open-boundary cases by placing extra selectable corners on sharp group edge bends.
- Adjusted the Add Primitive tools accept/cancel so that the initial click can place the mesh and then the settings can be modified before accepting the tool.
- Allow users to set specific extrude distance in PolyEd tool.
- Allow users to create a new asset in CubeGrid tool if the underlying asset is deleted.
- Various CubeGrid tool improvements. - Made the tool Accept/Cancel.
- Added the ability to set block size at current power
- Added ability to initialize the grid from a given actor, initialized to the current target.
- Added the option for the grid sizes to follow the default editor grid (1, 5, 10, 50, 100, etc).
- Allowed global mode for gizmo manipulation, to allow editor grid snapping to work.
- Add Select All and Invert Selection actions to PolyEd.
- Enable selection support within the UV Editor's Layout tool.
- Enabled support of selection within the UV Editor's Unwrap tool.
- Implemented support for snapping on gizmo initiated transforms in the UV Editor.
- Added a new toolbar in the 2D viewport that resembles the snapping controls found in the main level editor.
- Added support for selection mechanics within the 3D viewport.
- Updated the 3D UV Editor viewport to support mouse picking and marquee selection modes, just as in the 2D viewport.
- Provided a new Select All command bound to Ctrl + A. The Escape key will unselect all selected elements.
- Added a bridge edge action to the PolyEd tool, which creates a face between two boundary edges. If the two edges being bridged are connected by edges at either end, this action will not weld the edges of the new face to the existing edges, potentially leaving holes in the mesh.
- Made the transform gizmo in the PolyEd tool visible by default - appearing automatically when any portion of the mesh is selected.
- Support for creating DynamicMeshActors in Modeling Mode is now enabled by default.
- Mesh Booleans and CutMeshesWithMeshes. When filling holes, generate normals and UVs for the new patches
- Updated the UV Project status bar message to include information about Shift+Ctrl+Click for repositioning without reorienting.
- Adjusted the PivotAct tool to now show the active transform position and rotation in the tool's details panel.
- Extended the edge weld action in the PolyEd tool to group edges. Edges that have vertices other than their endpoints can be welded by sequentially welding their simple edges automatically. If the two group edges being welded have different numbers of vertices, then the group edge with fewer vertices is split until the two have the same number.
- Added support for symmetric mesh vertex sculpting in the VSculpt tool. Symmetry is detected and applied via vertex/point-set symmetry rather than topological symmetry. The Symmetry Plane is auto-detected (implemented in FMeshPlanarSymmetry) and currently cannot be specified by the user.
- Added a "Find Quads" mode to the Polygroup Generation Tool in Modeling Mode ("GrpGen"). This mode attempts to reconstruct the source quads of a triangle mesh as Polygroups by incrementally finding pairs of triangles. The implementation of this algorithm is in the FPolygroupsGenerator::FindSourceMeshPolygonPolygroups() function.
- Added support for creating and selecting a target Polygroup layer in the Polygroup Generator tool (GrpGen).
- Added support for setting target groups from an existing layer. Users can perform operations such as copying groups between layers and duplicating an existing layer.
- The Edit Normals Tool in Modeling Mode now allows the user to specify alternate Polygroup layers to define normal creases.
- Added support for Spectral Conformal unwrapping mode in the UV Editor's Unwrap tool to match functionality existing in the Modeling Mode version of the tool.
- Changed the selection gizmo placement in the UV Editor from being the centroid to the bounding box center of the selected elements.
- Added support for a new launcher for the UV Editor to appear in the Modeling Mode UVs tools category.
- Added a new ISM Editor Tool. Users can select and manipulate Instances in all the InstancedStaticMeshComponents of the selected Actors.
- Added new high performance rendering components for handling mesh highlighting on large meshes in the UV Editor.
- Includes 2D and 3D variations of Point Sets, Line Sets, and Triangle Sets. These are considerably stripped down from the previously used component classes, designed with the intent on reducing needed memory bandwidth to move data to the rendering thread.
- Made the following mesh creation tools generate tangents for their created meshes:
- PolyExt
- PathExt
- PathRev
- BdryRev
- Allowed selection mode changes even if the mechanic is not currently enabled in the UVEditor.
- Added drag alignment mechanic to the plane control gizmo in PolyExt tool, enabling translational and rotational snapping when moving or rotating the plane used for drawing the profile to extrude.
- UVEditor: Cleaned up options for the various UV Unwrap algorithms to only be visible to the user when the appropriate method has been selected to reduce confusion in the UX.
- Added hotkey R to hide plane control gizmo in the PolyEd tool.
- Added toggleable corner point visualization to the PolyEd tool.
Improvement:
- Adjusted UVs to always stay aligned in the same orientation when using the CubeGrid tool.
- Updated CubeGrid's UVs to be contiguous when performing multiple steps with the same selection.
- Updated CubeGrid sides to maintain the same groups with repeated steps of the same selection.
- Added support in CubeGrid for scaling UV's.
- Added support in CubeGrid for focus hotkey.
- Improved performance and runtime speed of rebuilding the UV overlays and meshes when edits or channel switches are performed, particularly on high polygon count meshes.
- Cleaned up warnings in the UV Editor related to type truncation and loss of precision issues in adherence with coding best practices.
- Improved WeightMap support in many tools in Modeling Mode, such as Duplicate and where possible Combine. In cases where weight map layers with duplicate names could be created, unique names are now auto-generated/enforced.
Bug Fix:
- Improved Mesh Boolean and Self-Union (MshBool and Merge tool) results to better handle nearly-coplanar sliver triangles.
- Fixed issue where the TargetMesh property was incorrectly set for skeletal and dynamic mesh targets in the BakeAll tool.
- Fixed MaterialID bakes to overwrite pixel buffers instead of accumulate.
- Fixed incorrect tangent normal bakes in the BakeAll tool by ensuring that the normals are transformed into the correct space for each source mesh.
- Fixed issue where the preview material in the BakeTexture tool was not reset when output type was modified.
- Fixed issue where the preview material in the BakeAll tool was not reset when the output type was modified.
- Fixed correspondence strategy in FMeshMapBaker when input meshes are the same.
- Fixed an issue where the error material was not shown when BakeTexture tool had invalid inputs.
- Fixed an issue where the error material was not shown when BakeVertex tool had invalid inputs.
- Fixed an issue where the error material was not shown when BakeAll tool had invalid inputs.
- Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeTexture tool.
- Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeAll tool.
- Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeVertex tool.
- Fixed an issue where vertex colors were incorrectly encoded when converting between static and dynamic meshes.
- Fixed bugs with how the CubeGrid tool deals with materials.
- Made the Msh2Coll tool use a background thread to compute collision shapes, so it will not lock up the editor while it computes.
- Prevented BakeRS tool UI from allowing user to try baking only rotation, when the input's transform included both rotation and non-uniform scale, as UE transforms don't support this.
- Fixed a crash when Displace tool tries to read WeightMap data from a deleted StaticMeshAsset.
- Fixed PolyEd performance regression on highly tessellated mesh regions.
- Fixed a bug where the number of the vertical slices being generated is always off by one in the Sphere Primitive Tool.
- Corrected Lattice tool to hide the gizmo only if constrained vertices are selected.
- Fixed PolyEd modeling tool failing to deal with certain bowtie group topologies.
- Fixed a bug in the Displace tool where undoing changes to the Perlin noise properties would not update the mesh in the viewport.
- Adjusted PolyEd offset and inset to work in pathological bowtie-related cases.
- Fixed DisconnectTriangles in cases of bowties.
- Fixed normal generation in CubeGrid tool.
- Fixed crash in CubeGrid if gizmo is dragged without ever having selected anything.
- Fixed PolyCut tool's handling of non-uniform scale
- Fixed various UV editor undo/redo transactions not being expired when the editor is closed.
- Fixed the exact predicates code accessing an index past the end of its local stack arrays.
- Resolved the Lattice tool's handling of negative scales.
- Fixed issue where converting a selection type resulting in an empty selection would cause an ensure to be thrown in the UV Editor.
- Fixed handling of some transforms with a negative scale in the modeling tools and geometry script functions for managing collision geometry.
- Adjusted the BdryRev tool to snap to the local mesh pivot if its rotation axis is 100,000 units (1000 meters) away from the target shape when the tool starts. This reduces the likelihood of confusing cases where the axis is too far away to be useful or visible.
- Resolved bug where undoing a selection would continue to transform the previous selection using the interactive gizmo.
- Fixed vertex sculpting brush alpha's "RotationAngle" display name not fitting in the available space, by changing the display name from "Rotation" to "Angle".
- Resolved handling of negative scales for a number of modeling tools and geometry script functions.
- Fixed issue in the UV Editor where activating some tools resets the selection mode, causing the user to re-select their desired mode after using the tool.
- Made the PathRev tool warn the user if the draw plane and axis is far from the camera position, with an explanation of how to place the draw plane in the view.
- Resolved issue where a crash would occur when a dynamic mesh is loaded into the UV Editor and then deleted externally before exiting the UV Editor.
- Prevented crash upon opening the UV Editor if the live preview tab was closed prior to last exiting the UV Editor. Also forces the live preview tab to be opened automatically upon UV Editor startup.
- Fixed issues where starting Play in Editor (PIE) mode wouldn't prevent the UV Editor from performing unwanted actions, such as saving assets.
- Added a bSRGBConversion parameter to ProceduralMeshComponent's CreateMeshSection and UpdateMeshSection functions. The caller can control whether sRGB conversion is performed. To keep current results unchanged, the default values of this parameter for the two functions is different (Create doesn't convert, but Update does).
- Corrected issue in the UV Editor where polygroups were being incorrectly set on operation factory instances in the Unwrap Tool.
- Fixed for PolyEdit and PolyPath tools not rendering preview results when at Large World Coordinate scales.
- Made vertex sculpting's symmetry detection more robust, so it should detect vertex mirror symmetry for arbitrary (non-axis-aligned) mirror planes.
- Resolved issue in the UV Editor where displaying background texture incorrectly handled textures that need non-color samplers in materials, such as normals.
- Fixed the level editor gizmo lurking invisibly, still clickable, in the HitProxy buffer after modeling tool start
- Resolved crash when right-clicking on the asset tab in the UV Editor would fail an assertion.
- Fixed a corner case in the BSP lightmap code causing a divide by zero and triggering an 'ensure' when the input spans zero range and exactly aligns to Scale. This happens at large-world-coordinate scales due to float precision.
- Removed ability for the Editor Viewport Camera Controller to affect the UV Editor's 2D viewport. This solves the issues around keyboard navigation causing unexpected lockups in the editor during extreme zoom instances.
- Fixed issue where the UV Editor's UI was in a semi-broken state after an autosave event occurred.
- Fixed Merge tool not working at large world coordinate scales.
- Fixed crash bug due to selection hover behavior in the UVEditor not being correctly handled by the Input Router during shutdown conditions.
- Fixed the modeling mode split tool's "from output" material selection method for inputs with multiple materials.
- Made sculpt tools focus on the sculpting brush using hotkey 'F', rather than the whole model.
- Fixed crash bug occurring when selecting elements while multiple assets are loaded in the UV Editor.
- Made PlanePositionGizmo use double precision to compute plane intersections, and not crash if plane intersection fails.
- Fixed VoxBlnd, VoxMrph, and VoxWrap tools not showing a live preview of their result at large world coordinate scales.
- Prevented "No Action" item from appearing in the Action dropdown for the Channel edit tool.
- Fixed Lattice tool's Dimensions setting becoming editable on control point movement redo.
- Corrected handling of negative scales in UDynamicMeshComponent::ApplyTransform.
- Disabled cast shadows for the Preview UV Layout square.
- Fixed Hole tool and Boundary Revolve tool from seeing polygroup boundary edges instead of mesh boundary edges.
- Fixed the Boundary Revolve tool skipping the last vertex on open boundaries.
- Stopped auto-loading settings from switching the target preset in AutoLOD. Users can now choose whether they want to instead write their current settings to that target.
Deprecated:
- Deprecated the unused Timestamp and GetTimestamp function on TPolygon2 and TPolyline3. Any code that needs to track timestamps for polygons or polylines should do so separately from these structs.
- The UPersistentMeshSelectionManager along with related functions and classes. This is replaced by new experimental functionality in the UGeometrySelectionManager class (disabled by default).
- Removed UV Island Conformal Unwrap action, now that its functionality is superseded by the Unwrap tool having selection support.
World Building
New:
- Added feature to move (Left Alt down) actors from Data Layer(s) to another data layer in the Data Layers Outliner.
- Prevented most common cases of UV generation failure when performing material baking when using World Partition - HLOD.
- Enabled Nanite on landscape HLODs if the source landscape proxies are Nanite-enabled when using World Partition - HLOD.
- Added support to World Partition - HLODs for automatic texture sizing for Merged & Simplified HLODs and reused existing code to share it between all HLOD generation methods
- In World Partition - HLOD, automated ScreenSize computation for "Simplify" HLOD method. ScreenSize option is now deduced from the meshes bounds and the configured draw distance.
- Added "-DebugCapture" option to the WorldPartitionMinimapBuilder, which writes bitmaps of all captured tiles & the final minimap.
- Instancing HLOD layers now has a "Disallow Nanite" option. This is necessary on Nanite meshes that have multiple LODs, otherwise the setting of the mesh's last LOD as the component ForcedLOD will not work.
- Exposed HLOD options on landscapes when using World Partition - HLODs.
- Added support for Approximate simplification method to Level HLODs
- Changed HLOD actors folders & labels naming in the scene outliner
- Unified autosubmit code for World Partition Builders
- Added auto submit support to existing builders
- Added auto submit tags support to allow scripts to provide robomerge tags for a CL
Improvement:
- Fixed and Improved World Partition Spatial Hash Grid Preview editor material used to preview grids in the world.
- Added highlighting full grid cells crossing the loading range radius .
- Added loading range circle.
- Extended the grid un-highlighted past the loaded area.
- Added a small circle to identify the center point.
- Fixed offsets.
Bug Fix:
- Fixed screen percentage warping by setting the post-process to pre-tonemapping.
- Fixed a bug where the World Partition minimap wouldn't capture LevelInstance since it never is able to UpdateStreamingState to load the actors in that LevelInstance before being captured.
- Fixed a crash occurring in the HLOD builder commandlet when hashing landscape texture source data while potentially asynchronously building textures.
- Fixed a few places where the FTextureSource's data was not being used.
- Fixed crash in world browser when unloading a World Composition level that cannot be unloaded because of lingering reference.
- Compute HLOD bounds in Z by using the subactors bounds rather than relying on the world's min/max Z when using World Partition - HLODs.
- Improved error handling for the Merge Actor - Mesh Approximate Tool.
- Ensure that child actor components are marked as HLOD relevant if the child actors are HLOD relevant for World Partition - HLODs
- In the minimap builder, fixed stretched tile capture when tile wasn't square.
- Fixed an issue where World Partition: Actors ActorGuid must not be reset in AActor::Serialize() when duplicating for PIE.
- Fixed an issue where IMeshMergeUtilities::CreateProxyMesh() returns a single static mesh when it could return multiple meshes.
- Makes sure skydome actors are excluded from HLOD in all Engine map templates.
- Improved outdated HLOD detection
- Excluded some HLOD builder subclasses from editor dropdowns.
- Fixed an issue with ISMC custom primitive data being stored in the HLOD proxy descriptor.
- Marked level packages created through UWorldPartitionLevelStreamingDynamic::LoadInEditor() as transient. This prevents the editor from asking to save those temp packages.
- Fixed custom primitive data not taken into account in some specific cases with World Partition - HLODs.
- Prevented false positive when testing for outdated HLODs
- Hide texture size property unless texture sizing type is "Use Single Texture Size" or "Use Automatic Biased Sizes" in World Partition - HLOD: Material Proxy settings.
- Avoided deleting World Settings from retained sublevels when using the World Partition - Conversion Commandlet.
- Deleted HLOD actors from retained sublevels when using the World Partition - Conversion Commandlet.
Level Design and Art Tools /GeometryScript
New:
- Added vertex color bake support to the BakeVertex tool.
- Added CreateCircle and CreateArc functions to Geometry Script's new PolyPath class
Localization
New:
- Expose ENGINE_API for QueueSubtitles.
- Added support for preview versions of the localization manifests to be generated and deleted during a preview localization run.
- This addresses false positives for localization warnings that can arise from comparing gathered strings to a stale manifest file.
- Added a preview parameter to the Localization Unreal Automation Tool command which allows the command to run in preview mode.
- Localization commandlets now generate *_Preview.manifest files during a run into the destination path specified by the config files.
- The localization automation script will delete all files that end with _Preview.manifest at the end of the gather run.
- Improved checks for manifest filename extensions to ensure no malformed manifest filenames are passed into the commandlet.
- Introduced a Preview cmd line arg to GatherTextCommandlet to allow the gathering of source and asset files without checking out or writing any localization files. This makes dry runs to print all localization warnings much easier for debugging.
- Introduced the -Preview arg and -GatherType param to UGatherTextCommandlet.
- The -GatherType param can have values of All, Source, Asset or Metadata. Source will only gather source files, Asset will only gather Asset files, Metadata will only gather Metadata and All will gather all 3.
- The -GatherType param is only supported in preview mode right now. This is because manifests are updated every single gather and we do not want the manifest to only reflect partial gathers.
- Added additional logs to display when the commandlet is run with -Preview and -GatherType.
- Refactored parts of UGatherTextCommandlet to reduce hard coded switch and param names.
- Introduced a virtual function in UGatherTextCommandletBase to allow commandlets to be conditionally skipped in preview mode.
- Introduced the -Preview arg and -GatherType param to UGatherTextCommandlet.
Bug Fix:
- Inserted a no-break space between the currency code and the numeric value to improve readability when formatting a foreign monetary value.
- When a currency is not from the current locale, the currency formatter may prepend or append the ISO currency code to disambiguate. However, this may cause readability issues. For example, 1500 Japanese yen is formatted as "¥1,500" in ja-JP, but it was formatted with its ISO currency code as "1 500 JPY" in es-ES or as "JPY1 500" in es-MX. In the last case, readers may mistakenly think that the price was 500 yen at a glance due to the spacing.
- We inserted a no-break space between the currency code and the numeric value, so that it is now formatted as "JPY 1 500".
Online
New:
- The callback of the gdk function XNetworkingRegisterConnectivityHintChanged is now called from the game thread, where we can safely call XNetworkingGetConnectivityHint.
- Make Party Invite Reject a virtual method in SocialUser.
- Only enable multiplayer subscription (which creates RTA connection) when create/join MPSD session.
- Added callback to handle xbl multiplayer connection id change, to make sure connection id in MPSD sessions is up to date.
- Added callback to handle xbl multiplayer subscription lost (lost connection to RTA), to stop multiplayer and delete all MPSD sessions.
- Added USocialSettings::GetSocialPlatformDescriptionForOnlineSubsystem to get a social platform description by OnlineSubsystem name.
Bug Fix:
- Fixed the potential playfab net driver initialization failure by delaying the authentication check of playfab user.
- Cache the sanitized text only when successful, because it can fail to sanitize when becoming offline. When back online, we need to sanitize it again instead of getting it from the cache.
- Fixed the connection failure of non-seamless multiplayer map travel on gdk when using playfab, listening server will no longer recreate the PlayFab EndPoint, so the URL of the EndPoint will not change.
- Fixed the random playfab authorize failure when retry, now it depends on the waiting time to receive the custom session data change (contains new invitation data), not how many times it has retried.
- Fixed the potential stuck issue when using playfab, now when error happens it will be returned to NetDriver, so it can be handled by map travel code.
- Fixed UWebAPIDefinition class to use AutoCollapseCategories instead of CollapseCategories.
- Fixed issue with H.265 being played using DX12 or Vulkan using WMFmediaPlayer.
- Fixed DX12 playback with WMFmediaPlayer (H264/5, HAP, ProRes).
- Fixed ElectraPlayer's close/shutdown code so it can also succeed during the engine's shutdown (PreExit) phase.
- Made social user list keep weak pointers to users to fix GC errors when leaving PIE with GC reference elimination (pending kill) disabled.
- Converted SocialToolKit LocalPlayerOwner to weak pointer.
Removed:
- Removed PartyPackage.h. The PACKAGE_SCOPE usage caused issues with subclasses trying to override PACKAGE_SCOPE virtuals.
Crash Reporter
Bug Fix:
- Stage Base.ini into crash reporter pak files to fix issues with missing configuration.
HTTP
New:
- Added Verbose logging to track progress of
HttpManager::Flush
. - Added an option to increase HTTP log verbosity when a request is being retried.
Online Subsystem
New:
- Added getter for EOS platform handle in OSSEOS, enabling sharing the platform with other systems.
- Updated Android to EOS-SDK-Android-21924193-v1.15.3, and swapped to using the libc++_static variant.
- Added IOnlineSubsystemEOS public interface header.
- Changed BucketId in EOS Sessions to use BuildUniqueId to fix compatibility issues.
- Updated CreateLobbyOptions fields:
- Addition of lobby id override and lobby host migration options.
- Removed hard coded search parameters from sessions and lobbies.
- Refactored DestroyLobbySession to make use of lobby host migration logic.
- Increased verbosity level for logs in
FSonyHTTPRequest::TickSendState
andFSonyHTTPRequest::TickThreadedRequest
from Verbose to VeryVerbose. - Updated Steam SDK to version 1.53a (with native Mac M1 support).
- Changed the default gamertag mode to Classic to reflect changes in GDK guidelines.
- Added USocialToolkit::CanAutoRecreatePersistentParty to control whether we should automatically recreate a persistent party on unexpected loss.
- Added a Compare method to party rep data that can compare a specific value without needing a full party rep data wrapper.
- Added an overload Checkout method that does not return receipts to the IOnlinePurchase interface.
- It is recommended to be used if the product (game) processes purchases via backend services, and the clients do not need to know about the purchase information.
- Implemented for all supported platforms.
Improvement:
- Refactored of logic surrounding Epic Id queries to construct UniqueIdEOS for lobby members. All logic making such queries now waits for them to finish before triggering any completion delegates. Refactored logic to mirror API Lobby data into OSS Lobbies.
- Refactored session object captures in session methods to avoid errors in lambdas.
- Moved support for account portal login to the base FEOSHelpers class for subclasses to use on Android.
Crash Fix:
- Fixed some crashes caused by converted strings being moved prior to use.
- Refactored of FOnlineAsyncTaskGDKRedeemCode to not end prematurely on app reactivation, causing a crash.
- Added fix for crash in CopyLobbyData when the session data was outdated.
- Fix for crash in FGDKAsyncBlock destruction.
Bug Fix:
- Fixed some occurrences of unterminated string conversions.
- Fixed OnlineStoreEOS to use the DecimalPoint value from EOS, not the one from UE I18N, as they disagree on the number of minor units in Chilean Pesos (Centavos).
- Fixed no core affinity being set for GameChat audio thread on GDK platforms.
- Fixed OSSEOS checking the data field of an auth token for validity, and ignoring the string field.
- Update Win64 binary to EOS-SDK-21924193-v1.15.3, to fix inability to fall-back on browser for account portal login flow.
- Fixed warnings about EOSSDK failing to load, when the SDK does not exist in the first two places we check.
- Fixed OSSEOS headers so they are includable outside the plugin.
- Fixed error/warning logging noise on LogEOSSDK when platforms are created and destroyed without being ticked, especially in commandlet runs.
- Fixed CompoundSubsystemEnum ignoring ESocialSubsystem::Primary and not creating a unique value for a given combination of subsystems.
- Added missing CREATE_MIRROR_PLATFORM_SESSION checks in OnlineSessionEOSPlus.
- Added logic to cache the updated Auth Token after a refresh in UserManagerEOS.
- Addition of logic to make FUserManagerEOS robust to callbacks returning after module shutdown.
- Added logic to return canceled error if an EOS purchase was canceled.
- Added missing early error exit to FUserManagerEOS::QueryExternalIdMappings.
- Fixed CacheDirectory issue with Android EOSSDK initialization
- Fixed the purchase validation issue on OnlinePurchaseInterfaceCrossgen that was caused by initializing the OnlinePurchaseInterfaceCrossgen before the OnlineIdentityInterfaceCrossgen.
Removed:
- Code for unused and deprecated GooglePlay Billing library. Actual dependency is brought through gradle.
- Deleted deprecated OnlineSubsystemTwitch.
Voice
New:
- Added getter for EOS platform handle in EOSVoiceChat, enabling sharing of the platform handle with other systems.
- Reimplemented SetPlayerVolume for EOSVoiceChat, now there is SDK support.
Bug Fix:
- Fixed a voice over IP problem on Android and, more generally, if the platform does not implement GetMicrophoneAmplitude.
WebSockets
New:
- Added optional/opt-in webserver to WebSocket server using the already available functionality from the underlying libwebsockets implementation.
- Added serving static content through the websocket server without taking an extra port for a webserver.
- Added ability to serve directories on disk as http mounts.
Bug Fix:
- Fixed memory leak in FWebSocketServer where some manually created arrays were not using delete.
Platform
API Change:
- The use of an integer "Controller Id" to refer to both a logical user and a specific input device is being deprecated in favor of the new
FPlatformUserId
andFInputDeviceId
types.- In 5.1 it is possible to convert between those types and the deprecated Controller Id, but this will not be available in a future version of UE when full support is added for multiple input devices under a single user.
New:
- Don't add messaging endpoint unless Xbox console is available to avoid long hang.
- Added support for
PlatformUserId
to clearly differentiate between logical users and input devices. Instead of using raw integers for both the controller Id and the user index, there are now different types for users and devices. To support this conversion there are utility functions inGenericPlatformMisc
and the online identity interface that allow conversion between the new types and integer indexes. - Added pool support in MallocBinned3 for larger than default alignment (16). Previously these allocations would allocate in page-sized blocks which could lead to large memory waste.
- Load DP on demand when using
dp.override
. - Added Getters for ShaderPlatform Name, the Shader Format of the ShaderPlatform, and the ShaderPlatformPropertiesHash as defined in DDPI
Bug Fix:
- GDBPrinter bug fixes: Fixed TSparseArray printer. Fixed FName printer so that it doesn't use a hardcoded value to determine if it's a valid FName or not. Disabled broken TMap and TSet printers, but you will see output from the TSparseArray printer so you can see the stored values.
- Remove XboxCommon implementation of PublishSymbols so it uses the same implementation as Windows and don't attempt to compress pdbs. Fixes issues with failing to publish large PDBs that the compression format does not support.
- Fixed valid SDK filtering in Turnkey by adding missing fields to SDKDescriptor declarations.
- Fixed a problem that was preventing Platform Extensions from calling
StartupModule
on new extension modules. - Fixed IterateDirectory() method on Unix, iOS, and Mac so it's behavior matched other platforms (Windows, etc.).
- Disabled
PLATFORM_ALLOW_ALLOCATIONS_IN_FASYNCWRITER_SERIALIZEBUFFERTOARCHIVE
on platforms which useFPlatformMallocCrash
during crash handling.
Desktop
New:
- Adding FirstMove events to windows. This is enabled with
WindowsApplication.EnableFirstTouchEvent
.
Linux
New:
- Improved process for exporting to Raspberry Pi 4.
- Added a new vendor ID for Broadcom.
- Split ASTC and ETC2 support into separate texture formats for Vulkan, as ASTC may not be supported.
Bug Fix:
- Added support for
IsGamepadAttached
on Linux. - Added support for Linux to search (using "which") for CLion outside of the default expected location.
- Linux windows now have a reasonable minimum size, and no longer can be scaled down to 1 pixel wide/tall.
- UE on Linux now locates any standalone Rider installation if it is either installed to the default location "/opt" (Rider Installation Guide), or anywhere else that is on the PATH.
- Fixed an issue where global shaders would get cooked for Linux Server platforms if it had any targeted RHIs enabled.
- The Chromium Embedded Framework (CEF) library that powers the Web Browser Widget has been updated to use Chromium's "Ozone" rendering backend under Linux. As a result, the Web Browser Widget now renders correctly in Linux environments that lack an X11 server, such as desktops running Wayland without the XWayland compatibility layer, and headless environments such as containers.
- Fixed missing quotes in
GenerateProjectFiles.sh
. - Fixed QMake project generator defines.
Mobile
Bug Fix:
- PipelineCaches directories are no longer trimmed in pak memory optimization. These need to be queried to discern when it is appropriate to kick off shader loads while installing data.
- PipelineCaches directories are no longer trimmed in .pak memory optimization, as they need to be queried to tell when it is appropriate to begin shader loads when installing data.
Online
New:
- Script added to retrieve Pixel Streaming Samples files from new repository in
PixelStreaming/Resources
. - Added Editor Streaming module for compositing and streaming of the Unreal Editor.
- Pixel Streaming now uses WebRTC codec negotiation.
- Pixel Streaming now supports custom protocols.
- Pixel Capture plugin created which can capture pixel buffers and sample them at independent rates.
- Added support for arbitrary audio input into Pixel Streaming.
- Added a compute shader for faster I420 conversion when using VPX, this is faster than CPU readback and conversion in our tests.
- Added peers can now swap roles between P2P and simulcast mid-stream. To test this new feature:
- Simply toggle the PreferSFU toggle in the settings panel.
- Click the new restart stream button in the settings panel.
- The editor can now resize appropriately if requested by the front end when Pixel Streaming the editor.
- PixelStreamingVCam supports camera control with ARKit.
- Streamer will now attempt reconnection after a set delay instead of instantly.
- Added embedded C++ signaling server, used for unit testing and some limited use cases where we cannot download servers (for example, offline usage in virtual production).
- Added a new module in Pixel Streaming plugin called "PixelStreamingServers" that is the C++ API for launching a signaling server (embedded or downloaded).
- Added datachannel support to SFU.
- Added WebRTC C++ client behavior to pixel streaming system. This is used for developing unit tests.
- Added a unit test that will start streaming, connect a client and check that a data channel message can be sent.
- Added the ability for a user to start/stop streaming as needed through the use of PixelStreaming.StartStreaming and PixelStreaming.StopStreaming.
- Added the ability for the stream resolution to be changed at runtime.
- Added a ForceKeyFrame blueprints and C++ method which forces the module's default streamer to send a keyframe.
- Added support for use of WebRTC version 96 with Pixel Streaming. Note: There are noticeable performance regressions introduced with this version that are being investigated. Version 84 remains the default.
- Added the ability to stream the main Level Editor window to the browser.
- Added a Pixel Streaming specific toolbar for starting and stopping streaming in the editor, as well as configuring some basic plugin settings.
- Added ARKit transform support for controlling PixelStreamingVCam cameras with ARKit transform data received from the LiveLink app. See PixelStreamingVCamSession for handling of this data.
- Added stat pixelstreaminggraphs that show real time graphs of Pixel Streaming stats.
- Added -PixelStreamingInputController=Host (or Any) to optionally restrict stream inputs to a single host peer. The default is -PixelStreamingInputController=Any.
- Added PixelStreamingServers utility to launch PixelStreaming servers from C++. (Added accompanying test too).
- Added tests for FPixelStreamingSourceFrame, FPixelStreamingFrameMetadata, FPixelStreamingFrameAdapterProcess and FPixelStreamingFrameAdapter.
- Added the ability to override the default InputDevice.
- Added the ability to have multiple streamers.
- Added support for LeftTriggerAnalog and RightTriggerAnalog to be sent as acceptable button press options in Pixel Streaming — even though they are analog inputs, some use cases require mapping them as buttons.
- Added launch arg -PixelStreamingNegotiateCodecs to enable negotiating Pixel Streaming video codecs with the browser.
- Default case: Negotiating video codecs is disabled and Pixel Streaming will only send a single selected codec, which can be configured using -PixelStreamingEncoderCodec=H264/VP8/VP9.
Improvement:
- WebRTC version upgraded to 4664 (M96) on Windows.
- Allow Editor dimensions to be set at launch time when Pixel Streaming editor with "-EditorPixelStreamingResX= and -EditorPixelStreamingResY=", or "-EditorPixelStreamingRes=".
- Implemented more accurate Pixel Streaming frame time stats.
- Fixed match viewport resolution browser side option.
- Changes to improve performance of editor when Pixel Streaming plugin is enabled but not streaming.
Crash Fix:
- Fixed PixelStreaming module state cleanup that was causing packaging crashes.
Bug Fix:
- Fixed resolution changing which was broken in 5.0.
- Fixed cirrus.js emitting ugly error message if config file was read only..
- Fixed PixelStreaming controller input. PixelStreaming is now compatible with the new
FGenericApplicationMessageHandler
controller interface. - Fixed Pixel Streaming FPS CVar so that it correctly enforces FPS.
- Fixed to make current Pixel Streaming compatible with older versions of UE signaling protocol where "playerConnected" message is not sent.
- Fixed for format requests locking forever.
- Fixed multi-peer Pixel Streaming not working with VPX codec.
- Fixed so that NVENC now only needs to scale frames as needed, there was some extraneous scaling happening before.
- Fixed on screen hud stats on startup that were not dismissable.
- Fixed bug where SFU peers were unable to receive data channels messages from the streamer.
- Fixed failing "connect" test where quality & input controller messages were being sent too early (before datachannel was established) for P2P peers.
- Fixed PixelStreamingAudioComponent finding trying to find audio sink on a data-only peer and crashing.
- Fixed PIXELSTREAMING_API exports on some files.
- Fixed PixelStreaming.build.cs that was too harsh about excluding any file with 'node' in the name.
- Fixed PixelStreaming.build.cs to exclude packaging the platform_scripts/cmd/coturn directory.
- Fixed Vulkan fast texture copy codepath to not crash in some edge cases.
Removed:
- Removed Pixel Streaming Samples as it has been moved to its own repository on GitHub.
- Removed unnecessary CVarPixelStreamingWaitForTextureCopy due to refactor.
XR
API Change:
- In an unlikely case you relied on the previous behavior, set FSceneViewExtensionContext::bStereoEnabled=true in your code before calling FSceneViewExtensions::GatherActiveExtensions()
New:
- OpenXR: Expose xrGetCurrentInteractionProfile to blueprint
- Added setting to specify which PIE instances get the VR headset if multiple PIE instances are used.
- Added PrimaryPIEClientIndex setting to Editor Preferences->Level Editor->Play->Multiplayer Options->Client.
- Added features related to play area bounds to OpenXR.
- Added a Blueprint to get the bounds and their origin in UE world space.
- Added a Delegate to respond to play area updates.
- Added basic support for blink and pupil info in eye tracking. Will be false/0.0 if this feature is not supported by the platform.
- XR: Added keyword "HMD" to IsHeadMountedDisplayEnabled, and IsHeadMountedDisplayConnected
- OpenXR: Added OnDestroySession to IOpenXRExtensionPlugin.
- Added haptic Soundwave support for stereo sounds.
- Added Support for Gauntlet automation to launch on HoloLens devices
- Exposed parameters of a fake stereo device for tweaking in UI.
- Initial change to support setting PixelDensity in OpenXR.
- Added pipelined access to PixelDensity, and checks to ensure that app-set PixelDensity is not more than the runtime actually supports.
- OpenXR: Register with FCoreDelegates::VRHeadsetRecenter Now that FOpenXRHMD supports ResetOrientationAndPosition correctly, we can register with the FCoreDelegate for those clients.
- Added support for multi-viewport on PC (D3D11/12, Vulkan) for stereo rendering and enabled by default.
- Added mono pass from plugin driven views in OpenXR.
- HMD extensions are now opt-in rather than opt-out when setting up a view family.
- Added protected access to AllocateDepthTexture
- Added Emulated world/tracker locked quad layers for OpenXR
- Translucency light volume textures are now shared between both views of a stereo pair.
- Made VSM debug view work in both eyes.
- Removed Omni-Directional Stereo Capture (experimental)
- Added "Emulate Stereo" level play option for standalone games for easier testing of rendering issues in VR without a headset.
- Added pipelined support for NativePresent in FOpenXRRenderBridge
- Added more ways to enable OpenXR validation (-openxrdebug, -openxrvalidation)
- OpenXR PixelDensity: custom quantization of width In the scenario where we have an atlased stereo texture, we need to make sure each half of the texture is aligned by 8 (new Strata requirement). We can do this by manually quantizing the texture after applying pixel density.
- Added Lumen hardware raytracing in VR.
Improvement:
- Extracted MicrosoftSpatialAudio from WindowsMixedRealityInterop so that it can be used with OpenXR rather than WMR.
- Changed CalculateRenderTargetSize assert so that it tolerates Game or Rendering thread.
- Improved tooltip for ShadingRate Material attribute.
Bug Fix:
- Fixed a typo in Epic_openxr.h
- Fixed MicrosoftSpatialAudio when using MicrosoftOpenXR -
- Fixed hololens target settings ini lookup.
- Fixed code that used to run while the RenderThread did not exist, and thus ran on the game thread, this code now runs on the render thread.
- Fixed FScheduler members being shadowed by FHoloLensRunableThread
- Fixed SceneTextures.cpp using module lookup functions in the render thread that are only safe to use without locking on the game thread.
- Added an accessor for this information to IStereoRendering.h and cached the values in the oculus HMD implementation. This cached value can be safely read on any thread.
- VectorVM fix for arm64 Neon -Need return type of MakeVectorRegisterInt64 for Neon to match SSE.
- OpenXRAR - avoid assert in GetDisplayTime when the openxr session is not synchronized. -Checking IsFocused before trying to get time. xrLocateSpace is only supposed to work when in the focused state. Our pins will retain their last known position. During pin creation they won't locate at all which should result in them maintaining their unreal world position.
- Fixed AR Tracked Geometry 64 bit FVector.
- Fixed thread safety of XR LockModularFeatureList.
- Fixed OpenXRHMD initialize space locations to avoid bad quaternions.
- Changed OpenXR xrGetReferenceSpaceBoundsRect make ensure on failure into a warning.
- Changed FPostProcessRectParams to support 2DArray textures
- VR PIE: Make sure SetIndependentViewportSize is called on GameThread We have to do a couple things in order to schedule our call to SetIndependentViewportSize on the GameThread Defer initial EnableStereo call until VR PIE startup while using the Editor (it used to call EnableStereo at editor startup??) VR PIE correctly resizes viewport since the window size and viewport size are decoupled * Call SetIndependentViewportSize in EnableStereo(true), which happens at VR PIE kickoff time in the GameThread
- Fixed shadow rendering using multiviewport in VR.
- Fixed translucency artifacts in VR.
- Fixed SingleLayerWater in Instanced Stereo in VR
- PR #9106: Bug Fix: ValveIndex_Left_Trackpad_Touch would never call release
- Enable ISR + multi-viewport for PSVR2
- Fixed the Editor Viewport not restoring correctly after exiting VR Editor Mode
- Fixed properly pipeline frame state from Game Thread to Render thread
- Pass SV_ViewID to VIEW_ID as uint, no more casting to float
- Fixed volumetric cloud rendering in stereo.
- Fixed too dark mobile preview
- Fixed volumetric fog in VR.
- Fixed artifacts with the distance field shadows in VR.
- Fixed XR scene textures to use requested extents more uniformly.
- Fixed crashing in forward when velocity output in base pass and MSAA are enabled.
- Fixed Nanite rendering in VR
- Fixed bind InstancedViewUB independent of active stereo rendering The shader compiler will enable ISR or Mobile Multi-View in shaders, independent of whether they are actively engaged in stereo rendering.
- Fixed support for the left texture for the Quad stereo layer.
- Disable max viewport resolution
- Fixed crash in ImgMediaMipMapInfoManager with -stereoenabled.
Deprecated:
- Remove GetScreenPercentage blueprint function deprecated since 4.19.
- The XR system click/touch FKeys, which cannot be bound in OpenXR, have been deprecated.
Platform Mobile
New:
- Added
r.Mobile.DesiredResX/Y
for Android and-mobileresx
and-mobileresy
commandline overrides as alternative to usingr.MobileContentScaleFactor
.- Set either
r.Mobile.DesiredResX
orr.Mobile.DesiredResY
to a value greater than 0, otherwiser.MobileContentScaleFactor
will be used. If you set both,r.MobileDesiredResX
will be used. These values are in pixels, and X and Y correspond to the current orientation of the device. Whichever dimension you set, the other one will be automatically calculated to preserve the aspect ratio. The final resolution used will be clamped to the device window resolution for the orientation.
- Set either
- Fixed Shader Complexity Preview ES31.
- Added the static method
ShouldCompileShaderFrequency
to filter frequencies for mobile platforms. This can be used to only allow vertex, pixel or compute shaders.
Bug Fix:
APlayerController
now enables motion controls by default.- Mobile platforms have
UE_COMMONINPUT_PLATFORM_SUPPORTS_TOUCH
set totrue
for the CommonUI plugin. - Mobile Texture Lookup Scene Depth now outputs WorldZ instead of DeviceZ.
- Vulkan Shader Compiler now checks the Shader Format instead of the Shader Platform.
- Added a method to check if Mobile post-processes should allow flipping. This is used to prevent Scene Captures from being flipped, as they are used as textures and sampled in the main scene.
- Backbuffer now sets the
TexCreate_ResolveTargetable
flag for cases whenMobileHDR
is set tofalse
and MSAA is enabled.
Removed:
- SceneDepthAux removed from certain platforms.
Android
New:
libUnreal.so
is now built against static libc++ due to issues with overridingnew
and delete. All our out of the box dependencies were updated to reflect this change. This was necessitated due to the engine upgrading to NDK 25b. Unreal Build Tool will scan for dependencies and throw an error if they requirelibc++_shared.so
. You can disable this check using thebDisableLibCppSharedDependencyValidation
option. You should update all dependencies in your project to build against static libc++, as mixing both static and shared libc++ within one app is unsupported by NDK and known to cause startup crashes. We still includelibc++_shared.so
in your.apk
by default to give provide room to upgrade your project. If you have successfully upgraded your project to eliminate any dependencies onlibc++_shared.so
, you can skip packaging it using thebSkipLibCpp
option within the/Script/AndroidRuntimeSettings.AndroidRuntimeSettings
group of your .ini file.- To reduce binary size in Android shipping builds, all symbols except the ones called from Java are now hidden by default. Debug\Development\Test builds still have default visibility to allow symbolication of crashes and asserts.
- Updated libunwind to the latest version from Github.
- Android toolchain now supports both full and thin LTO options. You can enable these with any of the following options:
- TargetRules
- bAllowLTCG or bPreferThinLTO
- UBT command line arguments: -LTCG/-ThinLTO. Please note that you have to enable both options if you want to enable ThinLTO. On Android, unlike on other platforms, PGO doesn't assume LTO, so if you have PGO builds and want to have LTO enabled, you'll need to enable LTO manually. This is due to toolchain issues, as having PGO assume LTO can cause extremely long build times and out of memory linker crashes.
- Added Clang Analyzer support to Android toolchain. This can be enabled using the
-StaticAnalyzer
UBT command. Refer toTargetRules.cs
for more information. - Added Android Toolchain option to disable stack protector. It can be disabled using the
bDisableStackProtector
option in the/Script/AndroidRuntimeSettings.AndroidRuntimeSettings
group of your config file (*Engine.ini). - Added file and line number logging for UnrealPluginLanguage (UPL) warnings and errors.
- Raised minimum Android version supported to 8.0 (SDK level 26).
- Set the minimum Java compile SDK level for Android to 30.
- If the
-BypassGradlePackaging
option is passed to UnrealBuildTool, Android packaging will be faster when onlylibUnreal.so
changes. - Individual OpenGL uniform buffers now have the option to force using real uniform buffers instead of emulated uniform buffers.
- Added Mobile Fidelity FX FSR as a plugin.
- Added support to SPIRV to generate structs from arrays with constant access which allows OpenGLShaderCompiler. This improves packing of shader data.
- Added
ANDROID_SDK_HOME
for AGDE to the SetupAndroid script.
Crash Fix:
- Added SPIR-V patch pass to fix driver crashes on Android 10.
- Fixed a possible crash on Macs where the editor would not properly shut down due to missing Turnkey support for Android.
Bug Fix:
- Android builds macOS now uses the rootProject path for AFSProject construction for AndroidFileServer. This fixes broken build processes.
- Because JCenter is now a read-only repository, mavenCentral repository is now preferred before JCenter. This is in compliance with Google's guidance regarding JCenter.
- Removed deprecated AppCache settings calls from WebViewControl.
- Fixed issues with Adreno version checks in MediaPlayer. These now use a more detailed regex search instead of parseInt to determine the modelnumber.
- Fixed misnamed functions for background and foreground delegates in Android media plugins.
- Added a check for ro.soc.model for ConfigRules chipset matching.
- Fixed installing of the overflow OBB file for Android.
- Fixed a null reference exception when running Turnkey on an installed engine build without Android support.
- Android: Prevent hang during pause by flushing GT before blocking RT During Android Pause, the Event Thread (ET) will block the Rendering Thread (RT), followed by waiting for a Game Thread (GT) command to complete. With Vulkan enabled, there could be a scenario where the game thread (GT) is waiting on the RT to flush. If the GT is waiting on RT while the ET blocks the RT, the ET will then deadlock waiting for GT. Instead, the ET can wait on the GT to finish first, with an unblocked RT.
- Added PropagateAlpha when generating the manifest for Android.
- Android: Prevent hang during pause by flushing GT before blocking RT During Android Pause, the Event Thread (ET) will block the Rendering Thread (RT), followed by waiting for a Game Thread (GT) command to complete. With Vulkan enabled, there could be a scenario where the game thread (GT) is waiting on the RT to flush. If the GT is waiting on RT while the ET blocks the RT, the ET will then deadlock waiting for GT. Instead, the ET can wait on the GT to finish first, with an unblocked RT.
- Changed the SDKManager check order for the SetupAndroid script.
- Added missing support for Turnkey for Android on Mac.
Deprecated:
- Removed legacy Visual Studio and NVidia Tegra Nsight Android project generators. These are now replaced by Google's AGDE.
iOS
New:
- Fixed
IMappedFileHandle::MapRegion
to map files or regions smaller than the page size.
iOS, tvOS, and iPadOS
New:
- Ignore iTunes DLL if the version number cannot be parsed expected.
- Added tvOS Bink Audio Decoder library.
Bug Fix:
- Fixed multiple bugs in MallocBinned, the default allocator for iOS.
- Fixed iOS Remote Mac toolchain cwrsync home directory detection. This was causing issues with SSH key generation in some Windows Active Directory environments.
RAD
New:
- Added the latest Bink binaries.
Rendering
New:
- Added a reference motion blur mode to MRQ In this mode, the post-processed motion blur is ignored and the Path Tracer accumulates frames across temporal samples instead, denoising only once per-frame instead of once per-temporal sample. This can be used to workaround limitations of the post processed motion blur effect, and allows pushing the temporal sample count higher than otherwise possible.
- Added experimental temporal denoising for offline path tracing that is spatially denoised. It gives a final touch to mitigate the temporal instability while preserving fine details. Enable the temporal denoiser in MRQ by adding the console variable 'r.PathTracing.TemporalDenoiser 1' when Path Tracing Denoising is enabled in the Post Process Volume Path Tracing settings when Denoiser is enabled.
- Hair strand rendering now allows a negative threshold to disable the Path Tracer invalidation to work around cases where the hair simulation does not fully settle. It also removes the clamp so the threshold can be increased past 1cm without fully disabling it.
- Added console variable r.SkinCache.SkipCompilingGPUSkinVF which enables you to skip compiling all GPU Skin Vertex Factor variants (except the pass through) if you are using GPU Skin Cache. The idea is that if you are using GPU Skin Cache and all Skeletal Meshes can fit within the cache at runtime, you only need the global compute shaders to perform GPU skinning. This means you will never need any GPU skin factory variants for any material, so they can skip compiling these shaders for significant savings.
- Don't compile GPU Skin Virtual Factories for special materials when 'r.SkinCache.SkipCompilingGPUSkinVF' is enabled. This accounts for roughly a couple thousand shaders across all our special engine materials, and these shaders will not be used, even for special cases in the engine, so it is safe to skip them.
- Only compile 'FTrivialMaterialCHS' when the proper console variables have been turned on. This saves on having to compile this shader variant for every material. In internal test projects, this saves ~2,000 shaders of ~3% of all shaders, and saves 15 shaders from being compiled in WorldGridMaterial in that same project.
- Avoid calling 'Get Material With Fallback' which was forcing compiling of shaders for materials even when On Demand Shader Compile (ODSC) was turned on. In CitySample, we went from compiling 125,000 shaders down to 9,000 shaders, which went from spending 13 minutes submitting shaders down to ~15 seconds. Calling 'GetIncompleteMaterialWithFallback' is safe to do in this case, since we don't actually need shaders from the material and are simply querying it for blend mode and for certain ray tracing flags.
- When running with On Demand Shader Compilation (ODSC), do not try to fetch fully completed shader maps from the DDC, which improves latency.
- MRQ will submit remaining jobs for compilation for all the materials in the world and block on the results before rendering.
- MRQ
- When running with ODSC in the editor Materials can have incomplete or partial shader maps. Shaders might be missing and we need to ensure all of them are compiled so we don't ever render a frame with the default material
- This logic will run before every render frame to properly handle new materials being loaded.
- If there are no incomplete materials this logic is a no-op and very lightweight. ~600us.
- UMaterialInterface
- Added a function to UMaterialInterface to query if we have a complete set of shaders.
- Made CacheShaders and IsComplete part of the public interface of UMaterialInterface.
- Optimizations
- 31x speedup to 'SubmitRemainingJobsForWorld'when there is no work to do. This went from 20ms down to 0.645ms. It only performs the material update context (which flushes rendering commands) when there are materials that actually need to do work.
- This turns 'SubmitRemainingJobsForWorld' into a no-op when there is no work.
- Misc
- When blocking on all shader map be sure to spawn a slow dialog so we can see the progress of shader compilation. - Only spawn the dialog (a heavy operation) if there are jobs.
- Always show the dialog even in PIE.
- MRQ
- Enabled Editor On Demand Shader Compilation, which drastically reduces the number of shaders compiled when working in the editor. On average, a 1.6x speedup when opening the editor and a map in various projects. Best case, a 2.23x speedup.
- Added a way to override the Sky Atmosphere visual sun disk radius from the material graph independently from the directional light radius.
- Volumetric fog now handles height fog start distance.
- When running with ODSC in the editor Materials can have incomplete or partial shader maps. In other words, some shaders might be missing. If a render system requires all shaders to be present and can't use ODSC functionality to compile the necessary shaders we need a mechanism for compiling just the missing shaders.
- Added UMaterialInterface::CacheShaders which is implemented for UMatetrial and UMaterialInstance. The call is just forwarded along to CacheResourceShadersForRendering and InitStaticPermutation respectively.
- You can call CacheResourceShadersForRendering multiple times (even with a completed shader map) and it will not recache uniform expressions. If the Resource's shader map is complete the function is a no-op.
- FObjectCacheContext can accept a UWorld and will only return primitives that are in that world.
- Added a function SubmitRemainingJobsForWorld(UWorld* World, EMaterialShaderPrecompileMode CompileMode) that will iterate all materials used by primitives in the world and compile the missing shaders.
- SubmitRemainingJobsForWorld() is used in various scenarios in the editor to ensure al shaders are compiled for all materials before proceeding.
- Explicitly try to compile UI and PP materials. Since we don't know which ones are used in the given world we just have to iterate all loaded ones. This is a potential area of optimization.
- If there are already complete shader maps (if you are not running with the shader job cache), SubmitRemainingJobsForWorld is fast and results in a no-op for each material.
- Added an 'illuminance meter' to the HDR (Eye Adaptation) visualization mode that shows mean and accounts for viewport rect.
- Fixed shadowed local lights looking dull at high exposure inside the volumetric fog.
- Fixed a typo in RayTracingMaterialHitShaders.usf.
- Added Vulkan external memory support.
- Added scoped CPU markers to various D3D shader compiler functions to make this easier to profile when shader compilation is done in process.
- Added Global Shader Types to the 'DumpMaterialShaderTypes' commandlet. This sorts global shaders alphabetically so diffs between output is stable. Also, added stats for scanning the asset registry and dumping the stats, and added a separate global shaders histogram, but it is currently not being dumped into the output log. The full asset path is reported for materials and material instance constants to make them easier to find in the editor.
- Added Sky Atmosphere transmittance on forward shaded translucent when per pixel mode is selected on the atmospheric Directional Light.
- Added an analytics provider to 'DumpMaterialShaderTypes' to track nightly statistics across various projects. It calculates the total shaders in the Default Materials as a good metric. This impacts editor startup time and is the default materials are the worst case scenario for usage flags. It only gathers analytics if passed in on the commandline.
- Added the ability to pass '-analytics' through automated testing. The following analytics are reported: ProjectName, BuildVersion, Platform, ShaderPlatform, TotalShaders, TotalMaterials, Total MaterialInstances, TotalGlobalShaders, and TotalDefaultMaterialShaders.
- Added an automated test to run the DumpMaterialShaderTypes commandlet, which is useful for catching shader count regressions on projects.
- Added a new test called "ShaderTypeRegressionTest" which can be run with the command line:
RunUAT BuildGraph -Script=Engine/Build/ShaderTypeRegressionTest.xml -Target="Shader Type Regression" -append:Projects="EngineTest" -append:Projects="CitySample" -append:Projects="Lyra" -append:Projects="MedievalGame[UnrealEditor]"
- The results are saved to Engine\Programs\AutomationTool\Saved...
- Added a new test called "ShaderTypeRegressionTest" which can be run with the command line:
- Volumetric Clouds is now precompiled through DXC. This accelerates volumetric domain materials (cloud shaders) compilation time by at least 6x.
- Replaced UE4 references with UE5 in related UnrealLightmass files.
- Added DumpGPU viewer script for Linux and Mac. Currently requires the Chrome Browser to view the dump files.
- 'Set Source Cubemap Angle' for Skylight components is now exposed in Blueprints.
- Added a warning when the maximum number of active ray tracing lights is equal to or greater than 'RAY_TRACING_LIGHT_COUNT_MAXIMUM'.
- Exposed 'BuildLightMaps' command to Python and Blueprint Utilities.
- Stat Groups are added to the list of stats printed when running "stat help"
- Changed default value for World Position Offset culling distance in ray tracing to 120m.
- Added support for multiple reflection captures for Single Layer Water materials.
- The GPU Dump Viewer now dumps both .sh and .bat so a dump can be opened either on Mac, Linux, or Windows regardless of the platform the files were dumped from.
- Added UE-DumpGPUPath environment variables to dump across Perforce workspaces at the same location by default on a machine.
- Implemented proper support for togglable Stationary direct lighting on mobile and deleted 'baked Stationary as Static' path. This change makes high quality and low quality lightmaps have unified lighting content and now they differ only in encoding.
- Added support for CustomDepth in Translucency pass on Mobile LDR.
- Refactored mobile Custom Depth and Stencil to line up with Desktop on all mobile platforms.
- Clustered local lights and reflections are now supported on Mobile Forward and Deferred rendering paths. Local light shadows are supported on Mobile Forward and Deferred, and need to enable full depth prepass to generate the ShadowMaskTexture.
- Disabled Simple Lights when using the Mobile Forward Renderer.
- Mobile now supports additional shading models, such as Two Sided Foliage, Cloth, and Eye. They use the same shading models as the dynamic lighting code path on Desktop.
- Reduced the size of UParticleModuleSpawn to 224 bytes to fit in a smaller FMallocBinned2 pool.
- Reset UniqueTables instead of emptying it to reduce allocator churn. Reset FCommandListResourceState::ResourceStates instead of emptying it to reduce allocator churn.
- Changed the Reflection Capture's encoded HDR data to RG11B10 format.
- Skip reflections for simple translucent materials for both Mobile Forward and Deferred rendering paths. Translucent materials will fall back to single reflection or sky capture on Mobile Deferred if clustered reflection is disabled.
- Enabled Ambient Occlusion on Mobile LDR.
- Initial work to support rendering with LWC-scale position. The basic approach is to add HLSL types FLWCScalar, FLWCMatrix, FLWCVector, and so on. Inside shaders, absolute world space position values should be represented as FLWCVector3. Matrices that transform into absolute world space become FLWCMatrix. Matrices that transform from world space become FLWCInverseMatrix. Generally, LWC values work by extending the regular float value with an additional tile coordinate. Final tile size will be a trade-off between scale and accuracy. Value represented by a FLWCVector thus becomes V.Tile * TileSize + V.Offset. Most operations can be performed directly on LWC values. There are HLSL functions like LWCAdd, LWCSub, LWCMultiply, LWCDivide. The goal is to stay with LWC values for as long as needed, then convert to regular float values when possible. One thing that comes up a lot is working in translated (rather than absolute) world space. WorldSpace + View.PrevPreViewTranslation = TranslatedWorldspace. Except 'View.PrevPreViewTranslation' is now a FLWCVector3, and WorldSpace quantities should be as well. So that becomes LWCAdd(WorldSpace, View.PrevPreViewTranslation) = TranslatedWorldspace. Assuming that we're talking about a position that's "reasonably close" to the camera, it should be safe to convert the translated WS value to float. The 'tile' coordinate of the 2 LWC values should cancel out when added together in this case. Materials are fully supporting LWC-values as well. Projective texturing and vertex animation materials that I've tested work correctly even when positioned "far away" from the origin. Lots of work remains to fully convert all of our shader code. There's a function LWCHackToFloat(), which is a simple wrapper for LWCToFloat(). The idea of HackToFloat is to mark places that need further attention, where I'm simply converting absolute WS positions to float, to get shaders to compile. Shaders converted in this way should continue to work for all existing content (without LWC-scale values), but they will break if positions get too large. General overview of the changes are as follows:
- LargeWorldCoordinates.ush - This defines the FLWC types and operations GPUScene.cpp, SceneData.ush
- Primitives add an extra 'float3' tile coordinate. Instance data is unchanged, so instances need to stay within the single-precision range of the primitive origin. Could potentially split instances behind the scenes (I think) if we don't want this limitation HLSLMaterialDerivativeAutogen.cpp, HLSLMaterialTranslator.cpp, Preshader.cpp
- Translated materials to use LWC values SceneView.cpp, SceneRelativeViewMatrices.cpp, ShaderCompiler.cpp, InstancedStereo.ush
- View uniform buffer includes LWC values where appropriate
- Added Blueprint function "Resize Render Target 2D" to support changing the resolution of a Render Target.
- Added an editor utility script function "Set LOD Screen Sizes" in "Static Mesh Editor Subsystem" to set the LOD screen size for static meshes. Useful for batch modification of LOD settings.
- Scene Capture: Added Blueprint function node "DeprojectSceneCaptureToWorld" to support translating UV coordinates in scene capture space to a world space ray, similar to "DeprojectScreenToWorld" which operates on the player camera. Allows hit tracing operations into scene capture surfaces without requiring C++ code. A typical approach involves feeding "DeprojectSceneCaptureToWorld" the output of a "Find Collision UV" node (requires "Support UV From Hit Results" enabled in Physics Settings). The "Find Collision UV" node receives a Hit reference from a "Line Trace By Channel" node. You can then use the output World Position and World Direction as a secondary ray to feed into another call to "Line Trace By Channel" to find the collision in the Scene Capture.
- Added a new console variable r.SkeletalMeshClothBlend.Enabled, which is set true by default. When the variable is false, the cloth weight used in skin rendering is set to 0 and the rendered mesh will effectively ignore the output of the cloth simulation.
- With Vulkan, a UE4 specific fix has been disabled on UE5 that was causing performance hitches.
- Move VulkanMemory.h to Private for easier hotfixing in the future.
- Refactored Layers and Extensions for the following on Vulkan:
- Split code for layers and extensions.
- Keep string arrays for layer management, and share as much code as possible between device and instance layers.
- Create a new class for extensions and manage them through a single flow.
- Package the code for the extension and its features+properties together in a single place, so the device code only iterates on loops of generic classes.
- Keep distinct states to track if an extensions: is supported by the engine, is enabled in the engine, is supported by the driver at runtime, is activated at runtime.
- If an extension is present but a required feature isn't, disable the extension.
- Remove feature structs from Vulkan Device when they were only used for init.
- Track promotion status of extensions (for future )
- Revisit some 'per platform' extensions that were enabled on all platforms.
- Read Skeletal Mesh render data from streaming bulk data so the editor can load the cooked data that is not cooked in line. This fixes editor-only renders the highest LOD when using cooked data as only the highest LOD is cooked inline.
- Added validation for invalid custom water bodies (no water mesh specified).
- Added support for Large World Coordinates (LWC) on GPUSkinnedVertexFactory and SkinCache shaders.
- Implemented GPUSkinCache debug visualization modes. 'Overview' mode shows skin cache on/off, recompute tangents on/off. 'Memory' modeshows skin cache memory consumption per sk mesh, includes RT if sk mesh uses a separate RT entry *) 'RayTracingLODOffset` shows RT LOD index offset from raster LOD index.
- Fixed skeletal mesh previous frame local-to-translated-world position in large world coordinates for both GPUSkinVF and LocalVF PassThrough.
- The r.UseLegacyMaintainYFOVViewMatrix console variable can now be set in config files.
- Implemented support for asynchronous creation and deletion of FRenderResource. The resource list uses a thread local free list that is coalesced later.
-
- Added support for FUintVector3 & FQuat4f as shader parameters.
- Added support for callbacks to simulate any-hit and intersection shaders in inline ray tracing.
- Added new ray tracing debug modes. 'Dynamic Instances' mode shows instances that go through a dynamic path. 'Proxy Type' mode shows instances colored by proxy type hash. 'Picker' allows picking instances/triangles with a mouse to show BLAS and instance info.
- Added support for "Distant Lights" to Virtual Shadow Maps (VSM), making it possible to support far more local lights with VSM shadows enabled by forcing caching, reducing page-table size, and round-robin updates on lights with a small screen-space footprint. Disabled by default, it can be enabled by setting r.Shadow.Virtual.DistantLightMode=1.
- Virtual Shadow Maps now support split screen rendering with caching and correct page marking.
- Changed how cards guides are generated at import time. This improves accuracy for picking the correct principal direction used for generated guides.
- Changed hair cards guide to have a root/tip color to make debugging easier.
- Added planar reflection support for hair strands.
- GatherRayTracingWorldInstancesForView was split into several parts in order to run most of the work asynchronously. This saves up to two-thirds of the GatherRayTracingWorldInstancesForView rendering thread critical path time in large projects. The main rendering thread cost is now FPrimitiveSceneProxy::GetDynamicRayTracingInstances(), which currently can't be moved to a task.
- The NVidia UReflexBlueprintLibrary API is now available to other modules.
- Added Rect Light texture atlas support. This allows a single texture binding for all textured area lighting.
- Added a project setting to disable per-object translucency shadows (disabled by default). To use translucency self-shadowing you must now enable this project setting. The Console Variable for this setting is r.Shadow.TranslucentPerObject.ProjectEnabled.
- Improved groom decimation accuracy and fixed invalid hair decimation when the decimation factor is larger than 0.5.
- Added Order Independent Transparency per-pixel sorting support for translucent Materials (experimental). Order Independent Transparency must be enabled in Project Settings and is off by default. It is currently only supported on PC Dx12. This is the initial step for fine grain/per-pixel sorting.
- Added precomputed BSDF directional albedo path for non-editor target. This avoids running the BuildTable pass which is too long on low-powered platforms.
- Changed the representation of hair strands from a cross to a quad cylinder to avoid self-shadowing artifacts and prevent discontinuities between segments.
- GPU texture formats for 32 bit float uncompressed pixels are now available (R32F and RGBA32F). Some platforms only support point/nearest sampling of 32 bit floats.
- Added previous position support for geometry cache and fixed hair strands motion vector when continuous level of detail (CLOD) is used.
- Added Groom Binding listing, preview, and skeletal mesh animation, within the Groom Asset Editor.
- Moving some of the FRayTracingScene initialization work into an asynchronous task which:
- Adds FRayTracingScene::BuildInitializationData, which builds FRayTracingSceneWithGeometryInstances.
- Adds FRayTracingScene::CreateWithInitializationData() that consumes FRayTracingSceneWithGeometryInstances data.
- Runs BuildInitializationData as soon as ray tracing instance culling tasks finish.
- Waits for scene initialization data in FDeferredShadingSceneRenderer::DispatchRayTracingWorldUpdates, which saves ~0.2-0.3ms of rendering thread time in large scenes.
- Unified the 8 separate variations of WriteRawToTexture_RenderThread into a single function on FTexture2DDynamicResource.
- Implemented and enabled two-pass Hierarchical Z-Buffer (HZB) occlusion culling for Virtual Shadow Maps when using Nanite geometry, making it render correct shadows under all forms of disocclusion. The console variable for this setting is 'r.Shadow.Virtual.UseHZB'.
- Improved and simplified 'ShaderPrint' to be the unique interface for outputting debug information from shaders. It regroups string printing, line, triangles, and widget (experimental) drawings into a single interface.
- Added Groom Alembic supports for GroupName.
- Added RootUV, Color attributes, Roughness attributes, and Precomputed Guide Weights information when importing a Groom Asset.
- Added r.Shadow.Virtual.Cache.ForceInvalidateClipmaps that can be used to force invalidation for Virtual Shadow Map clipmaps, even when caching is enabled. This is useful when the light is constantly invalidating (moving sunlight, for example) to reduce cache-management overhead.
- Changed voxelization to use an adaptive voxel size based on screen projection. This significantly reduces the cost of voxelization, shadow masks, and transmittance masks when grooms are further away from the camera.
- Reduced groom binding data size by deduplicating unique triangle data. The data size of the resulting binding asset type is reduced to approximately 1/5 of the original.
- Ray Tracing static primitive LOD calculations are now run asynchronously, as results are only needed much later for the FRayTracingSceneAddInstancesTask. This allows GatherRayTracingWorldInstancesForView() to start earlier on the rendering thread.
- Disabled primitive octree culling (console variable 'r.UseVisibilityOctree') by default as this causes visibility culling issues because of the limited extent of the tree (HALF_WORLD_MAX).
- Added tangent debug mode to the Groom Asset Editor.
- Added ray tracing Material evaluation to hair strands and custom primitive intersection.
- Fixed hair strands shadow culling when a hair instance is not visible in the primary view.
- Added per-object triangle sorting per view in order to improve translucent ordering artifacts.
- Implemented Large World Coordinates (LWC) support of Mesh Distance Fields data and related techniques.
- Batch Top Level Acceleration Structure (TLAS) builds on platforms that support it.
- Ray Tracing LightGrid is now calculated in translated world space.
- More than one PreviewPlatform can now use the same ShaderPlatforms.
- Improved expand bias in Distance Field Shadows by calculating the bias applied to two-sided meshes proportional to voxel size. You can adjust this bias with the console variable 'r.DFShadow.TwoSidedMeshDistanceBiasScale.'
- Global Signed Distance fields are now updated in translated world space. The clipmap center is used as the origin of translated world space during the update.
- Added console variable flags that automatically modify the KeyString when modified. The following KeyStrings are modified based on platform. The console variable r.MobileHDR is using this system now and others will follow in future releases.
- ECVF_GeneralShaderChange = 0x200 modify the Shader KeyString for All Platforms.
- ECVF_GeneralShaderChange = 0x400 modify the Shader KeyString for mobile Platforms.
- ECVF_GeneralShaderChange = 0x800 modify the Shader KeyString for Desktop Platforms.
- Create loose parameters uniform buffer to encapsulate GPUSkinPassThroughVertexFactory PreviousPositionBuffer. These changes ensure failure in MessPassProcessor.cpp in debug_editor build, due to PreviousPositionBuffer being a loose SRV parameter.
- Enabled Hardware Ray Tracing (shadows, reflections, ambient occlusion, global illumination) and the Path Tracer to now work in large worlds.
- Added support for capsule shadows in Large World Coordinates (LWC).
- Added support for multiple layers in FRayTracingScene.
- Added epsilon trace support in Raytraced Shadows to avoid self intersections.
- Changed ShaderArchive, GlobalShaderCache, ShaderDebugInfo and Autogen to use ShaderPlatformName and not ShaderFormat when naming their output files.
- Updated MeshUtilities::GenerateStratifiedUniformHemisphereSamples to use concentric disk sampling.
- Support specifying MaxAttributeSizeInBytes in FRayTracingPipelineStateInitializer instead of always using RAY_TRACING_MAX_ALLOWED_ATTRIBUTE_SIZE.
Improvement:
- Updated the Base Shape's material in Engine Content because it could cause invalidation of automatic image tests. The base color was changed from a value of (1, 1, 1, 1) to (0.9, 0.9, 0.9, 1.0). This change affects all base shapes (sphere, box, cylinder, and so on) that use the base shape material. Having a base color of 1.0 represents a physically unrealistic material that reflects 100% of all incoming light, which can create strange results where light never attenuates.
- Increased the Sample Per Pixel limit in the user interface for ray tracing passes.
- Adds a viewer console for GPUDumpViewer that can detect errors in the dump, such as incomplete dump.
- Improved the velocity precision on Android GLES platforms by using UINT format instead of FLOAT format.
- Improved the quality of AlphaToCoverage on mobile.
- Upgraded Vulkan SDK from 1.2.162.0 to 1.3.204.0.
- Improved VulkanRHI GPU rendering with earlydepthstencil.
- Added texture address mode member to volume textures to allow control of all three axes at once.
- Offloaded GPU scene uploads to an async task.
- The HDR tonemapper is now using ACES 1.3.
- Converted volumetric lightmap textures to RenderDependencyGraph (RDG).
- Ported GPU scene buffers to RenderDependencyGraph (RDG).
- Improved BuildHiddenComponentList performance by ~2ms in split-screen by expanding the hidden actor's components directly instead of doing it every frame.
- Removed cases of AddCopyToResolveTargetPass which either weren't necessary or weren't performing multisample resolves.
- Converted scene reflection capture path to RenderDependencyGraph (RDG).
- Conversions from the working color space (as set in rendering settings) are now correctly accounted for in the CombinedLUT and tonemapper.
- Improved water body map check error messages.
- Renamed the editor experimental setting bEnableAsyncSkeletalMeshCompilation to bEnableAsyncSkinnedAssetCompilation.
- Moved scene texture config and parameters into the Engine Library.
- Moved scene renderer deletion off the render thread.
- Moved RenderDependencyGraph (RDG) builder destruction off the render thread.
- Moved dynamic mesh passes and BeginSceneOcclusion off the render thread.
- Replaced thread-local MemStack with ConcurrentLinearAllocator across the renderer.
- Refactored the ray tracing geometry update logic for Skeletal Mesh to simplify its process. This includes:
- All skin cache entries needing RT geometry update are processed altogether in end-of-frame update whether batch dispatching or not, simplifies the logic.
- Transition buffers to read immediately after skin cache DoDispatch calls, simplifies the logic.
- No longer cache the flag to indicate whether RT geometry needs to be rebuilt, the logic is calculated directly when updating RT geometry.
- Improved hair strands root UV precision.
- Improved the performance of heightfield distance field management.
- Added the Frequency name to the "Unrecognized shader frequency" Shader Compiler error.
- Improved support for callable shaders.
- Reduced memory usage during RayTracingScene setup.
Optimization:
- Reduced GPUSkinPassThrough vertex factory shader permutations by merging it into local vertex factory. PassThroughVF is kept as a wrapper class.
- Reduced morph target vertex factory shader permutations by merging it into the GPUSkin vertex factory.
- Reduced multi influence cloth vertex factory shader permutations by merging with single influence cloth vertex factory.
Crash Fix:
- Fixed a potential crash where deleted primitives could potentially be put into the ray tracing mesh command cache even though their resources were already released.
- Fixed a potential crash in Movie Render Queue from null pointer dereference when searching MRQ setting classes.
- Made some Volumetric Fog console variables safe from causing a crash to occur.
- Fixed a crash when attempting to load ray tracing shaders when ray tracing is disabled.
- Removed an assert that was firing when rendering hair.
- Fixed an assert triggering because baked depth data was found to be invalid.
- Fixed a debug crash when GPUScene and modulated shadow are enabled.
- Fixed a crash while cooking Android with Lightmap Virtual Texturing enabled.
- Fixed a crash that could occur when using High Resolution Screenshot with 'Use custom depth as mask' enabled on Mobile Preview.
- Fixed crash on Vulkan when trying to read data from TextureCubeArray.
- Fixed a rare Vulkan RHI crash caused by an incorrect instance count when drawing indirect lines.
- Fixed random crash occurring in HLOD builder commandlet, where we're hashing landscape texture source data while potentially asynchronously building textures. UTexture2D::GetSizeX() / UTexture2D::GetSizeY() should be prevented in those cases, since unlike in the landscape editor, nothing ensures that FinishCachePlatformData() is called on those textures and the returned sizes end up being wrong / thread-unsafe. Also fixed a couple of places where we were not using the FTextureSource's data (even though those calls should be fine since they happen in a place where texture compilation is done)
- Fixed a crash that occurred when the bone name setup in a GroomComponent was incorrect.
- Fixed a crash with Hair when per-pixel linked list (PPLL) rendering is enabled, and hair groom are selected, proxy geometry is queried/rendered.
- Fixed a crash when using Materials with the UseHairStrands option enabled on a non-groom geometry.
- Fixed a crash when rendering hair strands with the Path Tracer when hair length scale was lower than 1.
- Fixed a crash that occurred when hair strands were rendered without any voxelization.
- Fix a crash that occurred when setting curve decimation above one.
- Fixed a crash that occurred when the number of DistanceField Mips was higher than DistanceField::NumMips.
- Fixed crash in FHZBOcclusionTester when MapResults is called before Submit.
Bug Fix:
- Fixed some issues that could occur when 'ShowFlag.Rendering' is disabled.
- Fixed Sky Light Capture not working correctly when toggling effect quality level.
- Fix an issue with 'GetMaxNumInstructionsForShader' that reported the incorrect instruction count for the given shader type. The function was not checking to see if the shader type in the pipeline was the same as the shader type we are asking for.
- Applied fix for Volumetric Cloud to work with Large World Coordinates (LWC).
- Ensure slow task dialog is shown when blocking 'on all shader' maps to be compiled. This way we can see the progress on how many shaders are being compiled.
- FFloat16 is not currently included in TShaderParameterTypeInfo, and increasing its array count will not increase its NumRows as intended. Simply hardcode correct values.
- Do not allow 'r.SkinCache.SkipCompilingGPUSkinVF=1' on mobile platforms (FeatureLevel == ERHIFeatureLevel::ES31). Some mobile platforms have a limit on how big buffers can be for skin cache positions. If we ever exceed this amount on a specific mesh, we skip the skin cache operation and need to fallback to a GPU Skin Shader. Since we don't know which shaders will be needed on a per-mesh basis, we must disable this feature and assume we need GPU Skin Shaders for '_all materials'.
- Fixed LoadAction to keep previous FinalLightingAtlas content if it was produced earlier (fix issue in Vulkan).
- Prevent shifts by a negative value, which addresses static analysis warning: warning V610: Undefined behavior. Check the shift operator
<<
. The right operand is negative ('....' = [-1..254]) - Texture Resolution will be 1. - Fixed Sky Atmosphere not updating correctly the cached camera aerial perspective buffer settings after console variable tweaks.
- Fixed a potential NaN in cloud depth texture with half float.
- Applied a fix for broken fog due to Large World Coordinates (LWC).
- Fix Game Thread and Render Thread access issues when performing shader compilation using FMaterial.
- SubmitCompileJobs was assumed to be render thread only. Make this explicit in the function name and add a render thread check.
- Added SubmitCompileJobs_GameThread to perform shader compilation submitted from the Game Thread safe.
- Keep a ref to a GameThreadPendingCompilerEnvironment because the one on the GameThreadShaderMap goes away after we clone.
- Added render thread check to GetRuntimeVirtualTextureOutputAttibuteMask_RenderThread
- Move simple enum types from ShaderCompiler.h to ShaderCompilerCore.h so we can access EShaderCompileJobPriority in MaterialShared.h
- Fixed incorrect usage SubmitCompileJobs that was submitted from the Game Thread using the Render Thread maps.
- Further reducing the geometry collection BLAS build count. a) Move the build out of the section loop so that we add one BLAS per geometry collection. b) Create the ray tracing geometry but delay the BLAS build later to dynamic raytracing geometry update.
- Fixed geometry collection performance issue by creating one TLAS per geometry collection instead of one per transform.
- Fixed a shader issue that was evident with SpeedTree foliage.
- Fixed an issue with DumpGPU when only the 32-bit version of Chrome Browser is installed.
- Fixed an issue with calling the DumpGPU command on mobile platforms.
- Fixed an issue with DumpGPU's resource search by saving all resource descriptors into a single Base/ResourceDesc.json file.
- Added dump timing measurement details to log when using DumpGPU.
- Fixed an issue with 'OpenGPUDumpViewer.bat' when a parent directory has a space in the file path.
- Fixed issues with ray tracing translucency looking overly bright when the tonemapper is disabled.
- Fixed an issue with missing GPUDumpViewer files from a packaged build on Android and iOS.
- Fixed black mip 0 in DumpGPU when a texture has a mip chain on D3D11 by using the capture by compute shader.
- Avoid divide-by-zero in GetLightMapColorLQ.
- Fixed Lightmass wrong string formatting.
- Ray tracing now takes into account the 'Visible In Scene Captures Only' flag.
- Fixed an issue where Static Lighting was broken when using Forward Rendering. The lightmap build data would get invalidated incorrectly while cooking.
- Fix DumpGPU file write error.
- When having lines that use world and screen space scaling in the same batch, OrthoZoomFactor can get overwritten, causing following vertices to potentially be generated wrongly.
- Fixed an issue where ray tracing could accidentally be enabled when disabled in render settings.
- Fixed incorrect Hierarchical Instance Static Mesh culling in ray tracing because bounds are not always initialized when the culling happens.
- Fixed FNiagaraRendererMeshes::GetDynamicRayTracingInstances fails to use Reserve, MoveTemp, or Emplace_GetRef to avoid copies and reallocations.
- Automation tests that do not have ray tracing enabled will now disable ray tracing explicitly to avoid enabling it by accident when D3D12 is active.
- Fixed a bug with Cascaded Shadow Map caching on mobile.
- Fixed a bug with DepthAux corruption on Mobile OpenGL.
- Fixed an issue where the indirect lighting of translucency is too bright on mobile.
- Fix an issue with depth of field jittering when the anti-aliasing method on mobile is set to Temporal Anti-Aliasing.
- Fix a shader bug on mobile with pixel projected reflection.
- Fixed an issue with stencil testing in Post Process Materials if MobileSupportFetchBindedCustomStencilBuffer
- Fixed an issue with fetching depth in mobile's separate translucent pass with Vulkan subpass.
- Fixed an issue with alpha detection in Virtual Texture builder causing tiles in the same virtual texture to use different formats.
- Fixed an issue that the Multi-Sampling Anti-Aliasing (MSAA) was broken on Android.
- Changed the precision of length2 from half to float to fix artifacts on Mobile Vulkan.
- Fixed an issue with reflection being too bright on Mobile Deferred renderer with Static Lighting disabled.
- Fixed an issue with mobile alpha coverage when the material is masked but writes every pixel.
- Fixed an issue with resolving Multi-Sampling Anti-Aliasing (MSAA) texture on IOS.
- Fixed an issue where the GlobalClipPlane doesn't work on depth-only vertex shader on Mobile Preview Shader platform.
- Fixed an issue where the brightness was not consistent when using Multi-Sampling Anti-Aliasing on iOS.
- Resolved an issue where depth content was not being kept when Temporal Anti-Aliasing was enabled. It was because the bKeepDepthContent was false if CameraCut is used and the SceneDepthTexture could be a dummy black texture (RGBA8 format) and a RenderDependencyGraph (RDG) validation failed at creating StencilTexture SRV which was expecting PF_DepthStencil format.
- Fixed an issue when Multi-Sampling Anti-Aliasing (MSAA) is enabled, it would only output SceneColor for SunMask on iOS.
- Fixed an issue with dark screens with Vignette enabled on Android.
- Fixed an issue with counting Skeletal and Static Meshes memory with mesh streaming enabled. The IncrementMemoryStats was called at the FSkeletalMeshLODRenderData::InitResources and FSkeletalMeshStreamIn::DoFinishUpdate.
- Fixed light flickering issue on Mobile Vulkan that could happen on Cloth and Hair assets.
- Fixed an issue with Cascaded Shadow Maps when using split-screen on mobile.
- Disabled GPUScene for landscape on mobile since it is not supported.
- Fixed an assert on Vulkan when a texture is created from TransientHeap with Discard as its initial state.
- Fixed
CmdBuffer->IsSubmitted()
assert on Vulkan. - Implemented changes on Vulkan RHI to avoid the automatic clearing of new targets when they are allocated in transient memory since it gets put in the upload command buffer that can execute earlier in the frame (when the same memory is potentially used by a different transient resource).
- Resolved a bug that caused flickering in the Editor when using Vulkan.
- Make it clear that PlatformData can't be null when creating texture cube array, fix static analysis warning.
- Fixed a Scene Capture issue so editor-only components aren't created when running a commandlet.
- Fixed 16 byte alignment of array elements for Vulkan. There are a few macros to help with conversion of cases where a single scalar is used in shader parameter arrays (and cannot be packed with other scalars).
- [C++] SHADER_PARAMETER_SCALAR_ARRAY(MemberType,MemberName,NumElements): adds an automagically packed array of scalars to shader parameters
- [C++,HLSL] GET_SCALAR_ARRAY_ELEMENT(PackedArray, ElementIndex): returns the value at that index in the scalar array
- [HLSL] DECLARE_SCALAR_ARRAY(ScalarType, ScalarName, ElementCount): declares an automagically packed array of scalars
- For Vulkan, we fixed an occasional layout error in Virtual Textures depending on which pass runs first after it is resized.
- Fixed an issue where a GameThread would stall (waiting for render thread) whenever a console variable was changed during gameplay.
- Fixed a NaN error introduced by fog when it is used on materials used by DrawCanvas
- Fixed mem report texture usage computation for landscape components. This includes:
- HeightmapTexture / XYOffsetmapTexture, which are only used on the non-mobile path, were artificially increasing the ref counts on platforms where mobile and non-mobile paths are enabled (in mobile mode)
- Weightmap[0], which contains the normal map in mobile mode, was not accounted for by the material instance's GetUsedTextures call, since it uses inlined HLSL code to sample it, rather than a texture sample material expression
- Fixed the visual calibration (device-encoding-only) viewport passes for HDR in scRGB mode.
- Fixed data race and potential double delete in FCanvas deletion path.
- Enabling HDR in the Editor now supports use with both HDR and non-HDR monitors.
- Fixed the "Selected Morph Target Vertices" Editor visualization, which was broken.
- Bug Fix: User Interface HDR composition in the Editor is now consistent with in-game HDR composition.
- Implemented a fix in the usage of ERayTracingPrimitiveFlags::UnsupportedProxyType. Its value is 0, so it must not be used with EnumHasAnyFlags().
- Fixed "Primary Rays" Ray Tracing debug view mode by renaming ERayTracingPrimaryRaysFlag::ConsiderSurfaceScatter to PrimaryView and using it to initialize the first ray instance inclusion mask in the RayTracingPrimaryRays Ray Generation Shader (RGS).
- Changed how hair strand textures are computed. These changes process hair strands textures in tile, and split computation over several frames to avoid Timeout Detection and Recover (TDR) on large grooms.
- Fixed an issue with HighResShot not clipping the rectangle to image bounds, and allowing memory to be read out of bounds.
- Changed groom bound computation when attached to a parent skeletal mesh, depending on whether it is attached relatively or not. The relative attachment is done based on attachment bone naming.
- Implemented a fix to exclude primitives that are meant to be hidden in game from the ray tracing scene when game view is enabled or in Play in Editor mode.
- Fixed an issue with hair strand shadows when Ray Traced Shadows is enabled. Ray Traced Shadows are now done in translated world space, replacing a previous temporary workaround for computing transversal in world space.
- Fixed a crash when r.RayTracing.Shadows is enabled dynamically. Previously FScene contained an array of Ray Trace Shadowed lights, which was updated when a light was added or removed. However, this is incorrect as the light's Ray Traced Shadow state depends on console variables that may be changed dynamically. The solution is to check if the scene currently contains any lights with Ray Traced Shadows during rendering. This is more expensive but robust. The array of RT-Shadowed lights is removed as it was not used beyond checking if it's empty.
- Fixed a reentrancy bug by making FSimpleMeshDrawCommandPass only run SetupDrawCommands the first time BuildRenderingCommands is called. This fixes a check in groom rendering.
- Fixed a hair selection issue under certain camera position and view resolutions.
- Fixed texture arrays with mip chains and streaming by adding an access point to texture arrays to get the mip data.
- Texture2dArrays now stream properly, correctly handling LODBias and packed mip tails.
- Platform Linux for the LiveLinkOverNDisplay Plugin was whitelisted in nDisplay.
- Fixed hair strands support for light functions by ensuring that light functions evaluated for hair strands will fetch the correct scene depth value.
- Fixed an issue where ACompositingElement could not initialize properly because Super::BeginPlay was not called.
- Fixed "Single Sample Shadow From Stationary Lights" by propagating the flag to GPU-Scene.
- Fixed the estimate for how many streaming texture mips to prefetch to avoid a blocking cache fetch on the main thread in the Editor.
- Implemented a fix for depth bounds setting outside of valid range on fog pass. The Render Hardware Interface (RHI) validation layer now has checks to catch such issues in the future.
- Fixed a leak when using the Null renderer (primarily for autotests), by implementing a valid Sync method.
- Fixed a memory leak relating to UpdateTextureRegions inFRemoteSessionARCameraChannel::UpdateRenderingTexture.
- Added support for root UV in hair card Groom Assets.
- Fixed the visualization of Cards guides so they are only available when simulation is enabled.
- Fixed missing update of hair ray tracing geometry when hair radius / tip / root / ray tracing scale are updated on a static groom.
- Fixed hair LOD colorization on cards and meshes geometry.
- Fixed a typo in the Blueprint action-menu category for composure export functions.
- PR #9127: Corrected a typo in an FLiveLinkLog warning message.
- Implemented code to use a conservative vertex count to initialize ray tracing geometries with multiple segments. The value of Segment.MaxVertices must be at least as large as the maximum value in the index buffer, plus 1. Previously this was initialized to per-segment vertex count, which can be too small.
- Fixed a bug to hide the shadow of primitives with "hidden shadow" enabled when the actor is hidden in the Editor UI. Previously, the shadow would remain even if the primitive was hidden in the Editor.
- Fixed Texture Profiler compiler errors.
- Apply "Get Ray Tracing Quality Switch," "Get Path Tracing Quality Switch," and "Get Lightmass Replace State" functions to ray tracing callable and miss shaders.
- Fixed an issue in FTextureLayout3d causing higher than expected memory usage.
- Fixed an issue with the availability of heightmap visibility when building the Global Distance Field in cooked builds.
- Fixed issues with Distance Field Shadows in water when using async compute.
- Fixed issues with Distance Field Shadows when using split screen.
- Fixed GlobalDistanceField corruption that occurred when a scene contained only heightfields.
- Fixed issues with materials applying vertex offset or modifying opacity based on DistanceToNearestSurface.
Deprecated:
- Deprecated bOverrideWaterMesh (WaterMeshOverride is enough to override the water mesh, no need for an additional boolean).
- Deprecated the view uniform buffer from MeshPassRenderState.
Removed:
- Removed all flip-y completely and only flip-y at the end on Android GL with a native window API since there is no need to handle flip-y on high level.
- Removed the limitation of having a max of four local lights when using Mobile Forward Renderer.
- Removed the 'High Quality Reflection' option when using the Mobile Forward Renderer.
- Removed the division of Pi on Mobile Directional Light's color in C++ to line up with desktop in shaders.
- Removed the Mobile rendering project setting to set 'Max Movable Spotlights / Point Lights'. On Mobile, this forces Movable Point Lights to be Static.
- Removed view uniform buffer from ray tracing mesh draw commands and deleted FPersistentUniformBuffers::ViewUniformBuffer.
- Crunch and zlib compression support on Virtual Texture tiles was removed from the engine.
- Removed the r.CachedRayTracingInstances.CacheLocalTransform/LazyUpdate console variable.
- Removed the deprecated FRayTracingSceneInitializer codepath.
Architecture
New:
- Virtual Shadow Map cache can optionally be allocated per view. Can be a significant performance win by avoiding constant cache thrashing when rendering multiple view families (for example, this is used for nDisplay). Enable the feature on the FSceneViewStateInterface using AddVirtualShadowMapCache. See also the related RemoveVirtualShadowMapCache and HasVirtualShadowMapCache functions.
- Added Virtual Texture warmup frames for Material baking. The number of warmup frames is controlled by the MaterialBaking.VTWarmupFrames Console Variable and defaults to 5. Warmup will only happen if the Material samples Virtual Textures.
- Added support for updating the Virtual Texture system when using DrawTileMesh. This allows systems that capture or bake Materials to warm up source Virtual Textures correctly.
- Added a renderer project setting to enable Virtual Textures to be used in opacity masks. This setting defaults to off, which is the current behavior.
- The Groom system now supports reading the skinned mesh geometry cache from the deformer graph system. This allows Groom to stay synched to the animated mesh when deformer graphs are used.
- Compression settings for Runtime Virtual Texture (RVT) streaming mips are now stored in the RVT Component instead of the RVT Asset.
- Decal components are now exposed to Blueprints.
- Added support for velocity vector output for objects that are marked as Static but have Materials with World Position Offset.
- Translucency Sort Priority is now used to sort Mesh Decals.
Bug Fix:
- Fixed sphere geometry vertex buffer to use FVector3f, rather than FVector.
- Fixed a bug that caused a failure when setting a Material Instance Dynamic on a decal after World Partition streaming has already happened.
- Removed an unnecessary warning that nothing will be written to virtual texture for empty foliage actors.
- Implemented changes to force a depth prepass when Virtual Textures are enabled for a project. This fixes an issue where masked Materials could not be used with Virtual Textures when the depth prepass wasn't enabled.
- Fix a bug with no velocity being written for Unlit Materials.
- Fix a bug with Virtual Textures not updating correctly in debug view modes.
- Fixed an issue where Adaptive Virtual Textures would read from pages that weren't fully mapped, which could lead to flickering or sampling errors.
- Implemented changes to disable parallel Render Dependency Graph if it's not running in a dedicated render thread.
Lighting
New:
- The Path Tracer now invalidates the path-traced out when decals are added, removed or transformed.
- Implemented Subsurface Scattering support for the eye shading model.
- Implemented Alpha Holdout blend mode.
- Enabled progress display by default and reduced the default Samples Per Pixel value to 2048 in the Post Process Settings.
- Dithered opacity masked Materials should now ignore the clip value.
- The Path Tracer now takes the normal map into account at the exit point of the random walk for better detail preservation in Subsurface Scattering.
- Added support for Light Functions in the Path Tracer. This also includes colored light functions when using them with the console variable 'r.PathTracing.LightFuntionColor'.
- Invalidate Path Tracer when Sequencer time changes This change also allows the Path Tracer to be used in the Niagara editor (with constant invalidation, but avoiding blurring).
- Improved filtering of which scene proxies should impact Path Tracer invalidation.
- Add support for path tracing in the Material Editor and Static Mesh Editors.
- Added Light Function support for ray tracing. Lights with assigned light function materials will now show up correctly in raytraced reflections.
- Implement Sky Atmosphere and Exponential Height Fog in the Path Tracer.
- Added support for Distance Field Shadow on water materials using Single Layer Water. Set the console command 'r.Water.SingleLayer.ShaderSupportDistanceFieldShadow' to enable it. This change requires restarting the editor.
- Implemented Ray Tracing support for the Image Plate plugin.
- Added support for a Light's 'Source Length' setting in Ray Tracing.
- Added functions on UExponentialHeightFogComponent to allow users to set Second Fog variables in code along with FSecondFogData struct to allow setting them through Blueprint.
- Implemented a workaround for incorrect shadow ranges in directional lights due to the changed default values in the Unreal Engine 5.0 release. Old defaults are no longer loaded if they are part of Blueprints, regardless of the engine version used to create the Blueprint.
Improvement:
- Improvements to Virtual Shadow Map static caching categorization. Primitives are still categorized initially based on mobility, but if a static primitive invalidates the virtual shadow map (usually due to the use of world position offset in a material) it will be transitioned to dynamic automatically to avoid continually invalidating the static cache.
Optimization:
- Several optimizations to light loop for shadowed lights that together lead to some gains in scenes with several local lights, and large gains when using virtual shadow maps one pass projection with many local lights.
- Reduced barriers and GPU idle time for small lights.
- Decoupled virtual shadow map one pass projection from clustered shading. When only a virtual shadow map is present for a light and no light functions are used, it can now take a fast path in the light loop.
Crash Fix:
- Fixed an assert on Light count when there are no lights in the scene.
- Fix potential crash when ray-traced shadows are disabled for the project but there is still a Light in the scene that enables ray-traced shadows.
Bug Fix:
- Applied a fix for potential NaNs in the hair shading model.
- Fixed Moveable Lights not invalidating the Path Tracer.
- Avoid invalidating the Path Tracer when a Moveable Light transform has been set but did not actually change.
- Fixed a constant invalidation in MRQ renders when camera depth of field is animated.
- Fixed missing scene invalidations when changing skylight or moving atmosphere / fog components.
- Fixed a constant path tracer invalidation being caused by Post Process Material blending.
- Fixed an issue with MRQ where the post-processed output is not accumulated properly when using the Path Tracer.
- Applied a fix for Reflection Captures sometimes showing up black in packaged games.
- Fixed the bug that Gizmos are affecting global illumination. Added translucent editor primitives support. Top view mesh elements with translucent materials will go through editor primitive rendering instead of the standard translucency pass.
- Applied a workaround for potential GPU timeouts when raytracing procedural hair primitives from a long distance.
- Fixed sky and cloud issues that could occur in split-screen.
- Fixed skylight intensity not updating through Sequencer.
- Volumetric fog history and pre integrated light froxel texture are now pre exposed to avoid smearing artifacts at super low exposure.
- GPULightmass should complete shader compilation before building lighting. The alternative is to have lightmass constantly restart as new shaders complete.
- Implemented code to avoid Distance Field Ambient Occlusion self shadowing when using the console variable
r.AOQuality >= 2
. - Fixed incorrect distance field indirect self shadowing.
Lumen
New:
- Lumen support added for Scene Capture 2D. By default Lumen is disabled for Scene Capture to save memory, but can be enabled via post process override settings in the Scene Capture Actor (override Dynamic Global Illumination Method and/or Reflection Method to Lumen). Lumen requires persistent state to function properly, so Lumen for Scene Capture requires either bCaptureEveryFrame or bAlwaysPersistRenderingState to be set to true. Lumen will be disabled if both are false. The persistent memory usage for Lumen is significant, from 300 to 600 MB or more, depending on quality settings. The Texture Editor has been upgraded to display GPU memory usage for Scene Capture 2D to allow the overhead to be observed. By default the quality is set to minimum, but can be overridden with the Scene Capture Cache Resolution Scale post process setting under Lumen.
- Surface cache generation algorithm is now more robust and able to cover a higher variety of meshes, including having surface cache for tiny scene elements.
- Distance field stochastic semi-transparency for foliage Software Ray Tracing. This gives a more accurate representation of foliage, less over-occlusion.
- Added Lumen Diffuse Color Boost to Post Process Volume. It allows brightening indirect lighting by calculating DiffuseColor for indirect lighting as pow(DiffuseColor, 1 / DiffuseBoost). Values above 1 (original diffuse color) aren't physically correct, but they can be useful as an art direction knob to increase the amount of bounced light in the scene. Best to keep below 2 as it also causes reflections to be brighter than the scene.
- Enabled Lumen Radiosity on High GI settings.
- Lumen Scene Direct Lighting now supports Rect Light Source Texture.
- Added Skylight leaking control for Lumen as a new Post Process Volume setting that allows skylight to leak intentionally to prevent areas from going fully black with global illumination. It's useful for art direction, as it is a non-physical control, although it should be kept very subtle (.005 or less) to avoid losing HDR lighting contrast. Skylight leaking ramps up over distance, which creates Ambient Occlusion and keeps it from looking flat.
- Lumen now supports the Two Sided Foliage shading model by accumulating irradiance for the backface, giving much higher quality foliage shading. The High GI scalability level disables r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse to avoid overhead. Also, improved Screen Probe hardware tracing biasing on two sided materials
- Removed ray dithering fade at the end of trace distance when far field isn't used
- When lighting surface cache pick N most important lights instead of N first lights. It improves lighting quality and fixes nondeterministic surface cache lighting as sometimes lights may be added to a scene in a different order. Control this with r.LumenScene.DirectLighting.MaxLightsPerTile.
- Added an AffectIndirectLightingWhileHidden property to the Primitive Component, which allows hidden primitives to be injected into Global Illumination (GI) and Reflections. This is useful as an extra art direction tool to create cheap invisible area lights through GI.
- Increased the Global Signed Distance Field (SDF) resolution when using Lumen Software Ray Tracing.
- Added support for lighting channels for analytical lights.
Improvement:
- In Software Ray Tracing mode voxel lighting volume has been replaced with an object grid, which allows sampling of the surface cache directly instead of a low resolution and leaky resampled voxel representation. This improves secondary bounces, reflections and GI from small emissive surface elements.
- Optimized radiosity card tile memory size by allocating based on the update atlas size instead of a physical atlas size.
- Added UPrimitiveComponent::InvalidateLumenSurfaceCache() to support manual surface cache refreshing on any material change.
- Raised Lumen GI's intensity clamp (firefly prevention) by a factor of 2 now that Lumen has less noise.
- Lumen lighting propagation is now faster while using editor movement widgets and toggling directional lights and skylights.
- Lumen GI now uses Spatiotemporal Blue Noise, which gives much cleaner indirect lighting, especially when the camera is still and in screenshots. 'High' GI scalability quality in particular is improved.
Crash Fix:
- Fixed a crash which occurred when reallocating surface cache pages with a modified aspect ratio after an object scale transform.
- Fixed crash which occurred when enabling reflection hit lighting with a surface cache project setting.
Bug Fix:
- Fixed Emissive Light Source not correctly encoded to be injected into the Voxel Lighting.
- Lumen Screen Traces now skip hitting foliage materials to fix noise that could occur around grass.
- Fix Radiance Cache leaking in Software Ray Tracing mode due to rays starting inside geometry.
- Fixed randomly missing mesh cards from cook
- Fixed mesh distance field volume interpolation on consoles.
- Disabled Octahedral Irradiance format for Screen Probe Gather on Epic GI scalability settings as it doesn't handle gradients well.
- Fixed Lumen GI and Reflections being culled at 1 million Unreal Units.
- Invisible shadow casters are now filtered out from Lumen Scene.
- Fixed an infinite loop that would occur when generating mesh cards for huge meshes.
- Fixed area and capsule lights to respect source radius and length when lighting the surface cache.
- Fixed non-Nanite per ISM surface cache generation.
- Fixed an issue with indirect light rendering when the Lighting Complexity View Mode is enabled
- Fixed missing Global Illumination energy on AMD GPUs.
Materials/Shaders
API Change:
- The DirectX Shader Compiler (DXC) no longer allows duplicate semantics in shader signatures. Particularly using SV_InstanceID requires careful examination of vertex factories input as it will likely be already defined there.
New:
- Exposed azimuthal roughness on hair through the scatter (Metallic) parameter. The default value of 0 corresponds to 1.0 azimuthal roughness (current behavior) while increasing the scatter amount makes the hair more and more forward scattering, leading to a softer appearance. The lowest possible roughness is limited to 0.1 to limit noise.
- Implemented support for Per Instance Custom Data for non-Nanite use cases (including ray tracing shaders).
- When switching between rendering preview modes, On-Demand Shader Compilation (ODSC) should be used. AllMaterialsCacheResourceShadersForRendering now accepts a parameter to decide whether to fully cache and complete all shader maps. By default this is true to maintain previous behavior. When switching preview materials this behavior defaults to false and we let ODSC in the editor handle which shaders need to be compiled, resulting in far fewer shaders compiled.
- Set InstructionCount when compiling shaders with DXC, which fixes an issue where all compiles of SM6 shaders were reporting 0 instructions.
- Implemented single shader file compilation for cooked platform On-Demand Shader Compilation (ODSC). For example, recompileshaders /Engine/Private/Lumen/LumenVisualizeHardwareRayTracing.usf which would result in: 1) the game sends the shader file string across the network to the cooking server, 2) cooking server finds all shaders of that type, 3) cooking server flushes those specific types from the global shader map, and 4) cooking server recompiles just those shaders and sends them back to the game. There is still work to do in this regard to refactor duplicate code in RecompileShadersForRemote, and to implement the ability for material shader maps to compile just specific shader types requested (which doesn't yet exist).
- Added UCompileShadersTestBedCommandlet which is meant as a simple way to profile/test/optimize shader compilation. Currently, it only compiles the global shaders. Having a commandlet is faster and easier to run repeatable tests than dealing with starting up the editor. You can run your projects with this commandlet with 'ProjectName -run=CompileShadersTestBed -ddc=Cold -ddc=NoShared -noshaderddc -trace=default,counters', which ensures you don't get results in any DDC and that you always compile shaders.
- Added more information to the DumpMaterialShaderTypes commandlet output.
- Keep track of a map from static parameter hash to a list of all mat instances that share the same hash. (currently this data isn't being printed out.)
- Print the full path to the parent material. Some assets have the same name making it hard to track down which asset we were referring to.
- Generate and print out the static parameter hash for each material instance.
- Added material instance function to generate a string which contains a comma separated list of base property overrides for material instances. These cause shaders to be stored with material instances.
- Generate and print out the base property override string to see which material instances also cause shaders. This output looks like the following:
- Base Property Overrides: True
- bOverride_OpacityMaskClipValue_0, bOverride_BlendMode_1, bOverride_ShadingModel_0, bOverride_TwoSided_0, bOverride_DitheredLODTransition_0, bOverride_CastDynamicShadowAsMasked_0, bOverride_OutputTranslucentVelocity_0
- Volumetric Cloud conservative density is now a float4 (conservative density in x and side float3 side payload in yzw).
- Dump DDC keys for global shaders. The console variable r.Material.DumpDDCKeys has been renamed to r.ShaderCompiler.DumpDDCKeys. The directory they output to changed from "MaterialDDCKeys" to "ShaderDDCKeys." Break getting the global shader map DDC key string out into a function to make it easier to call when we dump DDC keys. Global Shader map section files are named "GlobalShaderMap-%s" where %s is the name of the section (usually a global shader type). Editor and Game shaders are dumped to separate directories. Exposed ShouldDumpShaderDDCKeys function so material code can see if dumping is enabled.
- Added command line parameters to specify a specific shader model and material quality level to cook for. This is used to limit what cooking shadermaps to a single shader model and/or material quality level. It's useful for locally cooking or specific situations where you want to cook a minimal set of shader maps. Each command line parameter can be used independently. Also, added -CacheShaderFormat that when specified during a cook, the cooker will only compile this shader model if supported for each material. Added -CacheMaterialQuality that when specifying this during a cook, the cooker will only compile this quality level and default for each material. For example,
-CacheShaderFormat=PCD3D_SM5
and-CacheMaterialQuality=[0,1,2,3]
- Output the WorldGridMaterial's human readable DDC key string to the log. This is done for diagnostic purposes on users' machines, and for the build machines.
- Added new shader compilation editor analytics.
- ShadersCompiled: The number of shaders compiled.
- ShaderDDCMisses: How many times we missed shader maps in the DDC. This is a measure of how many times we didn't find Global and DefaultMaterial shaders.
- ShaderDDCHits: How many times did we successfully find shaders in the DDC.
- TimeShaderCompilationWasActive: Wall clock time of how long shader compilation was active across your whole editor session.
- Added better output to COTF + ODSC. Prints out what command is being run (global, material, changed, singleshader) and prints out exactly how many shaders were compiled. And added a function to convert command type enum to a string.
- Added an exec command "Material DumpDebugInfo" which dumps debug information for each shader in the material given as an argument. It can be run like the following: "material dumpdebuginfo WorldGridMaterial". It can also be used to see which shaders get invalidated when changing shader code:
- "material dumpdebuginfo WorldGridMaterial", change the shader usf/ush file, run "recompileshaders material WorldGridMaterial", then "material dumpdebuginfo WorldGridMaterial", and diff the outputs of the two.
- The filename follows the following format:
Engine\Programs\AutomationTool\{ProjectName}++UE5+Main-CL-20942948-WorldGridMaterial-2022.07.05-16.11.42.csv
- The file output looks like:
- Frequency, Target, VFType, ShaderType, SourceHash, VFSourceHash, OutputHash, IsShaderPipeline SF_Pixel, PCD3D_SM5, FGPUSpriteVertexFactory, TShadowDepthPSPixelShadowDepth_PerspectiveCorrect, 2DD4725EA72D0498EB6B1E656F35564D97083FC8, 920506EE58508D22D29046DCE7DF15BF34940059, EC976B76E986CB7E5235B154F9A0B3AF3AB9B1AD, false SF_Vertex, PCD3D_SM5, FGPUSpriteVertexFactory, TVirtualTextureVSBaseColorNormalRoughness, A3C811C874410080F3138AEF4489CCA932D7395A, 920506EE58508D22D29046DCE7DF15BF34940059, CD25F583872C5ECF0E156EA8F50AF96B6B199BDA, fal
- Water geometry now works with Pixel Depth Offset (PDO).
- Added the ability to specific material and material instances to cook using the command line to the CompileShaders commandlet. This adds the ability to specify which -targetplatform we should compile shaders for. You can specify multiple platforms by adding them together. For example, "-targetplatform=Windows+MyNewPlatform - Call BeginCacheForCookedPlatformData" to compile shaders instead of CacheShaders since the former allows you to specify platform. The following are some additional usage examples:
- Specify collection EngineTest -run=CompileShadersTestBed -targetplatform=Windows -collection=MyCollectionName
- Specify material list EngineTest -run=CompileShadersTestBed -targetplatform=Windows -materials=/Game/MyNewMaterial.MyNewMaterial+/Game/Tests/Materials/CoolMaterial.CoolMaterial
- Specify both a collection and material list EngineTest -run=CompileShadersTestBed -targetplatform=Windows -collection=MyCollectionName -materials=/Game/MyNewMaterial.MyNewMaterial+/Game/Tests/Materials/CoolMaterial.CoolMaterial
- Reduced the size of UMaterialInstanceDynamic by 8-bytes to drop into a smaller FMallocBinned2 pool.
- Added the control to turn on / off Screen Space Reflections on translucency dynamically using showflag and 'r.SSR.Quality'.
- The new HLSL translator supports Virtual Texturing.
- The Material Editor colors wires based on data type when using the new HLSL generator.
- Input and output data types are tracked for node connections in the Material Graph. Pins and wires are now color-coded by data type.
- Run two passes of PrepareExpression. The first pass to determine types, and second pass to flag expressions that are used. This way we can skip flagging constant/zero expressions (which we don't know about during the first pass)
- Added 'Total Thread Preprocess Time' for shader compilation. This instrument shows how long shader preprocessing takes for each shader compilation job, keep a running total in our shader stats per shader type, add logging to track total thread preprocessing time for all shaders, and fixup local variable names to match the output log names.
- The new HLSL translator supports structs in preshaders, which enables constant folding to be tracked across struct assignments.
- Implemented changes to optimize GetMaterialShaderMapKeyString during cooks.
- The new HLSL Material translator now supports automatic mip bias input.
- The new HLSL Material translator now supports flow control in preshaders.
- ShaderDebugPath now respects the material quality level for '...\Saved\ShaderDebugInfo\PCD3D_SM5\WorldGridMaterial\Default\FLocalVertexFactory\FHitProxyPS' or '...\Saved\ShaderDebugInfo\PCD3D_SM5\WorldGridMaterial\Epic\FLocalVertexFactory\FHitProxyPS' :
- Use 'LexToString(EMaterialQualityLevel::Type QualityLevel)' to convert the quality level enum to a string.
- This specifically appends to the DebugName the material quality at the level in the code where we "know" about the material. I wanted to avoid changing the parameters to the function, 'GlobalBeginCompileShader', because it is material agnostic.
- Generate if{}/else{} control flow rather than ?: for material switch expressions. Added non-static bool MCT type to allow plugging bool expressions into switch nodes when using new HLSL translator.
- Support matrix types in new HLSL translator Other various fixes/additions.
- Added support for Material Layers with new HLSL translator.
- Implemented const-correctness changes in new HLSL translator. 1) FExpression* is mostly always 'const'. 2) Since expressions should not change after creation, UMaterialExpression::GenerateHLSLStatements/Expression are const-methods.
- Some fixes for rules around promoting scalar values in new HLSL translator which supports some new node types.
- Texture values are no longer generated as HLSL code directly. Instead, they are replaced with a new 'Object' type system, which allows expressions to generate C++ objects of arbitrary type. This gives the texture sample expression full visibility into the texture object being sampled, which simplifies some code generation. More importantly it will allow virtual textures to work, which wasn't really possible with the previous system
- Added the "DumpMaterialExpressions" commandlet to dump an info table of all material expressions in the engine and the plugins enabled on the project to a plain text file which includes the following output material expression fields:
- Name for the name of the UMaterialExpression class (shows in material editor node search).
- DisplayName for the optional display name set on the class (shows in material editor node search and overrides Name).
- Caption to show text displayed on the material expression node.
- Description
- Tooltip Output location
<Project>\Saved\MaterialEditor\MaterialExpressions.txt
- The experimental CFLAG_RemoveDeadCode was added to ShaderMinifier to run a shader rewriting step that removes unused functions and types from the shader source before compilation. This improves compile times.
- Added DistanceFieldApproxAO Material node to calculate approximate ambient occlusion.
- Fixed duplicated SV_InstanceID semantic across the shader code.
- Added the ability to split the Pipeline State Object (PSO) cache among chunks, so each chunk contains the cache only for the assets it contains.
- The Command-Line Argument -noshaderddc now applies to the global shaders as well.
Improvement:
- Improved the specular and diffuse matching between Rasterizer and Path Tracer for SSProfile. Switch DMFP to MFP automatically.
- Removed compilation (of never used!) legacy simple forward shading permutations from Windows shader databases (~27% reduction of SM6, ~22% reduction of SM5 when simple forward was enabled in the compiler).
Crash Fix:
- Fixed multiple crashes that could occur when undoing materials in the Material Editor. The transaction system was not aware of the EditorOnly data owned by the UMaterial, meaning that any undo/redo operation left the editor-only data on the UMaterial in an incorrect state. For instance, UMaterialExpressions with properties missing, override virtual function Modify on UMaterial, and call Modify on the EditorOnly data owned by the UMaterial.
- Fixed occasional failures to decompress shaders in ShaderCodeArchive.cpp.
Bug Fix:
- We now ensure shaders are cached before drawing a tile with a material. In the editor with ODSC, shader maps could be incomplete resulting in them drawing a tiling with the default material (which never gets updated) If the material is detected to be incomplete, it will synchronously compile shaders so they are ready before drawing. Display a slow task if possible (not PIE)
- Fixed noise caused by world unit scale for large distance screen space subsurface scattering.
- Added console variable 'r.SSS.Checkerboard.NeighborSSSValidation' to fix subsurface profile border artifact when checkerboard is turned on. It is off by default due to performance concerns since it introduces one extra profile ID access per pixel at low quality (TAA mode by default), and four extra profile ID accesses per pixel at high quality.
- Fixed the 'Total Shaders' compiled counter and stat to account for the job cache DDC. We were potentially over counting actual shaders compiled if we found a job already in the cache. Now we increase the counter when we finish a job that was not cached, and use 'JobsCompleted' on the FShaderCompilerStats as a proxy for the number of total shaders compiled instead of counting the number compiled in the ShaderCompilerStats, because these are wrong and don't account for the job cache. Also, added a trace CPU profiler scope to FinishCompilation.
- Fixed an issue with wrong refraction happening when SingleLayerWater triangles are not horizontal in the world.
- Shader compilation will retry now when the following conditions are true: r.ShaderDevelopmentMode=1, and bSpecialEngineMaterial==True. This allows you to retry compilation of special engine materials, like WorldGridMaterial, even if you have bPromptToRetryFailedShaderCompiles=False.
- Fix for various issues with the "CompileShadersTestBed" commandlet by making it behave more like the cooker.
- The commandlet shouldn't be configured for rendering. This was originally done to force shader compilation to happen in PostLoad. This caused textures resources to be created, which is not needed and was causing crashes.
- Properly wait on potential DDC requests.
- Wait on shader compilation by calling ProcessAsyncResults, which is exactly what the cooker calls.
- While we have jobs to compile we process the results.
- Be sure to flush rendering commands so we cleanup deferred delete objects like Shader Maps
- Added logging to commandlet.
- Enabled "LogMaterial" for this commandlet so we can see DDC puts w/ DDC key.
- Fixed long wait times in FODSCManager::Tick caused by running when cook-on-the-fly is not enabled. Also only flush in ProcessCookOnTheFlyShaders if some work was actually done.
- When modifying a parameter value on a UMaterial, all expressions that match the name are updated, rather than simply the first.
- Compiler errors are now generated if a Material tries to append more than 4 components worth of data.
- Made sure that Blueprint exposed functions resulting in a Material (UMaterialInterface) draw are synchronously waiting for their shaders to be ready before issuing the draw command. This also removes double-update of canvas in Blueprint functions.
- Fixed a bug where custom scene textures could not be read in widget Materials.
- Removed fogging from water brush translucent Materials.
- Fixed a case where only the first virtual texture sampled on an Actor decal was updated correctly.
- Fixed a bug where decals that sample world normals were not able to write to emissive.
- Code was rewritten to use HLSL precise keywords in a number of places, including where World Position Offset is used. This fixes broken velocity vectors, and broken Editor outlines for a range of Materials.
- Fixed a bug with broken shadow casting from Material Instances when the "Cast Shadow as Masked" setting is enabled in the parent Material.
- Corrected an issue with Material Instances on decals looking incorrect when using cook on the fly.
- Fixed a bug with CorrelatedColorTemperature in TonemapCommon.ush.
- Fixed writing Virtual Texture feedback in ThinTranslucency Materials by using a hard-coded stochastic alpha threshold.
- Fixed issues with texture streaming on very skewed textures (4x1024 and similar) and non-power of two textures with cinematic LOD levels.
- Fixed a rare crash when building Hierarchical Levels of Detail (HLOD) in a commandlet by removing shadermap access that can pose threading hazards.
- Fixed hitching while precompiling the Pipeline State Object (PSO) cache.
Nanite
New:
- Enable compilation and usage of tier1 Windows DX12 mesh shaders in Nanite if running under SM 6.6 w/ atomics.
- Implemented initial Nanite raster pipeline register/unregister/de-duplication, including launching each raster pipeline during Nanite rasterization if programmable raster is enabled. Also hooked up graph GetMaterialMask function to Nanite HW raster pixel shader stage.
- Implemented Nanite support for rendering complex collisions for the fallback meshes.
- Added Nanite CPU Material culling to avoid unnecessary CPU and GPU overhead from numerous empty raster and shading dispatches/draws (content and view dependent).
- Implemented basic HW triangle barycentric path for Nanite HW raster passes (NANITE_USE_HW_BARYCENTRICS). Some APIs and platforms can further improve this with special intrinsics.
- Packed PixelValue into PageInfo for a single uint2 no interpolation VS->PS param (so parameter cache performance is unchanged, since the cache perf is based on attribute count not element count), and also export PixelValue so depth only Nanite rasterization can use it if needed. The pixel shader behavior is unchanged though (PixelValue is only exported for 64b vbuffer).
- Added ability to cull Nanite Instanced Static Meshes at a distance from the camera.
- Refactored Nanite Material GBuffer passes to run off the render thread.
- A Nanite Material override setting was added to Materials and Material Instances. The main advantage for this as opposed to using the NaniteSwitch Material Expression is that references from override Materials are not cooked on non-Nanite platforms.
- Streaming data for Nanite can now be fetched asynchronously from the Derived Data Cache in the Editor.
- The Nanite streamer now runs the GPU transcode in asynchronous compute on platforms that support it.
- Added a Nanite MaterialCount debug visualization mode which can be enabled with the console variable 'r.Nanite.Visualize MaterialCount'.
- Made imposter building optional with the console variable 'r.Nanite.Builder.Imposters'. This setting is turned off by default.
- Implemented changes to improve disk size for smaller Nanite meshes.
- Improved Nanite partitioning heuristics to produce fewer expensive multi-Material clusters.
- The PreSkinnedPosition shader graph node now works with Nanite.
Improvement:
- Removed a massive number of Nanite rasterizer shader permutations across all platforms/shaderdbs, significantly improving iteration times for the editor and cooker, especially when these numbers get multiplied by the number of materials that utilize programmable features in addition to the default material "fixed function" path.
- CLUSTER_PER_PAGE has been fully removed (since we no longer ever run CLUSTER_PER_PAGE=0), which now makes it mutually inclusive with VIRTUAL_TEXTURE_TARGET * HAS_RASTER_BIN has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load
- ADD_CLUSTER_OFFSET has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load
- HAS_PREV_DRAW_DATA has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load
- NEAR_CLIP (only change to significantly affect codegen) has been turned into a dynamic branch based on FNaniteView - this lets us merge depth clip/clamp rasterizer calls in VSM together instead of relying on HAS_PREV_DRAW_DATA, and a future optimization can now be done to merge local and directional light full Nanite pipeline calls together.
- VISUALIZE permutation removed from VS/MS since it only loaded uniform values that passed down per-vertex into fragment stage as nointerpolation parameters. Pixel shader now constructs this uint2 directly under the VISUALIZE permutation
- NANITE_MESH_SHADER_INTERP removed by default but still left in the code, since it is a work in progress potential optimization for DX12 mesh shaders
- Removed explicit Lumen and VSM usage of NANITE_RENDER_FLAG_HAVE_PREV_DRAW_DATA (now the dynamic branch path is only taken if CullRasterizeMultiPass implicitly breaks the rasterization into multiple calls due to NANITE_MAX_VIEWS_PER_CULL_RASTERIZE_PASS overflow)
- Performance was tested on a 2080Ti in AncientGame, and the delta is effectively noise (tested cached and uncached VSM). Further testing on other platforms will occur, but it is important to get this change in for all the benefits and easy to tweak things later if needed.
- Added an optimization to Nanite rasterizer binning. Multiple triangle Material span indirections of a single cluster are now emitted, rather than a single cluster indirection where each rasterizer VS needs to re-calculate whether or not a triangle is contained in the active rasterizer bin.
- Implemented a significant optimization in certain heavy programmable raster scenes to use a fixed function path in Nanite if the only programmable feature is World Position Offset (WPO), but Evaluate WPO is false.
- Implemented a minor CPU optimization to deferred pipeline registration on the Nanite draw lists. This is experimental and work is ongoing.
- Converted Nanite Streaming buffers to support the Render Dependency Graph (RDG).
Optimization:
- Explicitly disable WPO evaluation on Landscape Nanite meshes.
- Merged Nanite HW rasterizer passes into a single RDG pass, and also SW rasterizer passes into a single RDG pass. All passes update various buffers with atomics, so they are now always marked with SkipBarrier to disable synchronization between passes and allow for overlap. VSM in AncientGame campfire went from 4.64ms -> 3.41ms, Primary raster went from 1.34ms -> 1.07ms. Lumen raster 0.20ms -> 0.18ms. Much higher gains expected in content with high numbers of rasterizer bins (more overhead to remove using this optimization) MedievalGame is even better: Primary raster 1.82ms -> 0.92ms, VSM 2.99ms -> 2.07ms, Lumen 0.43ms -> 0.19ms
- Optimized raster binning by merging separate HW and SW dispatches together, and also fixed the cluster thread group count so we don't spawn 64x useless thread groups. Tested on a 2080Ti with AncientGame campfire.
- Separate HW/SW dispatch vs. Merged HW/SW dispatch Primary 1.28ms -> 1.02ms Directional VSM 1.66ms -> 1.52ms Local VSM 2.21ms -> 1.96ms
- Merged HW/SW dispatch -> Fixed Cluster Counts Primary 1.02ms -> 1.01ms Directional VSM 1.52ms -> 1.43ms Local VSM 1.96ms -> 1.92ms
- Big rewrite/optimization of Nanite programmable raster pipeline registration with GPUScene on the CPU, added raster bin visualization plus duplicate define code cleanup, added initial WIP two sided material support (will optimize the math shortly), and fixed a number of programmable raster VSM related bugs.
Crash Fix:
- Fix a Nanite crash which occurred when enabling Shader Complexity Mode in a cooked build.
- Fixed a Nanite crash that would occur when setting the Preview Render Level to SM5 after successfully rendering SM6.
- Fixed a potential crash when Nanite Derived Data Cache requests fail during cooking.
- Added vertex sanitation code to the Nanite builder to fix a potential crash when the input mesh has bad floating point data.
- Fixed a Nanite streaming crash when all pages early out.
Bug Fix:
- Fixed a race condition which occurred when accessing the RasterMaterial or ShadingMaterial WeakObjectPtr on the render thread.
- Fixed incorrect calculations that occurred in Nanite micropoly rasterizer when two sided materials are used.
- Fixed Nanite AuditMaterials logic to correctly handle Material instances changing Blend Mode.
- Fixed issues with Nanite triangle culling on orthographic cameras.
- Fixed an issue where Nanite Geometry Collections could go missing when raytracing.
- Fixed a logic issue with Nanite instance culling where the "Visible In Scene Capture Only" flag would not work properly.
- Fixed an issue where Nanite Static Mesh settings would reset every time you re-import.
- Fixed an issue where cluster DAG cuts from the Nanite Trim feature were sometimes inconsistent between clusters and groups, which could potentially lead to encoder crashes.
- Added logic to the Nanite streamer to retry Derived Data Cache (DDC) streaming requests if they fail. Derived Data Cache warnings were improved to include resource names.
- Fixed an incorrect warning message for Nanite cluster buffer overflows.
Removed:
- Fully removed Nanite and Virtual Shadow Map SM5 vendor extension, lockbuffer hack, and DX11 support from UE5
Niagara
API Change:
- Previously, new renderers were added by UClass; now it's a manual process to register new renderers, which allows for more flexibility. See FNiagaraRendererCreationInfo for more details.
New:
- Niagara node pins can be moved multiple steps at once.
- Added a "loose type" mode to Niagara. Users can now treat position types as vector types.
- Added unit metadata to system and emitter properties. You can enter values in seconds by default, but if you enter units in a different value it will auto-convert them. For example, entering '500 ms' will convert to 0.5 seconds.
- Overview modes now have a simplified display when the view is zoomed out.
- Improved Niagara pin type colors.
- Changed the parameter types of transform nodes to more clearly differentiate vector and position types.
- Made the Niagara component a Blueprint type.
- Double-clicking on a script node now opens the selected version in the graph.
- Added custom validation rule support to Niagara. Users can refer to UNiagaraValidationRule and its subclasses for examples to write their own.
- The UI now shows convertible linked inputs for stack input bindings.
- Changed the default value of the property Only Create on Spawn in the Component Renderer. The default value was previously true, it is now false. Previously, particles only got a component from the Component Renderer when they spawned, but now they will get that component as soon as it becomes available. This resolves issues that users had with burst systems, particularly when used in conjunction with Sequencer. Old assets are not affected.
- Added file include support for CustomHlsl nodes.
- Added a message to the emitter and script graphs when downstream assets are affected.
- You can now specify version dependencies in modules.
- Improved the audio player:
- One-shot audio no longer loops.
- Persistent Audio Components are destroyed when particles die.
- Audio modules work in emitter and system scripts.
- Added a setting to zoom-fit system assets when opened.
- Added an option to collapse disabled Niagara modules.
- Niagara components that are not auto-activated now stay off when you change users parameters.
- Improved numerics resolution, and made type checking stricter for operation nodes.
- Made the compilation status more obvious in Niagara's viewport.
- Removed loose parameter bindings from main Niagara parameters.
- Data Interfaces should now opt in to the new binding path by setting UseLegacyShaderBindings to false.
- BindParameters, SetParameters, and UnsetParameters are now BuildShaderParameters and SetShaderParameters.
- CreateComputeParameters and GetComputeParametersTypeDesc are now CreateShaderStorage and GetShaderStorageType.
- Shader storage should no longer be required for the majority of cases. Only those which require data based on bound functions will need additional data, everything else should be statically set.
- Modified Niagara Compute Dispatch to use FRDGBuilder through the pipeline.
- Legacy data interfaces run on the Graph execution timeline. Some caveats now exist, for example peeking the current buffer on the MainDataSet will be wrong.
- Converted data interfaces run on the Graph build timeline, executing passes as required.
- Converted data interfaces have been updated to use new PreStage, PostStage, and PostSimulate functions.
- Various other parts of Niagara have been updated to allow operations on the Graph builder timeline, for example, readbacks, debug drawing, profiling, and more.
- Various global compute shaders have been updated to use shader parameter structs.
- Added support for spawning over 16k max secondary particles per frame in Niagara Fluids.
- SimCache functions now access data from Blueprints.
- Added methods to get the socket index from filtered and unfiltered sockets.
- Added Velocity to all functions to make it consistent.
- Added Interpolated methods for World Space functions.
- Added RGB and RGBA pins to dynamic parameter material nodes.
- We now show pin names and added RGBA to the Particle Color node.
- Removed a case that blocked SRV for uniform sampling.
- Reduced the size of the GPU triangle uniform sampling buffer from 16 bytes per triangle to 8 bytes.
- Added a custom element count binding for simulation stages.
- Added reset to default option to the camera in the Baker.
- Added camera bookmarks to the Baker.
- Added Attribute Capture Mode options to Niagara SimCache. This allows you to capture all, renderer only, or user-supplied attributes only into the cache.
- Created a Blueprint library for capturing Niagara SimCache data.
- We now support position types for material parameter bindings.
- We now detect if a data interface is being used with a CPU script or not.
- We now allow the static mesh data interface to access GPU resources if it's not used by a CPU script.
- SRVs will be available on the target platform.
- Support added for Cube, 2DArray, and Volume Sample data interfaces to select both the texture and render target types. SetTextureObject function can take either parameter now.
- Data interfaces can add renderer-only attributes for capturing. For example, if a data interface ran a process post cache read to update the state required to render the system, we may not cache it, since the sim cache will only store renderer-bound attributes.
- Emitter Properties data interfaces can access data that is not part of the data buffers.
- Added a method to the particle reader to understand local or world space.
- Static mesh data interface CPU access warnings no longer include socket sampling.
- Added validation rules to simulation stage budgeting.
- There is now an option to reset Niagara and Cascade when crossing too many large world coordinate tiles, since this will result in rendering artifacts.
- Added constant material parameter bindings for renderers.
- We now track registered components on the Debug HUD, and optionally show their information.
- Converted the Collision data interface to Render Graph.
- Converted the Physics data interface to Render Graph and shader parameters.
- Added SubUV to the renderer information. This removes the GPU data deduplication, but this should be done via data interface deduplication and is not robust when using pointers.
- Added Sprite Renderer Info data interface for reading information from a sprite renderer inside a script.
- Converted Audio data interfaces to use shader parameter structs.
- Landscape data interface uses the shader template and shader parameters.
- Cross level references now use TSoftObjectPtr instead of TObjectPtr.
- Physics Field Update now uses Template, Shader Parameter, and Render Graph.
- Added a project setting for sort precision. Renderers can now override this project setting.
- Converted Niagara Debug Drawing to Render Graph.
- Converted the EmitterProperties, ActorComponent, and SimpleCounter data interfaces to shader parameters.
- Converted RasterizationGrid to shader parameters and Render Graph.
- Converted GeometryCollection and ChaosDestruction data interfaces to Render Graph.
- Updated the NiagaraVariant when calling array set functions.
- Converted StaticMesh data interface to shader parameters and Render Graph.
- Exposed occluded line drawing color scale and set defaults to 5%.
- Added Matrix User Parameters Setters. This truncates to FMatrix44f so will loosen precision for large world coordinates.
- Separated expanding bounds between dynamic and static. Added an option to snap bounds to units, to reduce update transform frequency as they grow. When no static bounds or dynamic bounds are present, we do not return the static bounds.
- Converted the Grid2D data interface to use template and parameter structure binding. All read-write data interfaces now use correct formatting for shader parameters.
- Converted example mouse data interface to parameter bindings.
- Converted RenderTarget data interface to use template and parameter structure binding.
- Curve data interface now uses template and parameter structure binding.
- Converted GBuffer data interface to use template and parameter structure binding
- Converted Spline data interface to shader parameters. Object Reader conversion and Neighbor Grid 3D conversion now use shader structures.
-
- Converted MeshRendererInfo, VectorField, CurlNoise, Camera, and Occlusion data interfaces to shader parameters.
- Rigid Mesh Collision data interface converted to Render Graph.
- Converted Export data interface to use template and parameter structure binding.
- Moved constant buffers into loose parameters, with the exception of the external cbuffer. Parameter binding is now enabled when possible, for example when there are no legacy data interfaces, external cbuffers, or view uniform buffers.
- Initial pass for Niagara Simulation Cache. Currently a full restart cache per frame is generated. It only contains system simulation and particle data set information. This is still highly experimental, while it works in cooked and uncooked we fully expect the data formats will change.
- Added support for shared static float buffers that data interfaces can push data into.
- Added NiagaraDebugHud console command to quickly enable or disable the HUD.
- Added a Blueprint method to modify filtered sockets and bones for skeletal mesh sampling.
- We now flush Niagara pending ticks in batches if we inject a large amount in a single frame. Render Graph has a limit on the number of passes that can execute. We avoid surpassing this limit, for example, by skipping forward in the Sequencer timeline.
- Added support for returning the bone scale on a skeletal mesh data interface.
- Converted Hair to Render Graph.
- Converted Texture data interfaces to use template and parameter structure bindings.
- Added a method for data interfaces to draw to the Debug HUD. Debug HUD is now wrapped with WITH_NIAGARA_DEBUGGER to make sure it's compiled out.
- Fixed an RHI resource leak by calling release on uniform buffer before memstack wipes memory.
- Updated the Array data interface to shader parameters.
- Converted the Async GPU Trace data interface to shader parameters and Render Graph.
- Added an experimental VirtualTexture data interface.
- Converted the Skeletal Mesh data interface to Render Graph and shader parameters.
- Added support for pulling a bind pose vertex or triangle.
- Added overrides for translucent sort priority and offset.
- Updated the Graph node Add menu logic. Loaded enums no longer show up in the make/break list unless the library only flag is off.
- Improved the UX for the Device Tree and CVar Conditions
- Cleaned up Niagara Device Tree. Device profiles have a new value called bIsVisibleForAsssets that lets you indicate which device profiles should be visible in other assets.
- Improved tooltips and coloring on the Device Tree to better show what is enabled or disabled and why.
- Added tooltips for CVar conditions to text entry and suggestion boxes showing the CVar help text.
- Platforms now specify a min and max Niagara Quality Level they support, which reduces need for trawling .ini files and allows fragments to set the quality level.
- CVar Conditions now have more control over what occurs when the condition is passed or failed. Previously they could only disable the set when the condition failed, which is now the default.
- New renderers added to emitters have a default asset assigned (for example a material or a mesh).
- Multiple tweaks and additions for making scalability smarter with regards to culling important player FX.
- New master mode for scalability culling allowing us to pause all culling. Useful for special cases such as a front end.
- Added ability to reset FXBudget on mode transitions.
- Tidied up library spawn functions with an initialization struct version.
- NiagaraComponents can now be told that they are a player effect explicitly.
- Physics Asset is replaced by Rigid Mesh Collision data interface for skeletal and static mesh collisions. All Niagara Fluids templates have been updated.
- Niagara scalability can now globally be paused or disabled via the console command fx.Niagara.ScalabililityCullingMode.
- Added a function to get spline length.
- Implemented cubic interpolation for 3D gas simulations (velocity and scalar advection). This gives a large increase in quality.
- Removed "Common" section from the Parameters panel in the Niagara Editor.
- Event spawn scripts can now modify the initial values for particle attributes, so modules dependent on this can function correctly when spawning from events. An example of how this could be used is the ScaleColor module. This is optional per event handler, but defaults to enabled. Existing content has this disabled to maintain existing behavior.
- Streak source particles for fluid simulations to avoid artifacts.
- Added Get Velocity to the Actor data interface.
- GPU scripts now log their errors in the Niagara log in a more reliable way.
- You can now bind the attached component or a local player using Add Source Mode.
- Small scale force to break up mushroom shapes on 3D gas simulations.
- Added an option on 3D Flip simulations to add more particles near the surface of the sim for more detail and smoother surfaces.
- Renderers now have default assets assigned to them, and new renderers can be registered via the Niagara Editor Module.
- Selecting from the Parameters panel will highlight active usages in the stack overview.
- Added an Effects section to the Niagara Component. Also added a category with Debug and Reset buttons. You can now summon the Niagara Debugger to view given variables, emitter, system, component, and more in context in the Niagara Editor.
- Improvements to Niagara's scalability visibility culling options. This inlcudes custom view frustum checks that allow some visibility culling that is not based on the results of rendering code. As such, this can be used for pre-culling.
- The Niagara Outliner can now pull data from a running instance of the game for a specific Niagara System into a Niagara SimCache for analysis and debugging.
- Fluid bounds are programmable and set via the setup of the simulation.
- Generalized the UvMapping feature so that it can be shared by both static and skeletal meshes. It now takes a different approach when specifying the uv index for the static mesh via a system script level VM function.
- Stripped data from NiagaraSystems when AV data is not required (server builds).
- Added a new function called vector field (LoadSample) to grab raw values by index rather than interpolated values.
- Added mesh streaming reporting to Niagara and Cascade primitive component to ensure renderable meshes are being adequately streamed in. It now reports a scaled instance at the origin of the component. It does not take into account dynamic mesh scale.
- When saving from the NiagaraSystemToolkit we now save the version not in edit mode. This prevents recompilation when someone references the system (for example in a level or a cook).
- Added turbulence and small scale field to Niagara Fluids. The new small scale turbulence can be used to add edge breakup on simulations. It works by incorporating a random vector at each cell, ranged by the density value inside the simulation.
- Added a bounds calculator for Niagara Light Renderers.
- Disabled dependency on the HairStrands plugin for Niagara Fluids. Old assets may now fail to run properly without manually enabling the HairStrands plugin for access to the NiagaraDataInterfacePhysicsAsset class. Newer assets are no longer dependent on this plugin, and in the future the class itself will be migrated to the Niagara plugin.
- Improvements to the Rigid Body data interface:
- Debug rendering now shows the actors providing rigid bodies.
- Added an emitter-based script for selecting actors using physics queries.
- Made improvements to memory and runtime performance.
Improvement:
- Optimizations for cooking in Niagara.
- Updated the UI to handle cache changing while the UI is open, and to use the new API to read the data.
- Made changes to the Static Mesh data Interface API for consistency.
- We no longer add to GPUDataInterfaces if the data interface is not used by a GPU emitter. This improves the performance and reduces the memory of generating GPU ticks in some situations.
- Cleaned up the copy and paste behaviors for Niagara Overview Graphs.
- Copying from emitters is now no longer supported. The intended behavior here isn't well defined, so users are directed to the more supported path of using the add emitter option from the context menu.
- Creating comments is no longer supported in emitter graphs. The overview is transient so any comments would not persist.
- Migrated NiagaraDataInterfacePhysicsAssets to NiagaraPlugin. Implementing an interface on GroomComponent produces consistent behavior.
- Added a stack warning for emitters which exclusively use emitter-sourced objects and are using dynamic bounds.
Crash Fix:
- Fixed a crash when using undo after adding a renderer.
- Prevented a crash in the editor when a struct with an unsupported type member was used in a module script.
- Fixed a crash when playing audio from a particle system on a platform that had audio disabled.
- Fix a crash when an event spawn info had no space left.
- Fixed a crash when using fx.SuppressNiagaraSystems 1 with NiagaraDataInterfaceArrayFunctionLibrary.
Bug Fix:
- Fixed a bug where user parameters that are linked to position types were only partially converted to positions.
- Fixed a few bugs with the search bar in the generated code view.
- Fixed an issue when duplicating a module would also duplicate all the script variable guids.
- Fixed a bug when position bindings couldn't see position variables.
- Prevented Niagara compilations from stacking, now you can have at most one pending compile request.
- Fixed a bug that prevented playing audio from Niagara in cooked builds.
- Fixed a bug when the array index changed, but was not picked up correctly in the Geometry Cache Renderer.
- Fixed an issue when user parameters that were bound to renderer position bindings were not updated to position types.
- Fixed a bug where pooled effects attached to Actors in hidden sublevels were not hidden properly.
- Fixed a memory leak when several script source copies were left in the root set after compiling a Niagara system.
- Fixed properties not showing for CustomHlsl nodes when the first input was a data interface.
- Fixed a bug when types for user parameters were not considered across emitters.
- Fixed an issue when Niagara systems without auto-activation would reinitialize after a compile request.
- Fixed a bug when setting bOwnerNoSee on Niagara components wasn't hiding the Component if one of the emitters used a Light Renderer.
- Fixed issues with memory image names. We now:
- Write to the MemoryImageNames array,
- Copy the contents of TArrayView rather than the layout of the view object itself, and
- Handle the name layout during patch application on foreign platforms.
- On the Actor's EndPlay, we now release references to the source Actor and Component from NiagaraDataInterfaceSkeletalMesh.
- Fixed GPU executing particle update script on spawn when interpolated spawning is disabled.
- Fixed an issue when holding onto task references longer than necessary.
- Fixed Mesh Renderer dynamic parameter constant bindings not working.
- Fixed a potential issue that could cause a crash in an edge case for Cascade's activation code.
- Fixed an issue with bool select nodes on the GPU where data is passed from the experimental virtual machine (VM).
- When fixed delta tick is enabled, we now force solo mode.
- Changed GPU initialize LODResource to TRefCountPtr to avoid stream out.
- Fixed an issue that could cause some errors from correctly showing up in the editor for GPU simulations.
- Fixed an issue when ray tracing was using PreViewTranslation for GPU instances. This also resolved missing large world coordinate support for Niagara and ray tracing.
- Fixed a bug with the Niagara Platform Set CVar text entry box.
- Resolved a memory stomp on loading UNiagaraGraph.
- Fixed emitter mode visibility tag and mesh index not working on Mesh Renderers.
- Fixed when a previous external cbuffer was using the current data. When not calling PostTick on GPU Context, we didn't push the data from current to previous.
- Fixed an issue when GPU scene mesh path was dangling into a potentially reallocated buffer.
- Fixed an incorrect LOD calculation in GetFirstValidLODIdx.
- Fixed issues with default quality levels for uninitialized device profiles that could cause incorrect scalability behavior.
- Fixed the Niagara Editor preview not resetting correctly when changing the Scalability Mode preview settings.
- Fixed an issue that would prevent local player FX reactivating after being scalability culled in some cases.
- Fixed an issue causing some Niagara user parameters set from Blueprints to be reset when a system was reactivated.
- All the renderer material bindings now show up in GetBoundAttributes. Prior to this change, there could be subtle differences in the data being preserved in cooked and uncooked.
- Modified the warmup delta time, it now affects the tick count and time properties. Added stack warnings on systems and emitters if the emitter maximum delta time is smaller than the system's warmup delta time.
- Fixed issue in the Scalability Manager that could cause no updates to occur in some cases.
- Fixed an issue with a duplicate user parameter of type position or vector being created when a variable with the same name but opposite type already existed.
- Static variables were depending on pin persistent GUIDs for caching. This is insufficient as some pins are zeroed out for persistent GUIDs. Picking the pin offset and parent guid in that case.
- Fixed an issue when some InstanceOverrideParameter data interfaces were being used before being post-loaded, and so missing some required post-load fixup.
- Fixed a bug that would cause the tick function for Niagara solo components to be left running even when the systems were inactive.
- Now detecting if a function signature actually changes when upgrading a data interface function call. This was causing an unnecessary reallocation of pins when doing a static duplicate.
- StackFunctionInput cache now correctly populates the data source.
- Fixed type checking of visited parameters when evaluating Fail If Not Set errors, as we may have intentional type mismatches for large world coordinate types.
- We now prevent caching shaders for scripts that are not associated with a system. This prevents the compilation of standalone scripts and scripts from standalone emitters.
- Made CullProxy on NiagaraComponent transient, so that we don't try to save any references to the dynamically created proxy component.
- Initialized UNiagaraScriptVariables added to graphs with default mode Value when the variable is in the module namespace.
- Apply SystemLWCTile to track the large world coordinate tile when evaluating Mesh signed distance fields (SDFs) in Niagara.
- Fixed an issue where BoundAttributes in NiagaraComponentRendererProperties were getting trimmed.
- We now handle TypeDefinitions with transient structs during serialization. If a small world coordinate struct is available, we use the mapping of this struct during the session to serialize out the large world coordinate version.
- Fixed an issue when systems that shared the same name (but different paths) would overwrite results when dumping byte code.
- Cleanup natvis for niagara types
- Types have been moved into their own niagara.natvis file.
- We can then resolve FNiagaraTypeDefinitionHandle through global pointers so that FNiagaraVariable can now be properly visualized.
- Incorporated the type into the ordering of the attributes. This resolves an issue that resulted in multiple attributes with the same name, but compatible types (float and position).
- Fixed two issues with attribute trimming Niagara particle scripts:
- Parameters to an impure function that were using the StackContext namespace weren't being properly included in the dependency chain.
- Custom HLSL nodes which internally used impure data interface functions wouldn't necessarily have their inputs marked as dependents (in the case where a dummy output variable was being used, which itself got trimmed).
- Stale and garbage-collected actor components can no longer be accessed when using the ActorComponent data interface.
- Fixed the FindQuatBetween script to handle the case where one (or both) of the input vectors are 0 length (an identity quat will be returned).
- Made sure we only enable bAreaWeighting if the option is selected and the underlying data is present. If you have modified the mesh, but it hasn't actually applied the change, it now behaves as expected.
- Fixed Niagara VM bytecode generation for if blocks when a variable was assigned and then used within the same block.
- Fixed VM bytecode generation which was failing in a very small number of cases of the form:
- A = GetFirstValue;
- B = A;
- A = GetSecondValue;
- C = A; This would get GetSecondValue assigned to C instead of GetFirstValue.
- Added an SSA pass to help reduce overwriting registers. This added logic removes self assignments, and adds logic to stop propagating when values are dirtied. From a sampling of scripts, about 2% are changed (where 1-3 unnecessary ops have been deleted).
- Niagara shaders now respect r.DumpShaderDebugWorkerCommandLine as expected.
- Implemented fixes for experimental compressed particle systems.
- Only particle systems will have their attributes compressed.
- Previous versions of our deny list will also be denied compression (we don't want to be comparing half Particles.Previous.Position with float Particles.Position).
- Fixed stride being supplied to VF shaders.
- Added a work around for an issue when Niagara GPU scripts for the editor platform would have compile requests that were never properly handled, including being put into DDC. This happened when compile requests were dirty on load.
- Made sure that DataInterface curves are consistent with respect to UpdateTimeRanges and BuildLUT for WITH_EDITORONLY_DATA.
- Fixed a bug where the Niagara stack did not reflect the compile status correctly, and only updated error symbols after clicking on it.
- Transient systems created during script merging are now reset.
Path Tracer
New:
- Added initial support for rendering water in the Path Tracer.
- Exposed a missing path tracing show flag in scene captures.
Postprocessing
New:
- Added support for a Screen Space Reflection input pass to scene view extensions, which mirrors the post-process Material blend location.
- Extended Luminance Range is enabled for new projects by default.
Improvement:
- Improved pixel shader animation and translucencies no longer ghost as much as in UE5.
- Local exposure is now applied when calculating bloom.
Crash Fix:
- Prevent crashes with post process materials when one of them is not a Material Instance and it tries to blend the parameters. The easiest fix is just to skip blending the materials together. The blending functions below only work on instances, so skip blending if we are just a material interface. This can happen in two scenarios: 1) A wrong material type is assigned into the post process material array, and 2) the same material is placed in twice. The MID lookup code above won't create two separate MIDs for the same material, resulting in this code trying to blend a MID with a Material Interface.
Bug Fix:
- Fixed an issue with PlanckianIsothermal in TonemapCommon.ush
RHI
New:
- Added parallel setup for Render Dependency Graph (RDG) passes, and offloaded RDG buffer uploads and uniform buffer creations off the render thread.
- Changed the minimum driver version for Nanite on Vulkan, and also added a check for Linux.
- On the Vulkan RHI, added an option to change pipeline queries to BOTTOM_OF_PIPE. This gives more precise measures for a single span, but might alter overall frame time on some platforms. TOP_OF_PIPE remains the default.
- A draw texture utility was added to RenderGraphUtils, which is used for copying with format conversions.
- Implemented support for parallel buffer creation and lock/unlock.
- All platforms now use the same Vulkan SKD flow for compilation to ensure that the engine is always built with the provided version at a minimum. A local SDK is only preferred if it is newer.
- Local uniform buffers were deprecated, as RHICreateUniformBuffer now works on any thread.
- On Vulkan, DriverDenyList entries were split per operating system, as driver numbering is different on each OS.
- DriverDenyList support was added to Linux.
- Added DriverDenyList entries for Vulkan on Windows and Linux.
- Added Render Graph (RDG) versions of UnifiedBuffer utilities.
- For Vulkan, fixed all cases of single scalar in shader parameter arrays to respect 16 byte alignment.
- Added static_assert to prevent the creation of new asserts moving forward. Used SHADER_PARAMETER_SCALAR_ARRAY/GET_SCALAR_ARRAY_ELEMENT for single parameters, or packed them with surrounding parameters when possible.
- Added "ultimate" version of AddClearRenderTargetPass that lets the user clear multiple mips, multiple array slices, with / without a custom clear color or viewport and does so by using a clear action if possible. Note that the existing versions have not been deprecated since they are more straightforward (they clear only a single mip/slice).
- In Vulkan, use vk_enum_string_helper to print enum names in debug messages.
- Implemented support for fused CopySrc | CopyDest transitions for Vulkan in RDG.
- In Vulkan, we set the initial state of GParticleCurveTexture to SRVMask since it might get bound before it is filled for the first time. This fixes a validation error.
- Added support for RHI validation breadcrumb logging with transition validation errors.
- Added parallel UpdateUniformBuffer support by taking a command list.
- Made RHICreateUniformBuffer thread safe.
- Added bindless resource support as a requirement for ray tracing on PC (SM 6.6 + Resource Binding Tier 3). Compile DXR shaders using the same profile when targeting PCD3D_SM5 and PCD3D_SM6 (for example,. lib_6_6 or lib_6_5 based on USE_SHADER_MODEL_6_6 define).
- Ensure that BC6+7 textures have good mappings on all platforms and RHIs, including ES3.1 RHI for performance mode. BC6+7 should now be useful in multi-platform games.
- Only set the D3D12 residency priority for acceleration structure resources on pool creation, rather than on individual BLAS creation. Saves significant CPU time when creating transient (short-lived) acceleration structures.
- Use D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_IN / OUT instead of just IN for GPU bread crumbs. This is more accurate when there are multiple GPU commands back-to-back without barriers. However it may be slightly more expensive when many breadcrumbs are inserted. This also fixes MaxParameterCount in FD3D12CommandContext::WriteGPUEventStackToBreadCrumbData and slightly refactors FD3D12CommandListManager::FDiagnosticBuffer.
- Reduced redundant D3D12 PSOs by ignoring vertex stream strides when computing the PSO cache key. D3D12_INPUT_LAYOUT_DESC part of D3D12 graphics PSO descriptor only includes the format, slot/semantic index, and so on. The stride is set at draw time using ID3D12GraphicsCommandList::IASetVertexBuffers. This saves a small percentage of total created low-level PSOs.
- Added the r.RayTracing.EnableInEditor and r.RayTracing.EnableInGame console variables to control whether ray tracing effects should be enabled by default in the editor and in game (if corresponding game user setting does not exist).
- Added support for creating raw buffer SRVs for any buffer in D3D12. In some RHIs, a raw buffer view can only be created if the buffer itself was originally created with a corresponding flag. However, modern RHIs such as D3D12 allow creating raw views for any buffer. This change adds FRawBufferShaderResourceViewInitializer to create raw views of buffers when GRHISupportsRawViewsForAnyBuffer is true.
- Added Raster Ordered View (ROV) type support for shader binding.
- Skip redundant calls to ID3D12Device5::SetResidencyPriority, which are extremely expensive The current priority can be stored in the D3D12 resource private data and redundant priority setting can be skipped. This is important for buffer allocations coming from CreateRayTracingBuffer.
- Added the r.RayTracing.RequireSM6 console variable which can be used to only compile ray tracing shaders when targeting the SM6 D3D12 shader format.
- Added Shader Model 6 warning dialogs, so that if a static mesh is detected to use Nanite, or a project is configured to use Virtual Shadow Maps and SM6 is not enabled in the project settings, a warning shows that SM6 needs to be enabled. Both cases only warn if the project was already configured to use a D3D platform.
- Added an option for enabling Nanite in Project Settings.
- Adding initial experimental D3D12 bindless support.
- Added public interfaces and data for initial experimental bindless support.
- Reworking shader platform settings on Windows to be per-RHI. This removes the -fated "min/max feature level" configs that can cause confusion. On Windows, "TargetedRHIs" is now split into "D3D11TargetedShaderFormats", "D3D12TargetedShaderFormats" and "VulkanTargetedShaderFormats". "TargetedRHIs" is still parsed for backwards compatibility. Using this, projects can now be more easily configured for D3D12-only or even Vulkan-only.
- Updated FShaderFormatsPropertyDetails to use FName instead of FString for shader platforms. Also added a filtering method for mixed RHI platforms like Windows.
- Reflection data is now included with SM6 embedded PDBs.
- Added initial GetResourceFromHeap and GetSamplerFromHeap support.
- Added TexCreate_Shared to FD3D11Texture3D.
- Added a minimal interface to OpenGLDrv.
- Added ERHIInterfaceType so the public RHIs can identify themselves.
- Added templated GetDynamicRHI to avoid accidental Validation DynamicRHI casts.
- Added depth clip control to the rasterizer state.
- Added VRS D3D12RHI updates for defer ShadingRateImage binding to State Cache. Previously, we would bind the shading rate image plus related combiners as part of SetRenderTargetsAndClear. Instead, VRS images can now use the state cache infrastructure to reduce binding overhead.
- Added "Supports Ray Tracing" to platform properties. This is checked in addition to the project/platform settings for RayTracing but is opt-in per platform instead of always enabled if the setting is enabled. This has the effect of reducing the number of platforms that say they support RayTracing which directly reduces the number of shader platforms that "support" RayTracing.
- Added D3D12 Mesh shader support for ID3D12Device8, ID3D12Device9, and ID3D12Device10.
- Created FShaderParameterMap::FindParameterAllocation method that returns the parameter struct instead of using reference parameters.
- Implemented a change to migrate back to using UniformBuffer structs since the cbuffer uses the same name as the struct, we have to rename the cbuffer using a consistent prefix. The reflection handling also needs to reinterpret the renamed cbuffer as the correct UniformBuffer.
- Added the ability to create a per-platform public interface for D3D12RHI.
- Added Create functions to FRDGTextureDesc, which now derives from FRHITextureDesc instead of being an alias.
Improvement:
- Added log messages for when D3D12CreateDevice fails.
- FCubemapTexturePropertiesPS permutations have been modernized.
- Changed WindowsTargetSettingsDetails to use shared functions to describe shader platforms.
- Renderer dependency cleaned up by removing RenderGraph.h from SceneRenderTargetParameters.h.
- Updated Agility SDK to 1.602.0
- Refactored D3D12 descriptor management to go through a central manager.
- Restored functionality to r.ShaderCompiler.EmitWarningsOnLoad.
- Added more DXGISwapChain and DXGIFactory coverage in D3D12 and cleaned up adapter/swapchain code with available types.
- D3D12RHI QuantizeBoundShaderState implementations now return the struct instead of taking it as an argument.
- Moved ShaderParameterParser into its own source files.
- Moved the bulk of SetShaderParameters to ShaderParameterStruct.cpp.
- Shader reflection handling has been reorganized to funnel through common functions.
- Moved D3D12RHI::ExecuteCodeWithCopyCommandQueueUsage into ID3D12DynamicRHI::RHIExecuteOnCopyCommandQueue.
- Cleaned up the DXGI includes in D3D121RHI.
- D3D12 descriptor heap size checks have been extended to allow for proper binding tier 3 support.
- Moved Vulkan and OpenGL implementations of ApplyStaticUniformBuffers out of headers to remove header dependency on RHICore.
- Reworked the parameter rewrite code to support automatic bindless conversion.
- The Max RHIFeatureLevel is now output to the log on D3D12RHI creation.
- Cleaned up D3D12 SRV and UAV implementations. Primarily renaming the "Initialize" methods to be more verbose about when they're called in relation to when the view is created. This allows us to identify when a CreateView call is for a newly-allocated descriptor or one that's been around for a while. Stubs added for deferred updates to bindless descriptors, not implemented yet. Unified a few RHI commands in RHICreateShaderResourceView to use a single command. Removed FD3D12ShaderResourceViewWithLocation and FD3D12UnorderedAccessViewWithLocation since they're no longer used.
- Renamed the ShaderPrint uniform buffer to ShaderPrintData so it no longer collides with ShaderPrint() functions.
- Switched ERHIFeatureLevel:SM6 from SM6.5 to SM6.6 in order to use the built-in 64-bit atomics.
- Added TypedUAVLoad support checking for D3D12.
- Added bNeedsExtraShaderFormats to TargetRules to protect hidden platforms from exposing their DataDrivenPlatformInfo defines to other hidden platforms.
- D3D12 Mesh shader support will now be checked with all other CheckFeatureSupport calls.
- Mesh shader support is now validated before creating D3D12 Mesh and Amplification shaders.
- SetShaderParameters implementations have been cleaned up using a new helper class that loads parameters from passed in binary blobs.
- DXGI includes have been cleaned up in D3D11RHI.
- D3D12 Root Signature creation is now unified under a common path.
- Updated Intel ExtensionsFramework version and added Intel Runtime support for atomic 64.
- Added proper lifetime management to resources used by FRHICommandD3D12UpdateUniformBuffer
- Updated the check for aliased textures in FD3D12TextureStats.
- Launching a game that isn't cooked with any shader formats for the selected RHI now shows an error dialog before fatally quitting.
- Added GRHISupportsLargerVariableRateShadingSizes to control support of 2x4/4x2/4x4 tile sizes. On D3D12, this maps to D3D12_FEATURE_DATA_D3D12_OPTIONS6::AdditionalShadingRatesSupported.
- FRHITextureCreateDesc can now be constructed functionally via reference-returning Set functions.
Crash Fix:
- Fixed a crash with Landscapes when using -rhivalidation. This fix ensures that the RHIBuffer is held for the life of the frame, as not all RHI backends have the Shader Resource View (SRV) to maintain a hard reference to the source buffer.
- Implemented changes to avoid using the "groupshared bool" on Vulkan, as it has issues on some NVIDIA drivers. This fixes a crash in Vulkan engine tests (and playback of D3D12 captures in RenderDoc).
- Fixed crashes that occurred when rendering offscreen in D3D12.
Bug Fix:
- Fixed an assert when booting the QAGame Editor. Needed to use EnumHasAllFlags instead of EnumHasAnyFlags when testing BUF_RayTracingScratch, because it's a compound flag.
- Fixed a bug with DriverDenyList support for Vulkan where no driver date was invalidating entries.
- Fixed an issue with ProfileGPU scoping error in D3D12 where it erroneously included async compute scopes in the device GPU profiler stack.
- In Vulkan, fixed a validation error where a view was created beyond its number of slices when the first slice index was offset.
- Applied a fix for double signal of GPU fence in DX12 when performing All -> Graphics transition.
- In Vulkan, allow MOBILE_EMULATION to be defined in VULKAN_PROFILE shaders. This fixes the gizmo not appearing when using Vulkan for Android emulation (alpha channel was not being set correctly for composite pass).
- In Vulkan, when a slice is specified, create the view for only that slice or layouts will be altered by the render pass for other slices. Fixes bad layouts in Vulkan Mobile Preview.
- Fixed a validation issue (in CitySample) with 2D copies using 0 as a Z component. This was resolved by adding DebugName to validation layer messages.
- Fixed Anisotropy EngineTests on Vulkan.
- Fixed a bug in CheckAllWritten() on Vulkan, and enabled it for graphic pipelines.
- Fixed Render Dependency Graph culling behavior differences between Clang and Microsoft Visual C++ (MSVC) due to static initialization of shader parameter metadata.
- Resolved a bug with texture 2D array resource creation.
- Unified the DataDrivePlatformInfo for VULKAN_SM5 in a common VulkanPC fake platform to prevent settings on different platforms from overwriting one another. Previously they would all fill the same VULKAN_SMS in the FGenericDataDrivenShaderPlatformInfo::Infos array.
- Fixed validation errors for unfreed resources which caused a loop on shutdown for as long as there were new entries to delete.
- Added RHICopyTexture unit tests and fixed inconsistencies and bugs in that code.
- Fixed validation errors on Vulkan where 2D default textures were used for Texture3D parameters.
- Added BlackArrayDummy to system textures (single black pixel slice-texture array) because Metal requires texture arrays to be bound to texture array parameters.
- Implemented changes to prevent collisions in the CurrentlyDeleting assert between an RHIThread running FRHIResource::FlushPendingDeletes and workers creating PSOs.
- Fixed an issue with D3D12 validation errors encountered on the ray tracing indirect buffer. This was solved by duplicating relevant logic from GetResourceDescAndAlignment() into the ray tracing indirect buffer creation path so that D3D12RHI_RESOURCE_FLAG_ALLOW_INDIRECT_BUFFER is included for indirect buffers.
- Fixed an issue with the SRV array slice not referencing the correct subresource in the Render Dependency Graph.
- Fixed an issue where dxgi.dll was being freed before it was used.
- Fixed an issue where view states were being set to the wrong FeatureLevel due to ULocalPlayer::PostInitProperties() creating view states before the UWorld was initialized.
- RHI-specific arguments are now passed to launched processes as expected.
- Implemented a workaround fix for the O0 crash in DXC when compiling FPathTracingRG.
- Fixed issues involving RemoveUniformBuffersFromSource implicitly calling TransformStringIntoCharacterArray.
- Fixed the missing VRS image state for XSX.
- The Windows Feature Level checkboxes should now prompt the user to restart.
- Addressed issues caused by improper handling of multi-plane texture formats.
- Launching the Editor without selecting feature levels will now fall back to default feature levels as expected.
- Fixed an issue where shader cooker stats would show incorrect shader format names.
- Fixed instances where FRHITexture*Desc types were being used incorrectly instead of FRDGTextureDesc types.
Deprecated:
- Deprecated CopyToResolveTarget method.
- Deprecate D3D12RHI::ExecuteCodeWithCopyCommandQueueUsage.
- Deprecated RHICreateTexture2DArray, RHICreateTexture3D, RHICreateTextureCube, and RHICreateTextureCubeArray.
- Deprecated RHI*CommandList::SetComputeShader and switching to the PSO cache's SetComputePipelineState to move towards ComputerPipelineState as the default binding method.
- Deprecated all of the Create functions in FRHITextureDesc.
Removed:
- Removing the majority of D3D12RHI_API uses.
- Removed the "equality comparison with extraneous parentheses" warning from DXC compiles.
- Removed the Experimental label from PCD3D_SM6.
- Removed more uses of GMaxRHIFeatureLevel. Focus started on GenerateMips and AddClearUAVPass.
- Removed deprecated RHI functions.
- Removed private RHI header includes.
- Removed unnecessary dependencies on RHICore and RHI ThirdParty libraries.
- Removed deprecated EShaderPlatform entries.
- Removed the long-form create functions and constructors from FRHITextureCreateDesc in favor of the shorter versions.
UnrealLightmass
New:
- Implemented 'Lightmass Replace' material expression to work with GPU Lightmass This allows static lighting to be baked with a simpler material, or to tweak the color of indirect lighting through the material graph.
Simulation
Physics
API Change:
- Exposed proximity tolerance as a parameter.
- Chaos Immediate Physics which is used by Rigid Body Animation Nodes (RBAN) now creates a straight capsule body when a tapered capsule is requested in ChaosInterface::CreateGeometry. Previously tapered capsules defined in physics assets were just ignored. The new capsule will have a radius equal to the mean of the requested tapered capsule's radii.
- Removed the console variable
p.ChaosCloth.Solver.UseImprovedTimeStepSmoothing
since there is no more solver dedicated code for the time step smoothing. A new console variablep.ChaosCloth.UseTimeStepSmoothing
, which defaults to 1, has also been added to completely disable time step smoothing if ever desired.
New:
- Added timestep post-processing in PBD evolution.
- Added PoissonSolve function.
- Add a 'skip fraction' to the custom Voronoi fracture tool, to remove a percentage of the 'live' sites.
- Reduced the size of UPhysicsConstraintTemplate to 1008, so it fits in a smaller FMallocBinned2 pool.
- Added a normals baking option to Fracture's AutoUV tool.
- Added a grid distribution option for fracture mesh cut.
- Added a 'custom' fracture pattern tool to support more user control of Voronoi fractures.
- For optimization, RBAN memory usage has been reduced.
- For Cloth, the Delete Cloth Asset button's tooltip has been updated.
- Reduced memory footprint for triangle mesh implicit object when using LWC.
- Added the missing Local Damping Coefficient in the SetDamping Blueprint function for Choas Cloth.
- Added a menu option for the grab/poke interaction distance in the Physics Asset Tool.
- Unregistered the cloth tick function whenever the owner Skeletal Mesh Component tick is disabled.
- Changed the Physics Asset Tool simulate key to Alt + I.
- Added an asset exporter abstract interface, and made it appear from the right click menu of the Clothing window whenever a corresponding modular feature is added.
- Exposed per-axis constraint drive strengths etc on ConstraintInstance.
- Updated Rigid Body Animation Nodes (RBAN) tonow optionally add kinematic objects at runtime to represent any Cloth Colliders defined in a parent skeleton. This can be used to improve the behavior of RBAN alternatives to cloth simulation (often used at lower LODs).
- Added a Checkbox called Use External Cloth Collision on the RBAN node preferences panel to enable the kinematic objects feature.
- Optimized the generation of geometry collections connection graphs has been.
- Made the fracture mode interactive selection tool's "keep fraction" option attempt to space out the bones it keeps, rather than choosing completely at random. Gave user control of the random seed.
- Added leaf and cluster selection tools to Fracture Mode
- Improved the Children selection tool in Fracture Mode to not deselect nodes with no children.
- Added project-default convex generation settings to Fracture Mode's project settings.
- *Updated the Convex tool to include buttons to save and load convex generation settings.
- We now apply project-default convex generation settings to all new or reset geometry collections.
- Added an option to skip automatic removal of overlaps between neighboring hulls In the geometry collection convex hull generation settings.
- New instance of geometry collections will now properly be initialized using the corresponding asset damage threshold array
- Added AddImpulse and AddRadialImpulse functions to Geometry Collection component.
- Added support for convex shapes in FBodyInstance GetShortestDistanceToPoint and GetClosestPointAndNormal methods.
- Query based events now set ItemIndex when the hit component is a geometry collection corresponding to one of its specific parts.
- Added multiple blueprint function taking this ItemIndex as an input allowing users to apply strain and/or break to specific part of the geometry collection.
- Updated the CollisionObjectReductionPercentage geometry collection setting to also apply to convex collision, where it previously was restricted to other types of simple collision.
- Added a flag on RigidBody AnimNode to allow it to use synchronous physics simulation.
- Renamed CVar to p.RigidBodyNode.DeferredSimulationDefault to reflect that it's the project default, not an override.
- Added an option to the AutoCluster tool in Fracture Mode to choose number of Voronoi sites as a fraction of total children to cluster, instead of directly specifying the number
- Added options to the AutoCluster tool to (try to) prevent creating isolated children, by merging such clusters with neighbors, and clusters of all children (by skipping cluster creation in that case).
- Added the ability for a geometry collection component to opt-out from sleep and/or break removal logic set on the asset.
- Added a merge-selected-only option to the Fracture Mode TinyGeo tool, and stop selecting all after every merge.
- Updated Geometry collections to now properly account for static meshes BuildScale parameter when importing geometry.
- Added support for CCD, linear and angular damping for geometry collections.
- Added asset-level option to use size specific damage thresholds for geometry collections.
- Updated a number of the Fracture Mode tools run expensive computations in a background thread, with a regularly-sampled progress/cancel UI. This includes the Fracture tools such as Voronoi, Plane, and Mesh, as well as the AutoUV tool.
- Added support for Enable Gravity parameter for geometry collections – only accounted for at initialization.
- Updated the Convex builder to now use a new convex hull generation algorithm.
- Updated the Geometry Collection Break events to now return the index of the specific piece. This "ItemIndex" can now be used to call blueprint functions targeting specific parts of the geometry collection.
- Improved remove on max sleep feature for geometry collections to be able to also remove slow moving pieces, allowing for more efficient removal behavior.
- Partial clusters will now crumble into smaller pieces after a certain time if remove on max sleep is enabled
- Optimized collision impulse processing for Geometry Collections.
- Added AddForce, AddRadialForce, and AddTorqueInRadians functions to Geometry Collection component.
- Added interpolated asynchronous physics support for geometry collections.
- Updated the p.ChaosCloth.Ispc command to register during static initialization (and in test builds), so it can be changed at startup for automated/unattended testing.
- Added support for the Start Awake parameter for geometry collections.
- Added a "Keep Frac" setting to the fracture interactive selection tool, to allow dropping a random fraction of the selection filter.
- Provided an optimized code path for mostly vertical sweeps )
- Added particle velocity visualization.
- Changed the aerodynamic forces visualization colors depending on whether the particles are kinematic or dynamic.
- Added support for Geometry Collections in Mesh Painting mode.
- Geometry collection fragments hidden using the Fracture Editor Hide tool will now be excluded from the simulation.
- Improved Chaos Cloth bending elements to be much more stable and correct, especially when the initial rest shape is not flat.
- Added the "Buckling" feature in Chaos Cloth (i.e., biphasic materials), which adds "Buckling Stiffness" and "Buckling Ratio".
- Updated Chaos Cloth bending element will now use its Buckling Stiffness rather than its Bending Stiffness once the cloth has bent beyond the limit set by Buckling Ratio.
- Added options on geometry collection creation:
- Ask if the user wants to duplicate input materials to create internal material slots.
- Ask if the user wants to split the mesh by connected components, creating separate bones for each component.
- Improved the names and organization of the geometry collection convex hull generation settings.
- Overlap removal settings are now a separate group -
- Renamed "Can Exceed Fraction" to "Allow Larger Hull Fraction"
- Renamed "Can Remove Fraction" to "Max Removal Fraction" and moved it to the overlap removal settings group.
- Renamed the GeoMr' tool to TinyGeo in Fracture Mode.
- Added a new GeoMrg tool in the 'edit' category which just merges the geometry from selected bones.
- Added new blueprint functions to apply external and internal strain to specific geometry collection fragments.
- Updated the Fracture Mode's validation tool into a modal tool with options, so the user can see what it will and won't do. Also added an option for it to remove 'clusters of one.'
- Added the Chaos Cloth Air Pressure Field (Normal displacement). This adds a new "Pressure" field and map to cloth which is used to model a difference in air pressure on two sides of cloth (e.g., inflatable objects, puffy jackets, pillows).
- Updated the fracture tools to propagate vertex colors internally on fracture via a smooth solve, so vertex colors are consistent within a fractured mesh.
- Added standard fracture settings (including random seed to control the cut distribution) back to the Mesh fracture tool, except not Grout and Noise (as these aren't supported).
- Updated Geometry collection to now caching their local bounds to reduce runtime overhead.
- Updated Edge and Bending constraint debug drawing colors to be based on their parallel graph coloring. Constraints solved in parallel are the same color. This is largely for developer debugging, so you probably don't need to worry about it, but this is what the color change means!
- Added the ability to define a timer for fragments ( including clusters) to be removed after a certain amount of time. This adds a new Remove On Break tool in the Fracture Editor that allows to set those parameters per fragment
- Added several geometry collection blueprint functions to control individual fragments by applying linear and angular velocity as well as getting their initial level in the hierarchy.
- Updated Existing Self Collisions in Chaos cloth (enabled via "Use Self Collisions") to now take normals into account and have a "Self Collision Friction" coefficient.
- Updated Self collisions Chaos cloth to be (slightly) faster, especially on hardware with a lot of CPU parallelism. It is still not recommended to use self collisions where speed is critical.
- Added a new "Use Self Intersections" flag has been added which will fix self intersections that were missed by the existing Self Collisions algorithm. This feature is highly experimental with significant changes and improvements expected in future releases.
- Added anchored property to anchor a geometry collection fragment which allows it to hold the structure while still being able to be removed unlike setting its initial state to kinematic. This can be set by using the right-click menu in the hierarchy in the Fracture editor outliner.
- Updated transient / un-Saved properties to work more logically for Geometry Collection data:
- The ManagedArrayCollection 'Saved' flag controls whether the whole property is saved, rather than just its data.
- Always save everything when transacting (ignore the Saved flag) Also when loading, remove properties that were not in the map that was loaded from.
- Stop manually removing some unsaved attributes, as the Saved flag should take care of that instead.
- Stop loading from the DDC (after already loading from the transaction history) for every undo/redo transaction.
- Changed the geometry collection 'remove overlaps' fracture convex generation option to support more options -- specifically adding options to only remove overlaps on clusters, or overlaps of clusters with other clusters.
- Added a Convex OverlapRemovalShrinkPercent variable to the geometry collection convex generation settings, to compute overlap removal on scaled-down convex hulls (without baking that scale into the hull). This gives additional flexibility when overlap removal is removing too much of the collision volumes.
Bug Fix:
- Fixed hit event not reporting other component or actor when it is a geometry collection component.
- Fixed crash in fracture mode AutoCluster tool when there are no bones
- Disable radial fracture position (center, normal) settings when position is controlled by gizmo. Update tooltips to explain why they're disabled.
- Updated Chaos Cloth to reset the field's outputs to avoid it affecting the cloth once it is no longer active.
- Restricted the solver field update in Chaos Cloth to the currently active LOD set of particles, thus avoiding unnecessary updates for the inactive LODs.
- Fixed the Chaos Shared Config ownership that was preventing some Skeletal Mesh assets from being saved once the first/original cloth asset owner had been deleted.
- Fixed an issue in Chaos Cloth where the collision particles index wasn't reset during an LOD change, and was causing the external collision sources to be re-added multiple times.
- Geometry Collection: Fixed shape generation not properly using relative size when clustering is on.
- Fixed the stiffness exponentiation calculations in Chaos Cloth. Prevented a 0 Low or High painted stiffness to be turned into a small stiffness whose effect is still perceivable on all related constraints when values are close to 0 and 1.
- Fixed issue where adding an element to the size specific array in a geometry collection asset details would sometimes add two.
- Fixed a crash when FParallelClothTask::GetDesiredThread() was called outside of the game thread.
- Fixed issue with heightfield depth computation when sample point is outside of the XY bounds of the heightfield.
- Fixed convex generation to properly remove internal and invalid faces.
- Updated Fracture Mode to only auto-scroll to bones in the outliner/histogram if they are selected via a single bone selection in the 3D view. This prevents the outliner view from auto-scrolling to the first bone in the list after every click while the user is multi-selecting within the outliner itself.
- Fixed rotated box-shaped fields that resulted in a smaller area of effect than expected.
- Fixed non-nanite cached geometry collections not properly updating their bounds in editor when using sequencer.
- Fixed Geometry Collection's size specific damage threshold calculation to now properly accounting for max cluster level value.
- Fixed inertia tensor calculation for geometry collection clusters when the original mesh has a world transform with a non zero rotation.
- Improved performance of proximity detection when fracturing very large meshes, especially for meshes with regular face orientations.
- Fixed inertia calculation for scaled geometry collection.
- Deleted geometry collection components are now properly handled by the Chaos-Niagara interface.
- Fixed complex collision display for spline mesh components.
- Factorized FMeshBatch spline setup code.
- Fixed a performance problem that caused the editor to take a very long time to convert a set of large static meshes to geometry collections.
- Fixed issue where sleeping geometry collections could be unexpectedly woken up by distant fields.
- Fixed performance bug in fracture mode that could cause a very long processing time on reset of a large geometry collection with many input parts.
- Fixed an edge case where running sweep queries against dirty elements in the AABBTree could lead to an infinite loop.
- Fixed issue where kinematically moving geometry collection would have their velocity set to 0 when activated by a field.
- Chaos Cloth: Fixed the velocity calculations when MaxPhysicsDelta kicks in, preventing the cloth from receiving excessive impulses as the time step gets clamped.
- Fixed capsule ray-cast sometimes returning false negatives.
- Fixed off-centered rotations issues for geometry collections when using asynchronous physics or caching.
- Fixed a crash due to fracture mode outliner being out of sync with geometry after an undo or redo.
- Fixed Geometry Collection hit proxies rendering incorrectly for triangles referencing a few vertices in each buffer, due to an incorrect offset parameter.
- Fixed geometry collection hit proxies rendering incorrectly in fracture mode when not actively selecting bones.
- Fixed smoothed velocities computation that could cause rigid bodies to flip between a sleeping and dynamic state while falling if they add a small force applied to them.
- Moved smoothed time step operations out of the solver of Chaos Cloth, leveraging the velocity scale to avoid cloth tugging issues. This also allows for more drastic change in time steps without causing the simulation to explode, as when using the slomo command for example.
- Fixed the fracture mode AutoUV tool to use more appropriate texture types when baking. For example, using linear rather than sRGB mapping when encoding values like distances, curvatures, and normals.
- Updated the fracture mode brick tool to work correctly with zero grout, rather than forcing the grout to always be non-zero.
- Fixed Chaos cache manager not working after resetting a cached geometry collection.
- Fixed the fracture mesh tool creating a very deep hierarchy when applying multiple cuts; it now only adds one level of children for a given fractured bone.
- Fixed character movement interaction with scaled geometry collections.
- Fixed bug where a blueprint Chaos collision event would not properly set the OtherComponent property.
- Fixed the fracture mode AutoUV tool's box projection feature sometimes messing up unrelated UV layers, and generating bad results for isolated triangles.
- Resolved rare crash when dynamically creating and deleting Chaos vehicles.
- Fixed Fractures to now be computed in a consistent local space, rather than globally. This makes the noise applied to fracture surfaces not depend on the world-space position of the geometry collection.
- Fixed fracture mode capturing 'escape' when in PIE and simulate modes, making it difficult to leave the mode.
- Fixed cook warning related to selection material in geometry collection.
- Fixed cached geometry collection bounds not being updated properly when scrubbing start time from caches in editor mode, causing them to sometimes be wrongly culled by the rendering system in editor.
- Fixed crash attempting to retrieve shapes from a body instance that has no actor instance (e.g. welded bodies).
- Fixed incorrect identification of owned instance shapes in GetSquaredDistanceToBody for welded instances.
- Enabled mask filters for Chaos collision.
- Adjusted zero-component scale behavior to always pass a valid scale to avoid creating invalid body instances due to invalid scales
- Fixed physical material resolve for landscapes with a simple collision mip enabled. Both material assignments and holes should be represented correctly now.
- Fixed rigid bodies no longer colliding after being constrained with a constraint using "Disable Collision". After the constraint breaks we now update the ignore manager for the bodies in question to re-enable their interaction.
- Fixed incorrect class filter for default destructible material to allow proper selection and avoid warnings for missing classes.
- Fixed exports of UShapeComponent templated methods so that the explicit instantiations can be called from external modules.
- Minor Chaos non-unity build fixes.
- Added warning for default physics collision handler to catch invalid actor references in pending collision lists.
- Fixed player collision mode rendering of convex elements which was previously not taking element transforms into account.
- Fixed use-after-move when building unions of implicit objects.
- Fixed OnHit event propagation to correctly identify the shape that the collision came from and the component that owns it.
- Added a memory barrier to TObjectPool to ensure no writes to the head block will reorder beyond grabbing a free item pointer
- Fixed erroneous deleter being used for derived types of FProxyTimestampBase
- Fixed physical material mask set operation causing the map array to endlessly expand on repeated calls.
- Fixed a few control paths that could lead to the dirty grid acceleration in scene queries to get caught inside an infinite loop which was showing up as a write-deadlock on the main thread
- Fixed disabled constraints never being removed from the constraint graph leading to severe performance degradation after long runtimes. Fixed disabled constraints never being removed from their owning particle joint lists - leading to dangling joint pointers in the particles.
- Fixed geometry collection/provider asserting that its geometry is of inner types without unwrapping its implicit.
- Fixed the cast helpers for Chaos geometries only accepting callable objects that return value types.
- Changed null actor release message from Warning to Verbose as it is a valid code path currently when welding shapes into a body instance of a parent that is set to NoCollision.
- Fixed a bug that was preventing physics constraint forces from being reported.
- Hoisted branch evaluation allocations out of AABB inner loops, reduces repeated allocations within a frame when objects move in Chaos scenes.
- Removed ensure in GetWorldVelocityAtPoint that required the object to be kinematic or dynamic. It is valid to request a velocity from a static object without firing an ensure - the velocity will always be zero in that case.
- Fixed incorrect access to inner physics materials during update when a material had not yet been created.
- Re-enabled scene-wide physics collision handler customization.
- Grouped sibling choice and cost for AABBTree leaf insertion to avoid double cache misses.
- Refactored nodes to be smaller so more nodes fit in a cache line.
- Altered node access pattern during FindSibling to avoid repeated indirection through the Node array.
- Fixed incorrect joint constraint termination leading to memory leaks and dangling joints that slow down the solver.
- Changed coincident vertex Warning during tri-mesh cleaning to Display. This is a recoverable issue as we just delete those triangles and move on. Display will still message to the user that there are invalid triangles to address.
Deprecated:
- Deprecated remove on fracture option for Geometry collections - this is now replaced by recently introduced and more flexible remove on break
Volumetric
New:
- Upgraded Blosc to version 1.21.0
- Added support for OpenVDB and Blosc on Mac and Linux in addition to Windows.
UI
New:
- Added new LLM subtags for UI and increased UI LLM coverage.
- Added a Blueprint-callable setter for
bHideInputAction
on CommonButtonBase.
Slate
API Change:
- As the
FTextBlockStyle
is now embedded in theFEditableTextBoxStyle
, it cannot be initialized the exact same way. If you need, you can now configure theFTextBlockStyle
of anFEditableTextBoxStyle
by callingSetTextStyle
on it.
New:
- Added InitialSortMode attribute to
FColumn
andSTableColumnHeader
. InitialSortMode will default toEColumnSortMode::Ascending
as before. - Added icons for C++ widget classes.
- Previously, UMG MultilineEditableTextBox contained both a Font with an EditableTextBoxStyle, and another Font with a TextBlockStyle. This was error-prone as it was not clear which one was supposed to be modified. To solve this duplication issue, the Font from the EditableTextBoxStyle has been removed, and the TextBlockStyle has been moved from the MultilineEditableTextBox to the EditableTextBoxStyle.
- Added general support for external per-mode widgets to be displayed by UMG editor. This improves UMG editor extensibility.
Crash Fix:
- Fixed a crash that would occur when capturing callstacks using Slate Insights in editor.
Bug Fix:
- Fixed an issue where
FDirectoryPath
properties failed to disable the path selection button when the property is disabled. - Fixed the checkbox style on editor utility widgets.
- Addressed an issue where zero-sized scissor rects were not culled.
- Fixed an issue where the mouse was not properly locked to the game window.
- Fixed several issues with Slate line and spline rendering.
- Addressed an issue where
SDockTab::OnTabClosed
would not fire when the tabs were removed. - Fixed an issue causing slider and text selections to be offset when displaying in non-standard viewport resolutions.
- Fixed the order of parameters in KeyEvent.
UMG
New:
- Keyboard input type overrides are now available for Spinbox
- Added an option to make moved widgets only invalidate the
SWorldWidgetScreenLayer
if they are visible. - Added list reordering to widget animations.
- Added DrawSpline to Widget Blueprint library.
- Added a size overlay for the currently selected widget to the UMG editor.
- Exported
FCommonAnalogCursor
from the CommonUI module.
Crash Fix:
- Fixed a potential crash that would occur in
UCommonButtonBase::RefreshDimensions
when the preview widget is rebuilt. - Added guards against CommonUI action router not existing on game shutdown.
Bug Fix:
- Safeguards have been added to prevent null entries from being added to a ListView with SetListItems
- Setting a Margin variable in a parent blueprint now correctly updates child blueprint variables as well.
- Fixed a bug that caused the cursor to disappear while using PIE with CommonUI.
- Fixed widget references not updating in UMG Designer on compile.
- Fixed issues preventing zoom from functioning well at small sizes in UMG Editor.
- Fixed rounded box outlines when using default CommonUI style with full transparency.
- Added missing broadcasts in CommonLazyImage and CommonLazyWidget.
- Fixed editable text box default focused color black.
- Editable texts will now react instantaneously to any change to the font settings done in the UMG designer. Previously it was necessary to force a refresh.
Virtual Production
New:
- You can now predetermine the number of frames to capture when using MediaCapture.
- Multi-User: Added an option/cvar for closing Sequencer when a sequence is closed by a remote user.
- DMXFixtures: Fixed visibility logic on all light fixtures to make sure it's responsive.
- Extended INetworkMessagingExtension to support network monitoring. Subscribers can provide bytes lost, bytes received, and bytes sent that can be displayed in a Multi-User Server session.
- Changed the default console variable values for Concert.EnableOpenRemoteSequencer and for Concert.EnableSequencerPlaybackSync to be true.
- Improved handling of World Partition levels in a Multi-User session.
- Added a delegate to the IConcertClientWorkspace class to indicate that a workspace has been synced and finalized.
- Added the LiveLinkFaceImporter plugin to the Unreal Editor source. Previously this plugin was only available on the marketplace.
- Added a setting to control the size of the work send queue for Multi-User. Sessions with a large number of transactions and clients that join late may cause this queue to fill up and never recover.
- Fixed incorrect values sent over Multi-User when using the Console Variable Editor.
- VP Roles improvements
- Moved roles to a menu in the level editor toolbar.
- Mde it easier to select/remove roles.
- Added roles subsystem to provide a basic Blueprint API.
- Added modifier key to increment/decrement timed data monitor offset by 10 and 0.1. By default, the Shift key will increment/decrement by 0.1, and the Control key will increment/decrement by 10.
- Changed VirtualCamera plugin to Runtime.
- Added a function to VCam Modifiers that allows them to access their associated name in the modifier stack.
- Added an intermediate dialogue when creating VCam related Blueprints to prompt for an optional InputActionContext. This dialogue is used when creating VCam Modifiers or VCam Widgets.
- Changed Right Click Asset Creation Menu to "VCam" from "Virtual Camera".
- Exposed ILiveLinkClient::GetSourceType to Blueprints. Name changed to GetSourceTypeFromGuid to avoid conflict with existing GetSourceType function using a Source Handle.
Bug Fix:
- Added additional precautions to deal with "slightly off" blocked ranges being set to control "blocked synced" playback.
- Improved the TCPMessaging retry on connection failure mechanic.
- Fixed blocked/synced playback timeouts with enabled audio playback on player setup. Syncing was disabled.
- DMXFixtures now checks if a DMX component is valid before reading it to avoid warnings in Blueprints.
- Added support for camera Field of View in beam shader.
- Fixed division by zero in zoom component.
- Trashed VCam components are now properly disabled when they are replaced in the Editor (usually via rerun construction scripts).
- Made LiveLink an explicit requirement of the VirtualCamera plugin.
- VCamComponent no longer tries to access the Live Link Client during cook.
- Fixed an issue where VCam Modifier Names were resetting when changing modifier properties in the Details panel.
Deprecated:
- DMXFixtures - Deprecated MinQuality and MaxQuality UProperties. Now using BeamQuality and ZoomQuality.
IO
API Change:
- CaptureSceneViewportImpl and CaptureRenderTargetImpl have been deprecated and replaced with InitializeCapture called for any type of capture and specific post initialize methods for each type of capture like PostInitializeCaptureViewport.
New:
- Added an importer for ulens files. This makes it possible to associate a LensFile asset with a file on disk, so it can be reimported as well.
- OpenEXR: Upgraded OpenEXR to version 3.1.5.
- Updated MediaCapture to use RDG, and added structured buffer output support to media capture.
-
- Added immediate rhi resource capture mode to MediaCapture.
- Added support for UAV output configuration from media converter in media texture.
- The Live Link API now allows deriving from LiveLinkProvider and MessageBusSource classes.
- Added autodetection for Blackmagic genlock format.
- Aja input format input is now autodetected by default.
- Added automatic exporting of data collected during camera calibration to disk.
- Added support for importing camera calibration datasets.
- Added "Depth of Field Supported" flag to the LiveLink Camera Role to allow a LiveLink Source to enable/disable depth of field (Focus Override) on a Camera Component.
- Media capture now automatically reopens media capture when media output is modified.
- Added option to enable linear conversion when doing a media capture.
- Added control key modifier to timed data buffer visualizer to zoom faster.
- Added format autodetection for Aja timecode.
- Added format autodetection for Aja Timecode Provider.
- Added Aja GPU direct support for input. Enabled by the console variable MediaIO.EnableGPUDirectInput.
- Renamed "Lens Distortion Component" to "Lens Component".
- Fixed a bug to guarantee that a camera recorded with Take Recorder would have nodal offset baked into its recorded transform.
- Added "Evaluation Mode" option to Lens Component to choose where the Focus and Zoom values used to evaluate a Lens File come from.
- Added media playback buttons to the simulcam viewport to support pausing and seeking a file media source used for camera calibration.
- Added ability for each controller in the LiveLink component to potentially control a different component.
- Added "Distortion Source" setting to Lens Component, with options to use a Lens File, a LiveLink Lens subject, or to manually drive the distortion state.
- Added "Filmback Override" setting to Lens Component, with options to use the filmback specified in a Lens File or a user-specified "Cropped Filmback".
- Changed the Composure CG Layer setting to choose a Lens Component instead of a Distortion Source.
- Deprecated Lens Distortion Handler Picker structure.
- Deprecated methods for querying for a Lens Distortion Handler from the Camera Calibration Subsystem.
- Added a new track recorder to Take Recorder to support recording distortion state from a Lens Component and applying distortion to a camera on playback of a level sequence.
- Timed Data Monitor Improvements
- Put channels in alphabetical order in buffer visualizer.
- Added buttons to increment/decrement frame offset and time evaluation offset.
- Added dropdown to select evaluation offset type (frame vs seconds).
- Fixed style not being registered resulting in white texture.
- Added indicator in frame time to display when you are over your frame budget.
- Added console command to reinitialize timecode and genlock. Commands are TimecodeProvider.Reset and CustomTimeStep.Reset.
- Added support for Rivermax 2110 video streaming for input as a MediaSource.
- Added support for Rivermax 2110 video streaming for output as a MediaOutput.
Bug Fix:
- LensFile image dimensions are now saved on the asset itself.
- Fixed IsChildOf called on nullptr in RemoteControl.
- Fixed crash when adding LiveLink component.
- Fixed a crash that happened when using file media capture with resolution that needs padding.
- Fixed float FileMedia output expected stride.
- Fixed crash caused by Media IO player not clearing itself from the timed data monitor system.
- Fixed LiveLinkLightController not setting the LightComponent's "Use Temperature".
- Fixed lens file import doing wrong coordinate conversion (unreal to opencv instead of the opposite).
- Fixed Remote Control preset transactions being ignored by Multi-User.
- Fixed NDisplay config "rebind all" not working if generated for a different config (Viewport properties excluded). Added context menu for rebinding viewport properties.
- Fixed audio crashing when outputting audio with Blackmagic on Linux.
- Fixed nDisplay exposed properties on viewports not being able to be rebound. Fixed some nDsplay properties changing to
after being changed in the preset. - Fixed Blueprint event not being callable with raw Remote Control API.
- In the Remote Control panel, exposing/unexposing now properly generates transactions in the undo history.
- Fixed Aja media capture outputting a still image after unexpected engine closes.
- Fixed Remote Control unexpose not working on nDisplay viewport properties.
- Fixed desync between the Remote Control web interface and Unreal Engine when entering or exiting a Multi-User session.
nDisplay
New:
- nDisplay: Added support for the resize tool in the OutputMapping UI to lock the aspect ratio when being dragged by holding shift.
Rendering
New:
- Added OpenColorIO support for selecting displays and views when available in the configuration file.
Improvement:
- Added OpenColorIO plugin Blueprint function to activate color transforms in game mode, called "Create In-Game OpenColorIO Display Extension".
- Added 32-bit float lookup table texture support in OpenColorIO for improved precision, exposed as a plugin setting.
- OpenColorIO plugin now uses v2.1's new GPU processor, while maintaining legacy support via a plugin setting.
Bug Fix:
- OpenColorIO source and destination color space conversion settings are now correctly reset if no longer available in the configuration.
- Fixed OpenColorIO crashing on Mac when using Lumen overview viewports.
- Improvement: Migrated OpenColorIO viewport settings from EditorPerProjectUserSettings.ini config to plugin-specific OpenColorIO.ini file.
- Fixed mismatch in Composure between preview window and viewport: the tone curve is now consistently disabled by default, with option to re-enable.
- Fixed media texture trilinear sampling with new style output.
Tools
New:
- Added the first version of the Render Grid plugin (still in heavy development), which allows you to render several variations (different materials, colors, etc) of the same level sequence with ease.
- Switchboard: Added a "Vulkan" option to the nDisplay "Render Mode" setting.
- SwitchboardEditor: The Switchboard toolbar button is no longer automatically hidden after desktop shortcuts have been created.
- Sequencer Playlists: Added support for opening multiple Playlist assets simultaneously. Double-clicking Playlist assets in the Content Browser will now spawn new Playlists editor tabs.
- Virtual Scouting: Added a new "Virtual Scouting" plugin, which contains code required for OpenXR compatibility. For now, the "Virtual Production Utilities" plugin is also still required to use Virtual Scouting.
- Virtual Scouting: GetHMDDeviceType is now shimmed for backward compatibility when using the OpenXR plugin, instead returning the name of the deprecated VR plugin which corresponds to the active OpenXR interaction profile.
- Virtual Scouting: Added a "Game View" toggle to the Virtual Scouting settings panel, and added an "Enter VR Mode" Blueprint function to the VPScoutingSubsystem.
- Switchboard: Added a setting to allow finding levels that are inside plugins.
- Virtual Scouting: You can now use the OpenXR aim pose for the laser origin when applicable, rather than the grip pose. We have added a socket named "OpenXrGrip" to the Virtual Scouting Oculus controller mesh (SM_Controller_RiftS), adjusted to coincide roughly with the OpenXR grip pose. For any mesh where this socket is present, the interactor mesh relative transform is adjusted to treat the socket as the mesh origin. This allows us to preserve the original mesh origin for compatibility with the deprecated Oculus VR plugin and its differing motion controller pose.
- VR Editor: Changed UIBrightness upper bound property annotation from ClampMax to UIMax, in order to permit values >10.0 to be typed in.
- Switchboard: Added support for hostnames in addition to IP addresses. Address-type settings fields will now attempt name resolution on the entered value, with highlighting to indicate the lookup status (yellow = pending, red = failed).
- Added support to join all interfaces on multicast address when 0.0.0.0 is used for UDP unicast.
- Enhanced Switchboard tool to allow users to save configurations outside of the main config folder.
- RemoteControlWebInterface: Added dedicated view for Virtual Production FX, Color Correction & Light Card control.
- Added SwitchboardListener and Multi-User Server as build steps in UnrealGameSync.
- Added an option to the Multi-User persist dialog to allow users to make a file writable if source control is not enabled.
- RemoteControlWebInterface: Added support for Controllers.
- Enabled ShotGrid plugin for Linux.
- Added Shader and Asset Loading status column to the Stage Monitor tool.
- The VPBookmark Actor used by both Virtual Camera and Virtual Scouting has been nativized.
- Added CineCameraComponent in VPBookmarkActor in order to save camera parameters on the bookmark
- Added the function InjectInputForAction to the VCamComponent that will inject the input to whichever input system the component is currently using.
- Added SetActorLabel function in the VCamBP function library that will be accessible from VCam modifiers and widgets.
- Implemented GetWorld function in VCamModifier class that will expose Actor related functions for VCam modifiers.
- Enhanced Input has been enabled in the VRTool and VirtualScoutingInteractor classes to support future development of VR in Editor toolsets.
- All materials associated with the Virtual Scouting tools have been modified to ignore pre-exposure. They can now be used in scenes with physically accurate lighting values and remain visible regardless of lighting ratios or exposure level.
- The Viewfinder tool now uses the CineCameraComponent filmback size and crop settings to define screen size and render target dimensions.
- Viewfinder and Viewfinder_v02 now display focal length from the focal length variable on the CinecameraComponent rather than the lens preset name to support arbitrarily named lenses.
- Take Recorder's "Review Last Take" now considers Multi-User setups where multiple takes may have been recorded.
- VPCineCamera SceneCapture2Dcomponent no longer captures every frame, saving performance in VR Scouting sessions with multiple VPCineCameras spawned in.
- UDP Messaging will now detect when a message cannot be properly routed and mark the endpoint as unreachable. This prevents the UDP Messaging module from initiating auto-repair, which would force the entire connection to be rebuilt.
Bug Fix:
- Virtual Scouting no longer logs an error and refuses to launch if r.PostProcessing.PropagateAlpha is not set to 0, which otherwise led to the rendered image displaying all black in the HMD.
- SwitchboardListener: Fix for building with bForceEnableExceptions ("error C2712: cannot use __try in functions that require object unwinding").
- Sequencer Playlists: Fixed a potential crash when specifying out-of-bounds start/end frame offset values.
- SwitchboardListener: Fixed expansion of %TEMP% in file destination paths on non-Windows platforms. This was causing a crash attempting to launch nDisplay devices running on Linux.
- Switchboard: Fixed unhandled exceptions during creation of a new Switchboard configuration when attempting to invoke wmic to populate guesses for project/engine paths.
- Switchboard now uses Build.bat/Build.sh instead of invoking UnrealBuildTool.exe directly, which ensures that the environment is set correctly.
- Sequencer Playlists: Fixed an issue where hold sections could display the wrong frame for certain sequences.
- For RemoteCotnrolWebInterface, there's no need to install NodeJS anymore. Plugins download required nodejs binary.
- Virtual Scouting - the Sequencer tool now opens the first available level sequence Actor.
Upgrade Notes
Animation
Rigging
Upgrade Notes:
- Hide Transform and TransformNoScale as available control types in Control Rig. Controls of Type Transform and TransformNoScale will continue to work — but users cannot create new controls of those types through the UI.
- The Update event is now called Forwards Solve and the Inverse event is now referred to as Backwards Solve in Control Rig.
- Spherical Pose Reader can now be mirrored. Inner/outer falloff regions are independent. Added debug drawing of coordinate axes.
- Node should behave as before, though you may find the inner/outer regions are tuned slightly differently after upgrading.
Sequencer
Upgrade Notes:
- Root instance handles are now type-enforced in Sequencer.
- This prevents passing an FInstanceHandle to something that specifically wants a root instance handle.
- FRootInstanceHandle is implicitly castable to an FInstanceHandle, but not visa-versa.
- Some forward-facing APIs that deal with root instance handles have been changed to use FRootInstanceHandle over FInstanceHandle.
Editor
Upgrade Notes:
- Upgraded the remote_execution.py script in the PythonScriptPlugin. Changes are backwards compatible. No changes to previous code that utilizes remote_execution.py is necessary. Changes include:
- Added macOS support and fixed problems with command socket not being able to start in Unreal.
- Added Python 3.9 support.
- Updated hair strands to support Alembic groom_group_cards_id for hair card generation.
- In order to use the new Alembic schema field 'groom_group_cards_id', any relevant groom assets with this field must be re-imported.
Foundation
Core
API Change:
- FAssetBundleData now only stores the paths of top level assets to save space, though it can still be populated by TSoftObjectPtr properties tagged with the appropriate metadata.
- FSoftObjectPath and FTopLevelAssetPath should be able to replace FNames that referenced object paths in most cases without problems, however they are restricted to storing strings which have the correct form (for example, they start with a '/', they do not contain adjacent subobject delimiters, and so on).
Upgrade Notes:
- FSoftObjectPath should be used to contain the paths of objects that may exist at any depth in an object hierarchy, such as /Path/To/Map.Map:PersistenLevel.Actor.Component.
- It stores the first two components (the package name and top level asset name) as FNames and the rest of the path as an FString.
- FTopLevelAssetPath should be used to contain the paths of objects which always have a package as their direct outer, such as /Path/To/Package.AssetName.
- FAssetData::ObjectPath is deprecated, FAssetData::GetSoftObjectPath or GetObjectPathString should be used instead.
Dev Tools
Upgrade Notes:
- Updated common memory reporting commands to properly use
-csv
output and added parsable delimiting to MemReport output. - Fixed audiomemreport command to properly redirect to a different OutputDevice (removed -skipcsvforaudio, added -log).
- Any tools that parse the output of affected memory profiling commands like "obj list" or "listtesxtures" may need adjusted to respect the new formatting. These outputs should now use more standard csv formatting that doesn't include leading or trailing white spaces in cells. MemReport files now include "Begin/End command" notations for each section.
Framework
Upgrade Notes:
- Large world support (~88 million km wide) is enabled for all worlds.
- If your project relies on the 22km UE4 WORLD_MAX you may revert to that version by building with UE_USE_UE4_WORLD_MAX=1.
- Alternatively project code can be updated to use UE_OLD_WORLD_MAX and equivalents as appropriate. Refer to EngineDefines.h for the complete list of OLD (UE4), LARGE (UE5), and HUGE_DISTANCE (precision limits) defines.
- AWorldSettings::bEnableLargeWorlds was deprecated as part of this change. Test projects that previously relied on this toggle will continue to function and will now apply world bounds restrictions to actors further than ~44 million km from the origin. You may use AWorldSettings::bEnableWorldBoundsChecks to alter this behavior.
Gameplay
Upgrade Notes:
- Enabled the Enhanced Input plugin by default.
- Upon project startup, if you have not customized your UPlayerInput or UInputComponent classes in your project, they will automatically be set to the new Enhanced Input versions.
- You can disable the automatic upgrade path by setting the console variable "EnhancedInput.bEnableAutoUpgrade" to false if desired.
- Enhanced Input is fully backwards compatible with the old input system, so you can make your UPlayerInput and UInputComponent's based on the Enhanced Input equivalents and all old Action and Axis mappings will still work. This provides a solid upgrade path where you can upgrade your input code at your own pace, or just keep it and start using Enhanced Input for new features.
Level Design and Art Tools
Geometry Core
API Change:
- Use volatile for INEXACT to force rounding.
Geometry Script
API Change:
- Added an AggGeom to the dynamic mesh component to support the addition of the Async Physics build for Dynamic Mesh component. Collision update functions should update instead of the one on the current BodySetup. This ensures new collision changes are not overwritten by an async build replacing the BodySetup.
Upgrade Notes:
- Update the CopyMeshToStaticMesh and CreateStaticMeshAsset Geometry scripting functions to use the standard engine FMeshNaniteSettings data structure to define Nanite settings instead of the previous custom structures/fields.
- This is a breaking change, Blueprints that use the now-deprecated properties will need to be manually updated.
- The previous NaniteProxyTrianglePercent values can be converted to the FMeshNaniteSettings Fallback Percent field by dividing the value by 100.
Modeling Tools
API Change:
- This adjustment is designed to support tools where the selection type before the tool is activated is not compatible with the tool's function and requires conversion (for example vertices to triangles). The old behavior was also partially broken, where attempts to call a mode change on an inactive selection mechanic would result in the mode being changed transparently, but with no other processing taken, such as converting the active selection or sending undo changes.
Platform
Upgrade Notes:
- Added a native async save API.
- Any save game operations that are currently nested in AsyncTask calls or similar can be moved to use the new async save game API.
Mobile
Upgrade Notes:
- Fixed issue where shader pipeline cache files could be incorrectly trimmed from the pak directory list.
Online
API Change:
- AVEncoder no longer stores a width and height. These properties have been moved to the FVideoEncoderInput. This input is now the source of truth and both AMF and NVENC will adapt their resolution to the input resolution
- Moved ECodec to public so the module can expose a method to select what codec the user would like to use.
- Modified packaging of a PixelStreaming project so that ps-infra files are placed in a nicer location.
- Renamed the encoders and their corresponding factories to better describe their purpose.
Upgrade Notes:
- Fixed
PixelStreamingAudioComponent
that had delayed audio. - Fixed audio bitrate from Unreal Engine to browser that was set to a low default causing compressed audio quality in stream. The new default is now Opus maximum value of 510kb/s.
- Fixed the Selective Forwarding Unit (SFU) not being added to the Pixel Streaming samples folder for a packaged project.
- Fixed default max bitrate not being high enough to support 4k.
- Fixed reconnections not autoplaying in the browser.
- Refactored Pixel Streaming start-up logic to be a more uniform code path.
- Refactored Pixel Streaming URL to use settings function like PixelStreamingIP and Port.
- Fixed backwards compatibility break where offers from players would not result in a connection.
- Fixed a deadlock scenario that could be triggered with rapid peer connects/disconnects.
- Fixed a crash in WebRTC caused by not removing the audio sink when a peer disconnects.
- Fixed streams being capped at 30fps by default.
- Fixed incorrect WebRTC headers being included in the public header.
- Frames now flow through a much more rigid set of operations to get streamed.
- Video Sources have a Video Adapter and are fed by a Video Input.
- Video Adapters are fed by the input and contain a number of
Processes
. - Processes take the input frame and adapt it to a format that the encoder can use.
- Frame Buffers now contain a reference to the adapter, frame data is grabbed from here as needed by the encoder.
- Adapters and their processes are public with the intention that users can implement their own adapt step for other encoders.
- Streamer is now modular so we can have multiple streamers with their own inputs that stream to their own location.
- Extracted out the copy texture into a rendering util and tweaked how it handles transitions.
- Modify PixelStreamingModule to use new functions for creating a streamer.
- Added optional codepaths to use WebRTC M96 or M84.
- Refactored plugin to enable using our API for the new Pixel Streaming Player plugin.
- Created a new
PixelStreamingPeerConnection
class to wrap the webrtc peer connection with specific pixel streaming behavior. - Made the signaling server connection public and renamed its observer methods so it is obvious when they are implemented.
- Some small changes to frame buffers to make handling of cached data slightly safer.
- Made use of lambdas more explicit where possible.
- Remove unnecessary warning message from PixelStreamingAudioComponent.
Rendering
Architecture
Upgrade Notes:
- Default to writing velocity in base pass instead of in depth pass. This is because we do not currently support nanite WPO with depth pass velocity (work to fix this is ongoing). To avoid any confusion or problems for licensees who are trying out the new nanite WPO, we default to this setting that works everywhere.
- Licensees can locally set depth pass velocity if they are not using nanite WPO and want the potential performance improvement.
Postprocessing
Upgrade Notes:
- Pixel shader animations no longer ghost.
- Translucencies no longer ghost.
- VFX no longer ghost.
Simulation
Physics
Upgrade Notes:
- Geometry collection now allows import of collision from the static meshes they are generated from.
- Existing geometry collection assets will need to be reset in the Fracture Editor to allow this feature to work.
- Then the "Import Collision From Source" checkbox then needs to be checked to allow using them.
- A "Collision" column mode in the Fracture Editor outliner has been added that will display if collisions are used, or are available or not.
- Fracture Editor outliner can now display run-time damage information, including maximum damage, current threshold and if the piece broke or not.
- In order to enable this feature, the component needs to have "Enable Run Time Data Collection" enabled.
- Then, in the Fracture Editor, simply run the simulation then pause or stop and then refresh the Fracture Editor outliner in "Damage" column mode.
- Size specific damage thresholds generation has been improved for geometry collections where bones can get assigned more predictable thresholds from the settings.
- Existing assets will use the cluster only computability mode and will need to uncheck the "Per Cluster Only Damage Threshold" check box.
- Added new interface to ChaosWheeledVehicleMovementComponent which enabled direct control over the drive and braking torque per wheel.
- The new blueprint compatible functions are SetDriveTorque and SetBrakeTorque. They take two parameters, Torque specified in Newton Meters and a wheel index. The wheel index matches the wheel array in the wheeled vehicle movement component.
- This has a few modes of operation allowing you to add to or completely override the torque at each wheel.
- The new property ExternalTorqueCombineMethod on the wheel class ChaosVehicleWheel, has three states
- None [the default] - No external torque will be applied to the simulation when you call the above set torque functions.
- Override - The external torque provided by the set torque functions will be used and any internal calculations for engine/ brakes will be ignored.
- Additive - The external torque provided by the set torque functions will be added to any internal calculations from engine/ brakes.
- This mode can also be changed at runtime via the blueprint compatible function SetTorqueCombineMethod.This is also defined per wheel.
- There is no change to current behavior, the new feature is enabled by setting a new property (ExternalTorqueCombineMethod) which is defaulted to off.
- Added brake and shock damage propagation options to geometry collection component (enabled by default). This allows finer tuning and more realistic breaks.
- No upgrade needed, older assets will keep it disabled, only new assets will have it enabled by default.
- In the Chaos Vehicle Plugin it was noted that the wheel forces were being applied to high up and not at the road surface.
- Rectifying this means vehicle handling will change dramatically, likely requiring a lowering of the center of mass by approximately the wheel radius to get the same result.
- To alleviate this issue a new property (bLegacyWheelFrictionPosition) has been added to retain the old behavior. This will automatically be enabled on any existing vehicles but will default to false on any new vehicles that are created.
- To ensure all your vehicles are consistent on existing projects, ensure bLegacyWheelFrictionPosition property is enabled on the ChaosWheeledVehicleMovementComponent.
New:
- Added a new connection graph method for geometry collection that filters overreaching connections by testing for bounds overlaps.
- Because this method produces better quality connection graphs, it is recommended to use it when possible.
- Added crumbling event for geometry collections that triggers whenever a cluster crumbling related function is called.
- Crumbling event will only fire if Notify Crumbling is enabled on the corresponding geometry collection component.
UI
Upgrade Notes:
- Added BP_OnPressed and BP_OnReleased blueprint-implementable events to CommonButtonBase of CommonUI for better control over visual states and animations.
UMG
New:
- Calling Stop Animation is now an asynchronous operation.
- This is currently enabled by default, but controllable through the UMG.AsyncAnimationControlFlow cvar (false disables this new flow).
- When an animation would usually be ticked by the animation tick manager, it now schedules an update on Stop, and queues a latent action to finish stopping before it completes the operation.
- Content that specifically relies upon Stop Animation being a synchronous call (that is, it relies upon animated values being immediately realized after Stop Animation has been called) should either disable UMG.AsyncAnimationControlFlow, or rework the content to respond to an OnAnimationStopped event (the latter being more preferable).