新内容
虚幻引擎5.5的发布进一步优化了虚幻引擎5的工具集。此版本对动画、渲染、虚拟制片、动态设计等多个领域进行了优化。
此版本包括我们的虚幻引擎开发者社区在GitHub上提交的改进。感谢虚幻引擎5.5的每一位贡献者: a-canary、aharvi、Akymbo-Humanoid、AlbinBernhardssonARM、aliemci、alikomurcu、ALiwoto、Almax27、Ambrosiussen、arkadiusz-filip、batlam987、ben-mkiv、BenjaminHill、BenVlodgi、BlenderSleuth、bmwhitley、brorbw、bunnylacey、Caffiendish、chriszuko、colonelsalt、Corey-Downing、David-Vodhanel、dgiannetti-riot、dorgonman、DoubleDeez、DPons97、drandall-microsoft、Duroxxigar、duyaokun、dwdamien、dyanikoglu、dzeligman、Ebrahim-Mottaghi-Rezaei、Edstub207、efokschaner、erebel55、ersenal、ersh1、exxello、foobit、Frigerius、gamethread、GaoYuanBob、Garashka、gnu-enjoyer、GracesGames、grafikrobot、Gusten、hozuki、HSeo、hui211314dd、ilkeraktug、IvayloH、jashking、jdperos、Jernias、jerobarraco、jinsongh2、jorgenpt、jppiiroinen-h13、jpritchard1010、just-bank、KaosSpectrum、kdada、kdbn、KeithMorning、KeithRare、KirillAlekseeenko、klukule、kronok、laycnc、ligazetom、lightbringer、lijenicol、liuhao0620、LizardThief、Losdrew、lxcug、MagForceSeven、MarcusSvensson92、MaximeRobinot、Maxmystere、maxon887、Meidozuki、MinusKube、mr0ptimist、mrobitaille-riot、najmm01、nickdarnell、nicoell-threedy、nikitakrutoy、ohmaya、pasotee、PetterVMC、PFGschen、phantom10111、PhDittmann、PICO-XR、ppchavan001、pramanc、projectgheist、pzychotic、r-vaillant、ramiroagis、rdunnington、reapazor、RiotAlam、rmobbs-ml、sadunkit、sheepandriy、Sigma-Erebus、Skylonxe、sleeptightAnsiC、slonopotamus、Sluggernot、SRombauts、StalkMen、stanley1108、StefanZimecki-Sharkmob、sunwtGitHub、supuo、TechNXGEN、teddemunnik、tgraupmann、Th3Fanbus、TheLumbee、tigerjang、tntnkn、TroutZhang、Tt-Wes、TwentyPast4、uextm、Urkaz、user37337、Vaei、Vesros、vgpechenkin、vorixo、Voulz、Wellwick、whalefood、xeru98、zachlute、zeaf
角色和动画
Sequencer的可用性

虚幻引擎 5.5对Sequencer的可用性进行了优化,让过场动画美术师能够控制序列内容的视图、更轻松地访问属性,并按序列内容筛选视口。这让界面更为可控,减少了工作流程产生的疲劳,能帮助用户更快地完成创作。
-
可自定义的筛选
-
隔离或隐藏选定的绑定项、轨道或通道
-
为隐藏(Hide)、隔离(Isolate)和显示全部(Show All)功能添加了热键
-
添加了绑定项属性、轨道属性、分段属性、通道属性以及键属性的覆层窗口
-
开启/关闭筛选序列内容视口选择
-
镜头试拍录制器将根据你录制的摄像机生成缩略图
动态Sequencer

动态Sequencer能让用户更好地定义数据的动态操作,以此增强交互式过场动画体验。
核心功能:
-
新的默认绑定类型 - 可在运行时动态绑定到不同对象的可替换对象(Replaceable)
-
创建自定义绑定类型 - 更好地控制Sequencer中对象的绑定方式
-
有条件地控制轨道行或分段的活动状态
-
使用可授权的曲线对序列、子序列或骨骼动画进行时间扭曲
-
重载并为子序列或镜头的变换原点赋予动画效果
动画模式:动画图层

动画图层让用户可以在非破坏性图层上创建运动,以增强控制性和灵活性。这利用了Sequencer的分段工作流,同时为管理这些分段/图层添加了更简洁的界面,并对可用性进行了大幅优化。
核心功能:
-
从所选项创建层
-
多对象层
-
合并所选层
-
附加和重载
-
静音、锁定、选择
-
可动画权重
-
重命名、复制、删除
模块化控制绑定

模块化控制绑定变为测试状态,同时做出了许多易用性优化,完善了用户界面,从而让用户能更快地编译绑定。
-
模块变体(Module Variants) 让模块的更新更为简易。
-
图解覆层(Schematic Overlay)的用户体验优化。
-
模块层级(Module Hierarchy)的简化
-
新模块:
-
四足模块
-
载具模块
-
-
原生双足模块 支持常见骨架类型 (如Vicon、Mixamo、mGear、HumanIK、Motive、XSens以及Advanced Skeleton)。
绑定变体(试验版)

绑定变体是高度实验性的工具,用于升级并切换控制绑定的模块和函数,让动画师能够将绑定无损地切换到不同的变体,以实现向上和向下的兼容。
- 使用新变体升级并切换控制绑定模块和函数。
可变的可自定义角色和网格体(测试版)

可变对象(Mutable) 可在运行时生成动态骨骼网格体、材质和纹理,以供创建角色自定义系统和动态内容。
-
删除隐藏的表面以防止Z轴冲突(Z-fighting)并实现对象分层和交互。例如:身上穿着衬衣,衬衣上又有外套的情况。
-
合并网格体和纹理,减少绘制调用。
-
烘培变形(Morph)以降低GPU负载。
-
烘焙诸如分层和贴花投影等纹理效果,以降低GPU负载。
-
基于图表的编辑器。
骨骼编辑器(生产就绪)

骨骼编辑器(Skeletal Editor)现在已达到生产就绪状态,并针对角色网格体的处理进行了全面优化和视觉反馈更新,加速并简化了骨骼网格体的绘制和权重编辑工作流程。
-
网格体的隔离
-
健壮的权重转移工具
-
边和面的选择功能,支持增长(Grow)/收缩(Shrink)/洪泛(Flood)
-
细节级别(LOD)和备用皮肤权重配置文件编辑
-
优化了视口线框和骨骼显示
-
优化了组件编辑器
-
套索选择
-
试验性的四边形网格体编辑
-
骨骼区域选择和多重编辑
动画变形器

你现在可以在控制绑定内生成自定义变形器,从而制作更逼真的动画效果,如接触变形效果,或更好的卡通风格挤压和拉伸效果等,并可轻松将其一键应用到Sequencer中的角色上。
我们还添加了 动画师工具套件(Animator Kit) 插件,内含一系列现成且内置变形器的控制绑定,包括格栅(Lattice)、摄像机空间格栅(Camera Space Lattice)和塑造(Sculpt)等,供你在动画中使用,或者将其作为参考样例,制作自己的绑定驱动式变形器。
ML变形器

机器学习(ML)变形器利用机器学习将高质量的离线网格体变形带入了实时领域。例如肌肉和准静态布料模拟等。虚幻引擎5.5为ML变形器添加了一些优化运行时变形的功能。
从虚幻引擎5.4到5.5的更改
-
新增绘制遮罩支持,可通过ML变形器编辑器的视口直接绘制。
-
可提供逐训练动画/地貌缓存输入的遮罩,从而将训练数据限制在特定区域。
-
为ML变形器的Maya插件添加了姿势混合器工具,以供优化训练数据。
-
根据内部和外部团队的反馈意见,解决了优化后工作流程的问题。
物理控制

物理控制(Physics Control)插件让你能用组件向蓝图添加简单、直观且强大的、基于物理的控制,或者使用动画图表节点为角色添加控制。这让你更容易利用静态网格体和骨骼网格体的突发物理运动,同时还能保持美术和Gameplay方面的控制。
-
完善了控制配置文件API(Control Profile API),该API可用于物理控制组件或带控制的刚体(Rigid Body With Control)的动画图表节点
-
优化了控制配置文件资产编辑器
-
简化了控制配置文件的创建过程
选择器

选择器(Chooser)插件在虚幻引擎5.5中达到了生产就绪状态。选择器提供了健壮的游戏上下文资产选择功能,以及许多出色的附加功能和调试功能。虽然它最初是为动画而设计,但我们还是将选择器公开了,以便用户能在新版本中选择几乎任何类型的资产。这可能导致复杂程度的跨度很大,简单的时候只有随机的选择器,复杂的时候可能涉及包含上千个动画的数据库驱动逻辑。
针对MetaHuman Animator的音频驱动式动画

通过音频生成高质量的面部动画,在MetaHuman Animator中快速呈现栩栩如生的面部表情。
-
使用MetaHuman Animator中的音频资产快速生成面部动画。
-
为所有MetaHuman面部控件快速制作动画,包括上半面部姿态的推理。
-
适用于各种语音和语言。
-
完全本地化的离线解决方案,适合批量处理音频。
如需详细了解音频驱动式动画,请参阅MetaHuman的音频驱动式动画文档。
虚幻引擎中优化后的MetaHuman

针对虚幻引擎5.5,我们采用了将MetaHuman成功引入UEFN的优化方法,并将同样的技术应用于虚幻引擎的MetaHuman。如今用户在导出MetaHuman时,可以选择以下任一选项:
-
影视版(完整)(Cinematic (Complete)) - 具有原始分辨率资产的现有'全脂'MetaHuman,或
-
高(High) 、 中(Medium) 和 低(Low) (优化版 (Optimized)) - 优化版MetaHuman具有经烘焙的纹理以及更低的复杂性。
这让影视版MetaHuman文件的平均大小从800MB减少到仅60MB,而如果选择高(优化版)选项,只会损失轻微的保真度。
此功能还引入了MetaHuman组件,它整合了MetaHuman的重要配置选项。这为用户进一步配置MetaHuman提供了统一的界面,允许用户在特定LOD下打开/关闭角色的动画功能,从而在性能和保真度之间进行权衡。
如需详细了解优化后的MetaHuman,请参阅优化后的MetaHuman文档。
渲染
MegaLights(试验版)

MegaLights是一项新的试验性功能,它让美术师能够在场景中添加数百个投射动态阴影的光源。美术师可以在不受限制或不影响性能的情况下,随心所欲地点亮场景。MegaLights让光照美术师首次可以在游戏主机和PC上使用绘制了纹理的区域光源,并用上柔和阴影、光照函数、媒体纹理播放和体积阴影等功能。
详细信息,请参阅MegaLights文档
Lumen优化

虚幻引擎5.5对Lumen的硬件光追(HWRT)性能进行了多项优化,重点是能让游戏主机能以60hz运行Lumen。此外,还有几项优化显著提高了Lumen的全局光照(GI)和反射质量。 Lumen现在还支持GI的击中光照(hit-lighting),这是一种开销更高,但更精确的GI计算方法,它可以避开Lumen在静态网格体上的一些限制。 另一项重要改进是新增了反射降噪器,它大大提高了低粗糙度反射的清晰度,并新增了对反射折射半透明度的支持。
硬件光线追踪

虚幻引擎5.5对底层系统做了许多面向外部的硬件光线追踪(HWRT)的优化。这些底层系统对Lumen、路径追踪和光线烘焙的性能和功能都有影响。同时还优化了光线追踪代码的异步求值,以及缓存和加速结构的管理。这些更改是为了让硬件支持的平台以更高的刷新率使用HWRT。
详细信息,请参阅硬件光线追踪文档。
路径追踪器

路径追踪器在虚幻引擎5.5中达到了生产就绪状态。这意味着路径追踪器功能齐全,可作为大气云和体积云的引用。它还迎来了新的时空降噪器,可通过影片渲染队列和影片渲染图表进行离线渲染,并支持Linux。
尽管路径追踪器已处于生产就绪状态,但我们预计某些正在开发或试验中的功能将无法与路径跟踪器配合使用。
详细信息,请参阅路径追踪器文档。
路径追踪器体积

虚幻引擎5.5的路径追踪器支持天空大气组件和体积云的引用质量渲染,让创建全功能引用或地面实况图像成为了可能。
由于需要保持交互性,对光线步进技术的一些优化可能会导致视觉瑕疵,而极度密集的云层可能要求用户进行仔细调试。
NFOR - 时空降噪器(试验版)

NFOR降噪器插件即"非线性加权一阶回归"或 "时空降噪器"。它的设计目的是在时间和空间上根据周围的斑块对每个像素进行降噪,从而为离线路径追踪渲染提供在时间维度上稳定的降噪效果。
这一功能并非针对采样次数极低或快速移动的物体,而是为了产出高质量的输出。
Vulkan光线追踪(测试版)

虚幻引擎5.5将默认开启Vulkan光线追踪。
Vulkan光线追踪的功能现在与DX12一致,在Linux平台上也是如此。这将允许用户使用一整套光线追踪功能,包括Lumen和路径追踪中的击中光照模式。
建议尝试此功能的用户使用最新的驱动程序(Windows使用Nvidia 560以上版本,Linux使用550以上版本)。
渲染通道优化

虚幻引擎5.5现在可以创建场景捕获并自定义渲染通道,通道可以自动映射主视图的摄像机和分辨率,包括时间抗锯齿抖动和屏幕百分比。这让合成图层可以做到在像素层面完全一致,而一般合成工作也能利用屏幕百分比来提高性能。
此外,名为"UserSceneTexture"的用户自定义中间纹理也可作为后期处理材质,按次序进行写入和读取。这意味着虚幻引擎能够以更强的性能运行多通道后期处理效果,如可分离滤镜或模糊效果等。
网格体纹理颜色绘制

虚幻引擎5.5现在支持在Nanite网格体实例上进行网格体绘制,且性能和内存开销已被降至最低。虚幻引擎5.5之前,使用Nanite无法实现这些常见的网格体绘制工作流,而这些工作流能让同一几何体的实例实现局部外观变化。
虚幻引擎5.5扩展了网格体绘制工具的功能,新增了纹理颜色(Texture Color)绘制模式,可对存储在网格体组件上的虚拟纹理进行绘制。其目的是支持类似于顶点绘制的工作流程,不过此类流程会根据纹理分辨率而不是顶点数进行缩放,从而以更高的效率处理Nanite网格体。我们还新增了在顶点和纹理颜色绘制之间进行复制的功能,以及在绘制时将纹理颜色自动传播到顶点颜色的选项。
正交渲染

正交渲染通常用于建筑和工程领域,有时也作为Gameplay的一种风格选择。它与等线视图的相似之处在于,所有对象都以相同的比例出现,平行线保持平行,比例在绘图/图像中表现一致,从而让人更容易判断相对大小。
虚幻引擎5.5的正交渲染在视觉上与透视渲染相同,支持光栅和路径追踪器中的大部分渲染功能。
详细信息,请参阅正交摄像机文档。
渲染并行化

虚幻引擎5.5优化了并行转译功能,该功能会发布渲染硬件接口(RHI)任务,将RHI命令列表转译为平台命令列表。这一改动带来了最高可达2倍的性能提升,(在某些平台上缩短了7毫秒耗时),减少了停滞次数,略微减少了绘制调用,并小幅优化了平台动态分辨率和渲染线程时间。
虚幻引擎5.5还优化了异步渲染依赖图表(Render Dependency Graph,RDG)的执行任务,使关键路径渲染线程时间缩短了0.4毫秒,并允许异步执行约一半的Slate渲染。
Day Sequence(试验性)

Day Sequence是一款试验性插件,它能自动生成24小时的日夜周期,让美术师可以在Sequencer工具中控制太阳、月亮、星星、大气和云层,从而轻松创建自己的光照效果。
除了完成用户在游戏中实现的基本昼夜循环所需的大部分工作外,Day Sequence还能处理网络同步(开箱即用的多人游戏支持)、使用体积重载创建兴趣点,以及创建程序化序列,从而突出以数据为中心的光照方法。
无绑定渲染

无绑定资源是一种低级别的功能,涉及DX12、Vulkan、Metal等现代渲染器硬件接口(RHI)中纹理和其他类型的数据缓冲区的管理。添加对无绑定资源的支持后,可以在渲染器中实现更灵活的GPU编程范式和额外的功能,而且达到这个要求才能在Vulkan上获得光线追踪的完整支持。
虚幻引擎5.5让更多平台可以使用无绑定资源。
第一人称渲染(试验版)

虚幻引擎5.5添加了对第一人称渲染的初步支持,其功能包括防止玩家的手/武器穿模到世界对象中,以及一套独立的视野(FOV),让开发者可以为第一人称资产指定不同于世界其他部分的FOV。
第一人称渲染功能适用于所有主要的图元类型和材质,包括不透明材质、半透明材质和Niagara粒子系统,以及Nanite几何体。此外还增加了新的蓝图函数,用于在世界空间和第一人称空间之间进行变换。
局部雾体积

局部雾体积属于可放置的Actor,可以简单高效地快速创建雾的局部变体。与体积雾不同,局部雾体积适用于所有平台和伸缩性级别,能提供与其他雾和光照系统一致的视觉效果,因而对低端和高端平台而言都是理想的选择。
局部雾体积在虚幻引擎5.5中达到了生产就绪状态。
详细信息,请参阅局部雾体积。
光源函数图集

新版光源函数图集(Light Function Atlas)加快了使用光源函数的各通道的渲染速度。为达成这一点,它将光源函数烘焙成纹理,然后将纹理投射到场景中,而不是重新计算每个光源的内联光照函数材质。这样可以显著节省GPU时间。尽管这种方法有一定的局限性,但它能使用彩色光源函数,也能使用Megalights的光源函数。
Substrate(测试版)

Substrate材质在虚幻引擎5.5中变为测试状态。Substrate材质尚未在大规模生产中得到验证,但它支持旧版材质的所有功能,而且支持部署了虚幻引擎的所有平台。我们正在努力减少材质的烘培时间和内存占用。当Substrate进入全面生产就绪状态时,上述方面将得到进一步优化。
异类体积(测试版)
Niagara的异类体积(HV)组件让你能够将体素数据库体积(VDB)导入至稀疏体积纹理中以进行渲染。虚幻引擎5.5对HV做出了多项优化:
-
针对第9代游戏主机性能的伸缩性控制
-
能够渲染多个重叠的HV
-
采用间接光照时,HV将应用自投影技术
-
支持影片渲染图表的Holdout,包括路径追踪
体积云材质更新
新的体积云材质是之前引擎内容随附材质的升级版本。虚幻引擎5.5对此材质进行了修改,令其更简单、更清晰、更易于配置,便于实现不同类型和形状的云所需的外观。

新材质完全取代了原版材质,因此所有使用原版体积云材质的模板和项目都会在虚幻引擎5.5中自动更新。预计部分项目的视觉效果可能会因此而有所变化,或难以找到正确的资源。如果你的项目依赖以前的材质,最简单的解决方案是从5.4或更早版本迁移到5.5。
虚拟制片
虚拟堪景

优化了虚幻引擎5.4引入的新版 虚拟堪景 工具,增加了VR内容浏览器和蓝图的可自定义小工具,并进一步优化了整个工具集的可自定义性。
虚幻引擎5.5的虚拟堪景工具可看作 生产就绪 。
用户现在可以使用兼容 OpenXR 的头戴式显示器(默认支持Oculus和Valve Index),获得强大的开箱即用体验。开发团队则有全面的 API 可用,以便构建各种自定义工具和用户体验。
旧版虚拟堪景工具在虚幻引擎5.5中仍可用,但将在虚幻引擎5.6中被移除。
Live Link Hub(测试版)

虚幻引擎5.5的 Live Link Hub 升级到了 测试 状态。在侧重于专业用户功能的同时,此版本还保持了最早的Unreal Editor for Fortnite特别版(UEFN)版本的易用性:
-
第三方插件 - Live Link Hub现可加载虚幻编辑器的Live Link插件,从而支持Live Link数据源的完整第三方生态。
-
数据重定时 - Live Link Hub现支持选择单个主题作为时间码源,并同步所有其他主题,让用户能将所有主题设置为同一帧率。这保证了用镜头试拍录制器(Take Recorder)录制Live Link数据时的一致性,并为默认不含定时数据的主题(如LiveLinkControllerInput和XR源等)添加了定时数据。
-
时间码支持 - Live Link Hub自身就可以为全部所附客户端提供时间码。无需使用串行数字接口(SDI)硬件就能简化同步全部引擎会话的过程。
-
虚拟主题 - Live Link Hub现支持虚拟主题。你可以将多个动画和基本角色主题合并为一个主题,从而简化引擎内的使用。
-
骨骼附件 - 虚拟主题现支持骨骼附件。你能够将动捕手套数据与身体数据合并为单个Live Link主题。
-
录制 - 录制原始数据以供日后重放。录制是异步写入的,录制完成后即可访问。
LiveLinkOpenVR

根据用户针对LiveLinkXR插件的反馈,我们创建了 LiveLinkOpenVR 功能,以解决虚拟制片(VP)工作流程的问题。LiveLinkOpenVR的用户界面和用户体验与LiveLinkXR一致,但它是专门针对 SteamVR 跟踪器下的Live Link工作流程而创建的。LiveLinkOpenVR 可在 Live Link Hub 和虚幻引擎的 Live Link 中使用。它对命令行参数没有任何要求,且仍可进行VR渲染。
针对表演捕捉的时间码优化

-
Sequencer时间码 - 你现在可以使用Stat SequenceTimecode命令,在视口中查看Sequencer时间码。可查看的内容包括序列时间码和镜头试拍录制器时间码。
-
动画资产编辑器时间码 - 如果时间码已作为自定义属性被导入或通过镜头试拍录制器被绘制到根骨骼,那么动画序列的动画资产编辑器现在会显示时间码。
-
LiveLink镜头试拍录像 - 与普通Actor录像一样,LiveLink主题的镜头试拍录像现可接收时间码轨道,让你能对时间和同步状况进行QA。
ProRes媒体时间码支持 - 使用内嵌时间码的ProRes文件的媒体资产现拥有时间码元数据。这使得Sequencer能够进行自动同步,从而达成与动画序列(Anim Sequence)和Soundwave资产的对等。如果导入的影片文件中存在时间码,那么Sequencer媒体轨道分段现可接收正确的时间码。
-
基于图像的媒体时间码支持 - 图像媒体文件具有用户可编辑的时间码元数据,这也是为了支持Sequencer时间轴的自动同步。
-
镜头试拍录制器 的 子帧 支持 - 子帧现为镜头试拍录像中的绘制浮点值。
摄像机校准精度

摄像机校准解算器现在可以利用校准器跟踪信息,大幅提高预估镜头和摄像机参数的准确性,且无需依赖跟踪设备的精确安装。系统还可以同时解算镜头失真和节点偏移,从而为操作员加速整个过程。
此外,还支持过扫描时的自适应分辨率,同样还支持带有时间超级分辨率(TSR)的镜头失真功能,这两项功能都能改善视觉效果的质量。
让单个发光板位于内视锥体上方/下方的功能按钮

目前,你可以选择让发光板位于内视锥体的上方或下方,但你只能对场景中的所有发光板进行全局性设置。大家普遍存在对发光板进行逐个控制的要求,因为在很多情况下,发光板必须靠近内视锥体,但根据具体拍摄要求,又必须有选择性地位于内视锥体上方或下方。
关卡可见性功能按钮

切换子关卡是舞台操作员的常见工作流程,在多用户的情况下进行此操作,就要求使用"在游戏中隐藏(Hidden in Game)"复选框,而不是(编辑器的)可见性复选框。关卡窗口只显示(编辑器的)可见性选项,因此当前的工作流程需要使用控制台变量尝试同步这两个复选框,以供其适应多用户操作。这样做既不稳定又容易出错,并且如果出现不同步的状况,舞台操作员也无法轻松解决问题。为提高透明度和简易性,两个复选框都应该在关卡窗口中显示。
颜色分级面板

对于需要在后期处理体积和色彩校正区域中进行颜色分级的虚幻引擎美术而言,不论项目中没有使用nDisplay,ICVFX编辑器中优化的颜色分级用户体验都与他们都息息相关。因此,我们将颜色分级面板升级为供一般编辑器使用,并向所有美术师开放。
生产就绪的ICVFX SMPTE 2110标准

随着制片功能开始过渡到基于SMPTE 2110标准的部署,虚幻引擎将继续优先改进IP视频信号流,以确保它能够满足现实世界中的摄像机内视觉特效(ICVFX)项目需求。我们最先在虚幻引擎5.3中引入了对端到端工作流程的支持,而在虚幻引擎5.5中,我们将通过以下方式提供 生产就绪的SMPTE 2110标准 的支持:
-
对虚幻引擎的核心SMPTE 2110标准支持进行大量稳定性优化。
-
自动检测并修复系统丢失帧锁的情况,以确保持续性的同步。
-
能够使用精确时间协议(PTP)提供时间码。
-
能够对2110外部媒体输入进行时间码对齐。
-
为2110媒体源提供OpenColorIO支持。
适用于CineCameras和MRQ的过扫描

CineCameraActor 现支持 过扫描乘数 。在帧边缘渲染额外的像素,能提高屏幕空间后期处理的精确度、在后期添加摄像机晃动,或通过 镜头失真 精确地让图像失真。
CineCameraActor和 影片渲染队列(MRQ) 都支持 过扫描 。
虚拟摄像机 - 后期平滑
在后期直接在设备上对虚拟摄像机移动进行非破坏性的平滑处理。原始移动数据始终保持不变,因此不会丢失任何数据!
虚拟摄像机 - 照片和书签浏览器

虚拟摄像机现在可以拍摄照片,并将其直接放入项目的保存文件夹,方便查看和共享。
拍摄照片的同时还会创建书签,书签可以通过新版书签浏览器进行查看和快速跳回。书签浏览器允许用户通过可视化界面搜索、排序、收藏和重命名书签。
虚拟摄像机 - 镜头试拍轮播

使用全新的镜头试拍轮播(Take Carousel)工具轻松查看和浏览你的试拍录像!轻扫轮播即可查看录像预览,并快速加载录像以供查看。
通过虚拟摄像机主屏幕上先前的录像预览缩略图,即可访问轮播。
多用户复制(测试版)

多用户复制(Multi User Replication)在用户体验和技术方面进行了一系列改进,现已正式进入测试阶段。多用户复制功能允许用户指定属性和Actor,以便实时复制到多用户会话中的其他客户端,且在需要高频率复制时,无需将更改打包到操作中,也无需淹没撤消缓冲区。保存并加载预设项即可显著加快设置复制的速度。
开发者迭代
Zen服务器 - 用快照加速编译农场的烘培(试验版)

烘焙依赖于编译代理程序的持久状态,从而避免重新烘焙相同的数据。然而我们无法保证将后一项烘焙作业分配给同一个代理程序。
而Zen服务器快照能存储烘培作业的状态,使其能够快速恢复,并复用于另一个编译代理程序的新作业,从而实现更快、更大量的编译农场烘培。
Zen服务器 - 向目标平台进行流送(试验版)

Zen服务器 是新的本地/共享数据虚幻引擎衍生数据缓存(DDC)的新架构。它不再将输出结果存储为磁盘上的松散文件,从而优化了数据调节和读/写性能。
服务器组件不需要耗费时间进行完整的复制部署,而是可以通过本地网络将烘培后的数据直接传输到游戏客户端和游戏服务器的目标平台,从而更快地进行'在目标上游玩(play on target)'的迭代。
作为共享DDC的Unreal Zen

在虚幻引擎5.5中,你已经可以在Window主机的生产环境中将Zen服务器部署为共享DDC。
我们用新的Unreal Zen存储服务器架构替换了网络文件共享,作为新的DDC存储。Zen对延迟的容忍度更高,并针对网络通信、从远程机器的读写进行了优化;操作行为也无需再在DDC存储层面执行同步IO。
Linux平台的Zen共享DDC仍处于测试阶段。
UBA C++和着色器编译

虚幻引擎5.5中,Windows编译主机上的虚幻编译加速器(UBA)已进入了生产就绪状态。UBA是一种用于C++和着色器编译的本地和分布式编译解决方案,与虚幻编译工具和/或Horde的远程编译(计算任务)系统结合使用。其中,Unreal Horde充当作业池协调员,为你的编译农场资源分配UBA代理程序助手资源。UBA可传输本地数据,执行远程任务并返回结果。
请注意,对于macOS和Linux编译主机,C++编译稳定且可以用于生产,但针对这些平台的着色器编译仍处于测试阶段。
Zen作为烘培输出存储(测试版)

先前,系统将经烘培的输出数据作为松散文件存储在磁盘上,从而导致了文件系统进程开销。而现在,只要在项目设置中启用,Unreal Zen存储服务器将以本地和/或远程方式存储平台的烘培数据,带来更好的本地数据调节和网络I/O性能。
Unreal Horde持续集成和远程执行

Unreal Horde持续集成和远程执行在虚幻引擎5.5中正式进入生产就绪状态。
Horde是一种'开箱即用'的持续集成解决方案,适用于所有使用虚幻引擎的开发团队。Horde具有水平伸缩性,是分布式的持续集成和编译平台系统,与Perforce挂钩,并与虚幻引擎开发者迭代工具和工作流程紧密集成。
编辑器默认开启的Zen加载器
新版Zen加载架构在虚幻引擎5.5中已进入生产就绪状态,并且默认启用。Zen加载器减少了开销并优化了资产加载路径,从而提高了编辑器启动、加载地图、加载到在编辑器中运行(PIE)以及各种烘培过程的性能。
动态设计
克隆器和效果器用户体验优化

最新版的克隆器(Cloner)和效果器(Effector)推出了强大的新功能,优化了创意工作流程。效果器现在推出了针对无缝分布对象的 推动分开(Push Apart) 功能、针对动态视觉控制的 粒子颜色(Particle Color) 功能,以及针对灵活操作的 反转体积(Invert Volume) 功能。诸如 环面(Torus) 和 轮辐(Radial) 的新形状拓展了设计的可能性。克隆器带来了先进的粒子发射器工作流程,用于生成和管理粒子以及基于点的动态效果,以实现逼真的交互。创建实例和静态网格体的功能提高了泛用性,追求高效和精度的美术师不可错过本次更新。
克隆器和效果器的紧邻效应

效果器系统为克隆粒子的着色强大的解决方案,可与克隆器和材质系统无缝集成。通过在效果器和克隆器系统之间传输数据,用户能够直观地在大量复制体中应用并控制粒子的颜色。这套系统可为你确保高动态、高响应的色彩效果,无需手动调整即可完美实现复杂的视觉效果。
克隆器和效果器参数
- 效果器数(Effector Count)
- 随机(Random)
- 网格体索引(Mesh Index)
- 规格化时长(Normalized Age)
- 索引(Index)
- 计数(Count)
- 颜色(Color)
- 执行器权重(Effector Weight)
- 进度(Progress)
- 网格体数(Mesh Count)
- 位置(Position)
- 速度(Velocity)
- 规格化速度(Velocity Normalized)
克隆器和效果器碰撞

克隆器和效果器现在都具有健壮的粒子和网格体碰撞功能,可实现复杂的程序化特效和动态交互。克隆体可以有效地相互碰撞,防止不必要的交叉,同时还能与环境中的其他网格体互动。新增的碰撞功能可提供更逼真和受控的结果,为复杂的模拟和精致的视觉效果提供了可能。
推动分开效果器

推动分开效果器(Push Apart Effector)是一件强大的工具,能够将克隆体从效果器的中心点推离。它非常适合用来生成类似于力场的效果,可实现受控分离和动态空间互动,提高项目的灵活性和精确度。
材质设计器PBR工作流程

材质设计器(Material Designer)现支持完整的基于物理的渲染(PBR)工作流程,让美工能够轻松编译复杂的材质。各通道都有一套堆叠系统,可帮助用户分层处理多个图像、颜色和噪点图案,从而实现复杂的材质设计。此工作流程还包括多纹理的拖放功能,以供用户快速高效地创建材质。
材质设计器纹理集

材质设计器现支持纹理集的完全拖放功能,简化了材质创建过程。利用逐插槽的名称匹配和用于识别特定通道(例如ORM地图)的通道打包功能,美术师能够快速高效地编译材质。这一功能加快了工作流程,让材质开发变得更快、更直观。
材质设计器特效

材质设计器现包含一系列材质特效,如色彩校正、失真、生成器和模糊效果,让用户可以更快速、更直观地创建复杂的材质。美术师可以应用这些特效,并以程序化的方式对其进行开关操作。此外,所有特效都可以在Sequencer中进行动画处理,从而开发出复杂、动态的视觉效果。
文本动画器

得益于程序化、非破坏性的功能,动画师现在可以在虚幻引擎中以前所未有的轻松方式创建文本动画。文本动画器(Text Animator)工具可以精确定位到单个字符,实现动态且有趣的文本效果。非破坏性方法确保了调整的简易性,为美术师的整个创作过程提供更强的控制力和灵活性。
属性动画器

属性动画器(Property Animator)是一项强大的功能,它通过程序化动画来驱动虚幻引擎中的大多数属性,让用户只需点击几下即可轻松控制位置、缩放、旋转、可见性等属性。最新的版本引入了新的曲线动画器,可实现平滑的进出动画和循环动画,非常适合弹出式的特效。我们还优化了对Sequencer的支持,可将动画器添加为轨道,方便通过拖放操作选择时间,同时能保留所有程序化的动画。其他功能还包括淡入/淡出轨道、复制、粘贴和完整的预设支持,以实现高效的工作流程。
过渡逻辑

在电视直播中,无缝呈现多个屏幕上的元素及其平滑过渡至关重要。在直播节目期间,过渡逻辑在精确控制元素的进出方面起着关键作用,它的原理是将屏幕上的各种元素分配到不同的"图层"中。此功能支持设计师智能地构造图形系统,确保每个元素按预期精准地在屏幕上出现和消失,以便让有影响力的直播活动获得至关重要的精准度。
过渡逻辑功能:
-
用于决定过渡的过渡树
-
将多个元素添加到层
-
将单个关卡中的元素标记为动态过渡元素,而无需将单个图形分割为多个。
-
使用过渡状态树(Transition State Tree),简化前期设置,并提供可选的后台复杂性设置
模拟和视觉特效处理
Chaos数据流编辑器(试验版)

在虚幻引擎5.5中,试验版Chaos数据流编辑器图表允许用户在基于节点的环境中以程序化方式生成资产。图表的实现方案采用了基于拉取的求值方法,即图中的节点根据对其输入的求值生成缓存输出状态。数据流资产则被用于协助模拟系统的程序化编写和设置。例如,Chaos布料系统会使用数据流从Marvelous Designer中导入并设置服装。
5.5的更新包括:
-
重路由节点
-
复制粘贴功能
-
更好的撤销功能支持
-
废弃功能的支持
-
动态输入
-
显示/隐藏引脚
-
为注释着色的功能
-
灰显禁用节点
-
节点版本管理(针对开发者)
-
任何类型的支持
如需详细了解Chaos数据流编辑器,请参阅数据流图表文档。
Chaos血肉(试验版)

虚幻引擎5.5的试验版Chaos血肉更新重点为:完成简单的单块带动画肌肉、简单的机器学习(ML)示例和完整的肌肉模拟。我们目前正在进行脂肪层的模拟,剩余的任务包括:在同一图表中设置肌肉和脂肪之间的静态约束、验证所驱动的SkeletalMesh外观,以及从GeomCache中为SkeletalMesh训练机器学习模型。
Chaos视觉调试器(测试版)

Chaos视觉调试器(Chaos Visual Debugger)在虚幻引擎5.4中发布了测试版,它是一款记录物理模拟状态(编辑器内或打包的构建)的工具,以便用户在之后将其可视化,同时支持来回拖动时间轴,且能够按对象逐个检查记录的数据。
虚幻引擎5.5中的Chaos视觉调试器仍为测试版,但添加了新功能并进行了几项优化。
新功能
-
场景查询浏览器 :场景查询浏览器(Scene Query Browser)将使用类似于场景大纲视图的全新专用窗口。你可以用此窗口查看任何给定帧中所有的场景查询,并按标签名称或类型等进行搜索。
-
输出日志的记录 :Chaos视觉调试器(CVD)现在能够显示输出日志的记录,这与Unreal Insights的做法类似。你只需在CVD内任选一帧,它就能选定并显示相应的日志行。同样的,当你选择任意日志行时,它也会显示相应的帧。
-
网络函数更新同步模式 :CVD已经可以在编辑器中运行(PIE)会话中记录服务器和客户端的数据,但它们得使用时间戳进行同步。在虚幻引擎5.5中,我们引入了新的"网络函数更新(Network Tick)"同步模式,它将计算并应用所需的偏移量,以按照预期状态显示可视化效果,同时它还考虑到了客户端的预测。在此模式下,你在服务器和客户端之间看到的任何偏差都表示网络出现了不同步。
-
碰撞几何体检查器 :你可以在新的细节面板上按碰撞几何体逐个查看数据记录(而不仅仅是按整个粒子/刚体查看)。此面板在后台处理所有混沌数据,再将其解码并还原为虚幻编辑器中使用的设置。例如,它可以显示几何体是仅可查询还是支持查询和物理效果等。碰撞通道和碰撞通道响应矩阵
-
最近的文件 :CVD将记住最近打开的5个文件,供你通过文件菜单进行访问。
-
加速结构 :CVD现在将记录并显示场景查询系统所使用的加速结构。
-
角色地面约束 :我们新增了对角色地面约束数据的记录和可视化支持。这是我们基于物理的角色移动系统使用的约束类型
-
泛用调试绘图 :现在你可以用C++宏或专用的蓝图节点来记录简单的形状,如球体、方框、线条等,然后在CVD中将其与模拟的其他部分一起可视化。
优化
-
性能 :删除了可跳过的工作并将更多剩余工作移至工作线程,从而优化了几何体的动态生成。未来版本将继续在这方面做出优化
-
显示菜单 :虚幻引擎5.5将显示菜单(Show Menu)重制为虚幻引擎的工具菜单,并添加了保存功能。现在,所有可用的可视化标记都被安排在了子菜单和分段中。此外,当你更改可视化标记时,新设置会自动保存(可按需恢复为默认设置)。
-
粒子着色 :虚幻引擎5.4使用的是Chaos调试绘图所采用的配色方案。那套方案适合线框显示,但不适合实心显示。虚幻引擎5.5则使用了一种不那么刺眼的配色方案,且可按需进行更改。
-
场景查询 :场景查询检查器现将解码碰撞查询的响应标记,以此显示碰撞通道响应矩阵。
Chaos破坏系统

Chaos破坏系统在虚幻引擎5.5中迎来了如下优化
虚幻编辑器优化
-
现在,当选择以下碰撞模式时,几何体集合会正确显示碰撞效果:
-
玩家碰撞
-
可见性碰撞
-
内存优化
- 虚幻引擎5.5减少了几何体集合组件及其对应物理代理的内存占用,因此提高了伸缩性
仅限根代理的自定义渲染器
- 添加了新的自定义渲染器,允许使用实例化静态网格体来渲染根代理网格体,但新版渲染器将使用普通渲染器来渲染损坏状态 新渲染器名为: GeometryCollectionRootProxyRenderer
数据流
-
为数据流编辑器添加了几何体集合的模拟视图,以供用户查看图表生成的最终几何体集合,以及显示所选节点结果的调试视图
-
引入或优化了数个新节点,以完全匹配编辑器破裂模式(Editor Fracture Mode)中可用的工具
-
优化了现存的破裂节点,以更好地匹配破裂编辑器工具中的参数
-
新的径向点分布节点
-
新的网格体切割节点
-
新的FixTinyGeo节点
-
新的重计算法线节点
-
新的验证节点
缓存
- 缓存集合现在迎来了新的插值模式,解决了默认插值模式的限制 使用大时间步长或慢动作重放时,默认插值模式有时难以满足需求
因此我们添加了另一个插值方式选项供用户选择。
-
四元数插值:
-
为标准四元数插值使用常规的FTransform混合方法
-
当时间步长较大或极小(慢动作)时有限制
-
-
欧拉插值:在欧拉角空间中对旋转进行插值
- 可能无法沿最短路径插值
-
双四元数插值:使用双四元数方法进行旋转插值
-
是极端场景中最精确的方法
-
但求值速度可能稍慢
-

Chaos模块化载具(试验版)

虚幻引擎5.5的试验性模块化载具系统是一个载具模拟插件,它可以实现实时的车辆构造和破坏,并允许组件的动态添加或移除。
从虚幻引擎5.4到5.5的更改
现有的Chaos载具插件使用固定的骨骼网格体拓扑结构,而模块化系统则不同,它更加灵活,支持自定义模拟模块和由客户端断定、服务器授权的物理特性,且具有倒回重新模拟功能。载具由多个GeometryCollection Actor构建,并组合在簇并集Actor之内,我们还计划让它能够支持静态网格体。这种模拟是模块化的,组件分配在模拟树中,既可用于创建传统载具,也可用于创建非常规载具。
如需详细了解模块化载具,请参阅Chaos模块化载具文档。
Niagara轻量级发射器(测试版)
新的轻量级发射器(Lightweight Emitter)不会存储任何从一帧到另一帧的状态,只计算可见代理的数据。这大大提高了发射器数量,并带来了受约束的、更快的功能集,从而提高了生产率,并大幅降低了运行时成本、缩短了简单行为的编译时间。
轻量级发射器在虚幻引擎5.4中被作为试验性功能引入,并在5.5中进入测试阶段。
如需详细了解轻量级发射器,请参阅Niagara轻量级发射器文档。
Niagara数据通道
Niagara数据通道(NDC)实现了Niagara系统之间以及Niagara与引擎其他组件之间的数据传递。一个很重要的用例是,使用NDC将事件注入大型共享Niagara系统,为冲击特效等实现更好的性能。
现在NDC在虚幻引擎5.5中为生产就绪状态,优化了用户体验以及运行时能力。
如需详细了解数据通道,请参阅Niagara数据通道文档。
世界构建
外部数据层

现在可以使用外部数据层将世界分区关卡内的Actor关联到特定的游戏功能插件。数据层也可以作为外部数据层的父层。仅在插件激活时,才会注入由此关联生成的流送关卡,而插件激活可在运行时设置。
可以利用数据层编辑器将Actor分配、移动到外部数据层,或是将其从中移除。同时会进行额外的插件依赖性验证,以防止无效组合。
总之,你可以通过外部数据层,使用各种游戏功能插件,在不影响基本游戏内容的情况下,将Actor添加到关卡中,这让外部数据层成为了DLC和实时游戏操作的理想选择。
必须开启世界分区外部数据层编辑器偏好设置,并激活游戏功能插件。
静态光照(试验版)
为世界分区关卡和关卡实例添加了试验性的静态光照支持。光照贴图和体积光照贴图技术均通过CPU Lightmass予以支持。
世界分区关卡的光照贴图数据则根据其Actor流送设置按网格单元进行打包,以进行流送。体积光照贴图使用独立的单元格大小和距离,可在"世界设置(World Settings)- Lightmass"中进行调整。
提供了新的世界分区静态光照Commandlet编译器,建议将其用于在世界分区关卡中加载和烘焙静态光照。
必须 在项目设置中允许静态光照,且 DefaultEngine.ini
配置文件中必须包含 r.AllowStaticLightingInWorldPartitionMaps=1
。
Commandlet示例:
-run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -Builder=WorldPartitionStaticLightingBuilder -Build -LogCmds="WorldPartitionStaticLightingBuilder "
程序化内容生成(PCG)
GPU计算(试验版)

增加了对 程序化内容生成(PCG)框架内GPU计算 的支持。
你可以通过PCG GPU计算,将GPU硬件的部分算力运用在并行和计算密集型进程之上。PCG会在后台编译核心图表,以供在GPU上执行。
数据可以在CPU和GPU之间无缝转换。
也可以直接写入GPU场景 ,从而快速高效地生成大量静态网格体实例,同时不影响CPU性能。直接写入GPU场景会有一些限制,比如不支持碰撞和间接光照。
首个试验版本包括:
-
自定义高级着色器语言(HLSL)GPU核心节点:点处理器、点生成器和自定义HLSL ,让用户能够自己定义输入/输出数据和线程数
-
对点、属性、纹理和地形数据的访问权限
-
提供读取、写入或输出的 基本函数 ,且可逐核心添加 自定义用户函数 。
-
具有 错误报告和语法高亮功能的HLSL编辑器
-
更新了复制点运算符 ,添加了GPU计算选项
-
通过程序化的实例化静态网格体组件, 在GPU上直接生成静态网格体 。
-
将 链式GPU核心 作为 单一操作 编译并执行。
余下的工作包括转换更多当前库中的PCG节点以供在GPU、分支和CPU VM上运行,以支持无界面服务器。
语法

在程序化内容生成的语境下,"语法"是指成形的规则系统,该系统定义了内容应该如何生成或结构化。这些规则通常使用简单的表示方法,如符号或单词,规定如何将较小的元素(如墙壁、柱子或面板)组合或串联起来,从而创建更复杂的结构,如栅栏或建筑物等。
为方便大家通过PCG框架使用语法,虚幻引擎5.5版本引入了数个新节点。这些新节点定义了各种形状,并根据所提供的语法对其进行细分。
节点
-
Select Grammar
-
Print Grammar
-
Clean Spline
-
Reverse Spline
-
Primitive Cross-Section
-
Spline to Segment
-
Duplicate Cross-Sections
-
Subdivide Segment
-
Subdivide Spline
语法的句法
令牌:
文字:任何不含空格的字符串
序列:[a, b, c] 随机选择:{a, b, c} 优先选择:
重复次数(默认:1) 固定次数:[a, b, c]3
零或以上: a*
一或以上: {a, b, c}+
随机选择中的权重(默认:1) 权重说明符: {a**:3**, [b, c]*:2, {d, e}+:1}
示例
[A, B*, C] [Entrance, {Corridor, Doors}*, Exit]
[Entrance, {Corridor+:2, Doors*}, Exit]
{[Entrance, Corridor, Exit], [Entrance, [Corridor, Doors]*, Exit]}
图表执行器v2

新版 PCG图表执行器 在多线程应用中的伸缩能力更强,可以在不受引擎帧时间限制的情况下运行PCG任务。
这有助于降低PCG对响应速度和帧率的影响,并显著优化编辑器和运行时应用场景中的执行墙上时钟时间。
要为编辑器和运行时独立配置并平衡允许的执行帧时间,请使用如下控制台变量:
pcg.EditorFrameTime
pcg.FrameTime
几何体处理

通过虚幻引擎的动态网格体类型,在PCG中直接建模、修改、组合并输出网格体。本功能还允许混合建模和实例化,以适应单一上下文中的不同用例。
示例:PCG建筑生成器可使用语法将模块实例填充到建筑侧面,并为屋顶和地板生成独特的几何体。它可以对生成的屋顶几何体进行重采样,从而在顶部生成资产。它还可以使用图元横截面操作来生成自己的形状模型,并对其应用语法。
此外,为了在进行网格体操作时保证内存和性能的高效利用,PCG现允许在每次操作之间偷取资源,从而尽可能避免了高消耗的数据复制。
首版的实现方案包括:
-
动态网格体数据类型(Dynamic Mesh Data Type)
-
资源窃取(Resource Stealing)
-
静态网格体转动态网格体(Static Mesh to Dynamic Mesh)
-
创建空的动态网格体(Create Empty Dynamic Mesh)
-
获取动态网格体(Get Dynamic Mesh)
-
变换(Transform)
-
合并(Merge)
-
从点附加网格体(Append Meshes from Points)
-
生成动态网格体(Spawn Dynamic Mesh)
-
调试节点支持
-
导出为静态网格体并将动态网格体保存为资产
-
在现有的网格体采样器运算符中支持动态网格体输入
-
使用几何体脚本函数,与PCG蓝图元素完全兼容以扩展功能
样条线网格体

添加了 Create Spline Mesh 节点,以便轻松将网格体分配给PCG中的样条线,进而大大简化了创建样条线网格体Actor的过程。
数据层支持

添加了对透明数据层分配的支持,从而让特定数据层配置(包括外部数据层)中由PCG组件生成的内容能够正确地为其创建的构件分配相同的属性。
World Raycast

添加了 World Ray Cast 节点,以供在PCG中推广光线投射。
有多种光线投射模式可供选择,如无限(Infinite)、缩放向量(Scaled Vector)或从带起点/终点的线段进行投射。光线的方向可以从$Rotation.Up等属性中重载,使用原点输入点的向上向量进行光线投射,从而实现更好的控制。
同时添加了 Create Points Sphere 节点,并提供了不同的选项,如基于测地线、泊松或角度的分布,从而构建简单的光线投射逻辑。
此外,所有光线投射相关节点(如World Raycast、World Ray Hit Query等)现在都可以查询更多 光线击中结果中的属性 ,如 UV、击中法线、渲染材质 等。
Pathfinding

Pathfinding节点增加了对点数据的A*寻路搜索算法的支持。
提供要遍历的点数据后,寻路系统将在给定的搜索半径内搜索点,并在可能的情况下,使用A*搜索算法找到一条从起始位置到目标位置的完整最优路径。系统使用启发法(预估法)预测路径上的下一个点。用户可以对此进行调整来提高性能,但代价是不再保证路径的最优性。
最终路径(如果存在)将以样条线数据或点数据的形式作为输出转发,其中包含表示路径的有序点集合。如果不存在最终路径,也可以选择输出部分路径。
用户在每一步之间都可以进行光线投射测试,以防止路径穿过物理障碍物,还可选择基于属性的路径加权,以帮助指导搜索算法(例如,偏向于平坦表面而不是陡坡)。
Elevation Isoline

添加了 Elevation Isoline 提取节点,该节点能够利用地表数据(如地形)有效地建立等值线。这尤其利于在壁架和斜坡附近精心放置资产。
生成的输出可以是逐等值线的点数据或样条线数据,且可以控制高度、增量和分辨率的最大和最小值。
Write to Niagara Data Channels(试验版)

PCG中添加了新的 Write to Niagara Data Channel 节点,用于将数据直接发送到Niagara系统。
通过将PCG属性写入Niagara数据通道(NDC),相关的Niagara系统就能生成发射器,或将数据用作系统本身的输入。用户可将其用于基于PCG逻辑的运行时上下文生成,例如在特定的生成资产下放置发射器、创建世界环境系统,甚至使用PCG的运行时层级生成和NDC岛状区将发射器实时添加到单个系统中。
要使用此功能,必须激活 程序化内容生成框架(PCG) - Niagara互操作插件 。
如需详细了解Niagara数据通道,请参阅此文档。
Save to PCG Data Assets

Save to PCG Data Assets节点将输入的数据集合从其所位于的PCG图表执行中直接保存到的PCG数据资产中。用户可以打开对话框进行保存,或让系统保存到预定位置。
此节点在图表每次重新运行时都会重新运行,但如果输入相同则不会执行。用户还可以指定描述和颜色。
此节点可用于编译离线收集信息的图表,让其他图表将其作为PCG数据资产使用。
此外,用户现在还可以从PCG编辑器的属性列表视图(Attribute List View)窗口中直接导出各份数据,或导出整份数据的集合。这将便于用户实时导出数据以进行调试,或在图表执行情境之外对数据进行并列对比。
编译器设置和编译菜单

之前的虚幻引擎5.4版本就添加了可以在关卡中生成PCG组件并保存结果的世界分区编译器。
虚幻引擎5.5版本则加入了新的PCG编译器设置资产,有了该资产,用户无需向编译器传输一长串的参数,就能规定编译器的设置。用户可以打开PCG内容浏览器的菜单,用其中的编辑器直接创建PCG编译器设置资产,然后进行自定义。
此类资产可以:
-
通过
-PCGBuilderSettings=/PathToAsset
开关作为编译器参数进行传输 -
被设定为全局项目设置
-
在触发当前加载关卡的PCG编译时,直接通过编辑器内新增的编译(Build)- PCG菜单对其进行定义
额外节点和运算符

除了新增的自定义HLSL、语法、样条线和线段操作、几何体、光线投射、等值线、寻路、样条线网格体、保存到PCG数据资产以及写入Niagara数据通道运算符等元素外,虚幻引擎5.5版本还引入了多个原生的PCG元素,包括:
-
Attract: 根据权重值和吸引距离,将点和属性从源数据插值到目标数据。可用于将点重组,或将缩放或旋转等属性插值到附近的吸引中心。
-
Collapse: 根据迭代搜索距离的阈值来合并点和属性。可用于合并附近的点并与Attract节点配对使用。
-
Blur: 在给定的距离内对给定属性应用空间模糊
-
Cluster: Cluster节点采用传统的集群算法,会尝试从点数据中识别世界空间"形心"附近的点群组。
-
Random Choice: 按比例或固定数量随机选择点或属性集条目。
-
Create Points Sphere:根据球体生成模式(测地线、角度、线段、随机、泊松)生成由点组成的球体
-
Add Component :依照模板组件,或依照存储在属性中的类,逐输入点添加组件到指定的Actor(通过'Target Actor'数据上的属性,或默认添加到PCG组件的所有者)。
-
Get Attribute List: 逐输入数据返回属性列表,每个属性占据一个条目。还可以选择输出内部类型和默认值(以字符串形式)。
-
Bounds from Mesh: 根据属性中提供的静态网格体边界更新输入数据的点边界。
-
Create Collision Data :创建一个数据,该数据将所有点都看作具有碰撞的静态网格体。输出数据为图元数据类型(与体积采样器兼容),可用作差异节点的"差异"部分,以获得更高精度。
Spawn Spline Component: 根据输入的样条线数据生成样条线组件。
-
Wait Until Landscape Ready :等待地形变化(如有)完成。此节点可以配合忽略地形更新的图表/PCG组件上的选项(如忽略地形跟踪(Ignore Landscape Tracking option)选项)一起使用,从而做到在不创建循环的情况下编译影响地形的图表(如放置带地形块的Actor等)。
-
Attribute Remove Duplicate: 删除属性值相同的点或属性集条目。
-
Get Tags: 根据输入数据返回属性列表,其中每个标签分别包含一个条目,还可以选择返回属性值(以字符串形式)。
-
Data Tags to Attribute Set: 返回属性集,每条输入数据只包含一个条目。
-
Sort Data by Tag Value: 根据标签的值对输入数据进行升序或降序排序,例如当输入数据的标签形式为
Tag:Value
时。 -
Filter Elements By Index: 筛选点或属性集,直接获取带有指定索引的新数据。
-
Parse String: 将字符串解析为属性,并将其转换为兼容的PCG类型。
-
Octree spatial queries: 可添加新函数,用蓝图中的点数据八叉树进行空间查询
平台
编辑器预览

编辑器平台预览功能让美术师能在虚幻引擎编辑器中迭代内容(如材质、视觉特效等),并预览设备上将显示的视觉效果。虚幻引擎5.5为移动端游戏的内容开发提供了多项优化。
-
捕获连接的Android设备配置文件的功能,以便预览特定设备上的效果
-
half16浮点精度着色器的模拟(针对所需的材质)
移动端渲染器

虚幻引擎5.5为移动端渲染器带来了多项新功能:
-
前向模式现在支持D-buffer贴花、矩形光源、胶囊体阴影和点光源阴影
-
运行时自动化PSO预缓存,用于替代手动PSO采集工作流程
-
屏幕空间反射
XR分辨率调整
更新了扩展现实(XR)的分辨率调整功能,可更好地匹配引擎的其他部分,并能够利用在OpenXR合成器中执行分辨率修改的能力来实现新的分辨率修改模式(根据OpenXR运行时的不同,行为可能会有所不同)。
-
vr.PixelDensity
已更名为xr.SecondaryScreenPercentage.HMDRenderTarget
, 以表示它只能用于空间分辨率修改,且不应在运行时进行频繁更改。这就类似于PC端的r.SecondaryScreenPercentage.GameViewport
。XR禁用了PC端的控制台变量,你应该改用xr.SecondaryScreenPercentage.HMDRenderTarget
。此外,现在对应HMD的理想渲染分辨率标准值是"100",而不是"1.0f"。xr.SecondaryScreenPercentage.HMDRenderTarget
的原理是改变最终渲染目标的大小,并允许渲染结果通过OpenXR合成器在空间上自动进行分辨率修改(变大或变小)。即使后期处理不可用,这一功能也可执行,这种情况就类似于在关闭移动端HDR的时候使用移动端渲染器。
-
即使后期处理不可用,虚幻引擎现在同样支持XR的动态分辨率,这种情况就类似于在关闭移动端HDR的时候使用移动端渲染器。使用控制台变量
xr.MobileLDRDynamicResolution
即可开启这一功能。注意,要使用动态分辨率的话,你必须像平常一样将其启用,而且你的XR设备必须使用特定于本设备的虚幻引擎插件将其开启。
visionOS 2.0(试验版)
对visionOS 2.0和混合沉浸模式(Mixed Immersive Mode)的试验性支持,可通过Metal实现直通式支持。
详情请参阅Apple Vision Pro快速入门指南。
移动端前向渲染器和PC端前向渲染的功能对等性
我们正在对移动端前向渲染器进行功能更新和性能优化。一旦其功能与旧版的PC端前向渲染器达成对等,我们就会将其定为PC VR的推荐渲染器。我们在虚幻引擎5.5中为其引入了如下功能的支持:
-
可移动点/聚光源IES纹理
-
胶囊体直接阴影
-
贴花
-
矩形光源
-
体积雾
-
Niagara粒子光源
-
可移动的点光源阴影(仅支持D3D,不支持Vulkan)
音频
Audio Insights

Audio Insights是分析和调试音频的主要工具。我们在新版本中提供了独立的模式和额外的可视化调试优化,具体如下:
-
适用于远程连接的独立Audio Insights模式
-
高频绘图仪数据
-
保存选项卡布局
音频控件

音频行业十分看重花哨的音频控件。人们认为定制化、流畅、精美的用户界面不可或缺,因为业界广泛采用的标准就是如此。我们也正在改进当前的控件系统,为加强其可定制性,我们将提供一套系统,专门用于制作外观精致的自定义音频控件。
-
基于UMaterial创建可扩展控件,让设计师为常见控件创建自定义的UMaterial。
-
提供UMaterial的基础实现方案。
注意事项
-
材质性能对用户界面性能的影响。
-
与Metasound的集成。
MetaSound的易用性

新版本为 MetaSound 和 音频调制 进行了多项编辑流程优化:
-
新的控制台命令
-
播放图表前无需使用空格键点击画布
-
辅助节点:Get Last Index
-
优化对预设工作流程的转换
-
支持箭头键的下拉菜单
-
为声音预览功能添加播放/停止按钮
-
快速输入提升
-
简单视图选项
-
隐藏未连接的引脚
-
右键点击从CB创建MS资源
-
清空未使用的输入
-
将getname添加到声波资产
-
清除延迟线音频
-
支持在引用中查找
-
以及更多优化
MetaSound页面

允许用户根据平台目标切换MetaSound图表或默认属性。
-
支持预设
-
可以按平台自定义输入和属性
-
在编辑器中预览页面和页面回退方案
-
可以为低端平台创建更简单/更廉价的图表,而无需改变Gameplay
MetaSound相对渲染成本

多个或相对较大的MetaSound并发播放可能导致大量的CPU时间成本。在受限的平台上,如果MetaSound使用的CPU预算过高,就会因为CPU瓶颈而对其他游戏系统产生连锁反应。通过使用动态语音计数, MetaSound相对渲染成本 能够让MetaSound的有效"语音数"更准确地反映MetaSound的真实渲染成本。在受限的平台上,大型MetaSound应该可以占用多个语音的计数,并有效减少被同时解码的并发声波数量。
-
性能指标直观化
-
能更好地限制CPU
-
平台/CPU的独立指标
注意
要启用语音限制,请使用:
-
CVAR au.EnableRelativeRenderCostVoiceLimit 1
-
播放Metasound源时,MetaSound编辑器将在左下角显示相对渲染成本。
-
au.debug.soundwaves 1
的调试界面将在CPU占用率的旁边显示相对渲染成本(RRC)。
建模
建模工具(测试版)

虚幻引擎5.5为建模工具带来了以下优化:
-
焊接和折叠
-
焊接现在将焊接至中心。新的"焊接至(weld to)"工具将焊接至最后的所选项。
-
为更多用例启用了边缘折叠,例如关闭单个三角形的洞。
-
只要可以分成两个独立的序列,焊接和桥接功能就可以同时在多个群组边缘上运行。
-
只要可以将顶点选择转换为适当的边缘选择,那么焊接、桥接和折叠功能就可以对选择顶点进行操作。
-
焊接功能还可以焊接一对顶点,而折叠功能可以对选择面生效。
-
-
变换和对齐: 除网格体类型之外,现在还可以处理所有图元组件。
-
编辑枢轴点: 如果编辑枢轴点(Edit Pivot)工具运行时存在激活的几何体选择,它会为该选择初始化枢轴点的位置(仅位置,默认方向不变)。此外还支持进行拖动以仅改变方向。
-
塑造: 启用手写笔和平板设备插件后,顶点和动态塑造笔刷将支持笔刷强度的压力。
-
拆分工具: 拆分工具现在可以显示网格体拆分的预览,并且添加了新选项,可以按多边形组、材质ID或顶点距离公差进行拆分,让用户可以跨越未焊接的边界进行拆分。
-
网格体至碰撞: 网格体至碰撞(mesh-to-collision)工具的用户界面上明确添加了用于凸包分解的选项(之前该功能被隐藏在凸包的设置中),并默认使用新的寻路驱动算法(不过你仍然可以切换到旧方法和/或手动请求凸包数量)。
-
多边形剪切: 多边形剪切(Polycut) 添加了'剪切外部(cut outside)'选项。
-
图元: 新的胶囊体工具,支持改变沿圆柱截面的切片数量。
挤压多边形(Extrude Polygon)、挤压路径(Extrude Path)和旋转路径(Revolve Path)现在会根据用户的选择来初始化其绘图平面,包括选择的几何元素(如果可用),以便用户绘制与所选顶点/边/面对齐的新形状。
- 立方体网格: 如果运行时存在激活的选择元素,则从枢轴点位置初始化(类似于编辑枢轴点,会保留默认方向)。
如需了解更多信息,请参阅建模模式概览。
建模工作流程(测试版)

选择转换: 网格体元素选择转换涵盖所有情况,因此当选择类型发生变化时,选择依然会被保留/转换
网格体元素选择颜色: 更新了网格体元素的颜色。现在可在项目设置中自定义颜色设置
如需了解更多信息,请参阅网格体元素选择文档。
UV工具(测试版)

-
笔刷/涂料UV选择工具: 适用于2D和3D视口,并且可以选择一次刷一个岛状区。
-
"创建岛状区"操作: 将所选项变成单独的岛状区(即删除所选项内的所有接缝,并沿其边界创建接缝)。将此操作与笔刷工具结合使用,可以让用户在先前由于拓扑结构不佳而难以绘制接缝的情况下创建岛状区。
-
变换UV工具: 位于建模工具的UV分段。将UV值从使用"现有位置(Existing Position)"方法简化的网格体变换为原始的网格体,从而让用户在简化的网格体上完成UV的布局,然后将其还原为原始的高分辨率网格体。
-
新的布局选项: 我们还添加了在重新打包岛状区时保持比例或旋转的选项
-
导出UV快照: UV编辑器和烘焙工具现已能提供烘焙的UV快照。这让用户能够导出具有用户可控的线框显示颜色和宽高比的图像。
如需了解更多信息,请参阅UV编辑器文档。
纹理工具(试验版)

-
新节点
-
柱状图扫面(Histogram Scan)
-
柱状图范围(Histogram Range)
-
边缘检查(Edge Detect)
-
扭曲(Warp)
-
纹理路径(Texture Path)
-
-
优化了3D预览中的默认材质: 新材质为基础颜色(BaseColor)、粗糙度(Roughness)、法线(Normal)、高光度(Specular)和金属感(Metallic)等标准材质通道提供了开放插槽。
-
新导出模式: 新的导出纹理图表(Export Texture Graph)模式让用户能使用纹理图表作为具有公开输入/输出参数且可复用的实用工具,且无需查看整个图表。
如需了解更多信息,请参阅纹理图表入门指南课程。
几何体脚本

动态网格体组件 现在还支持静态绘制路径(Static Draw Path)和距离场(Distance Fields)的渲染选项,并且可以与Lumen一起使用(尽管其Lumen网格体发片比静态网格体发片更简单)。
几何体脚本(Geometry Scripting) 库新增了五十多个新的几何体脚本节点,分别属于十几个功能类别。例如,新版本加强了骨骼网格体的互操作性,包括变形目标、蒙皮网格体配置文件、骨骼权重函数和LOD。此外,我们还添加了数个新函数,来帮助用户处理网格体上的碰撞对象和凸包分解。我们还针对网格体添加了许多特定功能,包括网格体选择、网格体修复和网格体UV打包等。为简化填充池化的临时动态网格体相关的工作,我们添加了新的宏,供用户请求和释放网格体。
如需了解更多信息,请参阅几何体脚本用户指南文档。
内容管线
导入交换框架

交换框架为用户提供了更简单的方法来创建、扩展和参数化导入/重新导入,不久还可以对导出、工作流程进行上述操作。
随着关卡导入功能在虚幻引擎5.5中的完善,以及部分用户界面的更新,交换框架的资产导入功能进入了 生产就绪 状态,而关卡导入功能则进入了 测试 状态。关卡导入功能会创建资产,并将模型的层级结构生成到关卡中。
我们的工作重点是:
完善关卡导入管线,特别是针对FBX格式的管线。内容创作者现在可以通过交换框架完全自定义自己的FBX管线。
-
至于关卡导入的输出,有新选项可以让用户创建 关卡实例Actor 。
-
重新设计了碰撞用户界面和行为,尤其针对重新导入功能进行了优化。
-
对导入对话窗口进行了一些外观更改。
交换工作流程改进

交换框架为用户提供了更简单的方法来创建、扩展和参数化导入/重新导入,不久还可以对导出、工作流程进行上述操作。
交换功能的拓展:
-
添加了仅适用于编辑器的蓝图管线,用于从自定义管线访问编辑器的功能;
-
能在骨架网格体上处理动画和变形目标;
-
为MaterialX导入添加了对部分布尔值和自定义输入的支持;
-
为glTF导入添加了对各向异性扩展和附加功能的支持;
-
与节点相关的元数据现在将被存储在Actor上。
使用交换功能(试验版)自定义USD资产的导入

USD是一种用途广泛的场景描述文件格式,在3D行业的采用率日益增长。
交换框架增加了对USD格式的支持。内容创建者现在可以对导入过程进行更多控制,可以为USD文件的资产导入添加自定义的处理步骤,类似于FBX等其他格式已有的交换功能。
交换功能对USD的支持仍处于试验阶段,且仅限于资产的导入。支持的资产类型包括:
-
纹理
-
材质
-
材质实例
-
静态网格体
-
骨骼网格体
-
动画序列
USD的支持和性能
USD是一种用途广泛的场景描述文件格式,在3D行业的采用率日益增长。内容创建者、美术师使用它在DCC之间传输3D内容,尤其是场景描述。它最初用于媒体娱乐行业,现在其用途开始蔓延到游戏和其他行业,如汽车、建筑等。
我们为虚幻引擎5.5做了大量工作,从而 缩短导入/加载时间 并减少 超大型舞台 的 内存占用 ,尤其针对 使用大量可实例化对象 的舞台。这将在加载/重载舞台Actor以及常规导入用例中得到展现。这样一来,我们能够加快场景的迭代速度,并在更多机器(尤其是内存较小的机器)上加载舞台,从而改善编辑流程。
针对虚幻引擎加载/导入的过程,我们提供了一款折叠API,从而对折叠元素进行更精细的控制。
框架
状态树用户体验和事件

我们对新版状态树(State Tree)编辑器进行了大幅度的用户体验优化,采用了更为亮眼的颜色、图标和无障碍选项。我们还添加了新的大纲视图窗口,以帮助用户更快地浏览大型的状态树。

我们改进了对条件事件的支持,添加了针对负载结构体的选项。例如,这可用于描述造成的伤害类型和数值,或噪音事件的响度和位置。
状态树运行时

为了丰富可选择的状态,我们添加了2个新的状态选择器:
-
工具状态选择器(Utility State Selector),基于分数进行选择。
-
随机状态选择器(Random State Selector),均匀且加权地进行选择。
我们还提供了与主树并行运行子树的功能,从而添加了对并行任务的支持。
最后,我们添加了属性绑定函数,让用户能够对发送到属性的值进行计算。这对于组合和计算其他参数或外部引用而言非常有用。

如需详细了解状态树选择器,请参阅状态树选择器概览文档。
状态树对比工具

随着多成员的大型团队使用模块化状态树功能协作创建更加复杂的AI系统,我们需要更好的方法来将状态树的差异可视化,让用户能更高效地使用此类共享数据。 类似于之前的蓝图对比工具,新的状态树对比工具更适合以这种方式审查工作,并轻松识别添加/修改/删除的内容,从而加快团队的审查和调试工作流程。
Gameplay摄像机

在虚幻引擎中协调摄像机将变得无比简单。我们计划提供一种新的工作流程,流程中包含各种工具和数据资产,通过将系统拆分为多个按逻辑进行组织的文件,从而实现多用户摄像机审核。用户团队应该能够轻松地以模块化方式编辑新的摄像机,并将它们集成到系统中,以灵活和简化的方式处理不同设置之间的转换。我们的工具集无疑能够大大简化摄像机的调试工作,因为我们正在尝试让系统和调试工具与倒回调试器兼容。
如需详细了解Gameplay摄像机系统,请参阅Gameplay摄像机系统文档。
结构体实用工具
结构体实用工具(Struct Utils)插件最初在虚幻引擎5.0中登场。从那时起,我们就在不断优化其易用性。现在,它已进入生产就绪状态,并将在未来得到全面支持。 结构体实用工具已被移入引擎模块,不再是单独的插件。
实例化Actor

实例化Actor是一项新功能,其设计目的是减少游戏世界中Actor过多而造成的开销。它的原理是用Mass实体替换Actor,并在Actor和实体之间进行即时转换(即水合/脱水过程),从而在人口密集的开放世界环境中提供更高的性能。 转换过程由Mass LOD系统负责,采用距离到观察者的逻辑来控制,另外也可用物理追踪来触发水合过程。
这种方法在拥有大量使用同一网格体的Actor时最为有效,例如大型环境中的岩石和树木。
自动寻路链接生成

虚幻引擎5.5提供了一种自动生成短距离寻路链接的方法。
-
功能启用后,系统通过复用寻路碰撞数据,生成寻路链接(Navlink),并将其作为寻路网格体图块生成流程的一部分。
-
寻路链接的轨迹会遵循指定的长度、高度和其他参数。
-
系统还将验证轨迹既不会发生碰撞,还能遵循代理程序的半径。
-
用户还可以使用
UGeneratedNavLinksProxy
类,在路径追踪期间以类似于自定义链接的方式发现并处理生成的寻路链接。
调试:
-
调试显示选项可以显示寻路链接的轨迹和轨迹验证。
-
还可以通过某个选项显示被过滤掉的链接。
-
可以检查特定的边缘,从而查看链接生成所使用的步骤。
-
生成的链接会与其他寻路链接一起显示,但会以粗线条表示。
-
寻路链接构建时间将与其他寻路网格体构建时间统计数据一起显示。
如需详细了解自动寻路链接生成,请参阅自动寻路链接生成文档。
移动器插件 - 动画支持

随着我们不断开发并改进新的角色移动器,我们让它能够跟上虚幻引擎5最新、最强大的动画技术,包括运动扭曲、优化的动画根运动支持以及运动匹配的轨迹查询。
学习代理程序

学习代理程序(Learning Agents)是一款虚幻引擎插件,让游戏开发者能够使用强化学习和/或模仿学习来训练并部署机器人。
从虚幻引擎5.4到5.5的更改:
重新设计的ML训练代码
-
我们重写了机器学习(ML)训练代码,让用户能更好地控制网络协议和ML训练算法
-
网络协议现在接受数量可变的网络和数据缓冲区,以支持BYOTA
支持额外的网络协议
-
学习代理程序现在可以灵活地支持多种网络协议。
-
TCP套接字 - 适合通过局域网(LAN)进行通信
-
共享内存 - 非常适合在本地机器上进行快速通信
-
-
最终用户可以添加自己的外部训练器协议,从而扩展学习代理程序的网络
引入你自己的训练算法(Bring Your Own Training Algorithm,BYOTA)
-
重写了学习代理程序的Python部分,让用户能更轻松地集成现成的ML训练算法,或自定义Python训练代码
-
用户可以直接在自己的项目工作空间中进行更改,无需修改学习代理程序的代码库
添加了Mac和Linux的训练
-
Mac和Linux也支持训练了!
-
Linux目前同时支持共享内存和套接字网络协议,而Mac目前仅支持套接字。
编辑器和用户界面系统
加强的UMG文本渲染功能

这项更新将优化字体的视觉保真度和渲染性能,并具有以下文本渲染功能:
-
现在缩放字体不会损失清晰度。这意味着文本在各种大小下都会显得更为清晰。
-
通过在材质中使用距离场,实现描边和投影等更高质量的效果。
-
更低的运行时内存占用。
可脚本化工具

-
模块化行为: 添加了基于模块化行为的新工具,取代了虚幻引擎5.4版那套基于点击和点击拖动操作的工具。
-
工具编译器: 添加了对工具编译器的支持,包括对工具目标和自定义工具编译器的支持。
-
筛选条件和集合: 添加了对工具组筛选条件的支持,以便管理大型的工具集合。
-
点/线/三角集: 添加了对点/线/三角集的支持,与渲染事件中的旧版图元绘图支持相比,能支持持久绘制的对象。
-
控件: 添加了对蓝图脚本视口控件的支持,允许对工具的用户界面进行更多自定义。
-
鼠标行为: 在模块化行为工具库中添加了对多次点击、单击、双击、单击拖动、单击或拖动、鼠标悬停以及鼠标滚轮ITF行为的支持。
-
输入行为: 增加了对ITF单键/多键输入行为的支持,并为可脚本化工具公开了支持。
如需了解更多信息,请参阅可脚本化工具系统文档。
额外插件目录
用户现在可以指定引擎和项目之外的目录,从而直接用插件浏览器解析插件!此类文件夹中的插件可以像其他插件一样出现在浏览器中。用户可以使用此功能维护动态的工具库,让工具库可以在同一个中心位置更新,并被所有项目引用。
批量重命名工具

批量重命名工具(Batch Renamer)插件先前在虚幻引擎5.4中以高级重命名工具(Advanced Renamer)的名称发布,在 5.5版本中改名并重新发布,并将成为虚幻编辑器核心体验的一部分。该插件允许用户同时重命名多个资产和Actor,并同时添加前缀/后缀。在虚幻引擎5.5种,批量重命名工具的用户界面得到了一些更新,以便匹配虚幻引擎5的风格。
引用查看界面用户体验优化

用户现在可以右键点击引用节点并选择"解析引用中的属性(Resolve Referencing Properties)"操作,以便直观地查看哪些属性正在通过其引用节点引用该节点。目前,当使用节点资产作为引用/值或类型时,此选项会检索属性。
将来我们可能会显示特定类型(材质、字体等)的信息,例如引用纹理的材质参数的名称。
引用查看界面还获得了一些可用性优化,用以改善内容重构体验:
-
拉远画面时更容易发现被折叠的节点,且当只有一个引用时不再进行折叠
-
编辑器偏好设置中的项目将正常生效
-
编辑器不会再因为加载大型图表而卡顿
StylusInput插件
重写了支持手写笔和平板设备输入的StylusInput插件。它的新API更明确、健壮且性能更高,原因如下:
-
需要为各个窗口明确请求平板设备输入的上下文。这样能确保仅在实际需要时才生成平板设备数据,并且应用程序/插件仅接收其所需的平板设备数据。
-
平板设备数据以数据包流的形式直接转发,同时将状态管理都交给客户端代码。这避免了之前插件实现中出现的问题,即由于仅在一个函数更新期间评估平板电脑数据,导致整个应用程序负载过大,进而导致数据包丢失或性能下降。
-
插件的用户可以选择用游戏线程还是异步线程回调新的平板设备数据。在大多数情况下,在游戏线程上获取数据可以避免进行线程同步,而异步调用一般具有更高的性能和/或为最终用户带来更低的延迟。
StylusInput插件目前仅能为支持Windows Ink的Windows平台提供平板设备数据。我们计划在未来版本中支持Linux和Mac。另外,虽然该插件可以转发鼠标输入,但它同样仅在支持Windows Ink的Windows平台上可用。我们计划在虚幻引擎5.6中为所有平台回滚为仅支持鼠标输入。
我们弃用了旧版的以 UStylusInputSubsystem
为中心的API,并计划在未来的版本中将其删除。要继续在编辑器中使用旧版API,请启用控制台变量 stylusinput.EnableLegacySubsystem
。
媒体
针对视频和自发光材质的媒体IO Holdout合成

在过去的版本中,我们为媒体板Actor添加了名为"覆层合成材质(Overlay Composite Material)"的快捷菜单,它有助于解决时间超级分辨率(TSR)脏污瑕疵的问题。现在我们废弃了这一功能,取而代之的是 发布了名为Holdout合成(Holdout Composite)的新插件和组件 ,该插件和组件具有以下优化点:
-
绕过了视频/媒体板的TSR和色调曲线:避免因缺乏运动向量和(有时)色彩变换不理想而产生脏污瑕疵。
-
适用于正面的半透明物体。之前的实现方案并不具备这种功能。
-
可选择是否进行曝光补偿,这意味着你可以控制视频内容是否要受实时眼部适应功能的影响。
约束
-
仅适用于无光照材质。
-
要求Alpha输出,且必须支持图元Alpha Holdout项目设置。
-
尚不支持半透明视频。
媒体IO时间码轨道支持

我们正在为 ImageMediaSource和FileMediaSource视频资产添加时间码支持 ,从而让它们可以在Sequencer中被正确放置并使用。图像序列的时间码元数据可通过手动字段进行设置,而标准视频文件的则可通过MOV容器进行解析。
-
为Sequencer添加了对时间码轨道的支持并将其公开给Sequencer。
-
添加时间码支持:
-
ImgMediaSource(可编辑字段)
-
FileMediaSource(通过MOV容器面板)
-
制片渲染管线
影片渲染图表(测试版)

虚幻引擎5.4成功推出了 影片渲染图表 的实验版,在此基础上,我们依然在努力优化基于图表的新版配置工作流程。新版的开发工作对以下三项工作予以同等关注:图表配置的新工作流程优化、基于最初用户反馈的改进、与旧版预设配置的等效性优化。虚幻引擎5.5将带来如下更新:
-
集合内的 可生成对象 。
- 临时Actor可通过名称进行引用,从而免去了为使用可生成对象的场景进行额外设置的开销。
-
优化了 控制台变量 管理。
- 无需重新打开图表,即可在队列(Queue)窗口中配置重载项。
-
设置了 控制台命令 开始/结束(Start/End)。
- 与渲染相关的触发器逻辑(例如来自蓝图的逻辑)。
-
优化了32位 后期处理材质 支持。
-
助力管线工具和脚本使用的 脚本标签(Script Tag) 。
- 脚本可以解析图表,从而更轻松地找到需要进行访问或修改等操作的特定节点。
-
引用动态模糊(Reference Motion Blur) 在 Path Traced Renderer 节点上可用。
-
渲染所有摄像机(Render All Cameras) 在 Camera Settings 节点上可用。
适用于所有资产类型的渲染图层

在试验版的影片渲染图表中,部分关键Actor类型缺乏被用作 Holdout 的能力,或是缺乏 修饰符(Modifier) 中的部分或全部其他选项。虚幻引擎5.5则提供对所有Actor类型的基本支持,现在包括:
-
半透明对象
-
Niagara特效
- 借助对半透明对象的支持。
-
异类体积
-
地形
-
无天空球体的天空大气组件
- 渲染图层最初只支持有天空球体的天空大气组件,但现在已无必要。
自定义EXR元数据

虚幻引擎5.5推出了新的 Set Metadata Attributes 渲染图层节点,它允许用户配置自定义的属性,而这些属性将在渲染到EXR输出类型时作为EXR元数据被写入。元数据属性是由用户驱动的键值对,可对渲染时提供的默认元数据进行扩展(例如GPU、驱动器、内存使用等)。用户可以使用斜杠符号(/)创建元数据的组织结构,或者为动态元数据创建文件名格式令牌。
此节点也可编写脚本,也可以通过Python添加节点来让管线自动创建元数据,这样一来,就不必在编写完成EXR文件后让自定义工具插入元数据。
图表内的Avid DNxHR/Apple ProRes格式
影片渲染图表 将提供输出类型节点 Apple ProRes Movie 和 Avid DNxHR Movie。图表中这两种节点的功能得到了优化,提供了新的 质量(Quality) 属性,为美术师提供了每种编码解码器的标准选项集。在旧版预设系统中,质量是作为特定值被硬编码的,用户无法修改。
这两种格式还能正确嵌入Sequencer的时间码,从而提高了编辑互操作性。
Cryptomatte/图表内对象的ID

在虚幻引擎5.5中, ObjectIDs 将被作为渲染器节点提供给影片渲染图表。
协议
DMX

除了作为插件核心的GDTF格式和MVR格式集成外,包括控制台、像素映射和冲突监控器在内的数字多路复用(DMX)技术堆栈现在达到生产就绪状态,直播节目设计师、虚拟制片操作员以及所有希望使用DMX驱动编辑器内嵌元素进行实时预览的用户都可以放心使用了。
控制台提示和用户体验
-
提示(Cue) 使用户可以存储并加载多项控制台配置。
-
编辑器插接 优化了用户界面的集成度。
-
支持GDTF ,同时还集成了读取默认值和物理调节器值的功能,为调节器添加了 第三选项:
-
DMX
-
规格化(Normalized)
-
物理
-
像素映射颜色精度
为输出颜色空间(Color Space)设置增加了对传输函数(线性、sRGB、自定义2.2/2.4伽玛曲线)的支持。
数据冲突监测
-
显示发送DMX的对象,即使它们并未引起冲突
-
转到发送DMX的对象的选项
-
打开发送DMX的对象的选项
-
与发送到网络的大量DMX数据相关的性能统计数据
远程控制DMX配接系统集成

将签名(Signature)添加到远程控制 。签名与DMX灯具类型类似,也是公开属性的集合,它让用户能够对大量Actor快速重复相关过程。在之前的版本中,用户必须为每个属性手动定义域(Universe)和配接ID(Patch ID),但现在,只要创建了签名并公开了Actor的属性,用户也可以将它们配接并保存在DMX库中,以便进一步控制。
远程控制DMX配接系统集成 旨在提供一种与当前DMX技术堆栈自然协调的机制,并让用户通过远程控制来使用DMX,从而控制任意虚幻引擎Actor。
此功能适用于虚拟制片、现场活动或所有需要使用DMX控制虚幻引擎中任意Actor的情况。
虽然签名的灵感来自DMX,但这一概念也可用于其他协议,以缩短向远程控制公开属性所需的时间。
-
可将类似的公开属性集快速应用于Actor的签名
-
用于配接和导出GDTF/MVR文件的DMX库
-
优化了用户体验,提高了可用性,这不限于DMX工作流程
-
优化了驱动大型属性集时的性能
平台SDK升级

-
Windows
-
Visual Studio 2022 v17.10或更高版本
-
Windows SDK 10.0.22621.0或更高版本
-
LLVM clang
-
最低:18.1.3
-
首选:18.1.8
-
-
.NET 4.6.2 Targeting Pack
-
.NET 8.0
-
-
构建农场编译时面向的IDE版本
-
Visual Studio 2022 17.8 14.38.33130工具链以及Windows 10 SDK (10.0.22621.0)
-
Xcode 15.4
-
-
GDK
-
Windows SDK最低版本:10.0.22000.0
-
GDK: 2024年6月更新2
-
最新恢复版本
-
支持的IDE:Visual Studio 2022
-
-
Linux
-
原生Linux开发
-
推荐操作系统:Ubuntu 22.04、Rocky Linux 8或更高版本、Redhat Linux 8或更高版本
-
编译器:clang 18.1.0
-
-
交叉编译工具链:基于v23 clang-18.1.0
-
-
MacOS / iOS / tvOS / iPadOS
-
推荐操作系统/Xcode
-
最新的macOS 14 Sonoma
-
Xcode 15.4或更高版本
-
-
最低操作系统/Xcode
-
macOS 13.5 Ventura
-
Xcode 15.2
-
-
测试版操作系统/Xcode(见下方批注)
- macOS 15 Sequoia
-
支持的目标SDK版本:
-
iOS SDK版本:15
-
macOS SDK版本:13
-
visionOS SDK版本:1
-
-
iOS图形API: Metal 2.4 - 3.1
-
其他批注
- Shader Model 6(SM6)要求macOS 15。此项支持目前为测试版,暂不推荐应用到生产环境。
-
-
Android
-
Android Studio Koala 2024.1.2 2024年8月29日版
-
Android NDK r25b
-
Android SDK
-
推荐: SDK 34
-
用于编译UE的最低版本: SDK 34
-
用于发售的默认目标SDK: SDK 34
-
SDK最低安装级别: SDK 26
-
如果你使用AGDE进行调试,推荐使用AGDE v23.2.91以上版本,因为该版本修复了SIGBUS错误。
-
-
构建工具:34.0.0
如果你要使用35.0.0版,那么在Windows上使用aidl时可能会出现问题。
-
Java运行时:
-
openjdk 21.0.3 2024-04-16
-
OpenJDK运行时环境(版本21.0.3+-12282718-b509.11)
-
OpenJDK 64位服务器虚拟机(版本21.0.3+-12282718-b509.11,混合模式)
-
-
其他批注
-
虚幻引擎已更新为使用Gradle 8.7,我们使用的Android Gradle插件(AGP)版本也已更新为8.5.2。如果你使用Android Studio进行调试,那么推荐使用Android Studio Koala。Ladybug也可用,但 不要 从上述版本更新Gradle或AGP。
-
选择NDK等级时,应该以android-26为目标,因为它支持Android 8.0以上版本。
-
-
-
EOSSDK
- 1.16.4-36651368
-
Steam
- 1.57
-
Switch
-
SDK 18.3.1
-
最低固件版本:19.0.0-2.0
-
Nintendo Dev Interface 2.6.0
-
支持的IDE:Visual Studio 2022
-
-
PS4
-
Orbis SDK 12.008.011
-
系统软件12.008.011
-
支持的IDE:Visual Studio 2022
-
-
PS5
-
Prospero SDK 10.00.00.40
-
系统软件10.01.00.00
-
支持的IDE:Visual Studio 2022
-
-
ARCore
- 1.37
-
ARKit
- 4.0
-
OpenXR
- 1.0.27
版本说明
Animation
API Change:
- ILODSyncInterface's SetSyncLOD and GetCurrentSyncLOD functions have been deprecated in favor of functions that allow separate control over the LOD requested for streaming and the LOD used for rendering.
New:
-
Added preview scene controller to animate character in any animation viewport using pose from any other running instance of the same skeletal mesh.
-
Multiple skin weight profiles can now be activated at the same time and layered on top of each other. This is currently limited to two layers and the active profiles cannot have overlapping weights, on the same vertex, that differ from the base.
-
The skeleton tree now has an option to show the internal bone indices.
-
[AnimationCore] Expose EEulerRotationOrder as blueprint type, which should be the enum to use when it comes to rotation order across animtion systems, including control rig.
Bug Fix:
- Fixed an issue where an actor using the LOD Sync Component, such as a MetaHuman, would only ever use the lowest LOD if the project had LOD streaming enabled.
Deprecated:
- USkeletalMesh::GetHasBeenSimplified and USkeletalMesh::SetHasBeenSimplified have been deprecated and should no longer be used. This information is already stored per LOD and can be accessed with FSkeletalMeshLODInfo::bHasBeenSimplified.
Animating in Engine
New:
-
Sequencer: Anim details: Shift does range select, and use new method to get display names to fix modular rig bugs with details panel
-
Sequencer: Control Rig: Add option to have non-grouped channels still get sorted when other groups are present. This is needed for a request to get the Control Rig WeightChannel first in the outliner when active, otherwise to hard to find.
-
Sequencer & Control Rig - Changed the default behavior when adding new control rig track: rigs added later now are evaluated after existing rig tracks by default, instead of before. The evaluation order can still be changed by right clicking on the Control Rig track and changing the order number.
-
Animator Kit plugin - when Animator Kit plugin is enabled, it also enables the "New TRS Gizmo"(Gizmo Framework) plugin, which allow you to enable the new TRS Gizmo via "Editor Preferences - General - New TRS Gizmo - Enable New Gizmos"
-
Sequencer: Anim Details: Add support for interactions and driven controls
-
Sequencer: Add bake settings to load animation into section for control rig so you can do proper key reduce and keep controls
-
Animator Kit Plugin - Added Sculpt Deformer Control Rig & Deformer Graph. Its implementation can be found in /Plugins/AnimatorKit/DeformerRigs/
-
Sequencer & Control Rig - Control Rig asset picker no longer shows rig modules as they are not intended for sequencer usage
-
Sequencer & Control Rig - Updated UI for the control rig asset picker when adding new Control Rig tracks. Also added asset filters based on ControlRigBlueprint Variant Tags. New tags can be created in Project Settings - RigVM Project Settings - Variant Tags. And these tags can be assigned to ControlRigBlueprints via Class Settings - Variant - Asset Variant.
-
Sequencer: Anim Details: Show anim details for sequencer selected objects/components not editor selected, per animator feedback
-
Sequencer: Add Force Evaluate BP/Python function to make sure we evaluate immediately, this is needed for example with control rig's since they get setup lazily on evaluation.
-
Sequencer: Anim detail fixes: Added support for bool,integers, floats and doubles
-
Sequencer Control Rig picker - It now shows rigs that can work with any skeleton, in addition to rigs created specifically for the active skeletal mesh when "filter by skeleton" is turned on
-
Animator Kit Plugin - Added CameraSpaceLatticeDeformer Control Rig & Deformer Graph. It can be used to deform a skeletal mesh from the viewpoint of the "Camera Handle" control. This control can be constrained to a cine camera to allow for deformation control from the perspective of the cine camera. Its implementation can be found in /Plugins/AnimatorKit/DeformerRigs/
-
Sequencer: Change default behavior so Control Rig Section to Keys are set based upon what section is selected in the outliner
-
Sequencer: Linked Anim Sequences. Allow ability to specify custom range when saving out custom time range, includes BP/Python functions.
-
Animator Kit Plugin - Added Lattice Deformer Control Rig & Deformer Graph. Its implementation can be found in /Plugins/AnimatorKit/DeformerRigs/
-
Sequencer: Constraints working with snapper tool
-
Sequencer: Fix overshoot for Smart and Auto tangents
-
Sequencer: Control Rig:Can now run PIE and animate a Control Rig in editor window at the same time.
-
Sequencer: Anim Details: Attributes are now shared per animators request, instead of just showing the first one.
-
Sequencer: Fix so User/Broken tangents get set to curve slope automatically wherever added in Curve Editor or Sequencer. Need to make sure we only do this when within the keys, if a key is added outside it stays flat.
-
Constraints: Space Switches: Add buttons to compensate key or all for spaces like we can for constraints.
-
Sequencer: Anim Details: Per animator feedback we only select curves on the section to key section when there are multiple sections.
-
Sequencer: Control Rig: New Smart Baking algorithm added as a curve filter, make new filter default for reducing control rig keys when baking, add bp/python support.
Bug Fix:
-
Sequencer: Animation Baking in subsequences would get the incorrect time range.
-
Sequencer: Anim Details: Fix Rotators not working with anim details and selection not working with actors.
-
Sequencer: Tween tools: Fix divide by zero crash with new Push Pull tween and change blend to ease function based on animators feedback
-
Sequencer: Control Rig: When collapsing, recording animation keys use preferred rotators.
-
Sequencer: Anim Details: Group keying properties in anim details to one undo.
-
Sequencer: Control Rig Make sure to tick the mode manager so pending deactivated modes are really deleted before enabling a new control rig edit mode.
-
Sequencer: Control Rig: Fix crash after undo add rig then add again, need to remove the stale control rig node from the layer instance proxy
-
Sequencer and Control Rig only reconstruct in the game thread #changelist validated #virtualized
-
Sequencer: anim Details panel add support for constraints.
-
Sequencer: Anim Detail Fixes, reset to default and vector3d working #changelist validated #virtualized
-
Sequencer: Control Rig: Make sure when collapsing by key the key is in section range
-
Sequencer : Anim Details: Make sure to set sequencer on edit mode and pass that through to tabs to avoid crashers
-
Sequencer: Control Rig: Restore selection state when refreshing tree view and make sure to clear sequencer when selecting in viewport/outliner
-
Sequencer: Control Rig: Fix collapsing sections when there are no absolute sections.
-
Sequencer: Anim details: Fix slow selection due to details panel getting recreated too many times, use timer handle now to make sure we only tick next once.
-
Sequencer: Anim Details: Use Relative values directly to avoid quat/rot conversions.
-
Sequencer: Anim Details: Fixed anim details showing multiple curves with multiple actors
-
Sequencer: Constraints: Only recreate channels if there is a valid world on the Control Rig.
-
Sequencer: Control Rig: Disable control rig not letting other objects to key with 'S'
-
Sequencer: Control Rig: Change the control mask from index based to be a set of names of masked out controls. Indices aren't reliable since the number of controls for rigs now changes for most rigs based upon how it is getting set up, e.g IK for FK settings now change the number of controls.
-
Sequencer: Control Rig: Don't refresh bones transforms if post evaluating when restoring state.
-
Sequencer: Control Rig outliner, speculative crash fix, reset delegate handles directly and check for null hierarchies
-
Sequencer : Anim Details: Move updating values when we are dirtied to only happen on next tick so we only do it once instead of possibly thousands of times.
-
Sequencer: Control Rig: Keep selection on IK/FK controls if selected and they lose visibility
-
Sequencer: Control Rig: Don't reset the mask if we have zero available controls
-
Sequencer: Constraints: Make sure to evaluate all constraints when baking
-
Sequencer: Anim Details: Don't update if compensating
-
Sequencer: Control Rig: When getting object replaced delegate don't force sequencer to rerun if the track is muted
-
Control Rig: Rotation Orders: Fix various issues with rotation orders.
-
FK Control Rigs: Fix channels keys not showing up on creation or load do to the track/section models not getting recreated. Need to mark as changed and wrap the change in a transaction for the view model to make the change. This will probably also fix some load time issues with AnimDataModels.
-
Control Rig: Snapper: We had an optimization to not re-evaluate a snap if we are on the current Sequencer frame but that will break do to how we gather frames (we could have gathered the last frame most recently). So just remove that check.
Gameplay
New:
-
Add experimental prediction to orientation warping
-
Improved PoseSearchDatabase indexing performances that was causing stutters in databases with lots of assets
-
[Motion Matching] Added sync groups support for the motion matching.
-
[Sync Groups] Added flag to stomp previous leader info (bOverwriteLeaderPosition).
-
[Sync Groups] Added a new role (ExclusiveLeader) which will make a tick record tick as ungrouped if it fails to be a leader.
-
-
Expanded Motion Warping plugin to support non-Character actors using adapters, and added warping support to Mover plugin #virtualized
-
[Motion Matching] Made PoseSearchDatabase items with an incompatible Skeleton have a red tint on their name to warn users.
-
Added UPoseSearchLibrary::IsAnimationAssetLooping to gather animation asset looping state in a thread safe manner
-
[Motion Matching] Added warnings for an empty PoseSearchDatabase item and an asset with an incompatible skeleton.
-
[Motion Matching] PoseSearchDatabase item's asset picker now filters based on if the asset is compatible with the PoseSearchDatabase's schema.
-
Improve debugging on OrientationWarp - Save prediction info so prediction can be analyzed during pauses
-
Added UPoseSearchLibrary::GetDatabaseTags to gather PoseSearchDatabase Tags in a thread safe manner
-
[Motion Matching] Able to perform all of the PoseSearchDatabase item's options via the right click context menu.
-
Changed display name for UAnimNotifyState_PoseSearchBlockTransition from "Pose Search: Block Transition" to "Pose Search: Block Transition In"
-
Made USkeleton::GetBlendProfile BlueprintThreadSafe
-
Fixed blend profiles support in BlendStack anim node
-
Improvements for motion matching debug lines rendering
-
Introduced normalization groups to motion matching schema channels to be able to normalize them together
-
Small performance improvements for motion matching
-
Added PoseSearchDebugger support to scrub RewindDebugger recordings after PIE has been stopped
-
Exposed PoseSearchAssetSampler to blue print via PoseSearchAssetSamplerLibrary
-
Added initial motion matching support for AnimNext
Bug Fix:
-
Fixed curves not being normalized from range 0 to 1 in FootAnimEventsModifier.
-
Fix Orientation Warping Counter Compensate undoing root motion rotation.
-
[Motion Matching] Fixed issue where selecting a BlendSpace, AnimMontage or AnimComposite for an item in a PoseSearchDatabase fails.
-
Add a strong interp to Counter Compensate to address stuttering when correcting between two samples between the same frames
-
Prevent Foot Placement running when an actor is dropped into the level viewport
-
Fixed montage segment details ticking the scene in the widget instead of via the viewport client. This was prone to crashes when force ticking slate widgets.
-
Fix to prevent Offset Root Bone anim node overwiting scale
-
[Motion Matching] Asset browser refreshes its asset list when the target PoseSearchDatabase's Schema changes
-
Fix Orientation Warping jittering with counter compensate - Don't update root motion direction based on prediction. - Remove threshholds / checks needed for contunity due to innapropriate root motion direction setting
-
Fixed editor freeze when deleting a BlendSpace from a PoseSearchDatabase
-
Fix Crash ChooserTableEditor due to 'SelectedColumn' not added to GC. - Add SelectedColumn to Root like 'SLevelEditor' does for 'SelectedElements'
-
[Motion Matching] Added content browser to the PoseSearchDatabase Editor.
-
keeping numerical errors in check in FAnimNode_OffsetRootBone::Evaluate_AnyThread
-
Fix for UPoseSearchDatabase::CachedAssetMap garbage collection
-
Fix for crash in UBlendSpace::ResetBlendSamples when adding a blend space into a pose search database
-
Fix for BlendSpace playback in BlendStack when repurposing an anim player previously playing a sequence
-
Fix for PoseSearch and Cook determinism by removing unneeded UPoseSearchSchema::PreSave
-
Fixed motion matching trajectory generation when gravity and collisions are applied
-
Fix for compatible skeletons support in pose history
-
Fix for crash during blue print compilation containing FAnimNode_PoseSearchHistoryCollector_Base with bInitializeWithRefPose set to true
-
Fixed ConditionalPostLoad dependency to UMirrorDataTable for motion matching
Deprecated:
-
Deprecated UPoseSearchDatabase::GetAnimationAssets
-
Deprecating FMotionMatchingState properties ComponentDeltaYaw, ComponentWorldYaw, AnimationDeltaYaw
Movie Render Queue
New:
-
New: Added the ability specify cvars at the job/shot level for graph-based configurations. These cvars will override any cvars set within the graph.
-
New: Added the "Is Spawnable" query to graph collections.
-
MovieGraph: Added support for 32-bit output on additional post-process materials.
-
New: Added the ability to frame nodes within the graph, or zoom out to show the entire graph (included in the View menu).
-
New: Added drag/drop capability for most collection queries in the graph.
-
MRG: Reference Motion blur should enable Reference DOF Post-processed Depth-of-Field does not work well if the input is already motion blurred. When using the reference motion blur mode, automatically turn on reference DOF.
-
New: Added the ability to re-order graph variables (drag/drop) and assign them to categories. The categories themselves are also re-orderable. The variable order/categorization is reflected in the job variables in the queue UI.
-
New: Added the "Avid DNxHR Movie" node to the graph. Note that this requires the "Avid DNxHR/DNxMXF Media" plugin to be enabled.
-
New: Added two new timecode properties to the Global Output Settings node ("Custom Timecode Start" and "Use DF Timecode if 29.97 FPS"). These properties affect the timecode that's included in the output from the Avid DNxHR Movie and Apple ProRes Movie nodes, and also the burn in that's displayed in the default burn-in widget with the Burn In node.
-
New: Added the "Apple ProRes Movie" node to the graph. Note that this requires the "Apple ProRes Media" plugin to be enabled.
-
New: Added support for the Object ID pass (aka Cryptomatte) to the graph via a new "Object ID" node.
-
New: Added the "Set Start/End Console Commands" node to the graph.
-
New: Added a "Set Metadata Attributes" node to the graph, which adds metadata to graph output files (currently, only EXRs will pick up the metadata).
-
New: Added the ability to duplicate a condition group condition in the graph.
-
New: Updated the "Actor Name" condition in the Collection node to match spawnable actors. This is a side-effect of an update to spawnables in general to give them a more readable name when being spawned.
-
New: Updated the picker for the Actor collection query in the graph to include a checkbox selection mode.
-
New: Updated pinned property promotion to set the new variable's default value to the current value of the property.
-
New: Added the "Actor Layer" query to graph collections.
-
Added the "Data Layer" query to graph collections.
-
New: Updated the Set Console Variable node to make promoting the Value property more streamlined. The "Value" in the context menu includes the name of the cvar -- eg, "Value (r.SomeCVar)". Also, when promoting the "Value" property, the new variable is given the name of the cvar.
-
New: Added a new "Script Tags" property to nodes in the graph to allow for easy identification within scripts.
-
New: Updated the Post Process Materials property to include an additional "Name" field (optional) that will be used as the pass name in file name formatting (the {renderer_sub_name} token in the graph, and the {render_pass} token in legacy MRQ). If a custom Name is not provided, the entire PPM's name name will be used.
-
New: Updated the "Apply Console Variable Preset" node to allow per-cvar pin promotions (so individual cvars within the preset can be overridden easily).
-
New: Added the ability to drag a pin to the Inputs/Outputs nodes in the graph and have the input/output created automatically (rather than creating the input/output manually, then doing the connection).
-
New: Added the ability to enable/disable individual collections within a "Modifier" node in the graph.
-
New: Added tooltips throughout the graph that specify a variable's description (in the Members panel, the variable node and variable node pin, and the queue UI).
-
New: Added "Duplicate" for variables in the graph.
Bug Fix:
-
Bug Fix: Fixed a freeze that could occur when using the Command Line Encoder node with a sequence that is playing audio.
-
MovieRenderPipeline: Fix broken EXR channel names on linux
-
Bug Fix: Fixed a crash that could occur if the queue has contents removed while a render is occurring. Removing queue contents is now blocked during a render.
-
MRQ: Fix tiling logic to allocate history per tile. The code could result in excessive memory allocations in this case.
-
Bug Fix: Fixed an issue that caused undo to reset the selection in the graph.
-
Bug Fix: Fixed an issue that caused the sublevel picker in the Collection node to load all sublevel assets, causing lengthy freezes in large projects. The picker will no longer trigger asset loads.
-
Bug Fix: Removed support for the "Buffer Visualization" view mode on the deferred renderer node in the graph because it could cause a crash.
-
MovieGraph: Removed reliance on cvars for the (deferred renderer) 32bit setting on additional post-process materials, allowing per-layer support.
-
Bug Fix: Updated the graph's preview window to hide burn-in and widget render layers.
-
The Command Line Encoder node no longer requires the executable (specified in Project Settings) to be part of the project if the path isn't absolute (PATH will be searched).
-
The Command Line Encoder node no longer generates incorrect warnings about missing {shot_name} and {sequence_name} tokens.
-
The Command Line Encoder node now handles sequence-level encodes correctly (ie, the file name format excludes {shot_name}).
-
Bug Fix: Updated the "Editor Folder" collection query in the graph to traverse into subfolders.
-
Bug Fix: The autowire context menu in the graph is now restricted to nodes that can only be connected on that branch type or pin type.
-
Bug Fix: Fixed a crash that could occur when Save As'ing over an existing graph that's already open.
-
Bug Fix: Fixed a bug where the C++ add-node API (UMovieGraphConfig::CreateNodeByClass()) didn't work properly when called from Python.
-
Bug Fix: Fixed several quirks in the file name format autocomplete widget.
-
Bug Fix: Fixed the detail lighting mode (via View Mode Index) not properly working on the Deferred Renderer node.
-
Bug Fix: Updated the lighting components on the path tracer node to work properly. Previously they were exposed under Show Flags which did not work properly. A dedicated Lighting Components section was added, which instead affects the post processing volume's path tracing Lighting Components properties.
-
Bug Fix: Updated the "Write All Samples (Debug)" feature to work for the deferred and path traced renderers in the graph.
Mutable
New:
- Added a new modifier, 'Transform Mesh In Mesh', that uses a secondary mesh as a region to specify a volume in which to transform vertices, using the given transform input.
Rigging
New:
-
Improved component editing in skin paint tool
-
[Deformer Graph] Added "TwoLayerLinearBlendSkin" deformer function, which serves as an usage example for the new layer skinning option added to the "Skeleton" Data Interface. It allows you to use two skin weight profiles to skin your character. The primary skin weight profile may only contain weights for primary bones like arms and legs, while the second skin weight profile only have to specify weights for tweaker bones (with the exception of the root bone) that are parented to those primary bones.
-
Expose TriangleEdit in skeletal mesh editor.
-
Improved retargeter debug drawing.
-
[Deformer Graph] Added a new version of the "Skeleton" data interface that supports additional features such as
-
Access data from any skin weight profile,
-
Access per-bone animation attributes as bone buffers, similar to the existing bone matrix buffer
-
Enable layered skinning that allows for layering of multiple skinning kernels using multiple skin weight profiles, which may be helpful if you want to separate skin weights for primary bones and tweaker bone into two different skin weight profiles. See new deformer function DG_Function_TwoLayerLinearBlendSkin for example usage.
-
-
Deformer Graph - exposed attribute name as a input property pin on the "SkinnedMeshVertexAttribute" data interface, which can then be driven by a Deformer Graph variable from Blueprint or ControlRig
-
A new function, FSkeletalMeshOperations::GetPosedMesh, was added to get a posed copy of a skeletal mesh's FMeshDescription. This function allows specifying either a full set of component space transforms, or a named set of bone space transforms, keyed to specific bones. It also supports activation of morph targets and selecting specific skin profiles to use for posing the mesh.
-
Deformer Graph - Added support for a variable node to connect to a constant node to override its value. This may be useful for providing pin default values to input pins on deformer functions/sub-graphs. Users of these functions can override these values using additional variable/constant nodes connected to those input pins. This is a temporary solution before pin default values are implemented for Deformer Graph.
-
Deformer Graph - Added a new deformer function "ComputeNormalsTangentsAndKeepImportedNormal" that first computes the rotational offset between the imported normal and the recomputed normals derived from the rest pose vertex positions, and then reapplies this offset to the recomputed normals derived from deformed vertex positions, in a attempt to construct deformed normals that retain the characteristics of imported normals.
-
Deformer Graph & Control Rig - Added "AddDeformer" Node in Control Rig, which allows any Control Rig to dynamically add deformation effect to the bound skeletal mesh using a deformer graph during forward solve. Deformer Graphs used in this context can use the new "ReadSkinnedMesh" data interface to read the output vertex buffers from a previous deformer if there are multiple "AddDeformer" nodes present. When right clicking on the "AddDeformer" node, click on "Refresh Variables" to make Deformer Graph variables appear as input pins on the node. See various Deformer Rigs shipped with the "AnimatorKit" plugin for example usage.
-
Added "Hammer" weights operation to skin weight tool.
-
Deformer Graph - Added a compilation error when there are kernels with no valid execution domain present in the graph
-
Deformer Graph - Show "Outdated" on data interface node title if there is a newer version of the data interface.
-
Deformer Graph - Added error messages when compiling/running a deformer graph that contains a debug draw data interface with unsupported platform project settings, which should help diagnose why certain deformer graphs are failing silently if it contains this data interface.
-
Added ability to Copy/Paste skin weights between selections of vertices.
-
Deformer Graph - Added "Skin Weights as Vertex Mask" Data Interface, which combines the skin weights of multiple bones into a single per-vertex weight map. Useful for limiting deformation effects to certain body parts of a character using existing skin weights, instead of having to paint another vertex attribute weight map.
-
Deformer Graph - Added support for using Deformer Graph variables/constants to set properties values on data interfaces. See "Skinned Mesh Vertex Attribute", "Skeleton" and "Skin Weights as Vertex Mask" data interfaces for example usage.
-
ControlRig - Added a new flag "AllowMultipleInstances" under "Sequencer" category in ControlRigBlueprint class settings that allows multiple instances of the rig to be added to the same character in sequencer. It may be useful for Deformer rigs like the lattice control rig shipped with the "AnimatorKit" plugin, where users can add multiple lattice deformer to the same character.
-
Deformer Graph - Added API support for changing the pins shown on a data interface node based on data interface property. See the new UOptimusAdvancedSkeletonDataInterface data interface class for example usage if your custom data interface has such needs.
-
Deformer Graph - Added support for array-type variable, which can be driven from ControlRig via "AddDeformer" node by right clicking on the node and click "Refresh Variables", or from Blueprint via "Set Variable" API on a OptimusDeformerInstance, just like normal deformer graph variables.
-
When converting a static mesh to a skeletal mesh, using the asset browser, the converter now gives a choice of setting the target path for the skeletal mesh; removing and adding prefixes and suffixes; and allows specifying the root bone location, if not using an existing skeleton.
-
Determinism pass on RigVM hashing
-
Added isolated selection support to the skin weight editing tool.
-
Deformer Graph - Deformer Graph should now also support Mac platform
-
Added ability to edit skin weights while previewing the pose from a running PIE session.
Bug Fix:
-
Fixes issue in skin paint tool where user could not paint with relax brush unless bone was selected
-
Fixe a crash in Control Rig when undocking the hiearchy and closing one editor while multiple editors are open
-
Fixes issue where editing skeletal mesh with non-manifold geometry scrambles material assignment.
-
Fixed bug where skin weight editor would load non-normalized weights.
-
Auto-retargeter window no longer slow in large projects with many animation assets.
-
ControlRig - Fixed a dead lock issue that can happen during Control Rig post load, when calling FRigVMTemplate::Resolve.
-
Fixes static mesh to skeletal mesh conversion losing multiple UV channels
-
Deformer Graph - Fix crash when collapsing a link between a component source pin and a group pin into a sub graph.
-
Fixed RigVMEdGraph generating invalid model node paths for EdGraph subgraphs, when a function that contains a collapsed graph is renamed.
-
Prevent control rig debug draw displaying in game view mode when high resolution screenshots are taken
-
Added some safety checks to compute graph/optimus to prevent crashes on nullptr.
-
Fixed an editor shutdown crash due to shared pointer cross dependency at ControlRigModeTools
-
Deformer Graph - Fix an out of bound access with Duplicate Vertices Data Interface. It should not use the section vertex index offset because the content of Its data buffers are only meaningful when the kernels are dispatched per material section instead of per mesh.
-
Allowed UScriptStructs to be pre-registered for use with FRigVMRegistry
-
Deformer Graph Editor - Fix debug draw/shader print provided by the "Debug Draw" data interface not showing up in deformer graph editor viewport
-
Deformer Graph - Fixed unconnected "Color" pin on "WriteSkinnedMesh" data interface can lead incorrect/random vertex color values for skeletal meshes using the Deformer Graph.
-
Fix issues importing RigVM pin default values for structs with native ImportTextItem implementations
-
Switched to using FLazyName for control rig built in types to avoid static init order issues in PGO builds
-
Deformer Graph & Skeletal Mesh Editor - Change Skeletal Mesh asset details to show new vertex attribute weight maps under "LODInfo - Vertex Attributes" immediately after weight map layer creation, allowing users to enable new vertex attributes for Deformer Graph usage without having to reopen the skeletal mesh editor.
-
Deformer Graph - Fixed Trigger Graph cannot be triggered from blueprint using EnqueueTriggerGraph API
-
Deformer Graph - Fixed bad motion vectors when skeletal mesh using a mesh deformer changes LOD
-
ControlRig - fixed name related nodes having different behaviors in editor vs in packaged. Nodes like replace/concat now use IgnoreCase.
Deprecated:
- Deformer Graph - Deprecating lattice deformer function shipped with the Deformer Graph plugin. Use the new lattice deformer rigs shipped with the Animator Kit plugin.
Runtime
New:
-
Anim notify and sync marker workflow changes
-
Skeletons are no longer dirtied when adding notifies and sync markers from animation timelines.
-
Skeletons can still hold sync markers and notifies, but they are not mandatory and they can all be held in animation assets if required.
-
'Find References' for notifies and sync markers now launches the find/replace dialog when selected from the animation timeline.
-
Removing notifies and sync markers from the skeleton now does only that. To remove from animations, use the find/replace tab.
-
-
New: Make PhysicsControl work with PrimitiveComponent, not just meshes.
-
New: PhysicsControl adds a function that can be used to zero the implied velocities when moving a character.
-
Update warning message in UAnimationAsset::ReplaceSkeleton for clarity
-
Added Root Motion Attribute handling to Inertialization and DeadBlending nodes.
-
ControlRig AnimNode - Added support for using Enums as input pins on the ControlRig AnimNode.
-
Disable 'Add Socket' action in skeleton tree when a bone is not selected
-
New: Better help text relating to animation syncing.
-
New: Adds an editor-only option to enable/disable each BlendSpace sample in "analyse all"
-
ModifyCurve anim node now generates debug data
-
Updated LLM reporting for Animation Graph to more accurately reflect actual usage.
-
Expose functions on the various cached anim state machine types to blueprint
-
New: Rename PhysicsControlProfilesAsset to PhysicsControlAsset - no functional changes, and the redirector should fix up any existing assets. Note that this is still an experimental feature.
-
[AnimRuntime] Added an optional interpolation override when sampling animations. This makes it possible to force sampling animations in Step interpolation mode even though the Anim Sequence assets are set to Linear.
-
New: PhysicsControl supports the body modifier "default" movement type, so it doesn't force a change to the movement.
-
Bug Fix: PhysicsControl/RigidBodyWithControl fixes problems initialising physics assets that have kinematic bodies.
-
Bug Fix: PhysicsControl/RigidBodyWithControl makes sure that when controls are disabled, the constraints are removed and the RigidBodyWithControl reverts node back to its uncontrolled state.
-
-
Added a flag to allow skeletal mesh component's animation to be completely disabled
-
Added support for blend mode in Montage Inertialization when used in conjunction with DeadBlending node.
-
Added a log at additive retarget bone transform function, to detect bone size differences between the retarget transforms array and the skeleton required bones.
-
Add editor option to hide long list of enum blueprint actions in the ABP editor. The bound enum can now me set in the node's property window.
-
The RigidBodyWithControl animation node has a viewer (previously called "editor") that lets users see lists of controls, modifiers, sets etc. However, this does not always function as expected, so until it is improved it has been hidden behind the CVar p.RigidBodyWithControl.EnableControlSetViewer which is disabled by default.
-
Use UToolMenu for AnimNotifyTrack ContextMenu. This allows users to customize the menu and apply permissions.
-
New: Improve help text for BlendSpace evaluator, which doesn't always behave as expected regarding the time input.
-
Added option to disable animation ticking when a skeletal mesh is directly occlusion/frustum culled
-
Skeletal mesh global scale animation now has a minimum value of zero
-
Clamp montage playback when stopping at end of section
-
Skeletal mesh editor now uses the required bones to display the skeleton tree, so the bones stays in sync with the preview scene. This will make clear which bones are excluded or not, as the required bones might have some bones that can not be removed from the LOD due to physics or other various needs.
-
Improved blueprint navigation speed when several assets are open and we double click to jump to other asset or element, like a state machine state
-
Morph target maximum blend wheight is now configurable at render settings. Value can be also controled using a cvar r.MorphTarget.MaxBlendWeight
-
New: BlendSpace analysis provides an alternative orientation calculation method which avoids problems when the pointing bone is not restricted to an "upright" orientation
-
Added support for mirroring root motion
Bug Fix:
-
Fixed a rare crash when running initial pre-evaluate GT anim instance tick
-
Fix montages not being marked dirty when (e.g.) adding curve comments or changing curve colors
-
Fix issues with selection in the montage editor selection. Marquee selection now requires Alt key.
-
Revert changes to AnimGetter nodes that led to invalid data and added a compile time error to check for these broken nodes and instructions to replace them.
-
Bug Fix: Makes the action buttons in the BlendSpace details appear when searching
-
Fixed crash in blend profiles when skeleton mapping is incomplete.
-
Changed 'missing bones' ensure to be a logged error
-
Fix notifies not being displayed in context menus under certain circumstances
-
Fix for crash when validating auto rule based transitions. Also reinstated some warnings as info
-
RandomPlayer anim graph node now calls PreloadRequiredAssets.
-
Allowed post process Animation Blueprints to be applied based on a LOD threshold per-component
-
Fix budgeted skeletal meshes that are placed in levels not getting registered when playing as client
-
Fix for issue where looping level sequences could get stuck on the final frame
-
Optimized the opening of notifies/sync marker widget
-
Fix edge cases around re-importing meshes with bones inserted into the hierarchy
-
Add missing fast path icons for blend space nodes
-
Add missing nullptr check on animation blueprint editor preview instance
-
Fix to set transient Skeletal Mesh Asset property when value is changed on an actor in level viewport
-
Fix viewport cursor style in animation editors when hovering mesh info text
-
Fixed issues copying and pasting notify states in montages
-
Fixed an issue where the animation notify copy / paste menu items stopped working
-
Bug Fix: Ensure the RigidBodyWithControl pose cache is big enough, allowing it to work even when the skeleton is updated whilst the node is operating.
-
Fix anim getter node title not updating on state rename.
-
Make automatic transition rule account for transit durations smaller than delta time value
-
Exposed a native way to get the 'main' anim instance in a thread safe way
-
Deprecated USkeletalMeshComponent::SetAnimClass function
-
Fix Lyra PIE property access issues caused by use of 'most up to date' classes
-
Fix pose watch not drawing correctly for debug skeletons larger than preview.
-
Fix copy-pasting shared transition rules not behaving correctly.
-
Fixed BlendSpace log spam in TickAssetPlayer function by setting the log as Verbose
-
Fix crash in 'call function from anim graph' node BP menu population
-
Fix for animation blueprints incorrectly showing animation graphs using animation layers default shared group in my blueprint.
-
Removed double-call to RemapTracksToNewSkeleton for 'this' sequence when remapping skeleton
-
Fix montage network compatibility between editor and non-editor builds
-
Fixed recording of anim notify states in looping montage sections
-
Fixed an issue where the experimental AnimNext plugins accidentally showed the beta tag
-
Fix bone names being drawn for bones when they're not visible
-
Fix crash with setting bone name in skeletal mesh region bone filter.
-
Fix an issue where closing a stand-alone viewport resulted in a crash.
-
Fix for an issue where WheelController anim node wasn't updating upstream nodes in the anim graph
-
Fix FAnimMontageInstance::GetNextSection to return next section of instance rather than the montage default next section.
-
Fixed TSAN race condition around bForceRefPose flag
-
Fix for aim offset anim node to account for socket offset when calculating pivot location
-
Fixed crash when reverting Skeletal Mesh unsaved change while the asset is opened in the editor
-
Changed PersonaToolkit raw object pointers to weak object pointers, so validity can be checked
-
Account for possible invalid section when montage is force moved
-
Fixed OnlyTickMontagesAndRefreshBonesWhenPlayingMontages option updating the anim instance multiple times
-
Exposed bShouldStopAllMontages pin in latent Play Montage node
-
Fixed anim sequence cooking indeterminism issue with curve names and added some checks to help detect some cases
-
Fixed animation budget allocator debug rendering sometimes getting removed
-
Fix animation editors selecting the incorrect bone for non-mesh bones leading to array out-of-bounds
-
Fixed function renames not applying to property access nodes and compilation crashes post-rename
-
URO now ignores non-visible mesh components to prevent invalid LOD params being set
-
Fixed problems editing various property types in anim notifies (e.g. FGameplayTagQuery and FRuntimeFloatCurve)
-
Fix for cook warning related to skeletal mesh component instance data introduced by 35191113
-
Fix issue with byte properties containing enums where default pin values weren't being set
-
Fix pose watches not being drawn in PIE
-
Fix pose watches using multicolor bones
-
Fixed Regenerate LOD button not getting enabled in the Skeletal Mesh Editor under some circumstances
-
Fix crash when destroying nodes that have no outer animation blueprint
-
Fix crashes when using ref pose overrides when using skeletons with virtual bones
-
Fix anim BP node orphan pins not getting removed on disconnection
-
Updated icons for animation asset find/replace tab
-
Notify list are now refreshed after Undo / Redo on animation sequences, to avoid crashes caused by active tooltips
-
Fixed crash setting a preview animation blueprint
-
Fix pasted 'anim getter' nodes introducing hidden references to their source animation blueprint
-
Fix native bitfield-bool properties writing to incorrect memory when exposed as pins on linked anim graphs
-
Fix unfixable warnings when variables referenced in in anim graph node pin bindings are removed
-
Fixed a crash at the asset editor module manager due to bad dependency with the preview scene
-
Fix animation attribute registration issues with attributes defined as user-defined structs
-
Fixed memory leak when switching skeletal meshes and setting animation mode during montages
-
Fix for issue where anim streamable couldn't be created directly from anim sequence asset #changelist validated #virtualized
-
Breakpoints in Animation Blueprints can now get hit when not debugging a specific object
-
Editor fix for transient values being reset at SkeletalMeshComponent for Blueprint created components at PostEditChange
Sequencer
Bug Fix:
- Remove support for weighted blendables in camera animations/shakes. This wasn't really needed, and caused problem with weights animated by gameplay code which would get stomped by Sequencer.
Synthesis
New:
-
[MLDeformer] - Enable tests for the editor framework, updated all tests to latest API etc. - Cooking improvements, where stripped data is recovered after cook. - Ability to select a training device. This allows you to pick a specific GPU to train on, or choose CPU. - Added some extra Cuda related logging, to help debugging issues. - Added checks to validate training data, checks for NaN and Inf etc in NMM. - Add another return code from the training, and improve error logging in NMM (show call stack etc). - Some other small typo fixes etc.
-
[MLDeformer] Copy over all shared settings when switching between model types.
-
[MLDeformer] Removed the delta cutoff threshold property and filtered out bad deltas. This also fixes the problem where the delta cutoff length was removing deltas in post-skinning space in the viewport, while removing them with the same length in pre-skinning space. This would possibly cause deltas removed during training that shouldn't have been removed.
-
New: Improvements to the Physics Control Asset Editor. Note that the feature remains experimental.
-
[MLDeformer] Changed some default settings to see higher quality result on first training. This makes it easier for new users. More advanced users can tweak the values to reduce memory usage and increase performance at runtime. The values changed are: - Compression level, which was 20 before, but now 1.0 - Delta Zero Threshold, which was 0.0025 before, and now 0.001.
-
The File Cache options have been hidden from the UI in the Nearest Neighbor MLDeformer Model with a cvar "MLDeformer.NearestNeighbor.ShowFileCacheCategory". File caching only works in very specific circumstances, and is not recommended except within the same training session, and even still it may not work correctly.
-
[MLDeformer] Automatically create two hidden layers when creating a new Nearest Neighbor model. And automatically create a section as well.
-
[MLDeformer] Show an error when the deformer can produce visual shading artifacts. This can happen when no deformer graph is used while skin cache is disabled and the materials don't have 'Use with morph targets' enabled.
Bug Fix:
-
[MLDeformer] Fixed a bug where the heatmap in ground truth mode would flicker. Playback in ground truth mode is now disabled for now as this causes issues due to differences in geom cache and anim sequence sampling. Scrubbing works as we can force things to be at the right frame.
-
[MLDeformer] Fixed a bug where the heatmap could get in a wrong state when toggling it on and off while playing, and while in ground truth mode while playing, and then scrubbing.
-
[MLDeformer] Fixed a crash when switching between NMM and NN and back to NMM models.
-
[MLDeformer] Fix a crash when saving a level after creating a character blueprint with Vertex Delta Model in it and a compute graph component.
-
[MLDeformer] Improved handling of delegate bindings, which could prevent crashes.
-
[MLDeformer] Fixed an issue where ground truth heatmaps were incorrect on some frames. Disabled showing ground truth heatmaps while playing the animation as well as that just doesn't work well due to frame differences. Directly added some extra error handling in the Neural Morph Model and logging some info about the Cuda hardware used.
-
[MLDeformer] Fixed the timeline from breaking when switching models. This was because some delegates were still pointing to the old editor model which got destroyed after switching models.Directly fixed a few small errors in the comments.
-
[MLDeformer] Fixed a crash when having an ML Deformer asset open, with HeatMap enabled, while untrained in testing mode and reloading the skeletal mesh it uses through "Asset Actions -> Reload".
-
[MLDeformer] Fixed a bug in the Finalize Morph Targets button where the memory usage wasn't reported correctly. Also fixed an issue where the editor uncooked asset didn't include the compressed morph targets. And fixed a typo in the button's tooltip and added a bit more information. Also made the Finalize Morph Targets button disabled when there is nothing to finalize.
-
[MLDeformer] Fixed a crash when there are no input sample animations, and the NMM is set to local mode, and you click a bone.
-
[MLDeformer] Fixed a crash when switching models and then clicking the LOD "Auto" button.
-
[MLDeformer] Fixed some pytorch deprecation warnings and fixed an issue when switching from global to local mode after having trained in global mode. This had to resample data.
-
[MLDeformer] Fixed a crash when packaging a project with a blueprint that has a VertexDeltaModel based ML Deformer inside it.
-
Fixed an issue where the Editor may crash on exit after training the Nearest Neighbor Model.
-
Fixed an issue where the Nearest Neighbor Model would underestimate the available GPU memory when training, causing it to allocate more than was available.
-
Fixed python crashes when training the Nearest Neighbor Model on machines without CUDA.
-
[MLDeformer] Fixed a little bug when switching model types. It didn't auto select the correct input anim in the timeline.
-
Fixed an upgrade issue when opening existing old Nearest Neighbor Model assets, which would cause some training tools such as the Key Pose Extractor to fail to open.
-
[MLDeformer] Fix some crash when pressing Undo in a specific case.
-
[MLDeformer] Bug fix when switching back and forth between ML models and then train again. Also some small tweaks to the python training code to move a tensor to the gpu when using gpu. And moved some display logging to verbose while sampling frames.
-
[MLDeformer] - Fixed a crash when deleting bones from the bone list in local mode. - Make sure the ML Deformer component gets reinitialized after training and after updating its trained input info object. - Handle the case when the deformer is not compatible with the current skeletal mesh.
-
[MLDeformer] Vertex delta model was still using the NNE RDG instead of ORT, which caused it to not be able to run the model properly.
-
[MLDeformer] Add an extra improvement to the handling of bindings in the ML Deformer Component. Also removed the quality level from the ML Deformer component as that isn't used anymore since we added LOD.
-
[MLDeformer] Fixed a crash in the Nearest Neighbor Model where the GetNumBaseMeshVerts() is 0, which can be caused by the imported model data not to be present.
-
[MLDeformer] Fixed a crash and potentially incorrect behavior when switching from Local mode to Global mode in the Neural Morph Model.
DMX
New:
-
Conflict monitor now shows a list of objects actively sending DMX even when no conflicts are detected.
-
Add progress bars when loading a large DMX library into control console or pixel mapping.
-
Control Console - Implement highlight selected patches in the fixture patch list when in custom layout.
-
Rework Blueprint Nodes and Runtime API to reset and clear DMX buffers
-
DMX Subsystem now has a Blueprint Node to clear DMX Buffers.
-
Fixture Patch now offers Blueprint Nodes to send default and zero values.
-
Monitors now update when DMX Buffers were cleared.
-
Changing port settings in the DMX Library now clears DMX Buffers.
-
-
Add a compact editor for Control Console that offers a minimal view and can be docked to the level editor.
-
The default quality of Pixel Mapping cells is now high instead of low..
-
Control Console - Add drag and drop operation in the cue list.
-
Add an auto-grouping checkbox for the default layout in Control Console.
-
Add shortcut to reload Control Console asset from disk.
-
Add a combo box to display and select a cue in the Control Console main and compact views.
-
Control Console - Implement ask user to confirm "Store" option when storing a Cue.
-
Add physical units and physical value ranges to Fixture Type Functions (editor only). Physical units and ranges export to MVR.
-
Control Console - Implement select every similar fader in your custom layout across all fixtures by double-clicking.
-
Add "group" and "add" options in the fixture patch list of the Control Console.
-
The DMXEditorModule now offers a public method to export DMX Libraries as MVR files.
-
Remove the beta version flag from the Control Console plugin.
-
The Fixture Type editor no has an option to only display the latest revision of GDTF modes.
-
Add controllers exposing editor color property and implementing search bar collapse/expand state in Control Console.
-
Add "physical unit" as a value type display option to the Control Console.
-
Add renaming Control Console UI options.
Bug Fix:
-
Control Console - Fix fader group controller combo box doesn't show the controller name.
-
Control Console - Fix prevent double-click from switching from compact/full UI modes.
-
Pixel Mapping and Control Console now send DMX values depending on their Stop Mode when their respective editor is closed.
-
Fix a bug where the Patch Tool does not show newly created DMX Libraries, fixed a bug where UDMXSubsystem::GetDMXLibraries did not return newly created DMX Libraries.
-
Control Console - Fix deleting layout 0 automatically switches back to Auto layout.
-
Control Console - Fix Custom Layout Rename button doesn't work.
-
Fix Control Console asset dirties on first opening
-
Control Console - Fix matrix fixtures can't be removed using the DEL key.
-
Fix issues where undo did not work after deleting an Input Source in Pixel Mapping.
-
Improve positioning of cells when adding selected patches to pixel mapping, fix cells stop resizing by mouse when either side is 1px.
-
Control Console - Fix Fader UI is not updated correctly when switching between custom to auto layout when oscillator class is involved.
-
Modes can now be edited in the Details View when multi-selecting Fixture Patches
-
Auto-assign now keeps valid stacks of patches instead of aligning them one after another.
-
Control Console - Fix various issues related to DMX Editor settings using a custom config instead of EditorPerProjectUserSettings.
-
Control Console - Fix user can add all patches or an empty group in custom layout if a filter is set.
-
Control Console - Fix faders not updating properly when creating new cues.
-
Fix Control Console does not preserve the grid layout when toggling off the Auto-group patches mode.
-
Fix Attributes defaulted to the first entry of Attributes in project settings, leading to changed defaults if the first entry changed.
-
Control Console - Fix renaming controller causes crash with matrix Fader Groups.
-
Control Console - Fix the add patch menu in custom layouts.
-
Control Console - Fix engine crashes when the Control Console is upgraded from a legacy Output Console.
-
Fixed an issue where OSX did not render DMX Pixel Mappings correctly and sent zero instead of color values.
-
Control Console - Fix Control Console UI widgets for controllers.
-
Modes can now be selected from the Add Fixture Patch menu as expected.
-
Control Console - Fix reset to default option is not performed correctly.
-
Fix Compact DMX Control Console window remains open when returning to Control Console.
-
Control Console - Fix controllers values automatically synching on grouping.
-
Control Console - Fix engine stalls when recalling a cue from a large DMX Library with limited fixture exposure.
-
Control Console - Fix matrix controllers don't get ungrouped when auto-grouping.
-
Control Console - Fix DMX streaming will stop if DMX library is reloaded.
-
Control Console - Fix resetting to Default Values doesn't mark Cue as modified, preventing users from saving changes.
-
Control Console - Fix rename muted/unmuted state for Fader Groups/Faders.
-
DMXEntityFixtureType::CreateFixtureTypeInDMXLibrary now correctly updates the Channel Span for its DMX Modes.
-
Control Console - Fix UI fails to update slider for grouped patches.
-
Control Console - Fix add Fader Group/Fader UI buttons.
Deprecated:
- The DMX Screen Component is now fully deprecated in favor of a purely Fixture Patch based workflow.
Editor
New:
-
Added the rendered object's name as metadata to the RenderThumbnail CPU trace, in order to quickly diagnose the costliest thumbnail renders
-
Move some USD classes and utilities (including access to the USD SDK) to a new USDCore plugin.
-
Added support to export CameraRig_Rail animation to USD.
-
Groom Bindings are now compiled asynchronously by default in the editor
-
Added a setting to control whether warnings logged during validation are promoted to errors
-
FValidateAssetsSettings::bCaptureWarningsDuringValidationAsErrors controls this behavior, and defaults to true to preserve the existing behavior.
-
Note: FDataValidationModule::OnValidateSourcePackageDuringCook now keeps them as warnings, as this is only used by UE::Cook::FDelegates::ValidateSourcePackage and cannot accept a FValidateAssetsSettings argument.
-
-
Group the PreviewPlatforms into submenus organized by PlatformName
-
Input of the '-PackageFolder' arg when running ResavePackagesCommandlet is now properly sanitized and the commandlet will warn the user if the provided path did not result in any package files being found.
-
Updated SunPosition plugin to add VolumetricCloud component with an updated version of the Hillside clouds material.
-
Json Preview Platform for Editor - New menu options for preview platforms to generate/preview devices from json files - Currently only enabled for Android preview platform
-
ImageCore::ResizeImage with fast high quality image resizing is now used for Texture Downscale and MaxTextureResolution. More filters added as well as the option to do alpha-weighted resizing.
-
Added DoubleClickBehavior to the InteractiveToolsFramework.
-
New: Added an additional fallback so we can spawn the Slow Task widget if we are a Program that compiles against the editor, but we don't use the mainframe module.
-
New: Skipping Asset Data Updates in the source control module when a actor label is changed if its package is transient. Some tools like the Chaos Visual Debugger need to spawn a large number of transient actors, which will result in actor label creations, which becomes expensive due to that asset data update attempt. Transient packages cannot be saved, therefore we can safely skip the update in the source control module for them.
-
Added JsonObjectGraphFunctionLibrary, a set of edit time functions for stringifying objects and persisting those strings to temporary files. Includes two new console commands snapshotblueprints
-
Add r.Editor.NeverStartInPreviewMode Disable Preview Platform automatically if Preview crashed
-
Add fixer to illegal reference data validation errors
-
Added IAssetReferenceFixer (following the pattern used for IAssetReferenceFilter), which allows UAssetValidator_AssetReferenceRestrictions to add a fixer token to any illegal references it finds.
-
New config option TextureImportSettings AutoLimitDimension to resize textures at import time to limit texture source sizes.
-
TextureAssetActions that modify texture source data can now convert 16 bit per channel source data to 8 bit, eg. TSF G16 to G8. This makes the uasset source content files smaller.
-
Removed duplicate Volumetric Cloud assets in SunPosition plugin to use EngineSky assets instead.
-
Added UMaterial and UMaterialInstance asset validators to help troubleshoot material compilation issues earlier on. They are disabled by default, see data validation setting "material validation platforms" field.
-
Added experimental support to import some USD assets (the same asset types supported by FBX) through Interchange.
-
Texture UEDelta filter provides much faster loading of uasset texture files.
-
Added option to export skeletal animation as geometry cache to USD.
-
Added new OverflowPolicy for text (Middle Ellipsis) can be used also in UMG widgets, there are currently some limitation to it displayed in the ToolTip.
-
Batch Renamer release, tool for renaming multiple Assets and Actors at once.
-
New: [Plugin Browser] "External" plugins (such as from .uproject AdditionalPluginDirectories, -PLUGIN= command line argument, or UE_ADDITIONAL_PLUGIN_PATHS environment variable) are now displayed in a separate category.
-
Added support for new check function for hover capture in Interactive Tools Framework behaviors, similar to the check function for mouse capture in behaviors.
Bug Fix:
-
Fix issue where temporary WorldPartition maps generated at cook time could be assigned Primary Asset Ids that would confuse the Asset Manager system
-
[Plugin Manager] Target receipt selection now prioritizes editor targets whose Launch executable matches the currently running executable. Previously, the first (arbitrary) editor target receipt with a matching configuration was chosen. This was necessary to disambiguate a second receipt for an editor target in the engine binaries directory, and matches existing logic used to determine the correct receipt in FEngineLoop::AppInit.
-
Disable breakpoints during tab restore to prevent editor freeze / infinite loop
-
Add PlatformName to FDataDrivenShaderPlatformInfo. In Editor, when using -game we now also load the TPS module of the preview platform if we are using OverrideSP command
-
Fix memory leak when the level editor viewport is set to realtime but it's not visible.
-
Added support for custom reset to default widgets to IDetailPropertyRow/FDetailWidgetRow
-
Allow single property views to hide their reset to default button
-
Fixed issue when using Preserve Aspect Ratio on an SWindow where the window would change aspect ratio the first time it was resized if it didn't have an OS border/titlebar
-
Re-enable VK SM5 preview for D3D Force SM6 for preview VK SM5, Mac SM5 Enable Lumen Support for Preview VK SM5, Mac SM5 Modifying FeatureLevelSwitch to respect the parent ShaderPlatform FeatureLevel and not the one set by preview in order to have consistent material logic with the Shader Platform we are trying to preview
-
Fixed crash when diffing class objects with sparse data
-
Fix for crash when adding a component in the level editor after its scene root has been deleted
-
Use the Runtime Value of bSupportsInlineRayTracing and bSupportsRayTracingShaders for preview platforms This avoids getting in a bad state where the Preview platform has bSupportsRayTracing=true, but bSupportsRayTracingShaders=bSupportsInlineRayTracing=false while Runtime RHI globals like GRHISupportsRayTracing is true, leading to crashes because of missing shaders. Like Android VK SM5 Preview in D3D Editor
-
Bug Fix: Fixed an issue where the OnTabClosed delegate was not triggerd when the Tabs were closed during the Mainframe reinitialization process.
-
Fixed material editor crash when trying to restore previously open shader code tab before shader instances are populated.
-
Fix property viewer not displaying correctly when setting a UScriptStruct as a container
-
Fix some cook nondeterminism bugs involving UWaterBodyMeshComponent and UAtmosphericFogComponent
-
Bug Fix: Added a missing null check on FActorTreeItem::OnVisibilityChanged. Some tools like the Chaos Visual Debugger can perform GC on their own, so if a visibility changed event in the outliner is processed while that is happening, we can end up with an invalid actor ptr which will result in a crash
-
Fixed crash when diffing assets in inactive plugins
-
Always scroll the initially selected item into view for class pickers
-
Diffing umap assets now provides a more useful text representation of the map, rather than an empty T3D object
-
Fix 100% repro crash on right click for Text Render / Dynamic mesh actors in outliner. Add check class valid AnimationAsset.
-
Hide Preview Platform indicator when we hide viewport UI
-
Updated clipboard operations in WindowsPlatformApplicationMisc to report an error instead of asserting if clipboard ownership is stolen before CloseClipboard is called
-
Make RenderUtils read from TargetPlatformSettings. Fixes the crashes/wrong rendering preview had when the sdk was not installed for the previewed platform
-
Added support for importing RootUV attribute from Blender groom Alembic.
-
Fixed UEditorValidatorSubsystem::ValidateAssetsWithSettings taking its settings as an out-param rather than an in-param
-
Fix a rare crash on editor shutdown caused by incorrect usage of EditorModeManager. Avoid interacting with EditorModeManager singleton during editor shutdown, as it's destroyed in AppPreExit, which is before ShutdownModule is called during editor shutdown (AppExit)
-
Fix thumbnails of transparent textures.
-
Fixed cases where Color Grading hue, saturation, and value sliders could fail to update when changed in another panel
-
Plugin Reference Viewer - Fixed a crash when plugins reference other plugins that have have not been discovered
-
Fixed a bug where Asset Guidelines failed to update ini files when the Enable Missing button was clicked.
-
Fix ShaderComplexity View crash in ES31 in Editor when SecondayUpscale is active
-
Asset Registry tag values are now updated when an asset is moved on disk
-
Fix unintended copy of FSelectedActorInfo in MakeTransformDetails Since of the operand in the ternary statement was a temporary object, we held a const reference to a temporary copy rather than a reference to the object pointed by SelectedActorInfoPtr
-
Replace Actor will now properly preserve scale and mobility for scene components coming from blueprint classes.
-
Fixed Curve Editor Crashes in array remove/clear and undo/redo
-
Editor: make viewport FOV computation consistent with the game
Datasmith
New:
-
Added the "bExportStaticMeshSourceData" export option when exporting static meshes to USD, which can be used in order to export the source mesh data as opposed to the current render data of the static mesh.
-
Added an explicit option to regenerate the LevelSequence that is created for AUsdStageActors when they open a stage. That option can be found on the USD Stage Editor, under the Options menu. In addition, many issues were fixed related to inherited visibilities in USD, and how those map to non-inherited visibilities in Unreal.
-
Optimized the opening and import of USD stages that use USD instanceable static meshes.
-
Fixed some performance bottlenecks on USD Stage Editor, especially for when opening very large USD stages.
-
Implemented support for removing and reloading referenced USD layers and payloads, by selecting the prim with the reference or payload, and right-clicking the target reference or payload on the references panel to the right of it.
-
Allow setting USD-related Unreal project settings via Python/Utility Blueprints: Just use unreal.UsdProjectSettings.get_default_object() to retrieve the settings object, and set/get the desired settings via get_editor_property/set_editor_property.
-
Exporting skeletal and transform animations to USD will now cover more cases, including components with AnimBlueprints and attach sockets.
-
Added an option to the USD LevelSequence exporter called "bExportSeparatePrimsPerSpawnableInstance" to control whether the export should spawn additional prims for each subsection spawnable instance or not
-
Implemented a new USD schema to allow explicitly controlling whether prim hierarchies are collapsed or not, when opened or imported in Unreal. Check the schema directly at "Engine\Plugins\Runtime\USDCore\Resources\UsdResources\Win64\plugins\unreal\resources\unreal"
-
Implemented a new option called "Use prim kinds for collapsing" (visible on the Options menu of the USD Stage Editor, as a property on the AUsdStageActor and as an import option when importing stages) that controls whether the import process should even use prim kinds for collapsing at all. When disabling this option, prims will not be collapsed by default.
-
Added the "USD.LevelSequenceExport.SkipConstantValues" cvar (enabled by default) that controls, for LevelSequence exports to USD, whether we should automatically skip exporting a timeSample value if the previous exported value for that property was identical and the new value is not needed.
-
Exporting geometry caches, static and skeletal meshes to USD will now also emit values for the extent attribute
-
Allow exporting static meshes with the Nanite override attribute and multiple LODs and at the same time.
-
Added support for opening and importing stages with the UsdMediaSpatialAudio schema via USoundWave assets, UAudioComponent and AAmbientSound.
-
Implemented support for opening USD stages and authoring new material overrides directly on the generated staticmesh/skeletalmesh/geometrycache components, even if those referenced prims were inside USD instanceables. This is done by the usage of USD collection-based material assignments.
-
[SketchUp] Fixed incorrecly exported geometry by baking transform into meshes with SketchUp transform that is not supported by Unreal(like 'shear' or parent scaled non-uniformly with a rotated child component).
-
Replaced the usage of Sequencer Dynamic Bindings with Sequencer Universal Object Locators in order to allow creating bindings, on external LevelSequences, to actors and components that are spawned when USD stages are opened via the AUsdStageActor. These bindings automatically repair themselves when the stage is reopened/reloaded.
-
The Selection Sync option of the USD Stage Editor is now enabled by default.
-
[Solidworks] Added support for Datasmith exporter of Solidworks 2024
-
Implemented a new version of the USD Asset Cache (UUsdAssetCache3). This version exposes the cached assets directly on the content browser, which should consume less memory and be more useful, safer to use, and easier to maintain.
-
Implement support for muting and reloading USD sublayers by right-clicking on them, on the bottom panel of the USD Stage Editor window.
-
Added a new Unreal project setting option called "Log Usd Sdk Errors" that enables or disables the reporting of USD SDK errors onto the Output Log.
-
Added a new option on the USD Stage Editor: "File -> Export -> Flattened layer stack", which flattens the opened USD stage's local layer stack into a single layer, but retains reference and payload arcs.
-
Add basic support for opening USD stages using UsdLuxShadowAPI (just the shadow:enable attribute for now).
-
Renamed 'bReuseIdenticalAssets' to 'bShareAssetsForIdenticalPrims' on the USD import options dialog.
-
Improved the USD.DiscardUndoBufferOnStageOpenClose cvar to have it prevent serialization of assets/components after opening, closing and reloading USD stages. This cvar is disabled by default, but can be used in order to gain some performance when opening very large USD stages, in case undo/redoing past the stage opening/closing operation itself is not needed.
-
[Solidworks] Metadata export - component, document, generic, summary, custom properties, config properties, comments, BoM table
-
Optimized the process of reloading USD stages via the USD Stage Editor (File -> Reload option), especially for very large USD stages.
-
Optimized the handling of update notices emitted by the USD SDK when a stage opened via AUsdStageActor is modified.
-
[Solidworks] Used PersistentIds for face identifications which fixes issues with face-material connection in the exported data
-
[Solidworks] Improved export times
-
[Solidworks] Animation is now exported from solidworks using Direct Link Sync
-
OpenUSD version was upgraded to v24.05
-
Optimized the process of opening and importing USD stages, especially for large stages.
-
When exporting LevelSequences to USD, the current level will now also be exported by default, unless another level is provided.
Bug Fix:
-
[Solidworks] FIxed exported parts not being updated when changing configs with DirectLink Sync
-
Fixed an issue when opening USD stages with non-primitive-shape Gprims within a prim hierarchy would cause the generated, collapsed, static mesh to be invalid and empty.
-
Fixed the export of LevelSequences to USD, when the LevelSequence animated blueprints set to rerun their construction scripts continuously in the Sequencer.
-
Fixed incorrect transforms when exporting LevelSequences to USD in some scenarios related to attachment tracks, especially if those were on top-level actors.
-
Fix ensure being triggered when adding/manipulating animation tracks of unsupported types on the LevelSequence generated by an AUsdStageActor when it opens a USD stage.
-
Fix LevelSequence spawnable tracks exported to USD (as visibility timeSamples) never being able to actually hide the objects.
-
[SketchUp] Fixed Layer/Tag visibility to take into account Default(Untagged) layer visibility overrides from parents.
-
[Datamith exporters] Datasmith exporters correctly inform about plugin upgrade when installing a newer version over the old one
-
Fixed how some scenarios would end up generating too many materials when opening or importing USD stages (e.g. if the mesh was doubleSided, the material required different primvars, etc.).
-
[Rhino] Fixed failing sync/export when internal texture has no path
-
[Rhino] Fixed export of visibility in certain cases, taking parent visibility into account
-
Fixed some name collision issues when exporting LevelSequences with spawnable tracks to USD, for those sequences with multiple spawnables that have identical names.
-
Fix a race condition when cooking games and applications that use the USD importer plugin using multiple cooker processes.
-
[3dsMax] Fixed Arnold light export SkyPortalLight only when the light is a SkyDome in Max
-
[3dsMax] Fixed Disk shape type to export as proper area light
-
BugFix: [Archicad exporter] Fixed crash exporting Morph elements
-
BugFix: [Archicad exporter] Fixed mirrored Morph elements export which caused exported elements to be misplaced before
-
[Archicad] Fixel export of Window/Area light orientation
-
[SketchUp] Fixed export of geometry normals which causing lighting issues when geometry is transformed within group
-
[Solidworks] Fixed mesh actor visibility when exploded view has parts different in different configs
-
Fixed many issues related to visibility and visibility tracks, when opening and importing USD stages.
-
[Navisworks] Fixex crash exporting high poly density terrain geometry
-
Fixed the behavior of AUsdStageActors converted into Spawnables when it comes to loading and unloading the stage, especially when in PIE or being rendered via MovieRenderQueue.
-
[CAD] Fixed importing non-manifold geometry hanging the editor
-
Fixed a crash when interacting with the LevelSequences generated by the AUsdStageActor after going into and out of PIE, in some scenarios.
Framework
New:
-
Engine (map and set add item); Implementing a way to have the map and set fill in with the next available enum value instead of always doing the default value.
-
-- Code --
- PropertyHandleImpl: FPropertyHandleMap::AddItem() - Added a HasKey() lambda. We're then checking if the map property's key is an enum property, if so, we'll loop the enum values to see if the map doesn't already have that enum value as a key. When we find one that isn't in the map, we're adding a child node and then setting the child's key node to be the enum value that is not in the map yet. If the map property's key is not enum then we do the old check for if the default key isn't there.
- FPropertyHandleSet::AddItem() - Added a HasElement() lambda. We're then checking if the set property's element is an enum property, if so, we'll loop the enum values to see if the set doesn't already have the enum value as an element. When we find one that isn't in the set, we're adding a child node and then setting the child node to be the enum value that is not in the set yet. If the set property's element is not enum then we do the old check for if the default key isn't there.
- UnrealTypes: FSetProperty::GetElementProperty() - Added this getter to return the ElementProp property.
-
-
Curve Table Filtering; Improving the curve table uasset filtering so we get more specific matches to the text queries. For example, typing "location" will filter all text with location in it but then typing "location.x" used to filter everything with location and x in it, now it'll filter things with location.x in it. So instead of filtering strings with x in it like "max", it now keeps both of the terms in consideration by finding x and then searching the hierarchy for location as well.
- -- Code -- CurveTableEditor: FCurveTableEditorItem::PassesFilter() - Updating the string search to not just be a Match() but to find each token in the string's hierarchy.
-
Engine (FScriptSetHelper); Adding FindLogicalIndex() to the set helper so we can get the logical index from the internal index. The internal index can have invalid entry indices kept in a continuous list for faster adding after an entry have been removed, while the logical index is all of the valid entry indices.
- -- Code -- UnrealType: FScriptSetHelper::FindLogicalIndex() - Added this function so we can get the logical index by passing in the internal index.
-
Remove CoreMinimal.h includes from plugin template headers
-
Adding new cvar to EditorIterationTests named project.iteration.pie.testiterations which specifies the number of times we start/run/stop PIE during the test. Default is 1 to match previous behavior.
-
The 'Revision Control Login' dialog will now immediately save settings changes to disk when either 'accept' or 'disable' buttons are selected where as before the changes would only be made permanent when the editor was shutdown.
-
Added a data validator that checks for corruption in package files. It will check for truncated files that were not fully saved to disk, invalid package summary info at the front of the package file and that the unstructured data stored in the package trailer is valid.
-
AggregateGeom (shape arrays); Adding the metadata specifier TitleProperty so we know what the name of the shapes are in the shape arrays.
- -- Code -- AggregateGeom: FKAggregateGeom - Added TitleProperty = "Name" to the shape array properties.
-
Exports to a .csv file the list of asset references that exist between the plugin and one of it's plugin dependencies
-
Utility console command to trace a plugin dependency chain and output the found paths
-
Add a RunCommandlet console command. Allows for faster iteration when debugging commandlets in the editor (e.g via hot reload)
-
ExportDirectory command added what will export to csv all cross plugin asset references for all plugins found under the specified directory.
-
Enabling GauntletModule to support multiple entries/exits from PIE without re-creating its controllers.
-
Plugin reference viewer utility suite. Plugin reference graphs can be exported to .csv to detail the number of reference types to each of the plugin dependencies
Bug Fix:
-
Updated the Asset Reference Restrictions asset validator to also ignore Verse packages when checking soft dependencies. Previously it only ignored script packages.
-
USkinnedMeshComponent (min LOD validation); Adding a validation step to the SetMinLOD(), OverrideMinLOD(), and ComputeMinLOD() function calls so we aren't setting to a value that doesn't have render data. This was seen on lower end platforms where the mesh would be invisible because there was no render data for the min LOD value being set.
- -- Code -- SkinnedMeshComponent: GetValidMinLOD() - Validate the min LOD value of the mesh component by iterating over render data to make sure we get something usable. SetMinLOD() - Calling GetValidMinLOD(). OverrideMinLOD() - Calling GetValidMinLOD(). ComputeMinLOD() - Calling GetValidMinLOD().
-
Fixed an issue where the perforce source control module was not returning the correct workspace root after a user had changed the currently used workspace via the editor ui.
-
Fixed a potential shutdown crash in the uncontrolled changelist module.
-
Engine (array, map, and set add item); Fixing an issue with the previous TMap and TSet auto increment implementaiton, where if you remove an element in the middle of the array then adding a new entry would incorrectly grab the last index of the container to adjust it. When adding an entry into a container, it will use the first free index (head of the linked list) instead of just adding to the end. Now we'll return the added logical index (meaning, the valid element index and not the internal index) into the container so calling code can get the correct entry if needed. NOTE: There is still a side effect of how we use the first free index of the container, which is really the last removed element of the container. This means that if we then add an element from an enum, it could be in a position that isn't sequential visually. For example, you add all entries with an enum key from 0-5, those keys will match the container index [0] [1] [2] [3] [4] [5]. You remove index 2 and 4 from the container [0] [1] [3] [5]. Now when you add, it'll add the new element to index 4 but the enum would be 2 [0] [1] [3] [2] [5].
-
-- Code --
- PropertyHandleImpl: FPropertyValueImpl::AddChild() - Added an int32 return type so we can return the logical index of the added child.
- FPropertyHandleSet::AddItem() - Using the child index from AddChild() instead of grabbing the last element on the container.
- FPropertyHandleMap::AddItem() - Using the child index from AddChild() instead of grabbing the last element on the container.
-
-
Fixed an issue where attempting to use a workspaces with a root set to a volume root would fail.
-
USkinnedMeshComponent (min LOD validation); Removing the log because it can get spammed when render data isn't ready.
- -- Code -- SkinnedMeshComponent: GetValidMinLOD() - Deleted the logging.
-
Fix not being able to edit Gameplay Tag Queries from modal windows
-
Fixed crash that occurred when creating an FAdvancedPreviewScene with bDefaultLight set to false
-
Fixed ensure when editing CDO properties in FDataLayersBroadcast::OnObjectPostEditChange.
Interchange
New:
-
It is now possible to save and load Interchange translator settings via Python and Editor Utility Blueprints (e.g. via the save_settings() and load_settings() functions) in order to "apply" property changes to translator settings.
-
Removing PCX importing/exporting.
Bug Fix:
-
Deformer settings are now retained when a skeletal mesh is re-imported.
-
Fix for FBX exporter not exporting control rig track data when there is no equivalent animation track
Landscape
API Change:
- Deprecated CreateLayerFrom, since it's a duplicate from DuplicateLayerAndMoveBrushes, but missed the brush reassignment, and was unused anyway.
New:
-
Removed editor-only data from landscape/water classes in order to avoid issues with missing data in cooked editor. Note that the associated textures have been changed to lazy-load on use (i.e. in the editor only, when the landscape brushes run) so that this doesn't affect the data loaded at runtime
-
Adjustments to actionable (landscape) messages UX:
-
Added tooltip when the widget is collapsed to help the user understand what it's about without having to expand it
-
Show the number of affected landscape actors even in the "dirty actors" case to help the user assess how much "out-of-date" the overall landscape is
-
Dirty actors are now handled part of out-of-date landscape proxy flags
-
Optimized update by gathering all out-of-date flags at once (~33% of what it used to cost)
-
-
Various UX improvements for landscape "Select" tool :
-
Don't display target layers, edit layers or BP brushes when using the Select tool, since it makes no sense there
-
Display the Select tool in the Paint panel since it applies there too
-
Refresh the landscape mode details panel when clearing the selection in order to hide the Select tool options immediately
-
Moved the Select tool-specific options into a "Select Mask" category
-
Moved the Select button to the end of the tool list for both Sculpt and Paint panel, since this is not really an editing tool and acts in both modes
-
-
Added system to invalidate VSM pages when using (non-Nanite) landscape, to hide shadow artifacts induced by the vertex morphing system of standard landscape : Relies on pre-computing max height delas from mip-to-mip for every landscape component Invalidation occurs when the evaluated max delta between the heights at the LOD value that was active when VSM was last cached is different enough from the heights at the current LOD value (for a given persistent view), based on a height threshold that is tweakable per landscape and overridable per landscape proxy Invalidation doesn't occur when Nanite landscape is used The invalidation rate is decreased as the LOD value goes up, controlled by a screen size parameter in the landscape actor (overridable per proxy), under which no invalidation will occur. This avoids over-invalidating VSM on higher LOD values, since they tend to occupy less real estate and therefore don't need to have perfect shadows
-
Added per landscape (overridable per-proxy) shadow map bias to help with this problem too
-
Added 3 non-shipping CVars to help tweak those 3 parameters in-game (landscape.OverrideNonNaniteVirtualShadowMapConstantDepthBiasOverride, landscape.OverrideNonNaniteVirtualShadowMapInvalidationHeightErrorThreshold, landscape.OverrideNonNaniteVirtualShadowMapInvalidationScreenSizeLimit)
-
The whole invalidation system can be enabled/disabled via CVar landscape.AllowNonNaniteVirtualShadowMapInvalidation
-
Added another CVar (landscape.NonNaniteVirtualShadowMapInvalidationLODAttenuationExponent) to tweak the screen-size-dependent invalidation rate curve shape
-
-
Fixed landscape.DumpLODs command : now works without parameter and can be used several times
-
Changed CachedSectionLODValues system for landscape to be usable both for ViewState-less views (one-shot renders like water info custom render passes) and "persistent" views (those that have FViewStateInterface associated). This allows to keep track of the previous frame's CachedSectionLODValues for a given persistent view and removes the previous hacky method
-
Prevented landscape render systems to have their LOD section values cleared when a render is made on another scene (e.g. any time a thumbnail renders in editor or when custom render passes execute) : now only the render systems that pertain to the scene being rendered get udpated
-
Landscape UX fixes
-
Fixed some landscape CVars which were not render-thread safe
-
Removed redundant calls to SupportsLandscapeEditing when ticking landscape proxies for grass. This is to avoid O(N^2) complexity when iterating on landscape proxies for ticking grass.
-
The Resize and Move tools are now disabled instead of hidden when unavailable, and the tooltip mentions why they are not available.
-
Optimizations for landscape flatten/smooth tool
-
Added info message when there are no target layers in landscape mode, to help the user understand the workflow now requires him to add layers either using the "Add" or the "Populate from materials" button
-
Added AllowedDensityRange to landscape Grass Variety. This can be used to prevent a variety from ever spawning on a given range of grass density (specified as an interval between 0 and 1)
-
Made landscape collision settings overridable per-proxy
-
Added tooltips to Landscape Dirtying Mode settings and made "In Landscape Mode And User Triggered Changes" the default
-
Water: Implemented the ability to tag arbitrary actors as "ground" by adding a WaterTerrainComponent. This will cause them to render into the water info texture terrain heightmap and affect wave attenuation, water rendering, etc.
-
Improvements to landscape flatten UX:
-
The flatten target value and terrace interval properties are defined in absolute world-space so we now bound their min and max slider values to what that the landscape can actually reach, so that the interval is always valid, regardless of the landscape scale
-
Adjust the preview grid in realtime when the target value is changed via the slider, to make it much easier to eye-ball it
-
Prevent the flatten target value eye dropper tool to validate the change when clicking anywhere outside the viewport or when leaving landscape mode
-
Save the value of preview grid in the user settings
-
-
Landscape mode paint panel :
-
Added filter to target layers list (helps when too many layers are being used)
-
Minor UX improvements
-
-
Landscape: Expose additional rendering properties on Landscape and Grass actors
-
Adds SActionableMessageViewportWidget in Viewport's toolbar. This widget will host warnings or messages with the ability to automate actions for the user. Current actionable messages: Invalid Landscape grassmaps, with associated rebuild action Invalid Landscape physical materials, with associated rebuild action Invalid Landscape nanite meshes with associated rebuild action Invalid grassmaps, physical materials, nanite meshes will be agregated to only one message if multiple rebuild are necessary * Landscape proxy packages needs to be updated, with associated mark dirty action
-
Added multiple views (split screen) support to SingleLayerWater by using a different slice of WaterInfoTexture and a different water quadtree per view. #changelist validated #virtualized
-
Landscape: Make the new layer creation dialog be optional, controlled by the ShowDialogForAutomaticLayerCreation landscape editor setting.
-
Disable Retopologize tool button when unsupported (due to edit layers) or when CVar "landscape.EnableRetopologizeTool" is false (default is false).
-
Fixed landscape target layers UX refresh issues
-
Added info message to explain to the user that all the landscape's target layers are hidden (either by the "Hide unused layers" filter of by the filter text box)
-
Used a standard show/hide icon button to the "Hide unused layers" toggle button" in order to help the user understand the status of that filter
-
Allowed drag and dropping target layers even when the "Hide unused layers" filter is active
Bug Fix:
-
Fixed missing transaction when overriding landscape properties
-
Fixed rivers rendering in the water brush : the scene capture component that's used internally was rendering Fog somehow
-
Fixed landscape flatten eye dropper tool canceling when clicking on the landscape while keeping the mouse still.
-
Fixed editor crash from importing heightmap image files with invalid tile coordinates.
-
Fixed crash in landscape alpha brush thumbnails which wrongly assumed that the texture's resource was loaded. Now the thumbnail viewport will keep on being invalidated until it can render the texture
-
Fixed crash when resizing landscape
-
Drastically reduced severe hang (minutes-> seconds) when clicking on an actor with "Show hidden properties while playing" enabled after a material compiles
-
Fixed rare crash when deleting edit layers
-
Re-select the affected landscape after using the resize tool in landscape mode
-
Moved landscape visibility layer info asset to from EditorLandscapeResources to EngineResources so that it doesn't get stripped on cook when "Exclude editor content when cooking" is used #virtualized
-
Prevent landscape target layers from being renamed to a layer name that's already in use
-
Fixed crash when landscape fixed grid vertex factory is not created : we would still create mesh batches regardless
-
Several fixes with landscape brushes Misc changes :
-
Added landscape.VisualLog.ShowBrushPhysics (0 by default) to avoid polluting the visual logger whenever we move the mouse when landscape sculpting/painting, since that is only relevant to debug the landscape brush
-
Added visual logs when extending the landscape data cache when using the landscape brush + fixed those logs to extend by (-0.5, +0.5) beyond the cached region, in order to properly show the vertices that were sampled (i.e. that allows to show what was cached when the cached region contains a single landscape vertex in either the X or Y direction)
-
-
Fixed landscape Select tool
-
Fixed assert when resizing landscape
-
Fixed crash when unloading a map while landscape mode is active
-
Fixed incorrect ensure triggering when loading old landscape levels that have landscape edit layers textures with more than a single mip. This ensure is only valid if CVar landscape.StripLayerMipsOnLoad is active (it's currently not)
-
Don't display landscape on-screen warnings while the landscape is being edited to avoid flickering of the message while stuff get updated in the background
-
Fixed landscape material property assignments not being properly undone when using edit layers : in that case, even if the landscape layers update runs properly, if no change was detected on weightmaps, the component material instances wouldn't get updated and the material changes wouldn't get applied
-
Fixed Water brush manager not properly reacting to landscape resolution changes
-
Fixed landscape.ShowDirty/TrackDirty, which was iterating over vertices without taking into account (subsection) duplicate vertices
-
Fix for crash when trying to make a landscape proxy "modified" on PostLoad when the main landscape actor has not registered to its ULandscapeInfo yet
-
Prevent user from accidently using a landscape target layer named after the reserved weightmap name for visibility
-
Landscape : fixed FBodyInstance being improperly detected as not synced with parent landscape when the content of the collision responses is similar but out-of-order
-
Prevented weightmap textures generated by turning edit layers on on a landscape that has it off to have a mip chain, which causes an assert later down the line
-
Fix wrong warning when importing landscape weightmap from 8bit source image.
-
Fixed rare asserts when using landscape brushes
-
Water: fixed GetWaterTimeSeconds so that it can be called outside of the game thread.
-
Fix for subtractive blend when using local merge
-
Fixed / improved landscape texture diff CVar utilities :
-
One texture / diff report is dumped per landscape paint layer (it used to be one per weightmap, which was incorrect if multiple layers from a given weightmap texture changed, as the last layer would override the other ones
-
Misc minor improvements in the diff report
-
-
Fixed LandscapeInherited properties (from a custom category, like Nanite) that failed to be made disabled and to have their tooltip customized to indicate they are inherited
-
Landscape batched merge fixes:
-
Fixed landscape edit layer renderers being renderered in all batches instead of just the ones they intersect with
-
Fixed OOBBox landscape edit layer render item debug display and misc visual logger improvements
-
-
Fixed UWaterBodyComponent::UpdateComponentVisibility updating the water info texture whenever it was called.
-
Fixed "Update Water Mesh During Interactive Changes" (Water Editor) setting that has been ineffective for a while now
-
Fix crash when building static lighting with a Landscape using WPO by waiting for the async readback to be complete before fetching the results.
-
Fix the index that the last row of verts in the collision mesh uses for their color.
Deprecated:
- Removed deprecated code in landscape and water (anything prior to, and including, 5.3)
Scripting
New:
-
New: Added Tool Menu Widget for use in Editor Utility Widgets. This widget gives Editor Utility Widgets the ability to create their own menus and toolbars by leveraging the ToolMenus system.
-
Expose realtime toggle to level editor subsystem This allows utilities to disable realtime for better performance during intenstive tasks
-
Added IsEditorPropertyOverridden to compare a named object property against its archetype value
-
Moved FEditorPythonExecuter to PythonScriptPlugin so that it can understand Python directly
-
It will now log an error if the Python script fails execution (to match the commandlet behavior). This error can be made fatal by passing -ScriptErrorsAreFatal on the command line.
-
It will now use a standard async task notification, rather than its own custom UI.
-
It will now defer starting script execution until IPythonScriptPlugin::OnPythonInitialized has run.
-
-
Remove the restriction that Unreal types generated from Python scripts must have globally unique names
-
There are two strategies used internally for achieving this:
-
If the Python script lives under the project or engine root (and ideally under a content mount point), then a package is created to host any types generated by that Python script.
-
If the Python script lives outside of any known portable path, then we take its absolute filename (normalized and lowercase) and append it to the generated type name as a hash.
-
-
These strategies allows a.py and b.py to both define an unreal.uthing() called "Foo" without those two generated types having a conflicting Unreal type name.
-
Note: For backwards compatibility, we leave a redirector from the old-style name to the most recent modular/hashed type name.
-
-
Editor Utility Widget blueprint -Added an option to spawn an Editor Utility Widget as a nomad tab so it can be docked as both major and minor tab.
-
Added GetPackageForObject, a function for editor scripts to get the package, principal use is to reload packages
-
Exposed AssetViewUtils::GetPackageLengthForCooking to scripting
-
This is available via UEditorAssetSubsystem as GetAssetFilenameLengthForCooking or GetLoadedAssetFilenameLengthForCooking
-
Added support for modifying spline points within blueprint graphs outside of the construction script via a new 'Set Override Construction Script' method.
Bug Fix:
-
Allow Blueprints to add UserDefinedStruct DataTable rows via UDataTableFunctionLibrary::AddDataTableRow
-
Don't crash when passing None as the class type to unreal.ObjectIterator
-
Instead gracefully handle it and emit a type error: 'type' cannot be 'None'
Deprecated:
-
Deprecated creating an instance of a BlueprintFunctionLibrary from Python
- These types only contain state functions and no state, and so you should just call their classmethods directly on the class from Python
UI
API Change:
- Deprecated SColorGradingWheel, SColorGradingPicker, and related types in the AppFramework and Slate modules. Updated classes with the same names can now be found in the AdvancedWidgets module.
New:
-
Revision Control: Add option to copy remote paths
-
String UPROPERTY types can now specify a validator UFUNCTION, on the same object, that will validate a user input and show a validation error on the string input, as needed. The function should be static, and takes as input a single FString reference, and returns an FText object. If validation passes, the function should return an empty FText object, otherwise the value of the FText object is displayed as the validation error.
-
Make content browser tooltips for 2D and cube texture arrays show array size
-
Two utility classes for use with the Details View class FDetailsViewCategoryHiderCustomization - Used to hide entire categories of a Details View. FDetailsViewWarningOrErrorCustomization - Used to insert an SWarningOrErrorBox into a Details View at the top of a specified category.
-
Kismet: Added slate argument to SKismetInspector to specify if the section selector should be shown.
-
[PropertyEditor] Moved CallInEditor functionality to shared location. You can now replictate this functionality, previously hard coded within ObjectDetails.
- See FObjectDetails::AddCallInEditorMethods for usage.
-
Added SActionButton to the ToolWidgets module, and exposed the icon color. This is a less specialized version of SPositive/NegativeActionButton that doesn't imply intent.
-
Tweaked formatting of project badge in editor to avoid unnecessary spaces
-
New: Added the experimental ImageWidgets plugin containing generic Slate widgets for displaying and interacting with images and image-like content. The currently provided widgets are SImageViewport for displaying and interacting with images and image-like content, and SImageCatalog for listing and interacting with a set of images.
-
The texture editor now shows relevant information, warnings, or errors for the current texture in the texture viewport.
-
The editor can now decode and view textures encoded for other platforms - notably, ASTC encoded textures for mobile platforms can be viewed in editor for quality reference.
-
Added tooltip with help text to console suggestions
-
ToolMenus: Added reusable UToolMenuWidgetCollectionContext class. Allows adding/finding widgets in a generic way, which should reduce the need to create custom context classes.
-
Added Select All/None button for column view right click context menu in the Content Browser
-
Folders can now be added to Favorites by simply dragging them in.
-
Changed color grading wheels to a clean, modern style that scales nicely to large monitor sizes.
-
Added supports for profiles for the ContentBrowser.AssetViewOptions menu The activated profile can be specified using the FAssetPickerConfig struct
-
Added new default animation editor preview profiles for editing purposes with grey background and nicer wireframe rendering.
-
Reorganized the Details panel for Color Correct Regions and Color Correct Windows for more convenient access to important properties.
-
Add an EditorPerProjectUserSettings override for Texture import PNG infill setting. This is so UI artists can set that to "always" for UI work without affecting other users.
-
Added customization support to properties added as external objects at propertyy editor
-
Revamped the place actors panel UI and added a Favorites category.
Bug Fix:
-
Fixed a problem with tooltip force fields, where if the force field would push the tooltip towards an invalid position (e.g. when forced down but the tooltip ends up outside the screen), the force field would end up being ineffective. With the fix, we're still trying to push the tooltip in the best direction, but if that fails, we're trying the other direction
-
Fixed crash when reloading texture being used as an atlas while it's sprite is visible
-
Fix VolumeTexturePreview using incorrect SizeZ calculation
-
The config-file value "ProjectBadgeBackgroundColor" is now respected again.
-
Fix for ThumbnailManager singleton shutdown crash, due to the thumbnail pool trying to access the singleton in the destructor
-
Account for LOD bias when determining volume depth slice count in texture editor
-
Fix 1-frame glitch in texture editor when changing mip level
-
Fixed issues with Nanite object highlights and selection outlines while editing a packed level actor in the Level Editor.
-
Fixed an issue that could cause the text alignment on an SPrimaryButton to be incorrect.
-
Fixed panning of the texture atlas visualizer
-
Fixed a rare crash when interacting with an Asset Editor with the Viewport tab closed.
-
Fix an issue where the level editor "Favorite Levels" main menu would be hidden if there are no recent levels.
-
Fixed issue where the PIE window would grow over time when launching PIE in a new editor window
UX
API Change:
- New API is disabled by default, to enable set CVAR Editor.EnableITFCursorOverrideSupport > 1
New:
-
Added Lit Wireframe viewmode, which combines MeshEdges with the Lit viewmode
-
Added categories for custom notify class properties in the details panel. All properties on the notify class will now show in their appropriate categories in the detail panel when selecting an animation notify in the animation editor. The categories will be placed as subgroups of the "Anim Notify" group. Any properties without a category will be placed directly under the "Anim Notify" group. Properties that explicitly specify a category of "AnimNotify" will be added to the "Anim Notify" category directly as if they did not have the "AnimNotify" prefix to prevent showing an extra nested category.
-
Added new options for loading presets in the Console Variables Editor, allowing you to either replace or add to the existing settings.
-
The Play-in-Editor toolbar now shows a Simulate button front and center. It's now easier than ever to jump straight into a Simulation without first playing or navigating a menu.
-
Added button to open selected data registry asset for FDataRegistryType detail customization
-
Added the Color Grading window, which provides a convenient interface for creating and controlling color grading objects, and which scales nicely on large monitors.
-
Added console command tooltips when displaying the history Also, for the console command text box, there is now a tooltip for the command currently being typed (if it's valid), which also displays the current value for CVars (to avoid typing the variable without parameter, switch to the log window to peak at the current value and back to the console command to enter a new value) Also added tooltips forcefields for both the edit text box and the suggestion list view
-
Polished the Console Variables Editor's interface, bringing it in line with Unreal Engine 5 style.
-
Added the ability to disable or delete multiple selected items in the Console Variables Editor.
-
Added right-click menu option to open underlying asset (data table, curve table) from data registry editor. Made right-click on data registry row highlight the row.
-
Provide new API for controlling mouse cursor styling during tool operations and prevent excessive hit proxy testing when the Interactive Tools Context has mouse capture active.
-
Changed RebuildModeToolBar and ShouldShowModeToolbar methods to be virtual, allowing derived toolkits more flexibility over constructing and managing the mode toolbar.
Bug Fix:
-
Fix an issue where menu search fields didn't respect the "Menu Search Field Visibility Threshold" setting.
-
Improved editor performance when moving Light Cards using the Unreal Stage app.
-
Fix a bug where the hotkey for "Open Level" (Ctrl+O on Windows and Cmd+O on Mac) didn't work after clicking on a tab.
-
Use cached transforms for Pilot transactions to allow for other transactions to occur while piloting.
-
Fixed Place Actor menu for Custom Actors (e.g. Runtime Virtual Texture Volume)
Foundation
New:
-
Add EAutomatinTestFlags::ProgramContext flag to filter tests for Program target.
-
Add StaticLoadAsset, LoadAssetAsync, and FSoftObjectPath::LoadAsync functions to make it easier to asynchronously load objects from C++. Also improve the comments to note which loading options are actually deprecated
-
StudioTelemetry's log analytics is now disabled by default.
-
Optional property support for StructSerializer & StructDeserializer.
Bug Fix:
-
Maps that use redirectors for sublevels can sometimes hang the editor. (Partial fix) In rare cases, moving maps with streaming levels could end up serializing PackageNameToLoad. This could happen if a map was moved and the asset registry hadn't updated its soft path redirect table before ULevelStreaming::Serialize was called. As a result, PackageNameToLoad would be saved to disk with the updated path. However, if the map were moved again, there would be a discrepancy between PackageNameToLoad and WorldAsset. This would eventually create a corrupt UPackage where the name and file path don't match. Eventually, the editor would hang as it failed to load the streaming level and repeatedly re-attempt. For now, we'll just clear out PackageNameToLoad during these scenarios. At some point, we'll need to phase out PackageNameToLoad completely in favor of WorldAsset. Having two fields attempt represent a package path is a bit clumsy and error prone.
-
CborStructSerialalizerBackend fixes for FSoftClassProperty. Serialize it like FSoftObjectProperty, where the path can be valid even if the object reference isn't.
-
Fixed an issue where Studio Telemetry could cause extreme performance issues in the editor when run on certain hardware configurations
Build
New:
-
Intel® Implicit SPMD Program Compiler has been updated to version 1.24.0.
-
Added
DeprecatedEngineVersion
to plugin descriptor to be able to warn when a plugin is deprecated and will be removed in future engine versions. -
Calling the CustomCopyHandler during CreatePakResponseFileFromStagingManifest
-
Adding support to the BuildGraph system to allow properties first declared inside a macro to be flagged as CreateInParentScope causing them to be created in the scope containing the macro invocation. This allows macros to be used to define collections of properties. This pattern is now used in EditorPerf.xml inside the SetupPerfProject macro.
Bug Fix:
-
Fixed FastBuild failing to distribute .hlsli files.
-
Nastepfilters re-added back into Visual Studio project file generation.
-
Fix data race in UBT DataDrivenPlatformInfoIniIsPresent
-
Adding UE_DEPRECATED_FORGAME and UE_DEPRECATED_FORENGINE to known optional tokens parsable by UHT. E.g. usable for enum entries.
-
ModifyConfig action in buildgraph is not preserving quotations on original value.
-
SN-DBS: Fixed the problem of distributed builds leaving ghost jobs running in the background after failing a build under certain conditions.
-
Fix an issue with making chunked builds due to incorrect quoting of path
-
bEnableNoInlinedWarnings=true causes crash under specific module fileset
-
SN-DBS: Fixed possible issues with distributed builds not handling the cl-filter tool correctly.
-
SN-DBS: Fixed incorrectly set timeout which could lead to spurious fails of long running jobs in distributed builds e.g. when building shaders on some platforms.
Core
API Change:
-
Change storage container from TSet to TArray for passing into UAssetManager::GetPrimaryAssetLoadList, ensure no duplicate assets were added to that list later on a higher level or use TArray::AddUnique().
-
As part of the fix to TSoftObjectPtr's API, some expressions may now fail to compile, like comparing TSoftObjectPtr with a TObjectPtr. This should be fixed by disambiguating the conversion by calling .Get() on the TObjectPtr to convert it to a UObject*.
New:
-
The 32 byte FIoChunkHash used by UnrealPak and iostore has been deprecated and replaced with the 20 byte FIoHash, and at the same time the command line argument -verifyhashdatabase was renamed to -validatechunkhashes and the IIoStoreWriterHashDatabase interface was removed.
-
UTexture::ForceRebuildPlatformData will now build Final when passed an encode speed of FinalIfAvailable, rather than always falling back to Fast. This fixes an issue where failed fetches for FinalIfAvailable would enqueue deferred force rebuilds of textures that will be rebuilt as Fast encoding. Subsequent runs of the editor will still miss on the same texture using Final encoding, and again kick off a rebuild for the already built Fast texture never populating the cache with Final texture data through normal editor usage.
-
Added UE_REQUIRES_FRIEND and UE_REQUIRES_DEFINITION to allow forward declarations and friend declarations with constraints.
-
[TextKey] Make TextKey SlabSize configurable with UE_TEXTKEY_SLAB_ALLOCATOR_SLAB_SIZE and bump the default size to 32k (64kb when using widechar). In tests this has saved up to 20Mb of memory. [RN] TextKey SlabSize is now configurable with UE_TEXTKEY_SLAB_ALLOCATOR_SLAB_SIZE
-
Added FMath::FloorLog2NonZero to enable optimizing callers where the value is known to be non-zero
-
Added support for TUniquePtr
and restored support for TSharedPtr . -
Changes the zenloader interpretation of the flag
RF_WasLoaded
to match the -nozenloader meaning by setting the RF_WasLoaded flag on the linker root object once the package load is complete. Before zenloader would set this flag during creation of the package but before any loading had occurred. Any code guarding access to an partially loaded object will now be correct if guarding against objects missing RF_WasLoaded. However this change does means code looking for partially loaded objects will now need to look for RF_WillBeLoaded specifically. -
Added detection and reporting of Cancel() and Wait() deadlocks in the DDC FRequestOwner
-
Added Algo::Mismatch.
-
Changed mip streaming to use query DDC with
GetValue
rather thanGetChunks
so that data fetching can propagate between the caching layers. Previously if data didn't exist locally, but did remotely, we would consistently miss every time locally, and have to pull data from the remote. This removes thousands of cache misses that can happen every time you load the editor with a local cache less populated than the remote cache. -
Moved Color Management logic & classes into the Core module.
-
Fix const range-based for loops over TBitArray<>
-
Added TArrayView support to TSet's constructor, fixed TArrayView deduction in its Append overload, and added CTAD support for constructing TSet from a range.
-
UObject::Rename will no longer call ResetLoaders implicitly as this frequently would break recursive loads by resetting the loader while still in use. Instead, ResetLoaders will be called when UObject::Rename would be moving an object to a new package with a different loader since using the loader after renaming would very likely be unintended and result in errors. If you do want a mismatched loader after renaming, provide the REN_AllowPackageLinkerMismatch flag when renaming.
-
DDC - Added ability to override OAuthIdentifier for Cloud DDC layer with env variables or command line arguments
-
Reduce the sleeping done in AsyncCompilationHelper::FinishCompilation and corrected all engine implementations of ICompilable to properly signal their completion rather than internally polling and sleeping dragging out slow tasks completion times.
-
FTopLevelAssetPath: Add support for appending to FUtf8StringBuilderBase. Add support for writing FTopLevelAssetPath to FCbWriter. Add support for loading a FTopLevelAssetPath from FCbFieldView. These changes allow FTopLevelAssetPath to be output via structured log.
-
Added TDelegateRegistration and TMulticastDelegateRegistration classes, which can be returned from OnX() functions to allow users to bind or unbind from owned delegates but not invoke them, a bit like C# events.
-
Added FObjectPropertyBase::SetObjectPropertyValueUnchecked variants of the existing functions which don't guard against invalid operations, like setting nullptr to a non-nullable property.
-
Added FindLastFrom to TBitArray
-
Improvements to TIntVector2, TIntVector3 and TIntVector4 to bring them closer to parity with the functionality available in the corresponding TVector classes.
-
Added TSharedFromThis::AsSharedSubobject(&Subobject) and TSharedFromThis::AsWeakSubobject(&Subobject) to allow easy access to the aliasing constructor.
-
Add TArray/TArrayView/FStringView::NumBytes() and FString::NumBytesWith[out]Null()
-
[Rider] Expose additional project properties from UBT to Rider
-
Made TVariant trivially destructible if all the types are trivially destructible.
-
[Rider] Fixed missing system include paths on macOS
-
Added FMath::WrapExclusive which gives more expected results for integral types. Deprecated FMath::Wrap for integers.
-
Add a thread-safe ref-counting mechanism to UObjects. Make TStrongObjectPtr more light-weight and usable on any thread by using ref-count instead of FGCObject. Add a pinning API to WeakObjectPtr so they can be converted safely to StrongObjectPtr from any thread. Make delegate broadcast thread-safe when used with UObjects by pinning during broadcast for non game-thread.
-
Added tracking and storage of unknown enum names and impersonation of enum types
-
TMulticastScriptDelegate archive stream operator is now slightly more conservative about what types of access rights are required based on the type of archive being processed. An archive marked IsSaving will now only require read access. Made a corresponding change in FArchiveGatherExternalActorRefs to ensure that it reports as IsSaving and thus only needs read access. This enables use during concurrent save.
-
The old task graph API now uses the new task system under the hood to improve scheduling behavior.
-
Added intrusive unset optional states to TSharedPtr and TWeakPtr.
-
FConfigFile can now be put in a mode where it will parse the ini file as python configparser does.
-
Added UEnum::IsValidEnumValueOrBitfield() for checking if an enum value allows a combination of flags.
-
Provide better API for AssetManager and StreamableManager to allow additional performance optimizations. Let the user pass TArray instead of the TSet into GetPrimaryAssetLoadList which let them avoid creating of unnecessary array copy when passing the list to AsyncLoading.
-
Add support for compressed binary PackageStoreRequest
-
Add PlatformMemory::KernelAddressBit to enable an extra high-bit for pointer tagging
-
Option to disable anaylzing engine modules or generated code
-
[PVS-Studio] Added a new format of the analyzer report
-
Added multithreaded data processing support for Asset Registry. In case of problems, this can be disabled with -dpcvars=AssetRegistry.TickGatherOnGTOnly=1
-
Changes the trace marker used for denoting GameThread async flushes to now clarify if a flush of all in-flight async loads is being performed or if the game thread is flushing only a subset of all loads. The "Flush All Async Loads GT" marker makes it easier to detect and fix bad behaviour since, except for a few special cases, we should never wait for all loads and instead should be specifying a subset.
-
Added cvar CoreUObject.NonNullableBehavior to control if non-nullable properties produce an error, a warning or a default object when failing to resolve an object reference. Default objects will not be created if the class is abstract.
-
Made UE_STATIC_ASSERT_COMPLETE_TYPE take an optional message, like regular static_assert does.
-
Defaulted - via T() = default; - many class constructors that also have a EForceInit constructor so that value-init works and we get better compiler warnings when they're uninitialized. Includes TBox2, TBoxSphereBounds, FLinearColor, FColor, FInterpCurvePoint, TMatrix, TPlane, TQuat, TRotator, TVector2, FVector_NetQuantize, FVector_NetQuantize10 and FVector_NetQuantizeNormal.
-
Added a UE_DEFINE_PRIVATE_MEMBER_PTR macro that allows access to private members of classes without explicit permission (friendship) from the class.
-
Replaced persistent auxilary memory with a new Persistent Linear Allocator. Some persistent UObject allocations were moved to it to save memory
-
Added CSV scope markers for ResetAsyncTraceTickTime and WorldPreActorTick to reduce the amount of unknown time going into WorldTickMisc [RN] Added CSV profiling markers for ResetAsyncTrace and WorldPreActorTick
-
Added UEnum::GetValueOrBitfieldFromString() for parsing a bar-separated string (but not bar-separated integers) into a flag-based UEnum. Added UEnum::GetValueOrBitfieldAsAuthoredNameString() and UEnum::GetValueOrBitfieldAsDisplayNameText() to match UEnum::GetValueOrBitfieldAsString(), for authored names and display names respectively. Added support for serialising enum flags and converting to/from text.
-
String: Added string case conversion functions under UE::String.
-
Update minimum MSVC to 14.38.33130 & minimum Visual Studio 2022 to 17.8
-
FCoreRedirects is now thread safe.
-
Improve performance of inserting elements into the asset preload list if the uniqueness is guaranteed by the caller.
-
Added MakeConstArrayView.
-
Expose GC time interval parameters inside UEngine. Allow override GC frame budget.
-
IncrementalCook: Add UE::Cook::IDeterminismHelper to write diagnostics for cook indeterminism and false positive iterative skips.
-
Added multi-process support to the saving of derived data cache replays
-
AssetRegistry: Turn on async scan and use of cache in editor -game and editor -server modes; the AssetRegistry is used in all game modes during startup and needs to be cached in all game modes. Delete all code for the non-monolithic cache; the monolithic cache now handles all cases.
-
Introduced _CONDITIONAL variants to TRACE_CPUPROFILER and UE_TRACE macros.
-
- Added FAutoConsoleVariableDeprecated (and FAutoConsoleVariableShadow), which can be used to change the name of a cvar but leave a shadow cvar behind with the old name, so old ini files are not broken, and can control if the user gets warnings, asserts, etc when used - Added support for skipping over Shadow cvars when all CVars are iterated over programmatically, so they are only used directly (like when one is in a .ini file)
-
Changed
UWorld::BlockTillLevelStreamingCompleted
implementation to no longer flush all in-flight async loads globally and instead only flush outstanding streaming level async requests. In large projects this can save significant amounts of time entering PIE. Specifically,-
ULevelStreaming now provides a protected member AsyncRequestIDs to keep track of async loads issues when loading a level. During OnLoadingFinished AsyncRequestIDs will be cleared.
-
If a child class of
ULevelStreaming
has not recorded any async loads in AsyncRequestIDs, we fallback to flushing all async loads as before since we can't know if implementers are relying on the past behaviour of a forced flush of all async loads. -
CVar
s.World.ForceFlushAllAsyncLoadsDuringLevelStreaming
has been added allowing one to revert back to old flushing behaviour temporarily while work to track necessary loads can be done.
-
-
Replace busy wait APIs with oversubscription to fix common deadlocks and reduce CPU usage.
-
r.ShaderCompiler.JobCacheDDCEnableRemotePolicy
is set to true by default now. Individual shader jobs will be cached to remote/shared DDC instances in all operation modes rather than only to the local machine. -
Added UE_REQUIRES_EXPR for wrapping up C++20 requires expressions.
-
Eliminated most blocking during requests in the DDC ZenCacheStore
-
Add a new commandlet '-run="VirtualizationEditor.GenerateMountPointPayloadManifestCommandlet"' that generates a report on editor bulkdata payload usage grouped by mountpoint.
-
Fix commas in unit test expressions in LowLevelTestAdapter for FAutomationTestFramework
-
Added UE_DEPRECATED_HEADER which acts like UE_DEPRECATED and should be placed in headers that should no longer be included.
-
Added [[nodiscard]] to more of the Compact Binary API
-
Added UHT support for FAnsiString and FUtf8String.
-
UnrealMathSSE cleanups enabled by having SSE4.2 min spec; also some UnrealMathNEON cleanups.
-
Add support for studio telemetry. Requires connection info to be defined in a BaseEngine.ini config, as well as opting into those providers via a BuildConfiguration.xml setting
-
Added moves to RelocateConstructItems.
-
MPCook And CookPackageSplitter: Allow each splitter class to opt out of the new behavor allowing generated packages to be retracted. Some splitters need to run BeginCacheForCookedPlatformData before they can decide which packages to generate.
-
Improved performance of FMallocBinned2 and FMallocBinned3
-
Eliminated most blocking during get requests in the DDC HttpCacheStore
-
Moved the reference-counted TSharedString from DDC into Core
-
Improving asset leak reporting when unloading plugins by ignoring the effects of the RF_Standalone flag.
-
Added a check to MakeShareable to ensure that you're not trying to call it on an already-shared TSharedFromThis object, as this will result in a double delete.
-
The existing UnrealPak feature -compressionEnableDDC for iostore compression has been optimized by implementing the newer DDC2 and Tasks APIs. It makes up to 128 inflight get requests and 128 inflight put requests up to a memory limit of roughly 2 GiB and uses batches of up to 8 items with a soft 16 MiB cutoff limit. Shaders, umaps and io chunks smaller than PackageCompressionMinBytesSaved or PackageCompressionMinSizeToConsiderDDC are currently excluded from DDC to reduce the cache churn.
-
Added a DDC FCacheKeyBuilder to support creation of cache keys
-
[Rider] Fixed missing toolchain include paths on Linux
-
Fix -execcmd parsing to allow multiple instances
-
De-inlined complex MemoryOps functions and coerced TFunction and TUniqueFunction bindings into function pointers if possible, to reduce the number of template instantiations.
-
Added InitFromString function to FIntPoint / FIntVector to mirror their ToString function * Added unit tests for InitFromString for FColor, FLinearColor, FVector, FVector2D, FVector4, FQuat, FRotator
-
Added intrusive unset states to various containers. Modified TOptional's move/copy constructors to avoid moving/copying an element type in an intrusive unset optional state, in case the element type doesn't or can't support them.
-
IterativeCooker: ConfigAccessTracking: Replace the limited tracking present in AccessDetection::ConfigIni with a more detailed version that calls arbitrary callbacks on each ConfigValue read.
-
Added UE_DEPRECATED_FORENGINE deprecation warnings for engine modules.
-
UPackage::SavedHash: Add the API that replaces UPackage->Guid. FIoHash SavedHash (or PackageSavedHash ) is now used instead on UPackage, FPackageSummary, and FAssetPackageData. UPackage->Guid is now deprecated; we will remove it in 5.5. This replacement only applies to the editor; in the cooked game we are removing UPackage->Guid with no replacment because it is unnecessary and costs memory.
-
Added a -setby= option to DumpCVars, to filter on how they were set, like "DumpCVars r. -setby=DeviceProfile" will show all rendering (r. prefix) that were last set by a DeviceProfile #changelist validated #virtualized
-
Added .natvis for TraceServices::TPagedArray.
-
Optimized memory footprint of FMallocBinned2 and FMallocBinned3
-
Disable Studio Telemetry in Shipping builds
-
Add cvars VeryLargePageAllocator.MaxCommittedPageCountDefault and VeryLargePageAllocator.MaxCommittedPageCountSmallPool to limit the number of large pages committed for each pool. Since VLPA very rarely releases pages, this avoids the situation where VLPA permanently holds too much memory, leaving less for other large allocations or rendering etc.
-
Added DispatchDynamicLogRecord for advanced log dispatching use cases
-
Added a TString
alias to map a char type to its corresponding string container type. -
FConfigBranch - Big refactor of how FConfigCachelni and FConfigFiles are read in, stored, and modified at runtime
-
FConfigBranch maintains the data of the hierarchy of layers (ie files) that make up the final resulting config values that are queried at runtime (editor keeps full data, non-editor defaults to collapsing all static config layers, for memory reasons)
-
Adding dynamic layers (plugins, hotfix, etc) is now a reversible operation, by having the state of the layers still around
-
When a dynamic layer is removed or added, in-memory changes are remembered (via a diff operation), the list of layers is updated, the combining logic for dynamic layers is run again, and the in-memory diff is patched back on top, then callbacks are fired to update cars, device profiles, object properties, etc
Additional memory saving functionality has also been introduced:
-
SafeUnloadBranch - you can unload a branch from memory, and with the known hierarchy in the branch, any access to that branch will cause the system to quickly reload the data into memory. It can be a small hitch, but if you know you likely don't need a branch again, it can be safely unloaded
-
Optionally, SafeUnloadBranch can be called after N seconds have passed with the branch not being read from.
-
This is car controlled, and is recommended only for very low memory situations
-
-
UnrealBuildTool: Intel ICX 2024.2 integration
-
Setting to control print level of PVS-Studio analyzer warnings (-StaticAnalyzerPVSPrintLevel)
-
Decoupled StudioTelemetryEditor from StudioTelemetry and moved it into its own Plugin EditorTelemetry This makes StudioTelemetry lighter weight and no longer dependant on the Engine and Editor leaving more useful for applying to other systems or applications outside of the Editor or Client Added OnStartSession, OnEndSession and OnRecordEvent delegates that are used by EditorTelemetry to Start/Stop its own session at the time StudioTelemetry starts and stops.
-
[RN] Encapsulated the property data argument of PropertyVisitor callbacks to an object that also includes the parent struct data.
-
Added an API to FRedirectCollector to provide read access to the global list of discovered asset redirects.
-
Added new UE_ preprocessor metaprogramming macros to replace the PREPROCESSOR_ macros to aid readability and discoverability: UE_STRINGIZE, UE_JOIN, UE_JOIN_FIRST, UE_IF, UE_COMMA_SEPARATED, UE_VA_ARG_COUNT, UE_APPEND_VA_ARG_COUNT, UE_EMPTY, UE_EMPTY_FUNCTION, UE_REMOVE_OPTIONAL_PARENS
-
[PVS-Studio] Add new PVS-Studio.exe silent exit code mode.
-
Accelerated CreateLinkerExports during loading in Editor by dramatically reducing memory traffic for assets with many exports. When loading a real-world UMap with 2M exports, we now take 25 seconds compared to 44 minutes.
-
Moved UserDefinedStruct to CoreUObject
-
Added RemoveAt*(Index, AllowShrinking) overloads to FString, FAnsiString, FUtf8String, TObservableArray, TIndirectArray and FPreviewAssetAttachContainer to match TArray.
-
Support adding additional debug visualizer files to be linked when a module is referenced with ModuleRules.PublicDebugVisualizerPaths
-
Add overload of IPlatformFile::OpenRead that can return error messages and takes it's parameters in the form of a bitfield enum.
-
Added missing GetLongPackageFName functions to SoftObjectPtr variations. The underlying FSoftObjectPath has a GetLongPackageFName, which is sometimes useful to call via the owning soft pointer.
-
Added an option for users to premit/restrict sending of User data and Hardware data. Adedd ability to turn off Telemetry capture altogether. Telemetry is ON by default User data is OFF by default Hardware data is ON by default Added commandline options for user to control what is sent by Telemetry: ST_SendTelemetry=true ST_SendUserData=false ST_SendHardwareData=true
-
Added optimized single element TArray Remove* overloads which don't take a count.
-
Introduced a new type of FCoreRedirect, Type_Asset. This can be used to implement behavior in cooked builds similar to what is provided by UObjectRedirector in uncooked builds.
-
Added FValueId::MakeIndexed to the DDC API to more easily support arrays of values
-
Added FPaths::IsStaged() which can be used to determine if you are running while staged. Since staging can remap directory structures, it can be important to know if staged (especially for staged programs)
-
Upgrade bundled dotnet to 8.0.300
-
Added UE_LIFETIMEBOUND attributes to TArray functions which return element references. Added MSVC support to UE_LIFETIMEBOUND.
-
Added TSet::FindArbitraryElement, TMap::FindArbitraryElement and TSortedMap::FindArbitraryElement.
-
Improves DoesPackageExistEx by enabling it to use the AssetRegistry when available, avoiding costly OS calls.
-
Added explicit configuration of the DDC file system cache as local or remote, with a fallback on Windows to detect a remote cache automatically
-
Added a custom import function to JsonObjectConverter methods to match the existing custom export callback.
-
Support for joining tuples, using a new set of
UE::Strings::JoinTuple*
functions. -
Added -DDC-ForceMemoryCache to allow the editor to boot when the cache is misconfigured
-
UStruct::IsChildOf
: Support classes which provide StaticStruct, in addition to those which provide StaticClass. -
Allow projects to opt out reporting loaded plugins in crash reports. This helps reduce the size of crash reports for project with many plugins.
-
UnrealBuildTool: Handle Ctrl-C to gracefully cancel running action queues
-
Added FUtf8StrProperty and FAnsiStrProperty.
- PerPlatformProperties can now be declared for data types outside of Engine, for example enums declared in game or plugin code.
Bug Fix:
-
Fixed many placement new calls in many Core containers to ensure that they still work with types which haven't overloaded operator new.
-
Fixed moving arrays of const TArray elements into array of non-const TArray elements (a const-incorrect operation).
-
Fixing static analysis warning related to auto& on a TCHAR constant.
-
Correctly add project source dir to include path when building a generic target (UnrealEditor, UnrealGame) with a -Project
-
Fixed TOptional::Emplace constructing over an already-constructed inner object when it's in the intrusive unset state.
-
Add list of subrules files to generated Rider project files.
-
Fixed issue where negative legacy could be accumulated in DDC request statistics skewing efficiency numbers.
-
UnrealBuildTool: Set -fno-delete-null-pointer-checks when compiling ms platforms with clang
-
Address cases where it was possible to see objects still being loaded when searching for them from a postload function.
-
Removed auto-creation of non-nullable properties.
-
Fix for FString::ParseIntoArray when string to parse has a length of 0, but still has backing memory
-
Fixed usage of FString::Printf without format arguments in Math header files.
-
Fixed constraints in TFieldPath and TWeakFieldPtr to allow normal pointer assignment semantics.
-
Fixed an issue where making a 0 byte length bulkdata streaming request would work correctly with IoStore but assert when IoStore is disabled.
-
Fix potential deadlock and reduce latency spikes in the task system
-
Ensure internal index is valid before resolving an FPackedObjectRef value from an object reference.
-
Prevented TSharedFromThis from being placed on a UObject.
-
Fixed some unexpected copies caused by trying to move a TArray into another with an incompatible allocator.
-
Fixed conversions in enum serialization when the enum associated with an enum property has changed
-
Fixed a visual bug in the debug console where the cursor position did not match up with the cursor indicator, due to different font sizes being used to calculate each.
-
Fixed the comment of MakeShared about the use of non-public constructors when using emplacement functions, which conflicts with advice given elsewhere in the engine.
-
Fix for AutomaticOptionalInclusion of a BP that depends on a native engine class resulting in a fatal cook error. We now explicitly check if the missing import is to a native type and suppress the error "Attempt to map an object during save that was not listed as a dependency".
-
Use integrated terminal for VSCode
-
Fixed remapping of lazy object ptr in PIE : now a default FGuid is remapped to default FGuid
-
Fix GenerateClangDatabase
-
Fixed static asserts in Cast which prevent casts of UObjectBase and UObjectBaseUtility.
-
Fixing the way that we parse ini config overrides on the command line. This should now properly handle quoted values so long as they are not mixed with commas. Instead, it is recommended that each key/value pair be specified via its own -ini argument.
-
Fixed dynamic delegate hashing of uninitialized padding in its GetTypeHash overload.
-
Moved FConsoleManager to be actually private, just by moving the class decl into the .cpp. There were a lot of uses of #include "HAL/ConsoleManager.h" instead of IConsoleManager.h (and unknown number of licensee uses), so I left that file there and it just includes IConsoleManager.h now. - Fixed up a couple of uses of FConsoleManager when IConsoleManager is the correct usage
-
Fixed constraints on TSharedPtr<>::operator() and TUniquePtr<>::operator(), which would fail to compile for types which overloaded the comma operator.
-
Fixed GFPs failing to build their package localization cache when loading their asset registry data async
-
Fixing a bug where we could try to reinstance CDOs asynchronously as part of live coding. This change ensures we finish all asset compilation before trying to gather the CDO references.
-
Fixed a potential shutdown crash in the bulkdata registry.
-
Makefile generator is now platform agnostic
-
Project Generator for VS Workspace support
-
Improved compiler error messages when using MemoryOps.h functions with incomplete types, e.g. when trying to instantiate the destructor of TArray
. -
Move additional target compile args to after the file type specific args, so any previous arguments will be overwritten if desired, or if they need to be added after other args, such as args that depend on the cppstd version
-
Fixed a lot of mismatched printf format arguments.
-
Support ISPC multiple architectures in a single build
-
Fixed an uninitialized invocation list lock count when move-constructing a TMulticastDelegate.
-
Fixed the StdMalloc wrappers not being defined when FORCE_ANSI_ALLOCATOR is defined.
-
Fixed TScriptBitArray breaking the ClearPartialSlackBits invariant
-
Fix a use-after-free in the task system
-
Fix crash when crash report upload response was null.
-
PVS-Studio - SN-DBS integration fix
-
Fixed TSoftObjectPtr being constructible/assignable from any UObject pointer type, not just convertible ones.
-
Fixed cache policy merging for batched chunk requests in the DDC HttpCacheStore
-
Fix missing ref counting in the runtime loader that could cause use-after-free.
-
Fixed Clang complaining about deprecated enums when used with a TEnumRange.
-
UnrealVS: Prefix encrypted Perforce server port address with "ssl:"
-
Add missing memory barrier when pipe tasks finishes
-
Fixed TNonRelocatableInlineAllocator::ForElementType::MoveToEmpty to leave the moved-from allocator pointing to the inline storage (like after a default construction) rather than unallocated heap storage.
-
Fixed TUniqueFunction compile error when constructing one with an lvalue.
-
Reduced delegate codegen by reimplementing TDelegateBase::CreateDelegateInstance as an operator new overload.
-
Added TIsContiguousContainer specialization for TInlineComponentArray, so it can bind to TArrayView.
-
Fix multiple race conditions that could lead to deadlocks in the task scheduler.
-
Ensured that a non-const source argument in provided to RelocateConstructItems.
-
[Rider] Fix IntelliSense by adding include order deprecation defines
-
Fixed TWeakFieldPtr not supporting "const T" template parameters.
-
\Fix
bool ExecuteDBProxyCommand()
-
Fixed FDateTime and FTimespan not serializing via StructSerializer.
-
Fixed a compile error in TDeque when using an allocator with NeedsElementType == false.
-
Properties that are EditorOnly and marked as part of a config are no longer skipped when not in Editor so standalone mode (-game) will be consistent with Editor and PIE.
-
Fixed an issue objects loaded from a package would be marked as invalid for loading when garbage collected. This meant that until the entire package was collected, it was not possible to fully load a partially loaded package when using ZenLoader in Editor.
-
Prevented Cast from being used on FFields.
-
Disallowed boolean inputs to interp functions.
-
Fix memory leak when waiting repeatedly on a task with a timeout.
-
Fix potential deadlock in IoDispatcher at runtime on low core count systems
-
Fixed inconsistency between EmptyString.ParseIntoArray(Array, DelimiterArray, 1, true) and EmptyString.ParseIntoArray(Array, DelimiterArray[0], true).
-
Fixed a bug where UnrealVirtualizationTool invoking a child process would fail if the engine root path or the target project path has spaces in it.
-
Make delegates in stat system thread safe .
-
Fixed broken TMulticastDelegate move functions.
-
Added missing FObjectPropertyBase::GetObjectPtrPropertyValue_InContainer overloads.
-
AssetRegistry now properly removes redirects from GRedirectCollector when object redirector assets are removed. Added additional conditional timing scopes to registry to help identify stalls.
-
OidcToken - Updated documentation with info regarding lack of support for Google based authentication and some suggested workarounds.
-
Fixed the wrong object being validated in FObjectProperty::PostSerializeObjectItem.
-
Adds missing GetId() member from TSet::TBaseKeyIterator. Without this implementation, it's not possible to use GetId() on TMap::TKeyIterators/TConstKeyIterators This missing implementation is specifically helpful for cases where you'd like to find the KV Pair ElementType for a given KeyArgumentType in cases where you may have collisions between keys and the actual KeyArgumentType value is important. Example case is when dealing with FNames in Editor since they compare on case-insensitive CompareIds but have unique DisplayIds for different casing. If you want to know the casing used when inserted into a map, you can now do the following: TMap
>::TConstKeyIterator It = CachedPackageData.CreateConstKeyIterator(PackageFNameOfAnyCase); FSetElementId Id = It.GetId(); if (!Id.IsValidId()) { return nullptr; } const TPair > KVPair = CachedPackageData.Get(Id); FName PackageNameWithCasingUsedUponInsertion = KVPair.Key; return KVPair.Value; -
Made FUtf8String::Printf's and Appendf's formatting strings be ANSI, because there's no printf which takes a char8_t formatting string. UTF-8-formatted string arguments are still possible via %s.
-
Fix TInstancedStruct assignment so Base = Derived assignments work
-
Improved the robustness of bulk data streaming, and fixed an issue where zero size bulk data was not serialized correctly when loading
-
Multiple fixes in pipe tasks when pushing tasks with prerequisites.
-
Removed rehashing from key iteration, and mutability from TSet members, making TSet thread-safe for concurrent reads.
-
Fixed FThreadSafeCounter64::GetValue() thread safety.
-
Fix broken AnyTaskCompleted that didn't actually wait on any of the tasks
-
Add architecture info to Rider project files
-
Optimized TQuat::Slerp_NotNormalized(). Added startup tests to validate more completely.
-
Fixed constness of FProperty* in TPropertyValueIterator.
-
Completed the FObjectPropertyBase::SetObjectPtr overload set, which was only partially implemented before.
-
Update NoExportTypes.h to add missing units, and to correct the order of units that were already there. This was breaking serialization of entries missing from the mirrored enum in NoExportTypes.h.
-
Fixed EAutomationTestFlags to be an enum class of pure flags, so the flags are visible in the debugger.
-
Allow Json object helpers to work with UClasses as well as UScriptStructs
-
Fix: clang coroutine support when building with C++17
-
Fix for buffer underrun in the Span and Region name generation
-
Stopped TArray::RemoveAt() being called with a non-integral size argument, including EAllowShrinking.
-
Fixed TIsValidVariadicFunctionArg failing to catch disallowed types in Printf-style functions accepting types which were convertible to allowed types but which weren't themselves allowed.
-
Add the ability to add properties and their values in one operation to an FInstancedPropertyBag
-
Fixed LiveCoding not detecting changes when working from vanilla editor
-
Make FDoubleProperty and FFloatProperty use Verse's extensional float equality semantics, and support value hashing. This should only affect comparison of NaNs: the previous behavior was for them to treat NaNs as equal to all other values; the new behavior is to treat all NaNs as equal to each other, and unequal to all other values.
-
Fix UScriptStruct::Serialize clobbering the saved struct flags on load for structs that don't have a matching CppStructOps.
-
Fixed TStrongObjectPtr's comparison operators to follow normal pointer semantics.
-
Fix incorrect call to AddStableReference on a stack variable
-
Added bitfield text import and export support to FByteProperty with an enum, and fixed a bug where a getter wouldn't be used.
-
Fixed a race in the legacy DDC API CachedDataProbablyExistsBatch
-
Restore the Windows dll directory cache startup optimization that has been broken and was inactive in the previous release.
-
Fixes for Rider project file generator
-
Fixed TWeakInterfacePtr
and TScriptInterface . -
Fixed class template argument deduction for TWeakObjectPtr.
-
Added missing OutFailReason parameters to FJsonObjectConverter::JsonObjectStringToUStruct, FJsonObjectConverter::JsonArrayStringToUStruct and FJsonObjectConverter::sonArrayToUStruct.
-
Fix wasting one cycle when starting GC async purge.
-
Added REQUIRE_CHECK_SLOW to low-level test macros, that validates that checkSlow, checkfSlow... are called on configurations where they're effective
-
Fixed property conversion to and from enums with bitfields.
-
Push array inner property to current archiver state when serializing "replacement" array item value overrides on load.
Deprecated:
-
Deprecated TEMPLATE_REQUIRES. UE_REQUIRES should be used instead, though the syntax is slightly different - see the comments.
-
FCompression interface now has 64 compression interfaces that should be preferred over the 32 bit ones, which will eventually be deprecated. Note that the return value meaning has changed to allow for returning whether the compression failed independent of whether the output was actually compressed.
-
Deprecated TIsTriviallyDestructible.
-
PostLoadAssetRegistryTags has been deprecated. Custom implementations should be changed to be thread safe and implemented as ThreadedPostLoadAssetRegistryTagsOverride. This was necessary in order to support multithreading of the asset gatherer tick to improve editor launch performance.
-
Added UHT support for
UE_DEPRECATED(all, "...")
macro, which is already used in the engine and will serve as a way to leave the UE_DEPRECATED mark on code that has been deprecated for more than 2 engine versions but has to stay in the codebase "forever" because it's reflected (UPROPERTY, UFUNCTION, UCLASS, USTRUCT).-
Use case :
// Let's say we've deprecated the following code in UE5.1 UE_DEPRECATED(5.1, "Use the other thing instead...") UPROPERTY(meta = (DeprecatedProperty, DeprecationMessage = "Use the other thing instead")) float SomeUProperty_DEPRECATED = 1.0f; UE_DEPRECATED(5.1, "Use the other thing instead...") UFUNCTION(meta = (DeprecatedFunction, DeprecationMessage = "Use the other thing instead...")) void FooBar(int32 X); // Then when shipping UE5.4, we would turn that into: UE_DEPRECATED(all, "Use the other thing instead...") UPROPERTY(meta = (DeprecatedProperty, DeprecationMessage = "Use the other thing instead")) float SomeUProperty_DEPRECATED = 1.0f; UE_DEPRECATED(all, "Use the other thing instead...") UFUNCTION(meta = (DeprecatedFunction, DeprecationMessage = "Use the other thing instead...")) void FooBar(int32 X);
-
Therefore, the act of deprecating code that is more than 2 engine versions old consists in a simple text-search for "UE_DEPRECATED" in your code and for the occurrences that are not tagged as "all" and more than 2 versions old. Then:
-
If the code is reflected, turn them into UE_DEPRECATED(all, ...)
-
Otherwise, remove the code altogether
-
-
-
Deprecated calling AddSaveOverride on the context given to UObject::PreSave
- You should override UObject::CollectSaveOverrides and call AddSaveOverride on its context instead
Dev Tools
New:
-
[UnrealBuildTool] Added a
bGenerateProgramProject
flag toTargetRules
, which forces a target to be treated as a program during project file generation. -
CSV Profiler: add support for aggregated task stats. This can be enabled via the cvar csv.AggregateTaskWorkerStats, which defaults to on. When enabled, stats recorded on task worker threads are aggregated instead of outputting a single stat per thread. This reduces CSV size when there are large numbers of worker threads, and makes stat data more intelligible. The stats appear with an AllWorkers prefix instead of the individual thread name.
-
Add support for the OptimizationLevel param for Clang-CL (so -Oz is used for OptimizeForSize etc). This includes optimal flags for PGO, since -Os tends to be the fastest option there (in addition to being smaller)
-
Updated the logging for mismatched build settings that require UniqueBuildEnvironment to show the values that don't match
-
Added more metadata information into UnrealInsights trace scopes:
-
Package name in AsyncLoading (for LoadTime channel)
-
Statemachine name during GameFeaturePlugin transitions.
-
Marked GC region
-
-
Added ability to read plugins into a config hierarchy, controlled by passing optional IncludePluginsForTargetType param to ConfigCache.ReadHierarchy(), with a TargetType (like Game or Editor). - Use this in CopyBuildToStagingDIrectory when reading the Packaging settings when staging. This allows plugins to add files/directories to stage without needing to modify every project. - Added a ConfigTester Turnkey command that can help test C# inis programmatically. Currently need to pass in these 3 params on commandline, it doesn't ask for them: -Branch=Engine -Section=SomeSection -Key=SomeKey
-
Allow for -ActionTypeFilter to BuildMode, which will make only certain action types to run
-
[UnrealBuildTool] Added a
bAllowEnginePluginsEnabledByDefault
field toTargetRules
, which is analogous to (the inverse of) the "DisableEnginePluginsByDefault" field in uproject descriptors. -
CsvProfiler - Report explicit event wait names as trace scopes.
-
Added a shared GetEditorForProject() function which should be used in UAT to get the path to the binary to run, becasue UnrealEditor-Cmd.exe is not always correct (if the editor is a Unique build environment, the editor to use to cook etc is the project editor, not UnrealEditor)
-
Passing in "null" for a lot of UnrealExe params, instead of "UnrealEditor-Cmd", to allow GetEditorForProject to be called (we must still allow for a true override, so we can't get rid of the param)
-
Added FileSystemReference.Exists
-
-
Added source location tracking for async load requests that do not have debug name specified
-
Added support to OutputLog to only have the TargetDevice functionality if DeveloperTools are included in the target (so programs can use it without needing to pull in the whole mess that is TargetPlatform)
-
Added a method for Shared build environment builds to have certain modules marked as caring about SDK version overrides for some platforms - if any of those platforms are overridden, the DLL will be written to the project Binaries dir instead of Engine (set bAllowSDKOverrideModulesWithSharedEnvironment = true in a Target.cs) - Added ability to optionally skip SDK validation when making a Target instance even if we don't want to skip Target validation (used when we make the base UnrealEditor target to compare to project's Editor target - we don't need to manage SDK for that temporary UnrealEditor target). - ShaderCompileWorker is now BuildEnvironment.UniqueIfNeeded, which will build into the project binaries dir if needed (based on per-project SDK override) - UnrealPak is marked as not caring about an SDK versions so it can be built along with SCW that does care - Added $(BinaryDir) variable to UEBuildTarget, etc, for the location of the first Binary in the output binaries
-
Allow to disable _callstack trace _channel and not pay for backtrace overhead, which can be very costly on some platforms.
-
Added ListShaderLibraries _and _ListShaderMaps commands that let you analyze the memory footprint of those structures. Requires r.TrackShaderMaps cvar to be enabled and for build target _bTrackRHIResourceInfo _set.
-
Set all *TargetPlatform.Build.cs's to set the new SDKVersionRelevantPlatforms list so that per-project SDK version overrides will compile unique versions of those modules when that platform's SDK version of overridden
-
Expose memreport metadata generation to the UEngine interface.
- Also expose DoGameSpecificBugItLog in CheatManager
-
Added client-side stat for IRIS active replicated object count
-
Experimental release of Automated Perf Testing Plugin v0.1, providing Gauntlet Test Controllers, UAT Test Nodes, and BuildGraph macros for adding common automated performance tests to a project's automated build and test.
- Currently supports static camera, sequencer, and full-screen quad material tests, with options to output via Insights, CSV Profiler, and FPS Charts.
-
Disable hitchdetector when LLM is enabled unless -_DetectHitchesWithLLM _command line parameter is specified. It is expected that LLM capture adds CPU overhead during captures, hang/hitch detection made things just worse by spamming logs with unhelpful info.
-
[UnrealBuildTool] Added a
bExplicitTargetForType
flag toTargetRules
, enabling targets to opt out of being considered byGetTargetNameByType
. This enables the introduction of new, narrowly-scopedTargetType.Editor
targets, without introducing an ambiguity around existing-TargetType=Editor
invocations of UBT. -
PerfReportTool: Add support for stat type qualifiers in summary tables so we can identify stats by their type to avoid ambiguity, e.g [meta]deviceprofile. Prefixes are : [metric] [csv] [meta] [toolmeta]
-
CSVToSVG 3.61
-
Add -startEvent and -endEvent params to start and stop graphing at a particular event
-
The params -startEventOffset and -endEventOffset allow you to offset the start/end by a particular number of frames
-
-
PerfReportTool v4.236.0 - Added Wildcard Stat support to BoundedStatSummary. This allows ReportTypes.xml to specify '
*
' for generated columns in a summary table. The tool will now attempt to match that wildcard to all possible stats, generating new columns for each. Wildcard symbol needs to be provided in the column name, summaryState name and stat name, or it will skip that stat name. Supports otherStat as well so can be used with the Ratio formula. [RN] PerfReportTool v4.236.0 Added Wildcard Stat support to BoundedStatSummary. This allows ReportTypes.xml to specify '*
' for generated columns in a summary table -
[AutomationTool]
MakeCookedEditor
now allows subclasses to overrideProjectParams
construction. -
CsvToSvg - Improvements to event formatting in graphs
-
Adding a macro called "AdditionalTestNodes" to BuildAndTestProject which can be extended via a file include "AdditionalTestNodesExtendFile" in order to inject additional test nodes attached to the existing per-platform/per-configuration test agent.
-
CSV Profiler - Add ProgramSizeMB metadata so we can capture this even when LLM isn't running
Bug Fix:
-
Scope filesystem callbacks to shader code into Shader LLM, added more asset tags
-
Restore behavior of MemReport -full by duplicating the list of commands from default profile.
-
UHT will now generate valid code if the header file had multiple '.'s in the file name.
-
Fixed UHT code generation to support enums with no enumerators
-
Fix issue where a TInstancedStructs property wasn't setting the meta data in the correct place when used with a container such as TArray.
-
Fixed typo in the centimeters per second units in UHT.
-
Fail gracefully if we fail to allocate TLS data for the CSV profiler
-
Remove FName block allocations and TextureManager construction from contributing to the MemQuery/Memtrace asset memory cost readings
-
Live Coding should no longer crash when patching headless editor instances
-
Fixed UnrealVS hanging on start-up due to unexpected load order with initialization.
-
Mark more SceneRender reallocations with correct LLM tag instead of EngineMisc and other random tags
-
CSV Profiler : Fix a crash related to SetWait
-
UHT will generate an error if an IInterface is improperly used.
Horde
New:
-
Horde: Add missing documentation for windowSize parameter
-
Horde: Separate out log event warnings and errors into a separate fingerprint when we exceed the 25 event limit in the Hashed Issue Handler.
- This means that any newly introduced errors will not be merged into an existing issue if it only comprises of warnings.
Bug Fix:
- Horde: Make horde chunk boundary calculation consistent with unsync, add unit tests to validate determinism
Insights
New:
-
Add command line override for sponsor mode for UnrealTraceServer.
-
Rearrange TraceLog message types and emit fatal error for OOM.
-
[Insights] Add TimingInsights.ExportTimerCallees command to export the callee tree of the provided timers.
-
Extended the Timing Regions Trace API to allow closing regions by ID. This allows multiple timing regions with the same name to overlap and be uniquely identified.
-
Adds a control layer for Trace (TraceService) and a controller (TraceController) integrated into SessionServices module. This allows remote control of tracing over messge bus.
-
Improved "Export memory snapshot". - Added Package, _AllocThreadName _and _FreeThreadName _columns to the exported table - Use filtered table result instead of all nodes as a datasource
-
Output TraceLog control port in log When running multiple instances on one the same machine TraceLog searches for an open port to listen to control commands, but there was no way for the user to know which port each process ended up using. Add log entries that print the final listening port.
-
Allow Unreal Insights to connect to non-standard control ports When running multiple instances on the same machine, TraceLog listening port will be different for each process. Allow the Unreal Insights connect UI to use non-standard ports by specifying "ip:port" format.
-
Add Trace Pause/Resume menu entry to the Trace Editor Widget.
-
Preset for "light" memory tracing. In certain scenarios it can be useful to trace detailed allocations, but without paying the cost of recording callstacks and instead rely on tags for analysis. Enable light memory tracing by starting the process with
-trace=memory_light
. -
Add option in UnrealTraceServer to detach from current console. Automatically apply this option when launching a forked server to avoid stopping the process when terminal window closes.
-
Add more descriptive tooltips to the channels and to the Screenshot,Bookmark and Region menu entries in the Insights Status Bar Widget.
-
Added Unreal Insights support for tracing memory page swap events
-
Added Branch and Version columns to session browser
-
NetworkInsights - Detected lost packets are now marked on incoming data - Changed how we display lost data to make it easier to spot.
-
Adding controls to the Insights status bar for to beginning/ending a trace region in the editor
-
Trace autostart for Mac/Linux. Applications can now automatically start tracing whenever Unreal Insights application is running. The behaviour can be controlled using the UI in Insights session browser or by starting the application with
-traceautostart=x
. -
Adding Trace Screenshot BP node to the Trace Utilities plugin
-
When using "-tracehost" command line argument without specifying a hostname, default host will be 'localhost'. This is analog to how the "-tracefile" arguments work.
-
Added Trace.RegionBegin command
-
Added Trace.RegionEnd command
-
These commands allow developers to manually tag regions of insights traces with custom names.
-
UnrealInsights - Add 'Copy Name To Clipboard' context menu option.
-
Improved SessionBrowser selection and expansion. Added text about the need to run with (-messaging) for sessions to be shown in SessionBrowser. Changed SessionBrowser row colouring and alignment. Disable auto selection of current session in Unreal Insights Frontend. Widened the channel list columns.
-
Added the ability for Unreal Insights to resolve symbols for iOS using psym files
Bug Fix:
-
[Insights] Fixed timing regions emitted from SlowTask to use unique ids. Matching by name was not reliable when multiple slow tasks with same name are active at the same time.
-
Fix for trace snapshots on platforms that use internal send buffers. When a trace was active and a snapshot was triggered the send buffer could be flushed while writing the snapshot, making the ongoing trace miss events.
-
Renamed the "LoadObject" named event (defined by SCOPED_NAMED_EVENT) as "StaticLoadObjectInternal" (measures time in StaticLoadObjectInternal() function) because there is another "LoadObject" cpu scope (defined using the UE_TRACE_LOG_SCOPED_T macro; the one with metadata) which measures same function.
-
Fix crashes in UnrealInsights when cache size grew too large.
-
Fix crash when UnrealTraceServer on Linux was looking for user home directory.
-
Do not reset bytes traced statistics on new connection
-
Correct how we now can return the original allocator from MemoryTrace_CreateInternal. This fixes incorrectly trying to hook virtual memory allocators on Windows when memory tracing is disabled.
-
Remove screenshot options from Insights status bar when feature is disabled.
-
Fix bug in UnrealTraceServer on Windows when launched by a process with elevated privileges and used as sponsor process. UTS was not able to open a handle to the sponsor which resulted in immediate exit.
-
GpuProfiler: Support gpu trace events named with the
_N pattern, where N is some integer. Before this fix, Gpu trace events with said naming pattern would all appear with the same name, which would correspond to the first one. e.g. VP_0, VP_1, VP_2 would all appear as VP_0 in Unreal Insights. This is because the event is being sent as a uint32 corresponding to the ComparisonIndex of FName, which is the same for the above naming pattern - the N ends up encoded in the Number of the FName, corresponding to the instance number. -
Fix narrowing of store directory string. At one point it was assumed that store directory would only ever be limited to ANSI. The selected directory string was narrowed before being sent to UnrealTraceServer.
-
Emit error message if TraceLogs redirect buffer is full.
Deprecated:
- Marked all the Profiler* modules (Profiler, ProfilerClient, ProfilerMessages, ProfilerService) as deprecated. If another module depends on one of these modules a warning message will be triggered by UBT. The old Profiler is actually deprecated since UE 5.0, superseded by Trace/UnrealInsights.
Unreal Build Accelerator
New:
- Added User and Build UBT/UBA Metrics to Horde Analytics
Framework
New:
-
Improved error messages when we skip loading a package during import because the plugin wasn't mounted. The plugin manager and the GameFeatureSubsystem now have an opportunity to provide additional information to the user about why the plugin wasn't loaded or the package wasn't found. This information is provided in the Message Log and output log.
-
Fixed potential recursive out-of-memory/corruption crash due to memory allocations in the crash handler.
-
Added ability to Gauntlet's Heartbeat system to track all client apps
-
Added thread manager interface for retrieving callstacks without incurring additional allocations (which will be used to avoid failing to allocate memory while crashing out of memory).
-
Factor FGameFeaturePluginTemplateDescription into it's own file
-
UBT will now write out the BuildPlugins names to correctly ignore optional plugins in the editor
-
Plugin templates can provide an optional default plugin name to use when selecting the template in the plugin wizard
-
Removing IniCacheSet usage in plugin manager; the set doesn't actually get propagated in the ParallelFor below where it is currently used (and doesn't save much in normal circumstances either).
Bug Fix:
-
Follow-up fix to a linker error from CL 27595673 that was reported by a licensee.
- If you created a custom class derived from ALight, there would be a linker error reporting a missing definition of ALight::PostLoad. The vtable of a derived class needs to call PostLoad, which requires that the symbol has been exported.
-
Improved ZipArchiveWritter ZIP64 handling of header output so that is outputs valid zip headers which prevents issues with some zip extration tools
-
Fixed linear extrapolation in SplineMeshComponent by using the positions at MinT and MaxT instead of the Spline StartPos and EndPos respectively
AI
New:
-
[NNE] Extended NNERuntimeORTDml to implement NPU runtime interface.
-
Add ability to search for blackboard keys and gameplay tags in the behavior tree editor
-
Prevent move or copy of FWorldConditionContext and FWorldConditionContextData
-
NNERuntimeORT upgrade ONNX Runtime to version 1.17.1 and its required dependency DirectML to version 1.13.1.
-
Create BlackboardKeyType_Struct and associated ValueOrBBKey_Struct
-
Create StateTreeMoveToTask wrapping a UAITask_MoveTo allowing state tree to move AI using the same framework as BehaviorTree Create the FStateTreeAITaskBase & FStateTreeAIActionTaskBase state tree task namespace for AI focused ST task
-
Our plugin NNERuntimeORT already includes a DirectML runtime that implements the GPU interface for neural network inference outside the rendering of a frame. We implement the necessary infrastructure to let this backend also implement the RDG interface for in-frame inference, providing a fast and powerful execution provider on DX12 based desktop systems.
-
Create BTTask_RunStateTree and BTTask_RunDynamicStateTree that allows the execution of state tree in a behavior tree
-
Introduce FValueOrBBKey_X, a Default Value/Blackboard Key pair for BTNodes with a custom view to make picking key easier FValueOrKey are created of each of the engine blackboard key types.
-
Added an editor accessor for the FullNodeMap
-
NNEDenoiser: Upgrade OIDN models to version 2.3.0.
-
NNEDenoiser uses NNERuntimeORTDml on RDG as default.
Bug Fix:
- [Learning Agents] Fixed MaxAgentNum bug with manager component not working on spatially loaded actors
Deprecated:
- Removed NNERuntimeRDGDml, please use NNERuntimeORTDml (on RDG) instead.
AI Behavior Trees
New:
-
Stop BT in UGameplayBehavior_BehaviorTree on abort
-
Clean up GameplayBehavior_BehaviorTree on ctrl teardown A cancelled behavior now explicitly stops the tree to not let it run until another different BT is pushed. It also solved the issue with repeated execution requests of the same BT asset that will fail as the component would think it's already running it. Listen to possessed Pawn changes to prevent leaving the behavior running which could cause a resource leak and an ensure in OnTimerTick.
-
Blackboard now uses DuplicateObject instead of NewObject when instantiating a key so all default values are properly copied.
-
Composite BT node memory lifecycle methods are now exported as part of the API
Bug Fix:
-
Updated TimeLimit Decorator to not get get ticked again in case it is still active after requesting execution (e.g. latent abort)
-
remove any scheduled updates when the tree is stopped
AI Debugging
New:
-
Rewind Debugger: Add support to specify trace filename or host in RewindDebugger.StartRecording
-
VisualLogger
-
Removed ensure on the Editor world when getting timestamp since it might be called while it's getting garbage collected
-
Added GWorld as a fallback in GetWorldForVisualLogger
-
-
Added option "Slot Details" to be able to reduce the amount of replicated data for worlds with large amount of SmartObjects.
-
This option is required to display annotations (i.e. turning it off will disable annotations and turning on Annotations will turn this one on)
-
When turned off, a single shape will represent the SmartObject in the world
-
-
Prevent Visual logger rendering actor from being selectable and showing up in the scene outliner
Bug Fix:
-
Fixing up a regression in the Visual Logger where Actors failed to have unique names with bForceUniqueLogNames set.
-
If the Gameplay Debugger is active while quitting, then restore the temporarily disabled GAreScreenMessagesEnabled flag (which allows messages to log to the screen). Previously, quitting the game (e.g. ending PIE) while the Gameplay Debugger was active would prevent further messages from being logged to the screen in subsequent plays.
-
Wrong definition of macro UE_CVLOG_CIRCLE_THICK Visual Logger
-
Improving ListenServer mode support for GameplayDebugger.
Deprecated:
- Deprecating old FVisualLogger::GetEntryToWrite in favor of a new, static FVisualLogger::GetEntryToWrite for consistent Engine Timestamps in Editor.
AI EQS
Bug Fix:
-
Allow EnvQuery TraceByProfile to set the shape of the trace used.
-
Fix EQSEditorModule custom Toolbar Extenders not being applied
AI Navigation
API Change:
- SetConfig should now store the properties supplied for registering the navdata in the NavAgentProperties. NavAgentProperties will be used as the agent mapped to the navdata for registering/unregistering with the navigation system.
New:
-
[Navigation] Added a query to ANavigationTestingActor to display if navigation data is ready (if it has been generated) within a given radius.
-
Addition of a Boolean to track if a navmesh has been loaded without it's tiles and update the display so it shows as needs to be rebuilt (can occur when undoing a navmesh).
-
Addition of a "Navmesh needs to be rebuilt" message to the navigation display since the stat display is not always enabled.
-
[Navmesh] Added more information when reporting the error message related to the TileNumberHardLimit.
-
[Navmesh] Added more information when reporting the warning message related to the tile pool size.
-
[Navlink] Added custom link owner's name to the link ID warning to allow identifying the problematic actor.
-
[Navigation] Improved AStar log readability and added details when filtering nodes.
-
[NavInvokers] Optimization: avoid reserving local containers every frame.
-
[NavInvokers] Added a profiler tag for more precise tracking.
-
GetEdgesForPathCorridorImpl is no longer inlined so that derived classes of ARecastNavMesh can call the function.
-
[Navmesh] Added display of heightfield layers to the tile debug display.
-
[Navigation] Clarified UAITask_MoveTo params.
-
Change NavLinkProxy to update navigation data in PostEditChangeProperty similar to what is done in other navigation code.
-
[Navmesh] exposed GetPolyWallSegments to game code via ARecastNavMesh
-
Replaced custom NavLink static registration queue by a new world subsystem that will also store NavRelevantObject that are not AActor/UActorComponent based. This change allow new NavigationSystem created after initial map load (e.g. ANavSystemConfigOverride) to properly recreate its custom nav link mappings and octree.
-
[NavInvokers] Optimization: now using a map instead of an array to avoid high cost as invoker usage scale up.
-
No longer add AI and Navigation systems when creating inactive world with physics
-
[Navmesh] Added a NaN check to dirty area bounds.
-
Added early warning for invalid bounds when creating FNavigationDirtyArea.
-
[Navmesh Generation] Removed MaxVerticalMergeError and instead prevent point merging when adding raw contour points if simplificationElevationRatio is being used.
-
Updated some NavigationSystem method display names to be consistent with other BP exposed functions
-
[Navmesh Generation] Fix contour simplification to be symmetrical when using SimplificationElevationRatio.
-
Exposed RequireNavigableEndLocation to MoveToLocationOrActor BP function.
-
[Navmesh] Optimization to simplifyContour.
-
[Navmesh] Removed deprecated FRecastNavMeshGenerationProperties.
Bug Fix:
-
[Navmesh] Refactor to keep solidHF and compactHF for the lifetime of FRecastTileGenerator.
-
[Navmesh] Changed ARecastNavMesh "Draw Failed NavLinks" debug name to "Draw Failed and Valid Links".
-
[Navigation] Fixed Recast AStar log name.
-
[Navmesh Generation] Fixed issue where polygon would wrongly connect to a different height, resulting in a broken navmesh surface.
-
[Navmesh] Fixed IntCastChecked assert caused by invalid location, tiny tiles or giant invoker radius.
-
[Navmesh Generation] While adding raw contour points, use the height from the highest connected corner cell.
-
Fixed RecastNavMeshGenerator to use TotalNavBounds when IsValid is 'true
-
Fix security issue:
-
Memory Corruption in SimpleCellGrid::Serialize() Due to Missing Bounds Check and Integer Overflow.
-
Make sure DataBytesCount is computed from width and height and prevent width*height from overflowing.
-
-
Fixed missing NavigationData cleanup when cleaning up the whole system. When a NavigationData is either EndPlay or Destroyed it unregisters itself from the NavigationSystem and perform its cleanup. Problem was that when the whole system is doing a cleanup in response to
OnWorldBeginTearDown
it was only unregistering without performing the cleanup. -
[Navmesh Generation] Fixed:
-
When removing poly, make sure that the totality of the replacement poly is copied.
-
When looping to see if vertex have been flagged for removal, stop the loop to prevent the flag from being reset.
-
-
Bug Fix: Fixed an issue where navmesh won't be updated if the user manually calls SetStaticMesh() function on a collision-disabled StaticMeshComponent
-
Fix crash when generating navmesh tiles if DirtyLayers has not been initialized.
-
[Navmesh] Fixed tile portals not connecting caused by picking opposite portal direction (on an edge above or below) when building mesh adjacency. This fixes issues seen in stairs where the stair corridor can be blocked by a hard edges when edges between layers do not match perfectly.
-
[Navlink] Avoid registering link proxy with invalid id.
-
Bug Fix: Fix issues that Navmesh Generation for Brush actor isn't correctly updated after some operations.
-
New: Added a console variable brush.ForceNavmeshGenerationOnStaticBrush to enable/disable the effects of Navmesh Generation relevant flags on Brush Actor.
-
[Navmesh] Fixed crash in ARecastNavMesh::FindPath when NavData is missing from the query.
-
[Navmesh] Fixed cylinder collision wrongly offset when used as navcollision on dynamic obstacle.
-
Fix issue where AgentToNavDataMap entries were not cleaned up properly due to ARecastNavMesh updating its config to have a valid agent step height if the step height was not overridden.
-
NavigationTestingActor: Don't reset ShowStepIndex for every request and allow to save it's value (not transient anymore).
-
[Navmesh] dtBuildTileCachePolyMesh fix: while removing vertices, fix addition of an extra point to the contour since it can break the triangulation and result in missing polygons.
-
[Navmesh] Fix crash in ARecastNavMesh::FindEdges when RecastNavMeshImpl is not valid.
-
Bug Fix: Fixed an issue where navmesh generation for HierarchicalStaticMeshComponent won't be updated correctly on certain operations.
-
New: Deprecated some APIs in HierarchicalStaticMeshComponent
-
[InstancedStaticMesh] Fixed partial navigation update for Editor manipulations
-
added partial update on component registration/unregistration
-
skip updates when adding/removing instances when component is not registered
-
added list of dirty areas to pending dirty element so they could be applied when udpate info is successfully processed
-
added some missing updates when not using partial updates
-
-
[WP Navmesh] Fix and simplify WorldPartitionNavigationDataBuilder clean packages process and removing dead code.
- Issues could occur with wrongly generated packages, now the chunks will be deleted regardless of their spatialization.
-
Bug Fix: Fixed an issue where InstanceStaticMeshComponent with odd numbers of negative scale axis didn't correctly generate navmesh
-
[Navmesh] Tiles are not saved during undo redo operations anymore.
-
OnNavigationBoundsUpdated, make a removal request if the bounds are invalid.
- This avoids having invalid RegisteredNavBounds when undoing the addtion of a NavMeshBoundVolume.
-
Fix possible crash for an invalid navmesh in AdjustLocationWithFilter.
-
[Navmesh] Fixed crash occurring when undoing removal of ARecastNavmesh.
-
Fixed crash in NavLocalGridManager when invalid parameters are provided
-
[Navmesh] Fixed crash when changing TileSizeUU value.
-
[Navmesh] Fixed debug display issue in duDebugDrawHeightfieldLayer
-
[Navmesh] Added ensure for TileSize != 0 and for the range of the tile coordinates.
AI Perception
Bug Fix:
- Fix Crash in UAISense_Sight::Update
AI Smart Objects
New:
-
Definition asset can no be longer be changed when component is bound to the simulation.
-
Cached variation is now reset when changing the asset definition
-
GameplayInteractions Plugin - UAITask_UseGameplayInteraction task success is now based on StateTree end result.
-
Adding support for SmartObjects on instanced actors using tag and fragments to create/destroy smart objects for mass entities
-
Owner actor is now provided to FindSmartObject in EQS query generator
-
Allow smart object creation from definition, transform and owner descriptor struct that will use dynamic IDs
-
Replaced registration type
WithCollection
byBindToExistingInstance
in USmartObjectComponent since it can also be used for objects not tied to a component lifetime created from CreateSmartObject -
Allow subsystem component accessor to force hydrate the actor associated to a smart object
-
Use sweeps instead of line traces to detect ground on exit. This prevents line traces from missing geometry when objects are perfectly aligned
Bug Fix:
-
Change BP function library's Mark Slot as Occupied to return the result of the subsystem's Mark Slot As Occupied when it is called.
-
Clear cached asset variation when the base asset gets saved
AI State Tree
New:
-
enabled debugger on all desktop platforms
-
New: Add buttons for creating new state tree nodes blueprint classes
-
New: Added Random Selection Behavior for State Tree
-
Create state tree task Run Parallel tree allowing a state to run a subtree while child state can still to be selected and entered.
-
New: Added Browse to Blueprint and Open Blueprint buttons for State Tree Nodes
-
New: Added Utility-based Selection Behaviors in State Tree.
-
New: Added Weight variable and a new type of State Tree Node named Considerations used by the aforementioned Selection Behaviors.
-
New: Added relevant UX features.
-
Extend FStateTreePropertyRef to be able to bind to multiple property types
-
StateTreeDebugger buffered data now handled differently if it can be reused in multiple traces during the same game session or if it needs to be reset when stopping the trace
-
Create IStateTreeSchemaProvider that allows a derived class to override the schema used by a parent property. Create StateTreeAIComponent & StateTreeAIComponentSchema derived from StateTreeComponent but guaranteed to have a AIController
-
StateTreeDebugger
-
New recording started from the debugger will be selected as the new active analysis
-
Allow multiple recordings during the same PIE session to reactive existing tracks
-
Do not apply trace selection if user reselect the current trace to avoid clearing data
-
Bug Fix:
-
Fix nullptr error for invalid StateTreeRef
-
Bug Fix: Hid "IsTrue" option for operator on State Tree Conditions because it's not applicable
-
Fixed debugger timelines reused for the same instances through multiple traces taken during the same game session
API
New:
- GameFeatures API: Add the OnGameFeatureActivated callback to trigger only once a Game Feature Plugin is completely active; For when some observing system relies on a plugin being fully active and not in the process of activating.
Audio
New:
-
Added two new Modulation functions on the Audio Component: Add Modulators and Remove Modulators.
-
Added experimental Control Bus Dashboard to Audio Insights. To view it, set the console variable au.Modulation.AudioInsightsTab to 1.
- This tab is a work in progress, but the implementation serves as an example if you want to build dashboards for your own tools.
-
Asynchronous loading added to Soundscape Palettes
-
Added a new CVar to force Spatialization Plugin Submix to send directly to main submix instead of the user set Default Submix: au.IgnoreUserResonanceSubmix
- This CVar is part of a fix for a very specific edge case involving Audio Modulation, Submixes, and External Spatialization plugins (eg. Resonance), which sometimes resulted in submixes' Volume Modulation being applied twice.
-
Remove tick from UMetaSoundOutputSubsystem, only drain queues when there is new data.
-
Newly created Control Buses now default to using the Volume Parameter.
-
Make subdivision trigger and pulse generator work the same way.
-
Added a CVar to Enable/Disable Audio Modulation: au.EnableAudioModulation
- Setting this CVar at runtime freezes the state of the entire Modulation System. Launching with this CVar means that no modulation assets will ever be created or updated.
-
Added highpass filter to Audio Component.
-
This performance improvements vastly increases the allowable size of a live auditioning MetaSound Source before clients experience audio dropouts.
-
Added Shared State Behavior input to MetaSound Array Random Get node for control over how random state is shared between nodes
-
Relative Render Cost estimates the instantaneous cost to rendering a MetaSound in a cross platform way.
Bug Fix:
-
We have fixed a minor bug in the Ogg Vorbis audio compression implementation that meant a single data frame of data was lost at the end of the stream. This bug presented mainly for highly compressed low bitrate single channel audio where a single data frame could contain multiple seconds of audio.
-
Added Audio Component ID to spatialization plugin data when using external Spatializer
-
Fixed an editor crash in City Sample related to audio.
-
Fixed a bug where IsControlBusMixActive sometimes returned true after the bus mix was deactivated.
-
[Harmonix] MIDI Note Trigger node: set note number only on note on. This will avoid issues with downstream patching that might behave badly when a note is transposed on the way in, but not on the way out. Step Sequence Player node: don't worry about setting a transposed note number on note off messages. The voice id of the message will be enough for downstream code to respond appropriately. #virtualized
-
Fixed a bug where Wet and Dry Submix Modulation incorrectly used Output Volume Modulation Settings, causing blueprint setters to not work properly.
-
Fixed crash when applying Modulation to a Source Effect's parameters at runtime.
-
Duplicated audio data when reading from memory mapped files
-
Improved thread safety of Audio Modulation's internal ID generation.
-
Fixed a bug where Modulation LFO Generators occasionally did not Activate
-
Allow MetaSound member default literal values and certain member fields to be copy/pasted in the details panel
-
Fix frequency clamp and interpolation in MetaSound Low Pass Filter node
-
Fix MetaSound trigger parameters being retriggered on realizing virtualized sounds and unneeded parameter updates being cached while virtualized
-
Enable pasting objects and object arrays from the content browser and Blueprint into MetaSound default values
-
Fix namespace being lost when select click renaming MetaSound graph members
-
Fix MetaSound Array Random Get node causing unintended repeats in some cases with shared state
Blueprint
API Change:
- Use FunctionReference.GetMemberParentClass() to query characteristics of the underlying function used by the node.
New:
-
Make FKismetCompilerUtilities::GenerateAssignmentNodes callable from other sources The logic of GenerateAssignmentNodes does not require a Call Function node, only that the input has a "then" pin which is not required by all Call Function nodes. Making this less restrictive makes it easier to write new custom K2 nodes based on or similar in functionality to CreateObjectFromClass without requiring a Call Function node is the source of the object.
-
Extend the K2Node_Event API to include a GetDelegatePin function
-
UK2Node_ConvertAsset improvement Adds two functions to the UK2Node_ConvertAsset implementation that act as accessors to the pins created by that node.
-
Add the ability to set DeprecatedFunction="Note" (and DeprecatedVariable) metadata in a class header to lower the severity of a blueprint deprecation message. This can be used for "soft" deprecations where the function still works but should not be used in new blueprints.
-
Native support for UK2Node_AsyncAction Adds function to UK2Node_AsyncAction so that its members (really protected members of UK2Node_BaseAsyncTask) can be initialized properly from native. We can also do this via node spawners, but they tend to be clumsy when spawning async action nodes as intermediates.
-
Editor scripts can now add variables to blueprint assets using AddMemberVariable
-
Remove unused line in
EdGraphSchema_K2.cpp
-
Deprecated redundant fields in UK2Node_CallFunction. Both bIsConstFunc and bIsInterfaceCall are unnecessary since we can simply query the underlying UFunction/UClass (via FunctionReference) to determine if we're dealing with a const function or an interface class. Additional changes:
-
A check for CLASS_Interface was added to UK2Node_Message. While the chances of hitting this are very low, it wouldn't make sense to reference a non-interface class when expanding this node. It should really error out in that case.
-
CreatePinsForFunctionCall had an unusual check for hiding the self pin if the pure function was non-const. This appears to be really old and no longer relevant.
-
Bug Fix:
-
Blueprint MemberReference now also looks for DeprecatedProperty meta
-
Ensure that function parameter names can't be renamed to any local variables. We already have a check that prevents renaming local variables to parameters, but we don't have the opposite check. Since renames first test the pin rename with RenameUserDefinedPin, we need an implementation in the function entry node that ensures that the new name doesn't collide with the local variable names.
-
Fixed reachable garbage issue involving UInheritableComponentHandler::UnnecessaryComponents
-
Fix crashes when reconstructing blueprint instances while using less common patterns of level loading
-
Fixed an editor crash that could result during propagation of a PostEditChange() event after modifying a nested struct member field on an archetype.
-
Fix data loss bug where changes to placed and inherited blueprint components could be lost if they override the parent actor class but used the same values as the component blueprint class.
-
ExposeOnSpawn Class properties now respect "none" value inputs on "Construct object from class" nodes
-
Blueprint Add Custom Event unable to resolve delegate signature inside a split struct The pin splitting logic didn't propagate the underlying member reference for the function signature of a delegate. CreatePin doesn't handle this automatically, so we need to copy over the information manually.
-
Fix several bugs when using ClassWithin on blueprint classes. It now properly updates blueprints when the native class changes and errors will no longer crash the editor
-
Make sure we clean up constructed components when using the Actor replacement workflow.
-
Comment Node doesn't update in the Bookmarks tab after being renamed in the Event Graph Anytime a node's title is changed, we need to refresh the bookmarks tab.
-
Fix it so ExposeOnSpawn parameters set on a create/spawn blueprint node are correctly compared against the class's default values. It will only override values that could possibly be different from the defaults (including all values that could change at runtime due to pin connections).
-
Derived struct data is not copied to base struct. We made Generic_SetStructurePropertyByName a bit too strict by only allowing structs that matched exactly for copying properties. Prior to the change, this function was incredibly lax by allowing completely unrelated structures to be copied. The appropriate middleground allows derived structs. While this may lead to object slicing in some instances, this is permissable. Additionally, removed the public-facing Generic_SetStructurePropertyByName function since it was deprecated.
-
Update TryFreeCDOName() to check the renamed default object name and not the current default object name. The PR fixes TryFreeCDOName, but this change includes some additional cosmetic changes to RenameGeneratedClasses (inconsistent whitespace, missing consts, etc).
-
Adjust FKismetCompilerUtilities::GenerateAssignmentNodes to ignore output pins GenerateAssignmentNodes gets confused by the existence of a pin who name matches a property name but cannot be connected to an assignment node input.
-
Fix data loss bug where changes to placed components of inherited blueprints could be lost if the child blueprint did not modify that component in any way
Blueprint Compiler
New:
- Blueprint macros can now infer more than one type of pin, especially useful for TMap related macros
Bug Fix:
-
Fixed cause of Blueprint Macro Library Macro Graphs remaining in the Blueprint asset after said graph was deleted by the user
-
Fixed updating of objects that only reference a blueprint or its instances via weak references
-
Fixed underlying cause of "Content is missing from cook" error when cooking deep blueprint hierarchies with components
-
Fixed one cause of phantom blueprint compilation errors after duplicating a blueprint graph
-
Dependent blueprints are automatically included in the compilation set when they are out of date, this fixes some obscure crashes during blueprint compilation
-
Allow structs in the error state to be contained in other structs in order to prevent cascading errors
-
Empty event graphs are now more aggressively pruned, can be disabled via [Blueprints] bDisableLateEventGraphPruning
-
Blueprint 'Switch' nodes now raise an error when their enum disappears
Blueprint Editor
New:
-
Reference parameters in blueprint functions can now be tagged as const, preventing mutation within the function's graph
-
Further optimized the Blueprint Editor's graph context menu, used to place nodes into blueprint graphs
-
Removing the usage of "Friendly Names" from the Functions and (Event Graphs/Overrides Menu). The reasoning is that there is a long-term goal of removing Friendly Names entirely from the Editor. It interferes with the users being able to properly name their Functions/Events and have that name consistent through the interface. We have kept the Friendly Names when calling a function in Blueprints as well as the Blueprints Action list. The reasoning behind that is the nodes are very hard to decipher when zoomed out on the graph unless there are spaces between the names.
-
Added UPARAM AllowedClasses and ShowDisplayNames metadata specifiers for UClass/TSubclassOf type parameters. These work like their UPROPERTY metadata specifier counterparts of the same name.
-
Reroute nodes can now display compiler notes, warnings, and errors
-
Added CreateBlueprintAssetWithParent editor function, for creating blueprint assets with a specific parent class
Bug Fix:
-
Fixed potential for deadlock when terminating a global Find-in-Blueprint query in projects that may index references to StringTable assets.
-
Fixed a crash when reloading a blueprint when the diff window is open
-
Edits to sparse class data now propagate properly to child classes
-
Changing categories of macros in libraries does not update in search menu of other BPs When changing a macro category, we need to actively update the action database with the change. While SetBlueprintFunctionOrMacroCategory does call MarkBlueprintAsModified, this won't trigger the Blueprint's OnChanged callback, which the database normally relies on for changes.
-
The Details Panel's "Create New Blueprint" button now works correctly with Soft Class Properties
-
Searching for references to an event function via the My Blueprints context menu no longer inadvertantly double quotes the event name
-
Fixed cause of errors being raised after reparenting a blueprint
-
Removed long broken shortcut for creating an Array Get item at Index node in blueprints
-
Fix ensure when trying to update 'object being debugged' and we were previously debugging an object that is no longer valid, but still exists
-
Fix blueprint editor crash where creating a Soft Object reference to a Component or UserWidget would incorrectly show the inline subobject UI and crash when you tried to use it. You normally want to use Soft Class references to blueprintable assets like these.
-
Fixed bug that would cause clicking an entry in the blueprint context menu to spawn the incorrect node
-
The tooltip associated with the config variable checkbox in the blueprint editor no longer erroneously mentions SKEL_ classes
-
Fix a potential race condition during Blueprint asset search data indexing.
-
Editor Crash when adding components to a Editor Only BP Actor Iteration over child nodes didn't have sufficient safeguards for any entry removal. After calling FactoryCreateInheritedBpSubobject, we need to ensure that the iteration index is still within bounds.
Blueprint Runtime
Bug Fix:
-
Fixed broken logic related to construction script deferral due to static mesh compilation
-
Fixed crash when the BPVM calls SetArrayPropertyByName with a null object. Most of the functions in KismetArrayLibrary.h check for a null property address and set bArrayContextFailed to true, which induces a runtime failure. However, SetArrayPropertyByName was overlooked, and would cause a crash due to a null dereference.
-
Optimized UUserDefinedStruct::InitializeStruct in non editor builds
Gameplay
API Change:
-
UAbilitySystemComponent::InternalTryActivateAbilityFailureTags should be set correctly to both the failure reason and which tags caused that reason to happen.
-
The big projects that use a lot of gameplay tags may want to limit the tags they use to identify gameplay ability events. Adding a gameplay tag filter allows such a project to use tag category remapping to adjust all filtering to their gameplay tag structure.
- To enable this feature, use the Category Remapping settings to remap "GameplayEventTagsCategory" under "Project Settings / GameplayTags".
-
C++ code stays the same in this case, but the DisplayNames are altered in Blueprints to help designers. Properly renaming the functions in C++ was out of scope.
-
Some data that used to reside in FMoverDefaultSyncState, such as MovementMode and the Layered Moves Group, is now accessible through FMoverSyncState instead.
-
Prefer to use the Gameplay Abilities Developer Settings class directly rather than AbilitySystemGlobals when querying settings variables. Prefer AbilitySystemGlobals for global override functions.
-
Note: a NavMoverComponent will have to be added in addition to a MoverComponent to get pathfinding working properly. This was done in an effort to have some separation for nav specific data and functionality.
-
Blackboard access should be through the movement component if needed.
-
When querying for current abilities (such as through FindAbilitySpecFromHandle) there is an EConsiderPending to specify how to handle pending abilities (abilities about-to-be-added or removed).
-
Deprecated FTickableObjectBase::IsAllowedToTick because it was slow and redundant with the existing IsTickable function. The new SetTickableTickType function is a more efficient and safer way to dynamically disable tick
-
Previously, removing a GameplayCue would cause a single EGameplayTagEventType::AnyCountChange callback with its Tag and Count, even though all equivalent Cues would receive an OnRemove. So previously: 15 GC Tags would be a single callback and now it will be 15 callbacks. This will change behavior if you're using something like AbilityTask_WaitGameplayTagCountChanged on the GameplayCue Tag (that callback would fire 15x now, and just once previously).
- The CVar to toggle this functionality is GameplayCue.Fix.UseEqualTagCountAndRemovalCallbacks (it is now defaulted to true)
-
Through the discovery of this bug, it's been reasoned that it is never safe to ClearInvalidTags. Thus all functionality which allows one to do that has been deprecated and/or removed.
-
The (Blueprint) GameplayTagInterface::GetOwnedGameplayTags member function has been redirected to BlueprintGameplayTagLibrary::GetOwnedGameplayTags. The implementation ensures that the results you get are always a newly initialized tag container, thus ensuring you do not accidentally reuse and append old results.
-
GetLedgeMove() and CheckLedgeDirection() had their "GravDir" parameter removed (in favor of using the CharacterMovement gravity direction), while adding the previous valid floor as a param.
-
This would have had very subtle bugs in the past, where a server-initiated prediction key would "catch-up" client keys, possibly before (or after) rejecting them. The new FPredictionKey handling makes these bugs more apparent.
-
Otherwise, it's possible to leak FPredictionKeys as some could be generated and never acknowledged because the batch chooses only a single key to be sent (when it can be acknowledging as many as three different events). By making the keys dependent, just a single acknowledgement will acknowledge all of those events.
-
p.NetServerMaxMoveDeltaTimeScalar adds a scalar on the server, clamped to >= 1
-
GAS - UGameplayEffectComponent::OnGameplayEffectChanged has been changed to non-const to allow the proper flow of updating its values on Post Blueprint Compilation. This allows us to update the inheritance values on Blueprint compilation which will happen after serialization (which could stomp PostInitProperties values).
-
As part of the performance improvements to world ticking, static level collections will no longer be created by default. These were only used by the disabled client world duplication feature (but they can be created by setting s.World.CreateStaticLevelCollection)
-
This behavior can be disabled with the "Input.bAutoReconcilePressedEventsOnFirstRepeat" Cvar.
-
In case this somehow causes issues unforeseen issues with split screen games, it can be disabled with the cvar 'input.bRemapDeviceIdForOffsetPlayerGamepadIds'.
New:
-
GAS - When an ability is blocked by a tag, we should report which tag caused the block. Added a generic tag for when the native or blueprint CanActivateAbility function blocks activation.
-
Mover: Adding BlueprintInternalUseOnly to LayeredMove, InstantEffect and MovmentModifier base structs to disallow making and queueing the base structs in BP. Also making error message for not implementing Clone function clearer and more helpful.
-
Added a new GameplayTags function to move tags between ini files
-
GAS - Adding GameplayTagFilter to API that works with gameplay tag events (see Programmer Notes)
-
Mover: adding a stance movement modifier meant to handle different stance changes such as crouch #virtualized
-
Added a new CharacterMovementComponent flag that allows jump logic to only apply jump velocity at the start of the jump, not continuously throughout the entire jump hold time, which remains the default behavior
-
Deprecated old CharacterMovementComponent::DoJump and made it to call the new DoJump function, which now allows caller to pass in DeltaTime. Existing code will continue to call the old DoJump, and the new behavior can be opted into via a cvar.
-
Add IsDataValid to FTableRowBase which can be used to enable data validation for data tables
-
Mover: changed montage-based anim root motion behavior to end itself once the mesh is no longer playing the montage, allowing smooth transition back to controlled movement without loss of momentum
-
Mover 2.0 adding Flying gameplay tag and adding some state checking functions to CharacterMoverComponent
-
GAS - Gameplay Cue Notify Actor (Looping) Function names have been renamed to give users a better understanding of when they trigger. An asset validation warning has been added in the case where a user implements OnActive and OnRemove, but not WhileActive. These have now been named to OnBurst, OnCeaseRelevant, and OnBecomeRelevant respectively.
-
Mover: stood up initial version of a standalone backend liaison for non-networked games
-
Trace Targeting Selection / Engineering: Added option to use Single trace instead of Multi trace. This allows for ensuring only one hit result is given, avoiding the case where an initial overlap hit is given along with the first hit past the initial overlap.
-
Mover 2.0: Adding Movement Modifier system - a system that is used to apply changes that indirectly influence the movement simulation, without proposing or executing any movement, but still in sync with the sim.
-
Added optional acceleration to RepMovement, in support of allowing Characters replicating it to sim proxies.
-
Mover 2.0 removing OnImpact delegate since as it was unneeded and could potentially affect performance
-
Mover: Adding ProcessGeneratedMovement delegate for mode-agnostic modification of proposed movement after it has been generated.
-
Disable concurrent actor/component tick queuing by default as it is slower in most cases and also causes reliability issues, it can be re-enabled with tick.AllowConcurrentTickQueue. This was disabled in code on platforms like windows, but now all platforms work the same by default
-
Mover: Adding Instant Movement Effects. A new Mover system that allows for direct modification of sync state for one frame. This essentially replaces any instantaneous layered moves like teleport or launch.
-
Mover: Converting Movement modes to use new instant movement effects for jumping and teleporting. This change also moves jumping out to the character movement component rather than specific modes (Modes can still handle jumps specifically if desired)
-
Mover: adding velocity to the mover debugger
-
GAS - Add OnMontageBlendedIn support for PlayMontageAndWait ability task
-
Mover: added data validation and runtime checks for transitions
-
GAS - Introducing FScopedDiscardPredictions which will allow users to write code that assumes predictions happen or not. For instance, cases where we want to the Ability System Component to do things that are unreliable / optional and this allows us to do that safely.
-
Mover: adding API for directly reading/writing to the simulation sync state that is yet to be committed/sent. This is to help support advanced mechanics that may break out of Network Prediction's rigid simulation window in order to interoperate with other gameplay or physics-simulated objects.
-
GAS - Adding Debug support for GameplayAbilityTargetActor_Radius
-
Mover Examples: Renaming Dashing pawn to AnimatedMannyPawnExtended and moving it out of the variants folder to the pawns folder #virtualized
-
Mover: Removing teleport layered move as it's functionality now lives in the teleport instant movement effect. This allows us to get rid of some data in FProposedMove.
-
Mover Examples: Adjusting example content to use instant effects where appropriate and adding a instant effect map #virtualized
-
Mover: removed unnecessary base pawn class
-
Mover Examples: Fleshing out dashing/extended pawn to have animations for all of its extra functionality including, Flying, Multi-jump, Ziplining and Dashing. This also splits off a separate animation blueprint for the extended examples pawn that contains functionality for all of these animations. #virtualized
-
Added a new flag to Targeting Sort Tasks that preserves the relative ordering of targets with equal scores, at the cost of slightly worse performance.
-
Mover: added templated convenience function to access the typed MoverComponent from the movement mode
-
Physics Mover - Add networked input struct for max speed and acceleration to avoid desyncs when changing these dynamically
-
Mover - Support multiple settings classes
-
Mover: Adding NavWalkingMode to support more efficient walking movement for actors using a navmesh
-
Mover Tests: Adjusting automated test plugins and adding automated test map for instant movement effects
-
Mover: moved required properties out of the sync state collection and onto the core sync state
-
Mover: added optional data validation for backend liaison classes
-
GAS - When Clearing an FScalableFloat Property field (using the UI), the RowName doesn't get reset. This can cause warnings/errors later when the scalable float is being evaluated because it has a RowName but no CurveTable.
-
Mover: added BP-callable function to manually set primary visual component
-
Mover: Added a bool to Falling Mode to customize landing - actors can now land and cancel vertical velocity or have the vertical velocity redirected based off the surface they landed on.
-
Mover: Adding gameplay tag query functions to support querying gameplay tags across different mover systems
-
GAS - Gameplay Debugger now reconciles Server vs. Client state for Gameplay Effects, similar to how Tags and Attributes work. Recolored the Gameplay Debugger to prefer Yellow (the common color) for properly networked attributes/effects. Aligned some text better. Small refactor for the Attributes.
-
Mover: improved data validation to prevent a variety of bad setup issues
-
Mover - Add gameplay tags to movement modes to indicate state
-
Mover: added planar movement constraints which are respected in the default character movement modes
-
Physics Mover - Support non-async physics update
-
GAS - PGameplay Abilities Developer Settings. Introducing the option to configure the AbilitySystemGlobals through an easier to understand user interface found in the Editor's Project Settings. Backwards compatibility is maintained with the old data.
-
Optimize UGameplayTagsManager::GameplayTagsMatchDepth to remove excess allocations.
-
Added a way to temporarily override how the GameplayTagsManager handles unloading of GameplayTags.
-
GAS - Add On GameplayEffect Inhibition Changed delegate
-
Added a way to temporarily defer rebuilds of the GameplayTag tree managed by the GameplayTagsManager.
-
Mover: export common movement mode gameplay tags, so external modules can use them directly
-
Add UWorld::EndPlay which properly calls RouteEndPlay and change the existing world shutdown code to use the new function. This must be called for any worlds that have a game mode and actually started play. Add a FTestWorldWrapper struct (used by new test System.Engine.Tick.PerfTest) which handles all of the logic required to create and destroy a gameplay world for automated tests. Fix several other issues with creating and destroying worlds during automated tests and improve warnings when things are done incorrectly.
-
Mover: Adding a Movement Mixer class that helps mixing layered moves and proposed moves and makes it more extensible.
-
Mover - Add mode activate and deactivate functions
-
Mover: Added more debug info to the Gameplay Debugger Tool readout
-
Mover: Layered move preferred moves only set the mode the first time they tick to avoid a mover system constantly setting movement mode
-
Mover plugin: added support for Mover trajectory prediction for use with motion-matching animation tech in PoseSearch
-
GAS - Exposing Gameplay Effect's GetAssetTags / GetGrantedTags to Blueprints
-
GAS - Exposing Gameplay Ability IsActive to Blueprints.
-
Mover: expanded transitions supported so they can always be actively evaluated, no longer limited to individual modes
-
Added public native function for setting the user description of a FGameplayTagQuery
-
Adjusting some comments in NetworkPredictionConfig so options in projects settings have correct/helpful tooltips
-
GAS - Changed the friendly DisplayNames of the GameplayEffectComponents to make them easier to comprehend.
-
MoverExamples: added ziplining mechanic example
-
GAS - Adding "ShowDebug AbilitySystem" to the console auto-complete list
-
GAS - Create GetExplicitTagCoung util for FGameplayTagCountContainer
-
GAS - Optional parameter to GameplayTagCountContainer::Reset allows a user to empty the container while keeping all of the registered tag count change callbacks.
-
Add GetPossibleDataRegistryIdList to the DataRegistrySubsystem to allow iterating registries from blueprint. Deprecate GetCachedItemFromLookupBP in favor of new "Find Data Registry Item From Lookup" that uses multiple output pins. Clean up the comments and names of the BP functions to remove experimental tag.
-
Targeting System / Sort By Distance: Added option for more accurate distance calculation based off of nearest collision surface instead of actor location.
-
Mover: Adding functions to allow users to poll mover component for active layered moves by type.
-
Add a new Tick Batching system for actors and components which can be enabled by setting the tick.AllowBatchedTicks cvar. When enabled, this will group together the execution of similar actor and component ticks which improves game thread performance. Also added options like ForEachNestedTick to TickFunction to better support manual tick batching (which can be faster than the new automated batching)
-
[GAS] Adding some debug information to track down warnings for potentially invalid use of GetOwnedGameplayTags() and related functions on Gameplay Effects.
-
[CharacterMovementComponent] Option to base the character on the attachment root of the objedt that the character is standing on. UCharacterMovementComponent::bBaseOnAttachmentRoot.
-
Mover: added initial support for taking root motion from a mesh attribute
-
[GAS] Added invalid data warning when BlockAbilityTags is used with Instant GE
-
GAS - Improving the GAS Debug Facilities. Attributes can now be debugged in the Gameplay Debugger. Layout of the GameplayDebugger is better formatted.
-
Mover: Adding Pathfollowing and NavMovement support. Also adding some example content to show/test the feature. #virtualized
-
[GAS] Giving a warning to users during validation that an FScalableFloat RowName could be invisibly set to a value (which would cause warnings at cook/runtime).
-
GAS - Adding
meta=(DeterminesOutputType)
toGetAttributeSet
ofAbilitySystemComponent
-
GAS - Adding the Gameplay Ability System README.md. We accept pull requests for better documentation!
-
Added new CVars that allow CSV Tracking for the following Movement related stats:
-
CVar: p.ClientRecordMovePackedRpcStatsToCsv
-
CVar: p.ClientRecordNetCorrectionDistanceToCsv
-
Correction Distance: whether the client received a correction from the server and how big it was.
-
Num movement RPCs the client sends to the server per frame
-
Num movement RPCs the client receives from the server per frame
-
Size of the sent Movement RPCs
-
Size of the received Movement RPCs
These stats will be recorded to the new CharacterMovementDetailed CSV Category
-
-
Mover: Removing movement mode GetBlackboard functions.
-
GAS - Introduce LogGameplayCues category which initially shows nothing, unless you set it to Verbose.
-
Mover Tets: Updating LayeredMove Automated test map to reflect new layered moves #virtualized
-
SplineComponent::GetSplinePointAt() now returns full FSplinePoint data. Previously it was missing the spline's Type property.
-
Fixes CharacterMovementComponent applying an anim montage's root motion with incorrect scale on last tick when the montage is triggered by AbilityTask_PlayMontageAndWait and the skel mesh is not recently rendered.
-
Fire the OnInputHardwareDeviceChanged event whenever the hardware device id changes from the last known platform user id map, not the input device id map. This gives us the desired behavior of firing a delegate any time the Platform User changes their "most recently used" input device, instead of only ever firing when an input device is connected.
-
Add a Kismet Math library function to access the value of a FRuntimeFloatCurve.
-
Mover: updated readme based on recent development
Bug Fix:
-
Fixing APlayerController::PostProcessWorldToScreen() not applying to ProjectWorldLocationToScreenWithDistance() #9917
-
GAS - Fixes for issues where Gameplay Effects & PredictionKeys. Solidifying rules around the client/server communication. It includes:
-
GE's could be without communicating a prediction key if it went through SendGameplayEventToActor.
-
GE's could be removed without being the authority through certain paths.
-
Server Initiated PredictionKeys were being sent down to the client, but it takes a spot in a circular buffer and thus it's possible it stomps an actual client FPredictionKey.
-
Extra logging and ensures to clarify these rules.
-
Changes to the Abilities Gameplay Debugger to catch these issues (previously multiple applications of a GE could go undetected).
-
Blueprint function MakeSpecHandle has been deprecated in favor of MakeSpecHandleByClass since you need the CDO instance.
-
-
Network Prediction plugin: fixed issue where client and server would desync on the number of inputs shared, causing ensures and continuous reconciliations
-
Mover: fixed crash that could occur for Mover actor instances outside of a game world, such as an in-editor thumbnail renderer
-
Mover: fixed bug where a layered move could work with old state data if sim tick is split into multiple substeps
-
GAS - Use CurrentValue instead of BaseValue when dispatching AttributeChangeDelegates in replication case. This solves a case where you can listen for the AttributeValueChangeDelegate on a Simulated Proxy and receive the Base value rather than properly aggregated value.
-
Fixed inconsistency between how FInputAxisBinding and FInputAxisKeyBinding determine their axis value when the input key has been previously consumed
-
Mover: fixed issue with inconsistency in auto-finding a primary visual component between cooked and non-cooked assets.
-
Fixed issue where a Character sliding down an unwalkable surface get hung up without sliding all the way down to a walkable surface
-
GAS ActivationOwnedTags now correctly replicate the tags to clients just once (not twice like previously).
-
MoverExamples: fixed bug where users could attempt to instantiate a MoverExamplesCharacter, which is intended as an abstract type
-
GAS - Added context menu to Gameplay Attribute widget (Editor)
-
Mover: Fixing timing issue with layered move preferred mode not getting applied
-
GAS - Fix for UGameplayAbility::GetSourceObject not returning a valid object when it is in the pending list.
-
MoverExamples: fixed shadow rendering artifact issues on various pawn assets
-
GAS - Properly dirtying the ActiveGampelayEffects array when granting a new Gameplay Ability Spec Handle. Adding some visual logging to help track down these complex issues.
-
Fix several crashes when trying to tick partially destroyed world objects. TickableWorldSubsystem and other world objects that use FTickableGameObject now disable their tick by calling the new function SetTickableTickType during unregistration. This uses a new SetTickableTickType function that can dynamically enable or disable ticking
-
GAS - Gameplay Cue Notify Actors are now removed properly on Listen Server instances. Previously when Gameplay Effects were removed, the Gameplay Cue Tags would still be present on the listen server. AbilitySystem.GameplayCueNotifyTagCheckOnRemove would then refuse to issue the Gameplay Cue Removal event since that Tag was still present. The removal code has been rewritten to account for this.
-
UCharacterMovementComponent::RoundAcceleration() changed to match the same rounding and clamping that is used by replication of FVector_NetQuantize10.
-
GAS - Removing PackageMap assumptions from the Gameplay Debugger (it's not valid in Replay and could therefore crash when using during Replay)
-
Fix bug where gameplay tags used in plugin config files would be lost if plugins were loaded in a different order
-
Fix crashes when modifying the types of currently registered DataRegistry assets
-
Mover: fixing issue with layered move mixing and preferred movement modes where Override velocity mix mode would override Preferred mode from OverrideAll
-
CharacterMovementComponent: fixed cases where mid-tick changes in movement mode could continue movement with the old mode's Phys function. This could occur in a customized project when root motion causes lift-off into a mode other than MOVE_Falling.
-
GAS - Console Command "AbilitySystem.Effect.Apply" return value has been fixed to account for Instant Effects.
-
Mover: Fixing issue with control rotation pitch and walking/falling mode causing actor to stop moving
-
GAS - Gameplay Effects could previously hold on to old GameplayTags.
-
Fixed root motion replication to proxies when finishing root motion to ensure the replicated shadowed state is correct on the frame that root motion finishes.
-
GAS - Fixing up some user-facing descriptions of FInheritableTagContainer.
-
GAS - Fixed bugs caused by gameplay cue getting removed after OnRemove is sent to the cue
-
Made FSoftObjectPath::LoadAsync const
-
Fixed issue where readme files for Mover and Network Prediction plugins were excluded from distributed builds
-
GAS - Reference to GameplayTag wasn't resolved correctly if the blueprint is loaded before the GameplayTag is registered. This could happen if a Blueprint is loaded early which contains a Native Gameplay Tag, but that Native Gameplay Tag is in a different plug-in.
-
Mover tests: Removing some old unused mannequin assets and modifying some of animations used to remove some unused notifies #virtualized
-
Mover: Initializing mover component start state on initialize and updating starting sync state on begin play if location has changed to avoid a warning about desynced positions. Also, downgrading an ensure to a warning to avoid pausing the editor for an issue that could potentially fix itself
-
When Undoing Apply Instance Changes into a Blueprint class the actor instance now gets replaced with a new/updated version of the BP class that was updated. Fixes an issue with transaction buffer losing reference to the actor and deleting it.
-
Mover: fixed bug where a turning rate that was a multiple of 360 degrees/second could prevent rotation in the default character movement modes
-
Fixed a few different crashes that were a result of a replicated LevelSequenceActor being recreated on client, but using a SequencePlayer from a previous, destroyed copy of that actor that hadn't been garbage-collected yet.
-
Mover: Fixing issue where falling mode wouldn't respect terminal velocity and apply gravity after clamping to terminal velocity
-
GAS - GetOwnedGameplayTags Fix For Reusing old tag container in blueprint event graphs.
-
Enhanced Input: Fixing issue with combo triggers not firing completed event when first and last combo action are the same action
-
Fixing reinstancing issue with nested subobjects and transaction buffer not collecting all subobject info
-
Mover: Fixing mixing issue where cumulative move didn't get correct mixing mode from mixing layered moves
-
Mover: fixed crash that could occur in standalone games where an invalid scene component could be discovered during initialization
-
GAS - GameplayCues: OriginalTag is never set for GCNs.
-
Set DEFAULT_ORTHOZOOM for Paper2D editor viewports.
-
GAS - Fix FGameplayEffectQuery::IsEmpty incorrectly returning true even if a CustomDelegate is bound
-
Network Prediction: fixed issue where the FixedTickFrameRate setting was not respected for non-physics simulations
-
Improved CharacterMovementComponent ledge movement functionality. Fixed deflection attempt reapplying acceleration, often making it fail by moving off the ledge again. Now GetLedgeMove() attempts to compute the ledge normal based on the hit of the capsule with the previous valid floor, and deflects movement as if hitting an invisible barrier.
-
Mover: fixes issues with kinematic based movement latency and drifting
-
Mover: Giving teleport layered move a higher default priority so it isn't overridden by other moves by default
-
Mover Examples: Base pawn now has missing flying animation #virtualized
-
Mover: Making multijump properly assign InAirJumps left so walking off platforms still allows the actor an in air jump
-
Mover: Fixing issues with TimeStep being passed into different mover systems where SubTimeStep should have been used
-
GAS - Ensure FPredictionKeys only attempt to "catch-up" if they were locally generated. If they are Server Initiated, then ignore them for catch-up purposes.
-
Mover: GenerateMove for LayeredMoves in subStep loop should use SubstepStartData and SubTimeStep.
-
Mover: Adding some data validation to physics movement modes to make sure that a physics backend class is present to avoid unwanted interactions and crashes
-
GAS - Gameplay FPredictionKey Fixes. 1. Previously, when calling a CaughtUp or Rejected callback, the FPredictionKey Replication Array could realloc while you were holding on to the reference. 2. Introduced some debug functionality that will attempt to catch these extremely hard to find cases where an FPredictionKey could be created and never acknowledged. 3. Added CVars for controlling behavior on how FPredictionKey Dependency Chains should behave.
-
Mover Examples: More polish for the Extended pawn. Adjusting aiming camera location, adding a dashing cooldown, fixing issue with vaulting playing flying animation after ending #virtualized
-
Mover: Adding some safety measures to AddMovementMode to avoid issues with passing in abstract classes
-
During actor reinstancing old actor components are now unregistered before spawning their replacements to avoid collision with component registration
-
GAS - FScopedServerAbilityRPCBatcher should ensure all keys generated in its batch are dependent.
-
GAS - AbilitiesGameplayEffectComponent could fail to grant and remove abilities if those abilities were granted/removed during the same scope lock (due to the PendingAdds/PendingRemoves). Making this more clear by allowing users to query the pending lists in some interfaces (EConsiderPending).
-
Mover: fixed issue where root motion in async simulations could be greatly exaggerated
-
Improved behavior to reduce character movement corrections by allowing server to run longer move time deltas than the client is allowed to send, to account for when client updates are lost or jittery and a longer time should be used. Fixed client timestamp when forcing updates, allowing client time advanced during normal updates, and stopping after duration limit exceeded.
-
Only enable AspectRatioAxisConstraint on the camera component if it is actually going to do anything
-
Change GameFeatureSubsystem::AddObserver to notify the new observer about any relevant plugins that are already enabled
-
GAS - UGameplayEffectComponent::OnGameplayEffectChanged has been changed to non-const
-
Several performance improvements to world ticking, especially when using world partition
-
GAS - Skip the check for unmapped references when receiving the replicated Server Initiated Gameplay Effects. This ensures the Gameplay Cues will always fire properly.
-
Fix crashes that could happen when modifying the GameFrameworkComponentManager delegates during execution of those delegates
-
Mover: fixed issue with interpolating between states that had different movement bases, typically leading to unintentional teleportation
-
GAS - FActiveGameplayEffectsContainer::CheckDuration will no longer remove Infinite Gameplay Effects.
-
GAS - Handling a case where InstancedPerExecution abilities could ensure if being Removed while in an EndAbility callstack.
-
GAS - Fix unbinding OnMontageBlendedInEnded delegate.
-
Mover: fixed check crash when compiling a BP that has a MoverComponent with a NetworkPhysicsLiaison backend specified
-
Cameras: fixed wrong error log message when stopping camera animations
-
Mover: Fixing a crash that occurs when attempting to fire a Queue Layered Move that's connected to a non struct node
-
Fix a bug where, if you are holding a key down during a level transition, the keystate map would incorrectly evaluate the state of the key as being released and re-pressed every frame. This meant that, for example, if you had a "Released" trigger on an Enhanced Input mapping context (or you were listening to any released event on a legacy mapping) that it would constantly fire as you hold down the key instead of only firing on release.
-
Make the InputKey property on UK2Node_InputDebugKey Visible only, not editable. This fixes a bug where you could select the unsupported "Any Key" option from the key selector.
-
Fix for bSkipAssigningGamepadToFirstPlayer in the GameViewportClient.
Deprecated:
-
GAS - Make it clear that we currently do not support replication when using InstancedPerExecution GameplayAbilities.
-
GAS - Deprecating FGameplayAbilitySpec::ActivationInfo since it only makes sense on NonInstanced Gameplay Abilities (which have also been deprecated). If you want that functionality, grab the instance and look at GetCurrentActivationInfo().
-
GAS - Deprecating NonInstanced Gameplay Abilities. We now only support either InstancedPerActor or InstancedPerExecution. The motivation is to provide a more consistent interface of the UGameplayAbility functions.
Mass
API Change:
- MassRepresentation's functions using
int32 InstanceId
parameters have been deprecated. Use theFMassEntityHandle
directly
New:
-
Improved FMassExecutionContext's checks whether subsystems and fragments are bound and configured for read-write if accessing mutable version.
-
fixed some processor execution flags to not run in pure Editor without associated world
-
updated FMassArchetypeCompositionDescriptor::DebugOutputDescription to include shared fragments
-
added new processor execution flags 'EditorWorld' and 'AllWorldModes' that could be used for processors that need to run when associated to a world in either client, server, standalone or Editor mode
-
added function 'DetermineProcessorSupportedTickTypes' so processors executed in an Editor world can be ticked in all tick modes
-
Added missing details about ConstSharedFragments in the archetype panel of the MassDebugger
-
Added support for all owned queries for processors inheriting from UMassSignalProcessorBase
-
Changed the Mass ISM-related API's usage of cryptic int32 to identify entities (usually obtained by hashing the entity handle) in favor of using the FMassEntityHandle directly. Added benefit is that we can directly identify the entity being processed by Mass Visualization, without additional lookups.
-
Improved performance of merging Mass command buffers
-
Changes to dynamic processor dependency solving to support dependencies between instances of the same processor class - for dynamic processors we use the processor instance name rather than class name while resolving dependencies.
Bug Fix:
-
Changed how we hash ISMComponents in MassRepresentation Using object path can cause issues in WP worlds since levels being removed might get their name changed which changes the hash and causes issues when removing ISM shared data.
-
Fixed broken Mass debug FAgentDebugVisualization wire shape visualization
-
Running post spawn processors only is anything was actually spawned.
-
Fixed observers getting notified before the fragments values are set on entities created through 'CreateEntity' and 'BuildEntity'
-
Changes to make editor-available Mass processors actually execute in editor mode.
Networking
API Change:
- UNetConnection::GetConnectionId() is deprecated in favor of UNetConnection::GetConnectionHandle().
New:
-
NetBitArray - Added safer ways to access internal buffers held by a FNetBitArray and FNetBitArrayView
-
GetWord() can be used to safely access the full 32bit value to modify 32bit entries at once.
-
GetDataChecked(NumWordSize) can be used to access the raw array buffer but will also validate that the maximum word iteration count is within the bounds of the NetBitArray
-
Reset() has been deprecated in favor of ClearAllBits()
-
-
Networking: Added Networking_FastArray_Apply csv scope to FastArray reception codepath
-
Allows to track regressions in FastArray user code
-
Exposed CSV Networking category via NetCore module export
-
-
NetDriver Added exclusive csv cpu scope to FlushNet call to track time spent inside NetworkHandlerComponent (compression, encryption, socket send, etc.)
-
NetDriver Handshake - The NetDriver of client connections will now automatically change the ReplicationSystem from non-Iris to Iris (or vice-versa) when they receive an Upgrade control message with a NetworkRuntimeFeature incompatibility
- Works in both the statelesshandshakecomponent and regular netconnection handshake
-
NetDriver Allow GameInstance's to override the Iris ReplicationSystem config
-
Change client pawn controller replication logic to properly call OnRep_Controller and NotifyControllerChanged when the controller is changed by code like ClientRestart that bypasses normal replication (this can be disabled with Controller.AlwaysNotifyClientOnControllerChange)
-
NetTokens are now serialized using separate indices per NetTokenDataStore
-
NetAnalytics
-
Added ability to add game specific attributes to the NetAnalytics framework
-
To add those game attributes, Implementations of FNetAnalyticsData must call AppendGameInstanceAttributes before calling SendAttributes.
-
Add or modify your game attributes with the NetDriver::SetNetAnalyticsAttributes function
-
NetDriver will add some default attributes (NetDriverName, NetDriverDefinition, ReplicationModel, NetMode) when net.AddNetDriverInfoToNetAnalytics is true
-
-
Added http.CurlAllowHTTP2 CVar to enable HTTP/2 for platforms using libcurl (defaults to false)
-
Added NetRefHandleManager as a protected member of NetObjectFilter for other internal filters to use and not having to create their own member.
-
Added protected GetObjectIndex function to NetObjectFilter. It returns the object index for the given NetRefHandle.
-
Added IRISCORE_API to UNetObjectGridWorldLocFilter, so that other game modules can derive from this class and extend it.
-
Added CSV Profiling Stat tracking for Average Jitter (milliseconds)
-
Added CSV Profiling Stat tracking for Packet Loss Percentage (In/Out)
-
Added "net.DisableRandomNetUpdateDelay" CVar to toggle the random delay added to actors' NextUpdateTime.
-
NetDriver
- Added some functions to allow swapping a NetDriver from a ReplicationDriver (RepGraph) to a ReplicationSystem (Iris) without destroying and restarting the netdriver
-
Experimental support for NetTokens to allow exporting stable pieces data such as strings and GameplayTags only once to reduce bandwidth usage. See NetTokenStore.h for details.
-
Added CSV profiling markers to Oodle when processing incoming packets.
-
Added CSV profiling markers to Oodle when processing outgoing packets.
-
Implemented FConnectionHandle which carry both parent connection and child connection information. This can be useful for APIs where it's important to keep track of child connections as well.
-
Added console command to set nettrace verbosity at runtime - NetTrace.SetTraceVerbosity [verbositylevel]
-
Added UE::Net::FTestWorldInstance and UE::Net::FTestWorlds to enable writing synchronous test cases within the scope of one function that utilize full UWorlds and the whole networking & replication path. The worlds created are PIE worlds and only work in the editor.
-
Added cvar net.SerializeNewActorOverrideLevel that can be optionally disabled to bring back the functionality of spawning replicated, dynamic actors in the persistent level on clients, regardless of its level on the server. This was the behavior in UE 4.19 and earlier.
-
Enabled EWorldType::Game worlds to be dedicated servers if desired in the editor.
-
Add a new UFUNCTION specifier "Remote" that turns the function into a unicast RPC that can be invoked on either clients or servers and executed on the remote side of the net connection. These functions will only execute remotely and only on net-owned actors.
-
Added Iris replication support for UInstancedActorsData.
-
Added a very early, experimental MultiServerReplication plugin that exposes a peer-to-peer like interface for communicating between multiple UE instances via online beacons. The only supported method of communication is via RPCs of subclasses of AMultiServerBeaconClient. Also added a UAT script LaunchMultiServer to automate launching a multi-server setup.
-
Added limited support for dynamic, replicated actors moving between levels at runtime on servers (via changing outer with the Rename function):
-
It's recommended to spawn dynamic actors in the world's persistent level and keep them there instead of relying on this feature.
-
This does not automatically replicate the level change to clients! If using this feature, set the cvar net.SerializeNewActorOverrideLevel=0 to keep the actors in the persistent level on clients.
-
This does not support actors placed in maps or other net-addressable/stably-named actors.
-
Use with the cvar value net.CleanUpRenamedDynamicActors=1 to destroy the actors on clients if they move into a level the client doesn't have loaded.
-
If using ReplicationGraph, set the cvar net.RepGraph.HandleDynamicActorRename=1.
-
Bug Fix:
-
Crash fix for removing InstancedStruct from a replicated array and adding the same struct type again when using Iris Replication.
-
Iris - Fix for issue where replicated overridden blueprint events/functions would not call the overrriden event/function
-
Iris - Fixed issue with changes to SubObjectFilterGroups would not enforce dirtiness until subobjects was modified
-
Iris - Invalidate delta compression baselines for the entire object hierarchy if a condition change are affecting properties in sub objects too. Prior to this fix such condition changes could cause bitstream errors on the receiving end.
-
Fix to ensure that members for both object and subobjects affected by changing conditionals such as owning connection, physics and role always are marked dirty when condition is re-enabled when using Iris Replication.
-
Fixed compilation error when UE_NET_ENABLE_REPLICATIONREADER_LOG is enabled.
-
Ensure locally controlled pawns on a listen server don't have a RemoteRole of ROLE_AutonomousProxy.
-
Iris - Fixed bug where late joining clients could cause ensures when RPCs were called on sub objects of relevant to owner only and connection filtered actors.
-
Iris - Keep reliability when splitting a NetBlob. Split unreliable multicast RPCs will now also keep their normal execution order.
-
Fix NetConnection crash when receiving packets from an IP address that was previously remapped after the user's client connection was cleaned-up.
-
Fix for ASAN crash issue on shutdown where UActorReplicationBridge would read from an already cleaned up reference to PackageMap. Changing to a UPROPERTY TObjectPtr fixes the issue. [RN] Fixed a case for a potential rare crash when shutting down ActorReplicationBridgebmittool SubmitTool-Development-4.2.0.1191505988
-
Fixed bug causing packet simulation to potentially be applied more than once on the same packet.
-
Fix for ASAN crash in Iris ObjectReplicationBridge - use cached version of FilterProfile instead of dereferencing a potentially invalid pointer due to array reallocation
-
Fixed issue where UHT did not generate separate FastArraySerializer type for FastArraySerializer's derived from other FastArraySerializers resulting in overloaded methods being called on base type instead of most derived type.
-
Fixed issue where some exports was not properly exported with recorded demo frame if exported by checkpoint causing bunch errors due to not all mustbemapped exports being registered.
-
Fixed an issue with Iris replication where reliable RPCs sent right before a client is disconnected (via the server kicking them, for example) could be dropped, especially under packet loss.
-
Fixed a bug with Iris replication where replicated components of an initially-dormant actor wouldn't replicate if the actor's dormancy is flushed before BeginPlay is called.
Learning Resources
Sample Content
New:
- Updating templates that weren't setting r.AllowStaticLighting to either False or True, to r.AllowStaticLighting=False
Level Design and Art Tools
Bug Fix:
- Fixed the level viewport tool bar having a wrong width with cinematic viewport.
Geometry Core
API Change:
- A new CVar, modeling.DisableAutoUVAreaDensitySampling, can be set to return the behavior to the original algorithm, in case there are legacy reasons to maintain that behavior.
New:
-
Added a faster variant of the Orient2D exact predicate for the case where one point is at the origin.
-
Generalized the GeometryCore grid interpolation code to support float as well as double precision, added support for clamping queries to the grid bounds, and fixed the Bounds() method to return the correct bounds.
-
Added new methods to VectorUtil for uniform random sampling of positions and barycentric coordinates on triangles
-
Improved the UV generation scheme PatchBuilder via a change to the polygroup generation stage, providing area aware sampling of the mesh surface and reducing the overcompensation effects that small, disconnected regions in the mesh were having on the overall segmentation.
Bug Fix:
-
Fixed a case where Dynamic Mesh could create invalid geometry when merging an edge pair.
-
Fixed crashes in the Convex Hull and Convex Decomposition methods.
-
Fixed an issue where the local parameterization (exponential maps) algorithm generated incorrect results for meshes without vertex normals.
-
GeometryProcessing Sparse Matrix: fix a crash when solving large sparse systems. We were computing NRows
*
NCols which can overflow int32 on moderately large matrices (~50k by 50k). -
Fixed an issue where mesh surface point sampling could hang on meshes with degenerate triangles.
-
The Dynamic Mesh CompactInPlace method now compacts more of the internal mesh data, fixing an issue where Convex Decomposition and some other algorithms would use an excessive amount of memory when processing large inputs.
-
Fixed an issue where the AABB tree build could crash for meshes with NaN or Inf vertices.
-
Fixed crashes and improved behavior of the Bevel algorithm on meshes that have bowtie vertices.
-
Update xatlas source files from github. Fixes a buffer overflow
-
The FitKDOP3 method now by-default adds a small thickening to its convex hulls, allowing it to create valid convex hulls for flat shapes. This thickening is exposed as a new parameter.
Geometry Script
New:
-
Added the option to set the material ID to use for hole fill triangles, for the plane cut and plane slice Geometry Script methods.
-
Made Geometry Script's Compact Material ID method optionally also remove duplicate materials
-
Moved Geometry Script out of 'Beta' status.
-
Added a new node to geometry scripting, "Prune Bone Weights", to prune a set of bones from all skin weights. This is useful when creating alternative skin weight profiles where specific bones need to be deactivated.
-
Added a new GenerateCollisionFromMesh method to Geometry Script, which fits simple collision primitives to an input dynamic mesh.
-
Added a new volume texture baking method to Geometry Script, which bakes a mesh SDF to a volume texture -- BakeSignedDistanceToVolumeTexture
-
The Geometry Script Add Primitive methods (Add Box, etc) now support requesting a material ID to be assigned to the appended mesh faces, via the FGeometryScriptPrimitiveOptions struct's Material ID member.
-
Geometry Script now has a global dynamic mesh pool, created on first access, to make it easier to use mesh pools in utility widgets.
-
Geometry Script's CopyMeshFromStaticMesh and CopyMeshToStaticMesh methods can now optionally use the 'asset' materials list rather than the 'per section' materials list, for cases where one would like the materials list not to vary per LOD and to match with the list the UI shows on the asset. Per section materials are still used by default. If you use the asset material list, be sure to specify this in both the 'copy from' and the 'copy to' calls.
-
Added a new node, "Copy Bones From Skeleton", to copy the reference skeleton of a skeleton asset to a dynamic mesh.
-
Added a new Geometry Script method to disconnect the mesh triangles along a selection of edges: ApplyMeshDisconnectFacesAlongEdges
-
Improved the capsule generator to support a cylinder-section subdivision parameter, and to make UVs consistent across different subdivision / hemisphere step amounts.
-
Geometry Script now has macros to automate the process of releasing meshes back to mesh pools after their use.
-
Geometry Script now has VectorTransformInPlace, VectorInverseTransformInPlace, and VectorPlaneProjectInPlace methods to efficient transform or project all the vectors in a FGeometryScriptVectorList. The transform methods can optionally transform the vectors as positions (i.e., applying the translation component of the transform).
-
Added new methods to manage simple collision shapes in geometry script -- CombineSimpleCollisionArray, to combine collision shapes from an array into a single FGeometryScriptSimpleCollision object, and ResetSimpleCollision to reset the shapes in a FGeometryScriptSimpleCollision object.
-
Added a new Geometry Script node to remap material IDs and construct a combined materials list, to help with workflows where you need multiple meshes to have consistent material IDs
-
The Geometry Script sweep functions now support "mitering" -- scaling the cross section at sharp turns to preserve apparent cross section width -- and have a Miter Limit parameter to control this scaling. (This is analogous to the stroke-miterlimit parameter in CSS.)
-
Added 'With Collision' variants of Geometry Script's Append Box, Sphere, and Capsule methods, which return a simple collision shape matching the appended primitive.
-
For meshes that are not the same, the IsSameMeshAs method now reports information about the difference it identified via a new FGeometryScriptMeshDifferenceInfo struct.
-
Dynamic Mesh Component's ConfigureMaterialSet method now by default will remove extra material slots on the component, so can be used to reduce the number of materials on the component. The previous behavior can be requested by passing false to bDeleteExtraSlots.
-
Added two new nodes, "Mesh Copy Bone Weights" and "Blend Bone Weights". The first one copies bone weights from one skin weight profile to another, which is useful when creating a new profile that is a simple modification to an existing profile. The second one allows blending two sets of bone weights into a single set, this is useful when implementing skin weight smoothing or proximity blending.
-
Geometry Script now has new 'With Materials' versions of the various 'Append Mesh' methods. These methods take the materials array of the target and append meshes as input, and returns a new combined materials array that the resulting mesh materials IDs reference.
-
Added bHaveValidUVs output param to GetAllUVSeamEdges.
-
Geometry Script has new methods to help specify Constrained Edges for the AppendDelaunayTriangulation2D node -- CreateConstrainedEdgesLoop and CreateConstrainedEdgesChain.
-
Added control over whether a Dynamic Mesh Component allows mesh element selection, which can be toggled via the SetAllowsGeometrySelection method. Generated Dynamic Mesh Components now default to disallowing this selection, since they will typically destroy manual selections and manual edits when they are re-generated.
-
Added a new SnapMeshOpenBoundaries method to Geometry Script, which attempts to match and snap together nearby mesh boundaries without adding or merging any vertices.
-
Dynamic Mesh Components now can optionally use the static render path, which can allow faster rendering (when mesh is not changing) and is necessary for Lumen support.
-
Added new methods to get static mesh and skeletal mesh asset materials with corresponding material slot names, and also added new methods to convert from this array-based format to the material map format used by the Create New Skeletal Mesh method.
-
Added a new geometry scripting node, "Copy Skin Weight Profile To Skeletal Mesh", that allows taking a skin weight profile from a dynamic mesh and applying it directly on a skeletal mesh asset, as long as the two mesh's topologies are identical.
-
Added a new UVShell bake type to the BakeTexture GeometryScript node.
-
There is a new Geometry Script method to set a custom complex collision mesh for a static mesh -- SetStaticMeshCustomComplexCollision
-
Added initial Lumen support for Dynamic Mesh Component
-
Added LineSetComponent as a blueprint spawnable component.
-
Added new methods to select mesh elements by material ID and by polygroup -- SelectMeshElementsByMaterialID and SelectMeshElementsByPolygroup.
-
Added more UV stats methods to Geometry Script: "Get Mesh UV Area" and "Get Num UV Islands"
-
Added a GetLODMaterialListFromSkeletalMesh method, to get the materials list used by a specific LOD of a skeletal mesh.
-
Added support for beveling meshes along a selection of edges in Geometry Script.
-
Added new Geometry Script methods to select mesh boundary edges, selection boundary edges, and 'sharp' edges (with large dihedral angles) -- SelectMeshBoundaryEdges, electSelectionBoundaryEdges and SelectMeshSharpEdges respectively.
-
Exposed GetAllUVSeamEdges and GetAllVertexPositionsAtEdges to MeshQueryFunctions.
-
Added a "navigable convex decomposition" method to geometry script collision functions
-
Geometry scripting nodes will now include the name of the calling Blueprint function when emitting warnings and errors. This makes it easier to track down the source of the message in large geometry graphs.
-
Added a new Geometry Script method to set or remove sharp normals on edge selections: SetSplitNormalsAlongSelectedEdges
-
Dynamic Mesh Component's physics mesh now supports querying UVs from hits, when the 'SupportUVFromHitResults' physics setting is enabled
-
Added edge selection support to Geometry Script.
-
Added a new Geometry Scirpt method to insert or remove UV seams along a selection of edges: SetUVSeamsAlongSelectedEdges
-
Added a new UV layout function which exposes functionality from the UV Editor Layout Tool, including multiple layout types and restrictions on scale and rotation, to geometry script.
-
Added new function to perform texel density UV scaling operations, allowing mesh UV islands to be scaled to match a consistent texel density over the whole mesh.
Bug Fix:
-
Fixed an issue where the Mesh to Collision fitting algorithm would fit an incorrectly-rotated oriented box in some cases.
-
Fixed an issue where CreateStaticMeshAsset would not set materials correctly when creating a static mesh with unnamed material slots.
-
Fixed an issue where some Geometry Script nodes required options struct pins to be connected.
-
Fixed an issue where bone data would be lost on dynamic meshes when they were serialized, causing some animation-related functionality to break in PIE or on load.
-
Fixed a crash in GetMaterialIDsOfTriangles if passed null triangle list, and changed the behavior when passed invalid triangle IDs to match that specified by the docstring comment -- a material ID of -1 is set for invalid triangles, while correct material IDs are still reported for valid triangles.
-
Added cvar geometry.DynamicMesh.MaxComplexCollisionTriCount to prevent Dynamic Mesh Components with many triangles from auto-generating complex collision, and fixed some issues with the collision preview rendering.
-
Fixed an issue where duplicate points could be added when using error-based sampling of splines with 'constant' control points.
-
Fixed issue where mesh surface point sampling would compute incorrect/inconsistent samplings for non-compact meshes
-
Fixed an issue when using "Copy Mesh To Skeletal Mesh" and the source dynamic mesh did not have the identical skeletal structure as the target skeletal mesh asset. Now the bone indices are properly remapped on the skin weights so that they match the target skeletal mesh.
-
Fixed an issue where 2D Voronoi diagrams would not be generated when the input points were collinear.
-
Added missing null checks for Geometry Script Scene Utility Functions on UDynamicMesh* inputs
-
Fixed issues in Geometry Script handling empty polygons and polygon lists -- AddPolygonVertex, AppendPolygonList not adding/appending, and AddPolygonToList crashing
-
Added a missing null check to the StaticMeshHasCustomizedCollision Geometry Script method
-
Mesh Transform methods now consistently transform normals and tangents.
-
Geometry Script options structs now more consistently expose members as editable, when they are blueprint read/writable, so that they can be edited via the properties panel when used as variables.
-
Fixed the AppendMesh nodes inconsistently handling transforms with negative scales.
-
Fixed the Geometry Script "Set Simple Collision on Static Mesh" function crashing when run with a null static mesh.
Modeling Tools
API Change:
- Previously BrushAdjusterInputBehavior was used to set a toggle that would be read during the On*Drag callbacks to differentiate between a "brush stroke" and a "brush adjustment". This was error prone for both new and old tools that derived off of BaseBrushTool as it broke or was easy to break assumptions made in the tool's drag callbacks. With this separation, OnBeginDrag/OnUpdateDrag/OnEndDrag will only be called for brush strokes as it was prior to the introduction of the BrushAdjusterInputBehavior.
New:
-
Added a 'cut outside' option to the PolyCut tool
-
The Weld Tool can now optionally split bowtie vertices, which enables it to successfully weld edges in more cases.
-
Modeling mode element selections now auto-convert selections when users change the active selection mode
-
The Edit Triangles tool can now collapse seam edges
-
There is a new option to toggle off the Cube Grid tool's grid plane visualization
-
The edit pivot tool now uses the mesh element selection (if available) as an initial pivot point.
-
New: Updated the default colors used in Mesh Element Selection. These colors can be customized in Edit >> Editor Preferences >> Plugins >> Modeling Mode >> Mesh Element Selection Mode
-
Added a configurable NormalSpace property to BentNormal bakes to support object space BentNormal bakes in the BakeTexture tool and GeometryScript node.
-
The draw polygon, draw polypath, and draw-and-revolve tools now initialize with a 'reasonable' drawing frame instead of starting at the origin. The frame is now center on the selection (if available) or the center of the view. If a mesh element is selected, the frame will also align to it.
-
The Mesh to Collision tool has improved handling of convex decomposition: - Convex decomposition is now a separate option from generating single convex hulls as a separate shape type (rather than hiding the feature under the 'max hulls' count) - There is a new pre-simplify option to make the decomposition compute faster for very large meshes - The tool is set to use better defaults for the navigable space protection algorithm - The tool does not default-enable the 'max count' collision shape option, as it can be confusing/frustrating to wait for a decomposition only to find it has random holes due to that option quietly throwing away shapes
-
The Transform tool now works on most component types, not just standard mesh types.
-
Enabled tablet support with pressure sensitivity for Modeling mode.
-
New: Added a 'Local Frame Mode' toggle in the Mesh Element Selection Toolbar Settings. Users can now use the gizmo to transform and edit a mesh based either on the selected geometry only or on the entire object.
-
Add an "Add Capsule" tool
-
Improved the "Split" tool to preview how it will split the mesh, and to give more options for splitting methods -- one can now split by mesh topology, vertex overlap (with a distance tolerance), material ID, or polygroup. Note if there is an active element selection, the tool will continue to split by the selection.
-
New: Added support for Mesh Element Selection in the Lattice Tool. By using Mesh Element Selection to select components of a mesh and entering the Lattice Tool, only the selected areas of the mesh will be affected.
-
New: Added support for Mesh Element Selection in the Split Tool. By using Mesh Element Selection to select components of a mesh and entering the Split Tool, only the selected areas of the mesh will be affected.
-
The Mesh Splines tool now has the same material and output type settings as the Revolve Spline tool.
-
Change some primitive creation tools to default to PerQuad, and make LatLong sphere PerFace not be the same as PerShape (and be same as PerQuad).
-
New: Added new settings to the UV Editor's 'Display' menu. These allow customization of the Boundary Line Thickness, Boundary Line Color, and Wireframe Thickness in the Unwrapped Viewport, along with the Selection Line Color, Line Thickness, and Point Size in the Live Preview Viewport.
-
Added a new UVShell bake type to the BakeTexture tool.
-
Added DoubleClickBehavior to the ScriptableModularBehaviorTool.
-
Add ability for CubeGrid to accept and start a new mesh without having to exit.
-
Display selection measurements in CubeGrid in the viewport.
-
Add tooltip for the status bar at the bottom of the edtior so it can be fully read.
-
Rename Absolute Grid Snapping option in the gizmo settings in modeling mode.
-
When the Cube Grid tool is started with an active Mesh Element Selection, the selection position is used as the origin of the grid.
-
In the Edit Pivot tool, the snap-dragging feature has a new option to snap just the orientation of the pivot.
-
The Vox Wrap tool now has an Apply Thicken Shells toggle and Thicken Shells slider, which can be used to capture open-boundary surfaces as shells of the specified thickness.
-
Make the Weld action in PolyEdit weld to center, and add a "Weld To" action for the previous welding behavior.
-
Added SkeletalMesh support for the Inspect tool.
-
New: Added support for converting a selection when changing between mesh element and/or topology types in Mesh Element Selection
-
New: Added a 'Snapshot' Tool in the UV Editor. This allows users to easily export a texture asset of a UV Layout, and to customize the look and resolution of the image to be exported.
-
New: Added support for Mesh Element Selection in the Smooth Tool. By using Mesh Element Selection to select components of a mesh and entering the Smooth Tool, only the selected areas of the mesh will be affected.
-
New: Added support for Mesh Element Selection in the Weld Tool. By using Mesh Element Selection to select components of a mesh and entering the Weld Tool, only the selected areas of the mesh will be affected.
-
New: Added support for Mesh Element Selection in the Displace Tool when using the 'Flat' subdivision type. By using Mesh Element Selection to select components of a mesh, entering the Split Tool, and ensuring the subdivision type is set to 'Flat', only the selected areas of the mesh will be affected.
-
Moved SDraggableBox slate widget into a new ModelingUI module, allowing it's usage in non-Editor Only contexts.
Bug Fix:
-
Bug Fix: Updated the behavior when deleting PolyGroup Edges in Mesh Element Selection. Now, upon PolyEdge deletion, the edge's adjoining groups are merged. This behavior now matches the PolyEdge deletion functionality found in the PolyGroup Edit Tool.
-
Fixed an issue where edge selections could be lost on tool accept after using the polygroup edit or triangle edit tools.
-
Bug Fix: Addressed a bug where the Level Editor scale snapping affected the UV Editor scale snapping
-
MeshModelingToolset: Update preview when toggling Shells to Solids in PolyEdit extrude activity.
-
Bug Fix: Fixed a bug in in the LOD Manager Tool when using the 'Clean Materials' feature. Previously on input meshes with multiple materials, 'Clean Materials' would remove the incorrect material.
-
Fixed the Select.InsertEdgeLoops tool initializing to the incorrect topology type. Prevent InsertEdgeLoops, InsertEdges and SimplifyByGroups tools from initializing in Triangle selection mode.
-
Fixed an issue where some primitives could be generated off-center when created with very low polygon counts.
-
Modeling tools now limit the number of background tasks that they will run simultaneously when generating preview results, especially for larger input meshes.
-
MeshModelingToolset: Add Bridge action to TriEdit
-
Bug Fix: Fixed a bug which did not allow for snapping when scaling a mesh in the XForm->Transform Tool
-
Fixed an issue where group colors were not rendering correctly in Simplify and Remesh tools.
-
MeshModelingToolset: Allow snapping to objects in scene when using DrawPolygonTool even when the camera is positioned such that the raycast does not hit the tool plane.
-
Fixed an issue with brush resizing sensitivity in the InteractiveToolsFramework BaseBrushTool when bSpecifyRadius is false.
-
Fixed an issue where some modeling mode selection operations would not work correctly for triangle edge selections.
-
Bug Fix: Improved the 'Brush Size' setting in the Group Paint Tool so that when manually adjusting the value, the new size is now reflected in viewport immediately, without having to first click in viewport to see the update.
-
Fixed material assignments being changed by the modeling tools for some assets.
-
Fixed redundant UV mesh spatial computation in modeling mode bake tools.
-
The Simplify tool's will now respect the prevent normal flips flag, and not prevent normal flips when that flag is disabled.
-
Fixed a crash that could occur in the Draw Spline tool when using a blueprint that deletes itself.
-
Fixed an issue where focus in some modeling tools did not work when there was no editor-level selection.
-
Fixed crash by preventing use of the Convert tool on cooked-for-editor geometry collections
-
The Polygroup Edit and Triangle Edit tools now auto-convert mode-level mesh element selections of mismatched topology type, rather than discarding them. Polygroup edge selections are now also properly converted, including in the case where the tool has enabled extra corner support.
-
Bug Fix: Fixed a bug in the UV Editor's Seam Tool which displayed incorrect seam placement in some cases involving multiple selected meshes or rotation.
-
Fixed an issue where box and cylinder UV projections could introduce new bowties in the UV mapping.
-
Fixed polygroup colors not rendering in the subdivide, tri select, and materials tools
-
Bug Fix: Fixed a bug that ignored scale transforms when creating new objects using mirroring.
-
MeshModelingToolset: Fix crash when hiding actors deleted by tools with Delete Inputs option.
-
Fixed Tri Select tool being called Triangle Edit in the Select tool group, so it has a consistent name and is not confused for the Triangle Edit tool in the Mesh tool group
-
Bug Fix: Addressed a bug which caused undo and redo to not behave as expected or crash when deselecting edges in Mesh Element Selection
-
Bug Fix: Disallowed Ctrl+Alt+Drag select when a tool is active which caused conflicting visuals relating to the active selection
-
Fixed a crash when using the brush resizing hotkey (b) in Modeling mode sculpt and paint tools.
-
Fixed a crash in the modeling mode's mesh element selection system that could occur when a mesh with an active element selection was deleted.
-
MeshModelingToolsetExp: Replace various usages of Tan(0.5
*
FOV) with new material function MF_OthoWidth -
We now prevent modeling tools from enabling element selection on non-editable dynamic meshes.
-
Fixed a crash in MeshMapBaker.ComputeUVCharts when operating on non-compact DynamicMesh inputs.
-
Fixed an issue where the Edit Normals tool could fail to correspondingly update tangents as needed in some cases.
-
Modeling mode now warns users when selection includes engine assets, which cannot be modified
-
Fixed an issue with modeling mode's mesh element selection where the gizmo could disappear after selection type changes.
-
Raised the default limit at which we use a faster-but-less-reliable copy-paste method for dynamic meshes from 1000 triangles to 200,000 triangles, and added an editor toast to surface when the less-reliable method fails (and what can be done about it).
-
PolyEdit's Bevel tool now refuses to start when there are no bevel-able edges in the current selection, and better handles selections with some boundary edges.
-
Bug Fix: Fixed a crash that occurred when exiting the editor while Mesh Element Selection was active
-
Fixed an issue where brush resizing using the hotkey (b) would not work when bSpecifyRadius was false.
-
The Mesh to Collision tool now supports referencing custom PolyGroup layers when multiple inputs are selected.
-
The Rotation setting in various Add Primitive (Add Box, etc) tools is now named Initial Rotation and is disabled when it is not applicable.
-
Changed flyout dialog in the New Preset window to use a list presentation instead of a tile presentation, allowing for more clarity in reading names on long preset collection labels.
Deprecated:
- Changed the default target requirements for most modeling tools and tool builders to use UDynamicMeshProvider/Committer. Only specific tools that directly get the MeshDescription in non-optional ways kept the UMeshDescriptionProvider/Committer.
Procedural
New:
-
Added a new Filter Elements by Index node that extracts the corresponding element(s), either point(s) or attribute value(s), from an index provided by an attribute on point or attribute set data.
-
Add parse string node: Allow to convert any string into a predefined type.
-
Added new Blueprint related event handlers for common PCG events.
-
OnPCGGraphStartGenerating
-
OnPCGGraphCancelled
-
OnPCGGraphGenerated
-
OnPCGGraphCleaned
-
-
Added the collapse node that does decimation and averaging.
-
Added 'In Graph Folder' and 'In Generated Folder' modes to the Create Target Actor and Spawn Actor nodes.
-
Added a new Pathfinding node that will find one or more optimal path through a cloud of points when provided with a starting and goal point/location. It will also find the shortest path to any goal, if multiple goals are provided.
-
Added the sort by tag value node which allows to sort data at the data level (useful to order data by priority, etc. in a very efficient manner).
-
Added option to quiet attribute filter on data that's missing an attribute
-
Added a "From Input" mode in the Get Actor Data nodes to allow for parsing of actors without doing a query.
-
Added some overrides in the Get Actor Data nodes.
-
Added the Attract node that allows to pair up source points with target points based on some criteria and a maximum search distance. This mapping (which can also be provided from an attribute) can then be used to do interpolation between source and target.
-
Added a new Subdivide Spline node that will place grammar modules along a full spline path.
-
Added a retrieval mode in the Get Parameter node (by name) to allow getting graph parameters from upstream or from the root without requiring to pass them down.
-
[PCG] Refactor Copy Attributes
-
Match Copy Points API
-
Sunset Transfer Attributes, which will be replaced by Copy Attributes
-
-
Added tags to the mesh descriptors used in the Static Mesh Spawner.
-
Added a mode to retrieve actor references only in the Get Actor Data node (useful to delay actor parsing or early filtering).
-
Added option in the Static Mesh Spawner to force the component choice to the user provided value.
-
Added a new Visualize Attribute node, which can be used to display attribute information in world space.
-
Add material extraction to the mesh sampler
-
Allowed more overrides on Get Actor Property and Get Property From Object path nodes.
-
Get Actor Property node now queries actor tags as well.
-
Added some flexibility to allow retrieval of multiple properties assuming the same cardinality.
-
Add a Spawn Spline Component node
-
Added an 'unordered' option in the cull points from bounds node, which is going to be more efficient when there is a significant size difference between in/out bounds.
-
Extended the C++ API to support partitioning on multiple attributes in PCGMetadataPartitionCommon.h.
-
Added a new Select Grammar node that will select a grammar module for a given key based on a selectable criteria.
-
Renamed the Apply On Actor node to Apply On Object and generalized its use to any object.
-
Geometry Script interop plugin has a new example map for V1 of Geometry Script nodes.
-
Add support for TSet extraction and in graph parameters
-
Added the Wait For Landscape Changes node, which can be used in conjunction with an option on the graph to ignore landscape changes for graphs that interact with the landscape.
-
Added the Save Data Asset node to export any input data. Added UI element to save collection/specific data being inspected to an asset.
-
Added the Add Component node that can add components to specified actor(s).
-
Changed the default spawn option in the Spawn Actor node to 'No merging'.
-
Added the option to retrieve the reflection direction in the world ray hit nodes.
-
Added component selection and filtering in the Get Data nodes.
-
Allowed include/exclude of landscape hits on the world queries
-
[PCG] V1 for Grammar support in PCG, with Shape Grammar (with Slicers)
-
Add a Spline to Segment to convert a linear spline into points, representing the segment
-
Add a Duplicate Cross Sections to duplicate a spline along an axis, following a grammar
-
Add a Subdivide Segment to slice a point into multiple points, following a grammar
-
-
Added the Collision Wrapper node that interprets a point data as-if it were collision. This can be used as a volume or in the 'difference' part of the Difference node, but it will not work as the source.
-
Added option to zoom on the data selected in the Attribute List View, and also added a contextual menu to zoom on selected rows (similar to the double-click).
-
Add Remove Duplicates node, that will keep only unique values for a given attribute.
-
Added a new Clustering node that will assign "clustering labels" to points based on a locational similarity, using one of the following traditional ML clustering algorithms:
-
K-Means
-
Expectation-Maximization
-
-
Added a new Clean Spline node that can remove extraneous control points from splines:
-
Fuses co-located control points.
-
Removes collinear control points.
-
-
Added steepness control on create points grid.
-
Added exponential on grid size that shifts to the next (& more) cell sizes. For example, a cell size of 400 with an exponential of 2 will make it work as-if it were a 1600 grid (400
*
2^2). This can be useful for very large distances - allows grid sizes up to ~2000km. -
Added a collision-aware mode in the Self-Pruning node. Note that it is very expensive, and relies on good bounds. Added the Set Bounds From Mesh node to act as a preamble to the self-pruning.
-
[PCG] Replace Density Remap by Attribute Remap
-
Node is using Metadata Operation base
-
Deprecate old Density Remap
-
Add preconfigured info for Density Remap, using Attribute Remap
-
Change the Unit Test to use Attribute Remap now
-
-
Added replace string operation in the String operation node.
-
Normalized attribute filtering parameters in the filtering/delete attributes nodes so they are a bit more flexible (e.g. substring match, etc.)
-
Added support to the Static Mesh Spawner for "Property Overrides", which will automatically partition ISMs accordingly.
-
Grammar feature has a new example map for V1
-
Enabled the extraction of metadata from Ray Hits including:
-
Impact (T/F)
-
Impact Point
-
Impact Normal
-
Impact Distance
-
Local Impact Point
-
Physical Material
-
Render Material
-
Static Mesh
-
UV Coords
-
Element Index
-
Face Index
-
-
Added a pause button & cancel mechanism to the toolbar, which can be controlled in the project settings.
-
Added a new Create Points Sphere node with the following generation modes:
-
Geodesic
-
Angle
-
Segments
-
Random
-
Poisson
-
-
Added multiple nodes to do tag to attribute processing and improved management of Tag:Value tags.
-
[PCG] Add Elevation Isolines node
- Use the Marching Squares algorithm, factorized in its own helper.
-
Added option to get components reference in the Get Actor Data nodes.
-
Added quality of life methods to simplify managed resource creation from blueprint (Add Component To Managed Resources, Add Actors To Managed Resources).
-
Added support to load multiple assets in the Load PCG Data asset node. Fixed graph compilation/culling issue when switching from/to FromInput in the get actor prop/get actor data nodes.
-
Added a new Primitive Cross-Section node that will automatically detect and output spline cross-sections from the combination one or more scene primitives.
-
Added approximate data size in megabytes in the profiling window. Note that this is an approximation and in practice there are cases where we will reuse data in more efficient ways and so on.
-
Added right-click -> copy column name in the attribute list view.
-
Added a new World Raycast node that will return the point of impact for one or more customizable line traces with the option to extract information about the hit and the target.
-
Made the texture sampler clearer with respect in how density is computed and added more options.
-
Added per-data caching in elements that loop over their required pins. Requires opt-in per element, which is done in a separate CL.
-
Added a new Print String node, which emits a log/warning/error to the log an optionally to the graph.
Bug Fix:
-
Added extra security, controlled by CVars, to alleviate out of memory asserts in Surface and Volume Samplers, often from unbounded or extreme sampling.
-
Fixed a bug causing the Volume Sampler to improperly sample the final row of X, Y, Z in certain situations.
-
Added robustness to out of memory security measures in PCG Samplers to help mitigate continued crashes
-
Fixed and issue with caching of the volume sampler results, which could be a problem in partitioned graphs.
-
Fixed a bug with ISM Body Instance Customization not displaying the correct channels when viewed in PCG nodes, such as the Static Mesh Spawner.
-
Removed unneeded data duplication in Get Actor Data.
-
Fixed times in the profiling window for tasks that went to sleep or that were executed in parallel.
-
Fixed bug where pasting an editor graph node that fails to import object properties will break the parser and crash the editor.
-
Fixed a bug preventing attributes with spaces to be filtered by the Filter Attribute node.
Texturing Tools
New:
- Texture Graph Editor: The node preview is now using the new SImageViewport widget
UV Editor
New:
-
Make the UV editor seam tool (and the modeling tools seam tool) follow paths better in certain "against the grain" situations.
-
Added functionality to the UV Layout tool to allow for preserving existing UV island's scale and orientation during layout operations.
Bug Fix:
-
Fixed issue where unwrap material was set with a depth offset multiplier that rendered mesh lines difficult to see in the unwrap view of the editor.
-
Added localization text for missing transform tool categories defined by the detail's customization for the tool.
World Building
New:
-
Add start/end/random offset to the PCG Spline Sampler
-
Added Seeding Modes to the PCG Spline Sampler, and a new mode 'Seed From Index' to get stable seeds when points change position.
-
Changed Pin/Unpin (user facing) to ForceLoad/ReleaseForceLoad in SceneOutliner
-
Add PCGDataVisualization interface and PCGDataVisualizationFactory factory to implement custom debug/visualization behavior for PCG data types.
-
[World Partition] Implemented asynchronous update streaming state. Can be turned on using wp.Runtime.UpdateStreaming.EnableAsyncUpdate true (disabled by default). This allows to run the computation of the world partition streaming cells to load/activate/unload outside of the game thread / critical path. Update of the cells underlying level streaming state and priority is still done in game thread.
-
External Data Layer V1 - Allows for plugins to inject/remove content (actors) in a partitioned world - Serves as a replacement for the experimental 'Content Bundle' feature - Added new External Data Layer (EDL) Asset - Added new Game Feature Action 'AddWorldPartitionContent' to control activation of an EDL asset - Supports Data Layers inside a plugin (child of an EDL) - Added builder to convert content bundles to EDL (UGameFeatureActionConvertContentBundleWorldPartitionBuilder) - Feature is temporarily disabled by default and can be turned on using Editor Experimental Settings 'Enable World Partition External Data Layers' flag
-
PCG Runtime Quality Branch/Select nodes. Added 'pcg.Quality' cvar ranging from 0 to 4 (Low, Medium, High, Epic, Cinematic).
-
Support for cooking PCG graphs with GPU enabled nodes.
-
Add option to compute alpha and distance along curve as attributes in PCG Spline Sampler node. Alpha is a value in [0,1] along the curve where each segment of the curve represents the same interval. For example, if the curve has three segments, points on those segments would lie in [0,0.333], [0.333, 0.666], [0.666, 1] respectively, and interpolate across those intervals using the spline's interpolation. Distance is the total cumulative distance along the spline to reach a given sample point.
-
Provide a native GPU implementation of the PCG Copy Points node, enabled by setting bExecuteOnGPU flag to true in the Copy Points node settings
-
Add command to refresh all PCG runtime gen components - 'pcg.RuntimeGeneration.Refresh'
-
Add EPCGTextureFilter for Point and Bilinear filtering on PCGTextureData
-
Add support to PCGDataVisualization interface for populating the Attribute List View window.
-
Add 'Spawn Spline Mesh' node which spawns takes a Spline Data and spawns Spline Mesh Components in the world.
-
Support attribute set data type in PCG GPU graphs
-
Update PCG Instance Data Packers to use attribute accessors
-
Add 'Create Surface From Spline' node for creating an implicit surface from a closed spline.
-
Fixed spline interior sampling not respecting the Bounding Shape input correctly
-
Allow PCG data visualizations to override double-click behavior in the Attribute List View window. Additionally, double-click on Spline Data entries focuses the relevant spline control point in viewport.
-
Add PCGWaterInterop plugin, with 'Get Water Spline Data' node.
Bug Fix:
-
[PCG] Bug Fix: Sanitize attribute names when creating from Tags to prevent spurious error messages thrown when Tags have characters not supported in PCG attribute names.
-
World Partition Editor
-
Add ShowMouseCoordinates (World Position) in Show Menu.
-
Used the default GrabHandClosed cursor when panning.
-
-
Add the ability to ignore the dirty flag when querying for external objects to save
-
[PCG] Bug Fix: Eliminated frequent blocking texture loads in editor when using the Get Texture Data node.
-
ForEachStreamingRelevantComponent now takes into account all UActorComponent when being invoked for editor.
-
Source Control Changelist View
- Fix initial refresh UI not being call for all changelist type (esp. the Uncontrolled Cl)
-
Added redirector support to FExternalPackageHelper::LoadObjectsFromExternalPackages
-
[PCG] Bug Fix: Fixed large freezes when using runtime generation in editor when many actors are present in level.
-
Fix assertion when trying to break LevelInstanceActor when its level isn't current
-
[PCG] Bug Fix: Addressed broken actor bounds when getting a point from an actor when the actor transform has negative scales.
-
Fix Deleting Assets progress bar exceeding 100%
-
Fix "Update Redirector References" process unable to fix up redirectors of assets used in level instances
-
Add checks to make sure RepresentingWorld is valid before it's accessed.
-
Fix warnings appearing after creating a new Empty Open World Level
Localization
API Change:
- The CookedLocalizationPaths setting is now deprecated because it serves no purpose anymore.
New:
-
Centralized the logic for forcing game localization data to load in an editor
- This is now controlled by FTextLocalizationManager::ShouldForceLoadGameLocalization, which will return true for: a cooked editor, or an uncooked editor with the game localization preview enabled, or with the CVar Localization.ForceLoadGameLocalizationInEditor set to true.
-
Exposed EDateTimeStyle to Blueprint Date/Time Text functions
-
Added "Localization.AlwaysLoadNativeLocalizationDataDuringInitialization" (default: false)
- This allows games to opt-in to loading the native localization data during initialization, even if the game isn't starting in the native language. This ensures that all gathered text will load some localization data, even if not fully translated.
-
Game localization data is now always loaded in cooked editors.
-
Exposed FText::AsMemory to Blueprints
-
Ref-count the mounting of localization data for explicitly mounted plugins
- This allows different systems that need plugin localization to call MountExplicitlyLoadedPluginLocalizationData and UnmountExplicitlyLoadedPluginLocalizationData (in pairs), without needing to understand any other system that may have mounted localization for that plugin, and avoids the unmount calls from different systems fighting with each other.
Bug Fix:
-
Remove restriction that the package localization cache can only be updated on the game thread
- This restriction was added before the asset registry itself was made thread-safe, and is no longer needed
-
Disable localization chunking when cooking DLC
-
Running this code as-is causes a name conflict in the DLC output that can override the base localization data when the DLC is mounted. This can result in most of the base localization data appearing to be missing, as the DLC may have been cooked against a much smaller set of packages in each chunk.
-
While this could be supported by adding a suffix to the chunked data within the DLC, plugin localization is a better way to achieve this, and so localization chunking is now disabled when cooking a DLC plugin.
-
-
Add a Clang compiled ICU static lib for x64 to fix memory corruption issues at runtime when linking with Link-LLD.
-
Fixed issue where NativeCultureIndex wouldn't be updated when deleting a culture, causing the native culture to be modified incorrectly.
-
Validate that the requested OS locale is supported by ICU, and if not, use the requested language instead
- We have some platforms that are returning unsupported locales (eg, a locale of en-IT, with a language of it-IT), so this change hardens the default locale set-up to validate that ICU has resource data for the requested locale, and if not, we use the requested language as the locale instead.
MetaHuman
New:
-
MetaHuman component for UE improvements - Instance PP AnimBP will only be played in case the physics asset or the control rig actually differs the one set in the AnimBP of the skeletal mesh asset. This way we avoid any overhead work at instantiation time.
- In case the control rig and physics asset set on the MH component match the ones set in the skel mesh assets, we still want to hook into the performance control, fixed now.
-
Added MetaData map to DNA User Asset to store MetaHuman relevant data like body type.
-
New: Added import path configuration to the project settings of the MetaHumanSDK plugin. This controls where imported MetaHumans will be added to the project.
-
Move MetaHumanRuntime plugin to MetaHumanSDK plugin and rename it to MetaHumanSDKRuntime #changelist validated
-
New: Added the experimental MetaHumanSDK plugin containing editor and runtime components supporting the use of MetaHumans in projects.
-
Moving DNAIndexMapping and SharedRigRuntimeContext to public folder
Mobile Rendering
New:
-
Add ReplaceTonemapper BlendLocation to the Mobile PostProcess
-
Support Vulkan pre-rotation on mobile. - Create an intermediate image as the BackBuffer and render normally, then copy the image to the actual BackBuffer in the low level. - Remove the QCom pre-rotation implementation.
-
Clamp number of active scene captures for mobile Deprecate calling GMaxNumReflectionCaptures and GMobileMaxNumReflectionCaptures directly to avoid errors in the future
-
Allow Debug View shaders on ES3_1 preview platforms
-
Removed SkyLight specific shader permutations. This halves total number of shader permutations in a projects with a stationary or movable SkyLights at a minor GPU cost.
-
Merged Linear64 and Gamma32 shader variants as we do not support both permutations at the same time
-
Added support for rendering debug primitives on mobile as part of the base pass when MobileHDR is disabled, as they would normally be rendered during post processing
-
PSO pre-caching is now enabled by default for iOS Metal, Android Vulkan and Android OpenGL ES
-
Added an option to not use "Pixel Local Storage" and "FrameBuffer Fetch" extensions on Android OpenGL. And instead rely on a regular texture sampling similar to immediate mode GPUs. Set r.Mobile.AllowFramebufferFetchOpenGL=0 to disable support for these extensions.
-
Removed some of the complexity in static lighting shader permutation settings r.Mobile.AllowMovableDirectionalLights option was removed. Movable lights are always allowed. CSM from movable lights will only work in a non pre-computed lighting environment or when "Combined Static and CSM" option is enabled. Removed r.Mobile.EnableNoPrecomputedLightingCSMShader. CSM shaders will be generated only when project has "Combined Static and CSM" option enabled.
-
"GPU Scene" is now enabled by default on all mobile platforms
-
Added support for SSAO in a mobile deferred shading
Bug Fix:
-
Allow modulate blend mode materials to be renderred in translucent after DOF pass on mobile.
-
Apply sky lighting with ambient occlusion on mobile deferred.
-
FSceneCapturePS has highp floats forced now to fix a driver bug FullPrecisionInPS can now be enabled on a per global shader basis and not just globally controlled by r.Mobile.FloatPrecisionMode
-
Correctly change between Mobile Forward and Mobile Deferred, taking into account r.Mobile.AllowDeferredShadingOpenGL cvar
-
Fix some issues related with CSM caching. 1. Fix an issue that the LastFrameExtraStaticShadowSubjects could be overridden when there are multiple Packets in FGatherShadowPrimitivesPacket. 2. Uses atomic add to count LastFrameExtraStaticShadowSubjects for multi-thread rendering. 3. Invalid the cached shadow map if the LastFrameExtraStaticShadowSubjects is greater than a throttle for both SDCM_MovablePrimitivesOnly and SDCM_CSMScrolling
-
Fixed crash when Building Virtual Textures with the separate mobile SVT enabled
-
Remove the DXT format support for Android OpenGL since the compressed RVT could be created with the DXT format but the compression method is ETC. ETC is aways supported on GLES 3.1.
-
Fix a crash if there are more than 8 lights cast shadow on mobile GL platform. UniformBuffer can't be created on worker thread on GL.
-
Fix up type of "OutColor" from "HALF4_TYPE" to "HALF_TYPE" in SunBlurPS_Mobile function ( PostProcessMobile.usf )
-
Fix a bug that the scene is much brighter with reflection capture on mobile.
-
Prevent mobile-specific SVT textures to be displayed if Virtual Textures on mobile is disabled in the project settings. If mobile support for virtual textures is to be used on certain mobile platforms only, the project settings should still be enabled (so that the editor can know that at least one mobile platform supports it) and those platforms should have r.Mobile.VirtualTextures set to 0 in the .ini files.
-
Fixed and optimized PSO pre-caching for all mobile project configurations, like projects with pre-computed lighting, dynamic lighting and/or VR projects.
-
Fixed precision issues with bloom on Android devices running OpenGL ES
-
Fixed flicker when rendering primitives with refractive materials in a mobile deferred shading mode
-
Fixed case where static actors were not rendered into a Stationary light Cascaded ShadowMaps in a project with a pre-computed lighting enabled.
Deprecated:
- Leave only immutable texture path for GL(only use glTexStorage2D), don't set GL_TEXTURE_MAX_LEVEL as it isn't needed anymore
Mobile Deferred
Bug Fix:
- Fix the GBufferA format for the mobile deferred with pixel local storage .
Mobile Forward
New:
-
Added IES Textures in Mobile Forward Renderer
-
Added movable point lights dynamic shadows in mobile forward renderer. Requires r.Mobile.EnableMovablePointLightsShadows=1 and r.Mobile.SupportGPUScene=True.
-
Added rect light support to mobile forward renderer. Requires r.Mobile.Forward.RenderRectLightsAsSpotLights=0.
-
Added capsule direct shadows to mobile forward renderer. Requires r.Mobile.EnableCapsuleShadows=1 and r.Mobile.EnableCapsuleDirectShadows=1.
Bug Fix:
- Fix depth prepass disabling MSAA.
Mobile Lighting
New:
- Force Lowerst Lod for Sky Capture on Android
Bug Fix:
- Don't do LightPrimitiveInteractions for local lights on mobile when r.Mobile.Forward.LocalLightsSinglePermutation is enabled and you don't have local light dynamic shadows enabled
Motion Design
New:
-
Added option to hide actors while waiting for the Delay Task to complete.
-
Renamed Mask Modifier Apply/set to Target/Source
-
Motion Design Outliner displays Levels as top level items
-
Added Default Transition Tree Template settings to build on new levels
Online
New:
- Change SocialChatManager in SocialToolkit to be protected instead of private
Bug Fix:
-
A constant DedicatedServerId is now used by OnlineSubsystemEOS when the game is ran as server. This fixes a bug with session search where IsValid() was returning false on sessions created by a server. There are several other minor fixes and improvements to session and lobby search in this change.
-
Added a IsValid() check on CurrentSessionSearch in StartLobbySearch to avoid potential crash
-
Fix for EOS SDK cache directory to account for system account file path. Added some checks to set cache directory to nullptr in EOS SDK platform create and empty string in config
-
Fix in RefreshConnectLogin to check Epic Games account only if EAS is used.
-
Modified FOnlineSessionEOS::FindFriendSession to call the correct completion delegate.
Crash Reporter
Bug Fix:
- Fixed an issue where the Language Code Identifier was always 0 in crash reports.
Hotfix System
New:
- Added UCurveTable modification callback deferral in OnlineHotfixManager similar to what is done for UDataTable to save performance.
HTTP
New:
- Added support to IHttpRequest to specify a Unix Socket to send the request to, supported on Windows and Linux
Bug Fix:
-
Fix a crash in the Curl HTTP implementation due to some curl state being manipulated on multiple threads under some circumstances
-
Added configurable choice of Packet Reliability Type in EOS Sockets
-
Update UAT to have the same default value for n.VerifyPeer as Unreal Engine. Fixes cacert.pem not being staged when n.VerifyPeer is not explicitly set to true in Engine.ini
Online Subsystem
New:
-
Updated OnlineSubsystemGoogle's Google SignIn implementation. Added support for silent sign in and retrieving server auth code
-
Added support to specify the type of auth in EOS external mapping queries
-
Updated EOSSDK version to EOS-SDK-35276460-v1.16.3
-
Refactor of PersistentAuth/AccountPortal login flow in UserManagerEOS. Addition of missing logic for proper EOS login flow on Switch when using NPLN.
-
Added support for EOSSDK Native Platform Integration in Xbox platforms
-
Addition of support for -epicdeploymentid and -deploymentid parameters to define EOS platform creation
-
Removed -EpicPortal parameter requirement to initialize Ecom interface in OnlineSubsystemEOS.
-
Added logic to Lyra to enable basic EOS beacon communication as part of the session creation and join flow.
-
Update OnlineSubsystemGoogle implementation for iOS to include privacy manifests (Using Google Sign In SDK 7.1.0)
-
Added implementation using CredentialManager and set it as default in OnlineSubsystemGoogle
-
Added support for EOS_Connect_AddNotifyAuthExpiration.
-
Update OnlineSubsystemFacebook on Android (updated to use Facebook SDK v17.0.0)
-
Addition of support for new result of EOS_Ecom_Checkout: EOS_Ecom_PurchaseProcessing in OSS.
-
EOSSDK binary update to version 1.16.4-36651368
-
Added new test command line option GETFRIENDDISPLAYNAME to FOnlineSubsystemImpl::HandleFriendExecCommands
-
Added support for EOS_Lobby_AddNotifyLeaveLobbyRequested, along with a new Sessions interface event and corresponding logic in CommonSessionSubsystem and CommonGameInstance reacting to it
-
Update OnlineSubsystemFacebook to include privacy manifest on iOS (updated to use Facebook SDK v17.0.3)
-
Addition of support for -NoEOS commandline parameter to stop EOS modules from loading.
-
Add entitlements and microtransaction implementation support for Steam. The important addition for Steam is entitlements, Steam apps that can purchase another Steam app through the Steam store (commonly used for expansion packs or other types of DLC) will now have an entry when calling the purchase interface's QueryReceipts functionality. There is additional support added for Steam's microtransaction API as well. There is little we can actually do in the engine, because all of the API requires calls to and from a trusted backend server. For this reason, the Steam purchasing link was added. It is simply an ease-of-use feature for coders who implement all of their purchasing support via the Online Subsystems. Simply define a server link with calls for initiate transaction and offer querying and all of your existing purchasing code will work just as it does on the other platforms.
-
Add EOS Integrated Platform support for Steam using the -CustomConfig=EOS command line option. This also includes the SteamEOS option to enable this in Lyra, but full Steam integrated platform support in Lyra is still a WIP
-
Update the CreateSession BP node to include a "Use Lobbies If Available" boolean.
-
Add sessions-based presence plugin for Lyra to enable some very simple functional testing of presence functionality in Lyra
-
[Online Services] Implement OnSessionCreated and OnSessionJoined in the SessionsOSSAdapter so that an event is fired when a session is created and joined.
Bug Fix:
-
Changed how OSS EOS Sessions responds to a EOS_ELobbyMemberStatus::EOS_LMS_CLOSED notification, destroying the related lobby instead of just removing the lobby member.
-
Disable FOnlineError from being constructable from a bool Unbind FOnlineEventDelegateHandle on move assignment
-
Fixed a bug where input did not respond while an EOS Overlay popup notification was showing.
-
Fix wrong check on GooglePlay's achievements that succeeded
-
Fix for override of the value the bUsesPresence in OSS EOS Lobbies
-
Refactored NetDriverDefinition across all platforms. Removed GameEngine re-definitions in Platform config. Moved Platform config from Engine to BaseEngine.
-
[OnlineSubsystem EOS] Fixed a crash in OnlineSubsystemEOS when accepting a friend request but the friend's list has not been populated yet.
-
Fix Steam OSSAdapter for EOS ExternalAuth
-
SteamSockets fixes SteamSocketsNetConnection has a custom handshake flow where it performs the handshake using the handler of the net driver, but this was causing problems after it was complete because the handler of the net connection did not have the data of the handshake (namely, the session and client IDs). This change synchronizes the two after the handshake is complete There were also some non-unity issues in the Steam sockets files that have been addressed.
-
Github pull- GetPlayerNickname() Steam fix - use GetFriendPersonaName with 64-bit ID Developer note: Code has been reworked, but the target issue is the same
Deprecated:
-
Deprecation of Stat/Leaderboard Interface variables and methods using FName, with new FString variants.
-
Deprecated usage of SEARCH_PRESENCE in OSS Sessions
-
Removed Online logic marked for deprecation in 5.3
-
OSS EOS Login Refactor: - Added new login methods that act in a more deterministic way. Added config variable to use new logic. - Kept old methods renamed as Legacy. They are used by default. - Changed Lyra config to stop using EOSPlus and use new login flow.
-
Deprecate IOnlinePartySystem::RejoinParty. This feature must be implemented as JoinParty.
Pixel Streaming
New:
-
Added support to the Pixel Streaming blueprint component to use the -PixelStreamingURL command line value instead of whatever is set on the component property.
-
[WebRTC] Fix: Rebuilt WebRTC with correct references to LibVpx.
-
[AVCodecs] Add: LibVpx (software VP8 and VP9) support to AVCodecs
-
[PS1] Add: FlexFec support to PixelStreaming
-
[AVCodecs] Add: VP9 profile enum
-
[PixelCapture] QOL: Update number of maximum capturers to support a larger number of concurrent streams
-
[PixelCapture] Add: New MediaIO based PixelCapturer that handles RHI -> RHI and RHI -> I420 CPU conversion
Bug Fix:
-
Fix: Pixel Streaming VR stereo images would not converge on Meta Quest 3 and Apple Vision Pro headsets. Additionally, reworked handling of XR axes, touches, and button presses in Pixel Streaming VR as they would sometimes result in no input or stuck input.
-
Fix: In Pixel Streaming VR off-center eye offsets were applied incorrectly and this caused distorted stereo rendering in Meta Quest 3 and Apple Vision Pro headsets.
-
Fix: Pixel Streaming VR controller Y-axis was inverted.
-
Fix: The number of connections returned by embedded C++ signalling server (used by editor streaming and VCam) was inaccurate if multiple streamers were started and you queried before they had finished identifying themselves.
-
[PixelCapture] Add: I010 pixel format support. NOTE: No capture pipeline exists for I010 data. This buffer exists purely to copy converted I4xx data in to.
-
[PS1] Fix: StreamerComponent not working with internal signalling server.
-
[AVCodecs] Fix: Re-add external semaphore deletion as it was accidentally removed in CL29731260
-
[AVCodecs] Fix AVCodecs NVDEC crash when video resizes larger than original size.
-
[PS1] Fix: PIE viewport streaming when there are other non-PIE game instances running (ex: Motion Design rundown)
-
[AVCodecs] Fix NVENC AVCodecs crash when video resize larger than max device resolution.
-
[AVCodecs] Fix: Update QP range for AV1 vs H.26X in NvEnc
-
[AVCodecs] Fix: Warning logs produced from running NVidia driver check on non-NVidia GPUs
-
[AVCodecs] Fix: VTCodecs hardware decoding. NOTE: There is a known memory leak with this codepath but will be addressed in a later CL
-
[PS1] Fix: Pixel Streaming blueprint components running unnecessarily even when unused in scene
Deprecated:
- Un-deprecate "kick" blueprints in Pixel Streaming 1.
Platform
API Change:
- Programmers can use FScopedFTZFloatMode wrapper struct to place on top of the scopes where they need to flush denormals to zero to avoid manual handling of said cases. It's implemented for both x64 and ARM architectures
New:
-
Replaced PLATFORM_SUPPORTS_VECTOR_ROUNDING_MODE with PLATFORM_SUPPORTS_VECTOR_CONTROL_REGISTERS, and replaced VectorSetControlRegister, VECTOR_ROUND_TOWARD_ZERO, and VECTOR_DENORMALS_FLUSH_TO_ZERO with noops when PLATFORM_SUPPORTS_VECTOR_CONTROL_REGISTERS is false
-
Make Turnkey persist UE_SDKS_ROOT to .epicrc on Mac and Linux
-
Implemented denormals flush to zero and round to zero floating unit control flags Plus fixed ARM FPU control flags API
-
Allow editor to load non-confidential platform extension DeviceProfiles.ini files - Always load the GlobalDefaults DeviceProfile object, not just when ALLOW_OTHER_PLATFORM_CONFIG is defined - Allow a couple of dp exec commands when ALLOW_OTHER_PLATFORM_CONFIG is 0
-
Moved all versions from
*SDK.Versions.cs
files to*_SDK.json
files - Some static variables made it tricky, so added some support to make it simpler on users of the static variables -
Leave only immutable texture path for GL(only use glTexStorage2D), don't set GL_TEXTURE_MAX_LEVEL as it isn't needed anymore
Bug Fix:
-
Fixed an issue where per-platform packaging settings were getting confused when project settings were changed in the editor (the per-platform ones were not getting updated).
-
Changed Hybrid project checking to always check all enabled platforms to see if any need to be hybrid. This helps address an issue where a single-platform (say IOS) plugin was causing packaging to fail because the host platform (Mac) to clean up the hybrid target files, so then packaging for IOS would fail to find the compiled hybrid targets
Desktop
New:
-
Use ITargetPlatformSettings instead of ITargetPlatform for Windows, Mac and Linux TargetSettingsDetails
-
Desktop Platforms TargetPlatform(TP) Refactor TargetPlatformControls(TPC)/TargetPlatformSettings(TPS) for Windows/Mac/Linux/WINGDK
Linux
New:
-
Fork
-
Added cvar fork.ParentSleepDurationInSec to give ability to configure the time parent process sleeps when it has no signals to execute
-
Added cvar fork.LogMemoryStatsWhenForking to control the memory stats log before every fork (enabled by default)
-
Added LogFork category used by fork related logs (previously LogHal)
-
-
Add support for -fsanitize-recover for ASAN which allows builds to continue on error [RN] Linux ASAN builds will now include fsanitize-recover to allow continue on error
Bug Fix:
-
Fix FUnixPlatformProcess::GetDllHandle issue when non-module shared libraries are reloaded
-
Write protecting GModuleSymbolFileMemory to better be able to identify the root cause of crash during ensure stack walking
-
Prevent GModuleSymbolFileMemory from being freed if it's size exceeds SSIZE_MAX. Cleaned up some logging and code duplication
Deprecated:
-
Linux toolchains earlier than v23 are now deprecated since they cannot properly link for Rocky Linux 8
-
Toolchain upgrade to llvm 18.1.0 - support Rocky Linux 8 as minimum supported OS - deprecate CentOS 7 support
Mac
New:
-
Metal RHI now uses Bindless when enabling SM6
-
Metal RHI Context Refactor Removed MetalContext and MetalRenderPass. Most functionality is now within MetalRHIContext and removed dependancies so that multiple MetalRHIContext's can execute in parallel.
Windows
New:
- Improving support for Windows arm64 - compilation fixes and many third party libraries compiled for arm64
XR
New:
-
IOpenXRExtensionPlugin::UpdateCompositionLayers - headers array should not be of pointer-to-const -Removed const so that extension plugins can add new chain structs via the next ptr. -Fixed passing pointer to openxr chain struct that goes out of scope. -Removed a couple 5.1 deprecated functions from IOpenXRExtensionPlugin.h
-
VisionOS: audio capture support -Add visionOS platform support
-
Add CVAR to control whether we throttle the application when HMD is not worn -xr.OpenXRPausedIdleFPS created to specify the max fps when the openxr session is idle. When set to 0 there is no max fps. 10fps is the default. Setting it to 60 or 90 is more likely to be correct than 0, because with openxr idle the 'natural' max framerate may be faster than it is in vr. -Also changed OnStartGameFrame to avoid some useless work when we are not in an OpenXR session.
-
Input Actions with the same description silently breaks OpenXR input -Detecting duplicate Action or ActionSet descriptions before we create them, issuing a warning, and then replacing them with the Action or ActionSet's FName so that the inputs will function.
-
[OpenXR] One extension plugin adds multiple interaction profiles -Adds a hook to IOpenXRExtensionPlugin to add multiple interaction profiles. Previously only one could be added. -Deprecated the single interaction profile version, and replaced all uses of it in the engine.
-
VisionOS hand tracking fix -Fixed tracked flag bit flag setting error.
-
XR RHIGetDefaultContext usage elimination -Refactored so we don't use RHIGetDefaultContext anymore, instead we pass the rhicommandcontext down from OnBeginRendering_RenderThread or from RHIEndDrawingViewport through CustomPresent. -Added a DebugLabel to the swapchains, because i have often wanted one while debugging.
-
Add Mac as a target/allow platform for the OpenXREyeTracker plugin
-
Check to see if we're in an XR Tracking Only session and update tracking devices if we ar
-
VR Template
-
Add visionOS specific .ini
-
Added support for reading VisionOS***.ini. IOS is a parent platform, so it's INIs are read as well.
-
Added VisionOSEngine.ini to vr template which disables MobileMultiview and InstancedStereoRendering, which are not currently supported.
-
Fixed build break where notification manager is used, but was not included on visionos. Perhaps it wasn't supported in an earlier version, but the types in question exist now so I just removed the ifdef removal on VisionOS.
-
Bug Fix:
-
Fixed stereo layers depth not working in PCVR. Fixed crash when using the left texture of a stereo layer.
-
Fixed shader compilation crash when enabling foveation on mobile due to CAS VRS not being supported.
-
Fixed Bloom with mobile multi view and mobile hdr.
-
Fix tonemapper being enabled in XR. Keep it enabled only in Editor windows as they need the linear to sRGB conversion that is done by the HW in the XR backbuffer case.
-
Fixed Custom Depth and Custom Stencil for mobile multi view.
-
MSAA depth working on VisionOS for both eyes
-
Fixed editor crash using Rect Light with mobile multi view
-
Fixed DBuffer decals for stereo rendering
-
XRThreadUtils ExecuteOnRHIThread_Impl goes around rhi cmd list when it should not. -Removed the IsRHIThreadRunning() check. We don't want this command being executed out of order if the rhi command list is being used, even if there isn't a dedicated rhi thread.
-
Fix crash when changing map with OpenXR foveation enabled
-
Fix decals not rendering in stereo with ISR
-
Fixed vulkan error log spam about using non multiview texture on multiview layout when depth prepass was enabled.
-
Fix deferred mobile renderer base pass only rendering to the left eye with mobile multi view.
-
Fixed volumetric fog for stereo rendering.
-
Fixed VisionOS passthrough edge artifact
- There was a race condition between acquiring a new depth swapchain texture and comitting to render into it. The result was that the depth buffer given to compositor services was occasionally one frame old. Because any 32x32 pixel block with all pixels at zero depth is dropped entirely this could result in 32x32 pixel bites taken out of the edges of rendered geometry abutting non-rendered passthrough areas of the output. This is fixed by moving the depth acquire to the same point as the color acquire. One must be running with the xr.OpenXRAcquireMode=1 for the fix to fuunction, in the other path the race condition still exists. This is now set in VisionOSEngine.ini. It is possible that this problem affected other VR devices which use depth for reprojection, but it would have been much more subtle.
-
ensure() instead of check() if OpenXRPath cannot be converted to a strin
-
Fix animated decals not rendering correctly in the right eye with mobile multi view.
-
Fixed velocity rendering for mobile multi view
Deprecated:
-
AzureSpatialAnchors deletion -Service retired November 2024, deprecated in 5.4. Time to delete it.
-
Remove deprecated BeginRendering_RenderThread and BeginRendering_GameThread -Deprecated in 4.19. -Added cvar xr.LateUpdateManager.Disable, which disables late update of attached components.
Platform Mobile
New:
-
Added HW Depth Resolve for Vulkan
-
ASTC HQ mapping from BC7 is now configurable with new config DefaultASTCQualityBySizeHQ and respects per-texture quality override.
-
Use VS2022 to build etc2comp library since its a required VS version since UE5.4
Bug Fix:
- Set proper user agent on mobile WebView browsers
Android
New:
-
Implemented FPlatformMisc::SetStoredValue, GetStoredValue and others on Android
-
Memory mapped animations and audio are now enabled on Android to save memory.
-
Add SharedPreferences accessors for Android
-
bool AndroidThunkCpp_HasSharedPreference(const FString& Group, const FString& Key)
-
void AndroidThunkCpp_SetSharedPreferenceBool(const FString& Group, const FString& Key, bool Value)
-
bool AndroidThunkCpp_GetSharedPreferenceBool(const FString& Group, const FString& Key, bool DefaultValue)
-
void AndroidThunkCpp_SetSharedPreferenceInt(const FString& Group, const FString& Key, int32 Value)
-
int32 AndroidThunkCpp_GetSharedPreferenceInt(const FString& Group, const FString& Key, int32 DefaultValue)
-
void AndroidThunkCpp_SetSharedPreferenceString(const FString& Group, const FString& Key, const FString& Value)
-
FString AndroidThunkCpp_GetSharedPreferenceString(const FString& Group, const FString& Key, const FString& DefaultValue)
-
-
Updated to AGP 8.5.2
-
Added support for HWAsan starting from NDK 26
-
Switched Android configurations to build with ISPC enabled by default.
-
Move gc.MaxObjectsInGame, Substrate and NumPreallocatedVertices settings from Android Platform ini to Base ini
-
Added support for debug keystore
-
Flavorless 'Android' target platform now defaults to ASTC flavor
-
Add device profile to support Xclipse devices running the SM5 renderer Rearranged Android SM5 device profiles to add vendor-specific defaults
Bug Fix:
-
Fixed quick launch not working on Android when using Zen Store and target device and host are on different networks
-
Do not attach network connection monitoring to PSOService processes
-
Block AFS token from inclusion in packaged ini
-
Fixed issue with UnrealAndroidFileTool packages command not including all installed apps
-
Introduce short names for both
AndroidTargetPlatformControls
andAndroidTargetPlatformSettings
, which are causing certain built targets to run afoul of theMAX_PATH
limit we impose on UBT file path lengths. -
Fixed updating device orientation in Android's onConfigurationChanged callback. This fixes the cached in-engine value for current device orientation being completely wrong in some particular situations.
-
Fixed issue with HMD initialization on Android
-
Fixed output directory issue for Blueprint APKs
-
Fixed order of arguments when using AFS to push libUnreal.so outside of .apk
-
Fix a crash when generating a patch with a pak larger than 2GB.
-
Added additional location to check for Android Studio binary
-
Fixed issue with Android environment variables not always set on Mac
-
Better handling of pread/pwrite for Android filesystem
-
Fixed vulkan PSO cache when using Zen streaming
-
Change method of ordering AndroidFileServer (AFS) startup sequence (am start -W doesn't work for older Android)
-
Only kill Java tasks started by MakeAPK on build machines
-
Fixed issue with incremental building growing the APK size when only .so files change
-
AutoSDK for Android is now on -27
-
Upgraded Swappy to code based on the latest in AOSP. We now manually load libswappy.so as a shared library built with static libstdc++ and hidden symbol visibility, isolating it from Unreal's allocator which would sometimes cause crashes during rotation or backgrounding.
-
Fixed Android_Multi builds incorrectly treating ASTC_NormalRG as ASTC_NormalLA
-
OpenGL: Correctly set 'Layered' argument in a glBindImageTexture call for a Texture2DArray resource
iOS, tvOS, and iPadOS
New:
-
Added caching of FIOSPlatformMisc::GetNetworkConnectionType result to avoid redundant checks
-
Memory mapped animations are now enabled on iOS to save memory.
-
Add MallocBinned3 to iOS
-
Refactored iOS background downloading stack
-
Added MarketplaceKit.framework wrapper
-
Change the slack growth factor from 1.25% to 1.2% IOS
-
Add IOS as supported platform for MobileFSR
-
Enabled UE_BINNEDCOMMON_ALLOW_RUNTIME_TWEAKING for IOS
-
Autosdk MetalDeveloperTools support On Win64 MetalShaderFormat module is always loaded
-
Added option to order CDN's by ping time on iOS background download
-
Implemented ScheduleLocalNotificationAtTimeOverrideId on iOS
-
Added ability to retry stale background downloads when we're in foreground on iOS
-
Added CDN re-ordering for background download to potentially improve chances of reply at the first try
-
Do not add StoreKit framework dependency for apps not distributed through the AppStore
-
Improved Commit\Decommit memory syscalls on iOS and Mac to reduce RSS
-
Optimized compiler and linker flags for iOS
-
Added "ResignApp.sh" (meant for IOS but should work for Mac apps also) that can resign a .xcarchive, .app or .ipa with another cert/provision pair, and can change bundle ID, embedded commandline, build version (like 0.1.1234) and marketing version (like 1.0)
-
Run Engine/Build/BatchFiles/Mac/ResignApp.sh with no params for help
-
An .xcarchive can resign to any type, .app and .ipa can output to each other, but cannot output to .xcarchive (because we re-use the directory structure of the input .xcarchive)
-
-
Added support to use zipped xcframeworks dependencies
-
IOS/TVOS/VisionOS TargetPlatform(TP) refactor to TargetPlatformSettings(TPS)/TargetPlatformControls(TPC)
-
Added an optional array RequiredEntitlements to [/Script/IOSRuntimeSettings.IOSRuntimeSettings] in the Engine.ini file. The app checks for these at startup and logs a fatal error if the entitlements are not found. This can help verify the app is signed with a key with the correct entitlements during development.
-
Added support for a static feature level on iOS
-
Added the UnrealAutomationTool command GeneratePsyms that can generate a .psym file for use with Unreal Insights from an iOS .dSYM file. The tool is intended to be run from the UnrealAutomationTool command line using
- _./RunUAT.sh GeneratePsyms -files=MyProject/Binaries/IOS/MyProject.dSYM _or using a SymGen node in the BuildGraph xml.
-
libimobiledevice improvements
-
idevicefs added -r option for rm, to remove recursively
-
idevicefs push/pull is an order of magnitude faster
-
idevicefs ls now shows directories and filesizes
-
removed debugging log from itcpconnect and the return code now indicates success/failure
-
Bug Fix:
-
Added support for partial file writes on iOS
-
Fixed several #ifdef 's that should be #if (caused Mac code to execute on IOS)
-
Support Web Auth to complete using an external browser
-
Update command line arguments only on when app is open with expected game schema
-
Changed handling of file write returning 0 as an error on iOS
-
Enabled ApplicationReceivedScreenOrientationChangedNotificationDelegate in engine pre-init on iOS
-
Fixed several issues with a mobile deferred shading on iOS that were causing crashes and incorrect rendering.
-
Fixed cases where drawable surface could leak
Quixel
Bug Fix:
- Fixed a crash that would occur if the user dragged an asset to the viewport after closing the quixel bridge panel.
Render Pipeline(MRQ)
New:
-
Added support for camera overscan to MRQ. MRQ now uses the camera's overscan property to set overscan, and MRQ overscan property has been changed to an override, which when enabled replaces the camera's overscan value with its own.
-
Add reference motion blur parameter to Path Traced Render node in MRG.
Rendering
API Change:
- For external users of "r.PostProcessing.PropagateAlpha", calls to FindTConsoleVariableDataInt(..) will need to be replaced with regular FindConsoleVariable(..), since the former call would silently fail on a (now) boolean console variable.
New:
-
Hair - Add project settings for hair tristrip geometry as not all project are compatible with this.
-
Hair - Split direct lighting loop for GBuffer & Hair inputs. This avoids context switching between each light and improve performance overall, and give a 5% improvement.
-
Hair - Change groom skinning to use mesh's vertex normal instead of face vertex normal. This helps smooth the groom look when the underlying mesh has rough triangulation.
-
Hair - Add hair show flags to disable hair rendering on certain view.
-
Implemented native support for rendering first person geometry with an (effectively) different FOV and a smaller scale as to minimize the chance of clipping with the scene. The feature is controlled by the FirstPersonFieldOfView and FirstPersonScale properties on the camera component (or alternatively directly on the FMinimalViewInfo). Primitives can be tagged as first person by ticking the "IsFirstPerson" checkbox on the primitive component. Should support most primitives, including Niagara systems. The different FOV and scale is achieved with a 3x3 matrix multiplication that is applied in the shader after WPO. This matrix scales the geometry towards the camera and also scales the XY components in view space to cancel out the scene FOV and to achieve the intended first person FOV. This means that the first person geometry is modified in world space before any projection, so the rest of the renderer doesn't need to deal with a separate projection matrix (and related matrices), but it also means that we're lighting fairly small and slightly deformed geometry. In practise, the morphing seems to be acceptable. The scaling appears to be mostly inconsequential for for lighting and reflections, but scene shadows cast onto the first person geometry are a bit more binary. Self-shadows and casting shadows onto the scene are problems that will be solved in separate CLs. For now it is probably best to untick "Cast Shadows" on the first person geometry.
-
Replaced the previously called "Enable alpha channel support in post processing" (r.PostProcessing.PropagateAlpha) renderer setting with an "Alpha Output" boolean located in the Default category, effectively removing the "linear-only" constrained option with value "1".
-
Hair - Improve noise on hair transmittance and shadow. Replace the jitter noise by a blue noise function which remove structural noise, and lead to more pleasing results.
-
Added ECVF_Scalability flag to r.Shadow.NaniteLODBias
-
Added tonemapper and post-process materials to visible scene capture show flags.
-
Handle multiple views when computing visibility masks for per-instance occlusion queries
- Add a shader permutation to load previous visibility mask values before setting/clearing the visiblity bit for the current view
-
DirectionalLight : Add a setter for AtmosphereSunDiskColorScale on the proxy so we don't need to fully recreate the renderstate each time it changes. This avoids 20ms spikes on the render thread
-
Cleaned up and reduced tonemap shader permutations for faster compilation.
-
Hair - Allow AutoLOD bias to have negative value.
-
Added DumpMaterialInfo commandlet, which writes a CSV with properties of all matching materials to disk.
-
[LWC] Implemented invariant operators on specific platforms that have issues with fast-math and the 'precise' keyword. Platforms that have invariant instruction intrinsics use those. On some platforms the FMA intrinsic is used, where it has the same invariance effect.
-
Hair - Add group color to CV visualization, reference point / position offset, and large point visualization option.
-
Local Fog Volumes now work with per pixel fog option on materials.
-
Hair - Add experiemental screen trace for hanlding occlusion test when integrating Lumen input for hair (Enabled/disabled with r.HairStrands.SkyLighting.ScreenTraceOcclusion).
-
Hair - Add Depth of Field Use hair depth property on PostProcessVolume.
-
Hair - Save Hair Strands Textures generation options into groom strands to avoid re-entering them each time textures are generated.
-
Added new (deferred) renderer project setting for primitive alpha holdout support, separating it regular propagate alpha which now becomes runtime-toggleable (POST_PROCESS_ALPHA has been completely removed).
-
Added public custom render pass option to render scene color with/without alpha, in addition to the existing scene color with depth render mode.
-
Added a new FirstPersonOutput node which allows users to pass a FirstPersonInterpolationAlpha value to interpolate between world space and first person space on a per-vertex frequency.
-
Add support for CommandLine versioning within a run so parse results can be cached safely Cache IsHDRAllowed cmd line parse results as it is called per window per frame in slate
-
Added a project setting, r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences, that allows you to enable Unlimited Bone Influences in a project without compiling extra shader permutations for GPU skinning. This saves runtime memory, disk space and shader compilation time. When the setting is enabled, any mesh LODs using Unlimited Bone Influences that don't have a deformer assigned will use the DeformerGraph plugin's default deformer. This ensures that UBI meshes are always rendered with a deformer, and therefore the GPU skinning permutations for UBI aren't needed. Also added a per-LOD setting that allows users to disable mesh deformers on a specific LOD, which could be useful for controlling performance, e.g. disabling an expensive deformer on lower LODs. Some changes to functions on USkinnedMeshComponent lay the foundations for having different deformers on different LODs as well.
-
[VSM] Added VSMTexelDitherScale to light proxy, analogous to r.Shadow.Virtual.SMRT.TexelDitherScale
-
[VSM] Added VSMResolutionLodBias to light proxy, analogous to r.Shadow.Virtual.ResolutionLodBias
-
Hair - Add VSM multiple sample support for hair strands voxel tracing, allowing to reduce noise on shadow cast by grooms.
-
Re-implemented MeshEdges showflag. This fixes issues with z-fighting, TSR ghosting, missing Nanite geometry and adds flexibility in the composition step. The wireframe overlay is now rendered as a separate pre-pass, and composited into EditorPrimitives after the main pass.
-
Added bTargetArraySlicesIndependently to UTextureRenderTarget (relevant for 2D arrays and cube or cube array) so that each slice can be individually rendered to by a pixel shader
-
Don't allow setting MSAA with deferred shading in renderer settings as this combination is not supported.
-
Hair - Fix missing control point when enabling triangle strip geometry for hair strands.
-
Improved Blue Noise textures using "FastNoise: Filter-Adapted Spatio-Temporal Sampling for Real-Time Rendering". Improves quality of various stochastic effects like Lumen, MegaLights, Hair, Volumetric Fog relying on BlueNoiseScalar and BlueNoiseVec2. #virtualized
-
Hair - Improve Groom importer warning/error reporting. Add report of invalid position.
-
[LWC] Added the LWC complexity debug viewmode, similar to the shader complexity view, which shows how much LWC function usage each material has.
Bug Fix:
-
SceneCapture: Moved scene view extension setup calls before renderer creation to match the main render path.
-
Hair - Fix scene preview profile in groom editor. Add widget in groom editor for switching scene profile.
-
Hair - Fix Deep shadow in VR.
-
Fix cooking issue with groom binding on certain platforms.
-
Hair - Fix hair view rect with stereo rendering causing RHI assert due to be out of bound.
-
Hair - Fix hair being updated despite the instance being explicit set to 'not visible'.
-
Add a small fix to update a TextureSampler Anisotropy at runtime in PIE when r.MaxAnisotropy is not 0
-
SceneCapture: Fixed missing show flag property reset and toggle behavior.
-
Hair - Fix missing tiles when rendering groom with PPLL due to incorrect tile coordinate computation.
-
hair - Fix race condition between NiagaraDataInterface and GroomComponent.
-
Hair - Fix Groom cache. Fix typo in groom cache causing groom cache's position to be overriden by groom cache's radius. Fix groom cache reimport causing max hair radius computation to be incorrect due to a memory move operation. Fix incorrect groom cache's hair radius normalization when updating interpolated hair radius.
-
Set RVT texture bounds usability improvements :
-
Ensure the set bounds are valid in the case of a flat mesh
-
Take into account the unloaded components bounds when the bounds align actor is a landscape
-
-
Fixed various missing resource transition when rendering RVT (thumbnails, SVT baking), causing RHI validation issues
-
[Shadows] Fix incorrect clamping of ShadowFactor weights in ShadowFactorsUpsample pass, used in distance field and capsule shadows, leading to screenspace blocky shadow artifacts.
-
Fix 0-byte request done by groom system on cooked build, causing crashes on loose-file/non-packaged builds.
-
Fix a validation failure when verifying uploaded instance info in GPUScene.
-
Fix Reflection capture removal causes the primitive GPU state become dirty.
-
Fixed incorrect loading of actor and object world position in mobile scene data loader/writer.
-
Hair - Fix crash in groom deformer when changing geometry type.
-
Fixed a couple of crashes and asserts related to async groom compilation
-
Hair - Improve stability of hair strands texture generation.
-
Fix groom cache interplation when triangle strip geometry is enabled.
-
Hair - Fix incorrect shadow mask for hair when using VSM & cluster shading or VSM & OnePassShadowmap
-
Hair - Change opaque shadow mask to run into a single pass when using deep shadow map (instead of one pass per macro group).
-
Hair - Fix incorrect FOV value on SceneCapture entity. This was causing the hair strands to look incorrect, due to the FOV being use for computing pixel size based on FOV.
-
Hair - Fix hair group name not being serialized after import. The group name weren't correctly transferred from the hair group description into the UGroomAsset. Thus there weren't serialized. This was causing group to not have any names once the asset was reopened.
-
Hair - Fix crash when visualizing light complexity with a groom component in view.
-
Hair - Fix hair data issuing 0-byte requests to DDC. This can cause the Zen server to cancel all batches requests, causing hair data to be missing. This fix ensures only non-0-byte requests are emitted.
-
Fixed problem when building SVT from within the RVT component's Build button, which would actually disable SVT, because the texture wasn't waited upon while recreating the RVT component's render state
-
Prevent mobile-specific SVT textures to be displayed if Virtual Textures on mobile is disabled in the project settings
-
Various UX adjustments to make it clear to the user what to expect when using mobile-specific SVT
-
-
Hair - Fix OnePass transmittance support for hair with light not casting shadow
-
Hair - Fix crash when building large RT acceleration (e.g., a lot of groom instance). The scratch buffer used for building the BLAS is limited to 2Gb which might not be enough. This CL split the acceleration building into pieces which accomodate this limitation.
-
Hair - Remove CPU path for deep shadow map and extend limit from 16 to 32 DOM slots
-
Hair - Fixed incorrect hair voxel tracing. Trace were slightly offset compare to the shading point. Also fixed incorrect scene depth injection into voxels, causing light leak.
-
Fixed an issue with Translucent After Motion Blur rendering when Viewport Scale is less than 100%.
-
Hair - Fix missing shadow casting from groom when light is too close. The RayEnd point was scaled to 75% of the light surface to aleviate shadow map issue. This is not necessary for voxel groom traversal.
-
Hair - Fix groom importing when groom contains curve with invalid position (NaN/INF).
-
Cleanup r.MinScreenRadiusForCSMDepth which is not used anymore, r.Shadow.RadiusThreshold is now used for culling shadow casters.
-
Fix missing hair shadow on instance having both 'hidden in game' and 'hidden shadow' enabled with light having RT shadow.
-
Fix Groom holdout with fog.
-
Fixed crash when rendering shadows out of a viewstate-less view
-
Hair - Remove remove screen probe noise on hair pixel from Lumen screen traces. Hair pixels are flagged as diffuse back face surface like SSS or foliage, to avoid screen traces which cause noise due to their high frequency geometry.
-
Hair - Fix race condition in hair cards builder.
-
Add the EVCF_Scalability flag to foliage.LODDistanceScale
-
Hair - Fix groom per-CV attribute to be incorrect depending of the imported content. This was due to an incorrect Log2 rounding of the CV chunk size, causing incorrect lookup at runtime.
-
Fixed a memory leak when streaming in HairStrands grooms
-
Fixed inaccurate luminance factors globally, updating the legacy NTSC luminance factors to working color space accurate ones which match the sRGB/Rec.709 definition by default. Legacy factors remain accessible by enabling a new renderer "r.LegacyLuminanceFactors" project setting.
-
Fixed crash in RVT details customization when the underlying get GCed
-
Hair - Fix overbright hair shading when roughness is close to 0. The gaussian normalization causes the BSDF Mp term to reach very high value. Clamping this normalization limits the values. This change is equivalent to have min roughness value, but only for the normalization term. So the highlight remains sharp, but the energy is kept under sensible value.
-
Hair - Fix crash when reloading groom asset. There is no longer need to reload groom resources, since this is now only done when derived data are updated.
-
Fixed scene capture show flags not updating at runtime from blueprint.
-
Hair - Fix RT groom geometry being rebuilt every frame with static groom. This was causing OOM on certain platform with tight memory budget.
-
Fixed crash when using light functions that use primitive custom data and hardware ray tracing is enabled.
-
Fixed case where overridden MinLOD on a Skinned mesh component could be higher than asset MinLOD resulting in rendering corruption
Architecture
New:
-
Change Virtual Texture conversion dialog UI. Remove "apply filter" button, and apply filter whenever we change the filter value in the drop down.Select initial filter value as min or max size according to whether we are converting to or from Virtual Texture.
-
Align virtual texture tile border sizes to multiple of two instead of power of two. This fixes an issue where the streaming mips asset for runtime virtual texture would mismatch the original runtime virtual texture.
-
Add console variable r.VT.RVT.StreamingMips.UseAlways. This forces the use of runtime virtual texture streaming mips and disables runtime generation of pages. It can be useful for debugging. Especially when combined with the recently added r.VT.RVT.StreamingMips.UseInEditor
-
Add Runtime Virtual Texture volume option for only using the streaming low mips. This only applies when the streaming low mips are already enabled and showing. It forces the use of only the streaming virtual texture with no runtime pages. This is intended for workflows that use runtime virtual texture only as a means to generate some baked world texture for sampling. Also changed "Show in Editor" to be a persistent setting, since that is what would be required for such a baked only workflow.
- To help with debug only workflows to show streaming mips in editor, added r.VT.RVT.StreamingMips.UseInEditor which when set to 0 will force streaming mips off in editor, 2 will force on in editor, and 1 will obey the runtime virtual texture volume setting.
-
Add minimum material quality as an optional filter for whether a runtime virtual texture volume is instantiated in game.
-
Add custom depth output support to geometry collection components that use nanite.
-
Rewrite of the "Paint then Apply" approach for mesh texture painting. We now immediately write brush strokes to the final texture without an additional apply step. Undo has changed so that it can be applied per brush stroke, and when painting on multiple components in a single stroke this is now a single transaction.
-
Change r.VT.AVT.AgeToFree so that a value of 0 disables automatic eviction of old adaptive virtual texture entries. Change the default setting to 0. This avoids potentially high CPU costs for remapping pages unnecessarily.
-
Add basic DX12 Work Graph support. For this first pass there is no exposed RHI functionality for directly dispatching a work graph. Instead shader bundles have been extended to support a work graph based implementation. Nanite compute materials now can use work graph shader bundles on D3D12 when r.Nanite.AllowWorkGraphMaterials and r.Nanite.Bundle.Shading are both set. Both of these default to off at the moment.
-
The Vertex Weight painting mode now supports painting to individual LODs (like the Vertex Color mode).
-
Add project renderer settings to disable specific runtime virtual texture material types. This allows us to remove shader permutations for types that we know that we don't need. When removed, material types no longer show up in selction option for the runtime virtual texture asset.
-
Added render pass flags to the AddFullscreenPass, AddFullscreenInstancedMultiViewportPass and AddRasterizeToRectsPass PS utils
-
Allowed custom render passes to specify a persistent "FSceneViewStateInterface" in order to properly create a scene view / scene view key. This allows custom render passes to eventually use persistent scene view data (e.g. temporal)
-
Added validation that a scene view state, if used by a FViewInfo, cannot be shared by 2 different FViewInfo, since this some systems like visibility don't support (and it doesn't sound like a good idea either)
-
Custom render passes now have an option to specify whether they are a scene capture (so that non custom render passes made for other purposes than scene captures are not considered as such)
-
-
Make support for virtual texture 16bit page tables configurable using the console variable "r.VT.Support16BitPageTable". Defaults to on which is the existing behavior. In some cases we might want to disable and pay a higher page table memory cost to reduce the overall pressure on the number of unique page table formats which is limited to 16.
Bug Fix:
-
Prevent USceneCaptureComponent functions ShowOnlyComponent and ShowOnlyActorComponents from adding duplicate components to the ShowOnlyComponents array. Matches existing behavior for the HideComponent and HideActorComponents functions with the HiddenComponents array.
-
Fix incorrect sRGB logic for some compression paths in the Runtime Virtual Textire format "Base Color, Normal, Roughness".
-
Fix mesh paint texture painting seam painting bug. When collecting the seam mask we were assuming that the FStaticMeshSection::MaterialIndex was the same as the section index. When that wasn't true we were using a seam mask from the wrong material section.
-
Fix crash when mounting pak file after FRenderAssetStreamingManager was deleted.
-
Add instance culling for decal passes so that HISM decals now work instead of only the first decal instance being visible.
-
Fix potential flicker when marking render state dirty on geometry collection components.
-
Fix issue where page table size wasn't being shown correctly in the runtime virtual texture asset details panel.
-
Fix streaming mips not baking normals for "BaseColor,Roughness,Normal" runtime virtual texture format.
-
Fixed race condition in UTexture release. Fixes some licensee reported crashes when reading texture resource from render thread after game thread release.
Lighting
New:
-
[LWC] Added lighting channels support.
-
Add Diffuse scale support on light.
-
Move hardcoded LUT into engine resources to reduce binary size. Remove about 300Kb of binary size.
-
[VSM Fixed issues with debug viewmode rendering. Label placement is now correct with DPI scaling. Overlays are now rendered below editor primitives. A grayscale view of the scene is now composited below the overlay for better visibility.
-
Don't update translucent geometry BLAS and don't add it to TLAS if there's no feature which would trace against it.
-
[VSM] Added counters to Unreal Insights tracing. Requires both VSM stats and Insights counters to be enabled. (
r.Shadow.Virtual.ShowStats 1
andtrace.enable counters
) -
[Shadows] Perform PresizeSubjectPrimitiveArrays of whole scene shadows once per task instead of redundantly per packet for improved performance. Thanks to CDPR for this contribution.
-
Add a separate cvar to control how long unreferenced VSM lights live - r.Shadow.Virtual.Cache.MaxLightAgeSinceLastRequest - separate from the per-page ages. Keeping VSM lights around too long can cause too much bloat in the page table sizes and processing, reducing performance in various page-table-related passes (clearing, etc).
-
[VSM] Adapted debug viewmodes to better show local lights. Visualization modes now show a composite of all lights by default, and change to showing individual lights when one is selected in editor or by name. With r.shadow.virtual.visualize.nextlight, you can select the next light for visualization. When VSM visualization is enabled, one pass projection is now turned off, as it is incompatible with the debug output in the projection shader.
-
Add light component setting to select MegaLights RT or VSM.
-
Remove console-specific disabling of various raytracing effects in default device profiles.
-
Rect light, light functions can now have a perspective projection instead of an orthographic projection when the new property LightFunctionConeAngle>0.
-
Run RenderDitheredLODFadingOutMask only when RT shadows are enabled. Apart from another render pass overhead, it writes to stencil interesting a sync point, which prevents the Lumen DiffuseIndirectAndAO from overlapping with Lights.
-
Use spatiotemporal blue noise for SMRT step offset and directional light ray for minor quality and performance improvements.
-
Optimization to skip/simplify VSM light grid pruning when there are no VSM local lights.
-
Add (optional) RGBA16 bit format support for rect light atlas in order to address hue shift.
-
[VSM] Fixed cache not invalidating properly on pagepool size change when AllocateViaLRU=1
Bug Fix:
-
Exclude light with contact shadow from being rendered with clustered shading, since the pass does not support this.
-
Shadows: Ray-Traced directional light penumbra size does not match the path tracer
-
Ray Tracing: Ensure that ReverseCulling does not depend on the matrix determinant and observe ReverseCulling where appropriate
-
Fixing Position Driven Light Functions For Path Tracing And Ray Tracing
-
Add aniso support for legacy lighting with cluster shading.
-
Add IsStaticLightingAllowed check to ASkeletalMeshActor to prevent unnecessary warnings when static lighting is not enabled in the project
-
Fix skeletal meshes not getting swapped to VSM dynamic caching in some cases
-
Fix cluster shading being executed twice causing intensity discrepency on certain platforms. On platforms supporting rect primitive, the vertex shader was executed twice, due to the vertex shader assuming triangle list topology.
-
Ray Tracing: Nanite fallback mesh should not flip culling direction based on the transform
-
Fixed initialization error in LocalLightComponent.cpp
-
Fixed CSM shadow casters getting falsely culled due to test with primitive octree using an incorrect culling volume.
-
Fix edge integral math causing NaN value with rect light under coplanar setup. This fix ensures that rsqrt always get strictly positive values.
-
RayTraced Shadows: Fix incorrect shadowing for lights with non-zero source length
-
VSM: disable screen ray and normal bias on subsurface materials Can cause various artifacts with extreme opacity values
-
Fix IES Texture Thumbnails rendering
Lumen
New:
-
Enable area shadows by default for hit lighting. It's more noisy, but it's a better default for most use cases.
-
Added foliage specific cutoff for screen probe importance sampled specular. This can improve perf on consoles depending on the settings, scene and resolution.
-
Move hit velocity calculations a bit further in the shader in order to optimize number of VGPR. This improves shader occupancy % in the LumenScreenProbeHardwareRaytracing pass.
-
Reduced surface cache leaking issues by tightening depth bias to 10 units in HWRT path. This bias is now exposed as r.Lumen.HardwareRayTracing.SurfaceCacheSampling.DepthBias and represents max disprepancy between rasterized and ray traced geometry.
-
New Lumen Refection denoiser. It's sharper, faster, has less noise and has less ghosting.
-
Don't build the ray tracing light grid if it's not used by Lumen. Saves performance when HWRT is used with Lumen.
-
Don't trace shadow rays in Lumen Direct Lighting if light has disabled shadows, but requires a shadow mask due to light function usage.
-
Implement inline AHS support for Lumen on certain platforms. This speeds up AHS handling in Lumen.
-
Run AHS only for meshes with some sections casting shadows. Fully disabled shadows can be filtered out at an instance level, but GI and reflection passes still need to run AHS on those sections.
-
Reorder surface cache shadow traces for better coherency in the HWRT path.
-
Overlap Radiance Cache updates (opaque and translucent). Those two passes have low GPU utilization, so it's a pretty good optimization where translucent cache traces become almost free.
-
Optimize ray tracing performance by pulling out Surface Cache Alpha Masking code to a permutation, which saves some VGPRs in tracing passes.
-
Turn noise in Screen Probe Gather into less noticeable structured error by constraining random ray directions to a smaller subset which can be handled by a temporal accumulation.
-
Added support for the "indirect lighting intensity" property of lights for Lumen Hit-Lighting
-
Implemented alternative avoid self intersections mode, which retraces ray if the original ray hits a backface too soon. This mode is faster on plartforms which don't support AHS inlining.
Bug Fix:
-
Fixed FLumenDirectLightingTaskData race condition which could sometimes cause crashes
-
Add member initializers for FMeshCardsBuildData to avoid Bounds being serialized with NaN values if MaxLumenMeshCards is 0.
-
Fixed normals on two-sided geometry when using Hardware Ray Tracing with Lumen
-
Fxed bias in importance sampling of BRDF due to an off-center filter kernel in Lumen Screen Probe Gather. This increases changes of finding the right lighting directions, mostly visible on non Lambertian BRDFs.
-
Fixed black spots in GI when radiance cache probe atlas size is set to a non power of two, which is default on some platforms.
-
Fixed stale indirect lighting bug when switching scalability levels or switching GI quality through PPV. This was caused by radiosity reading previous frame information after radiosity settings change, which was causing it to read invalid memory.
-
Fixed reflections far away from the origin (LWC).
-
Fixed r.Lumen.ScreenProbeGather.Temporal.RejectBasedOnNormal causing artifaces due to mismatching history scene normal (overwritten by water) causing constant temporal history rejection.
-
Add streaming view support for Lumen scene. This CL adds streaming views' origins to the view family and pipes them to Lumen scene rendering so to update content prior to camera cut/jump.
-
Subsurface profile in Lumen cache is white, ignoring the surface color. Remove the influence of subsurface color on subsurface profile and eye to correct.
-
Refresh LumenScene when Lumen becomes actives if some updates were ignored due to Lumen being inactive. For example, some objects added in Wireframe view, where Lumen is disabled and then user switches to Lit view.
-
Fix missing backlight on SSS surface with Lumen.
Materials and Shaders
API Change:
-
This allows the following pattern when there are multiple shader entrypoints in a single file:
#ifdef MyEntryPointName void MyEntryPointName(...) { } #endif
- This makes it possible to completely hide code and variables that are specific to one shader type from the others, while keeping the convenience of having multiple shader definitions in a single .usf file. This pattern is completely opt-in and therefore does not disrupt any previous idioms, but can be useful to avoid warnings from unused code.
-
Removed dubious code in MaterialEditor.cpp that prevented orphaned nodes to be deleted.
- Unified calls to Material->Modify() to MaterialModify() to make sure Modify() is called on the material and its editor only data, as well as the edited material function (if any) and its editor only data.
New:
-
Efficiently generate shader hashes on more platforms.
-
Re-use shader bytecode buffers so they are allocated only once (either at the point of reading back job results from workers or DDC). These buffers are now stored as FSharedBuffer instances and the following locations now reference these shared buffers instead of reallocating/copying:
-
In-memory shader job cache
-
Shader maps
-
Pushing results to DDC
-
Shader library
-
This is a significant memory optimization particularly for cooks, as the job cache and shader library allocations remain alive for the duration of the cook until final shader library packaging.
-
-
Add compression for in-memory shader source for in flight compilation jobs, and enable this by default (Mermaid SuperFast compression). This halves the high watermark for ShaderCompiler memory usage during cooks, with minimal measurable impact to preprocessing time.
-
[Shaders] - Add LLM markers to track memory of shader compilation to help diagnose out of memory issues. - Instruments: (FShaderCompilingManager::SubmitJobs, FShaderCompilingManager::ProcessAsyncResults, GlobalBeginCompileShader, FShaderJobCache::FindOrAdd)
-
Add support for explicit DDX/DDY driven mip level mode for runtime virtual texture sample.The derivatives can be provided in world or UV space.Providing DDX/DDY of a world space node should now be preferred over using the old "Ignore Input WorldPosition" mip level mode. That mode will now no longer be shown for selection (though legacy materials using it will continue to work).
-
Change Displacement runtime virtual texture blend mode. Displacement now does opacity blend instead of Max blend.
-
Shader code will now look for ShaderCompileWorker to be in the project Binaries, and fall back to Engine/Binaries if not (this can happen when building SCW as Unique BuildEnvironment if the project overrides an SDK version)
-
Dump internal FXC compiler warnings when FXC fails to compile but DXC manages to, so that the user can know what failed and eventually correct it or at least make an informed decision about whether to bypass the error using DXC pre-compilation
-
Introduced FloatToUInt and UIntToFloat material expressions.
-
Shaders: Add a define to all shaders of the entry point name (defined as itself)
-
Material editor now only puts results to DDC after succesful translation if the DDC query finished in time, that is before the full concurrent translation finished. This is to avoid polluting the DDC with the results of small materials that will never be fetched by the DDC because they're faster to directly translate instead.
-
Noise material expression only accepts 3D vector as position input. Fix tooltip and the material translator to reflect this. - Update tooltip to just say "3D" - Change the translator function to only accept 3D position vectors. That way it results in a material translation error instead of a shader compiler error.
-
Hash environment modifications for global & material shader types and include in shadermap DDC key; the result of this is that both modifications to ShouldCompilePermutation and ModifyCompilationEnvironment functions on individual shader types now correctly invalidate shadermaps, eliminating the need for version bumps in these cases and preventing the possibility of cache pollution bugs due to individual shader cache keys already taking these types of modifications into account (since these always affect the generated preprocessed shader code)
-
Material Instance Editor now automatically disable overrides of CurveAtlas parameters when the new parameter in the new parent references a different Atlas texture (as the original curve would no longer make sense).
-
Fix tooltip on Vector Noise position input. - The input position only accepts 3 dimensional vectors and will fail material compilation if given a 2D vector. - Update the tooltip by removing the 2D vector.
-
Enforce BeforeDOF translucency pass for alpha holdout blend mode.
-
Added the "Automatically set Material usage flags in editor default" project setting to enable/disable making new Materials automatically set usage flags.
-
Update tooltip for hiding unconnected pins in materials - The name of the command and the tooltip now match the blueprint editors similar functionality
-
The grid in the material editor has been hardcoded disabled for ~12 years, but we left in the ability to toggle the grid via the UI. This UI element didn't do anything and was useless. - Remove the toggle in the UI for the grid (since it doesn't do anything). - The Material Instance Editor still had the ability to toggle the grid, so this change effectively removes this behavior to keep the editors consistent.
-
Added PeriodicWorldPosition to the TransformPosition material expression, which is similar to absolute world space, but the world origin is moved to the center of the tile the camera is in. Offers better precision for large worlds.
-
The various recent improvements to the shader compilation pipeline means that there are a number of transformations that shader code undergoes before making it to the runtime (deduplication, deadstripping, comment stripping, removal of line directives, etc.). As such it’s not always obvious when looking at a shader in a capture (RenderDoc or similar) what it is and how it was generated. To improve this a DebugHash_
comment is now added to the top of the final shader code passed to the compiler, as well as exporting a DebugHash_ .txt file alongside ShaderDebugInfo for any compiled permutation. With both of these changes it's now possible to quickly find the dumped debug info for whatever shader you are looking at in a capture by pasting the contents of the above comment into Everything (or whatever other file search mechanism you prefer). Note that this requires both symbol and debug info export to be enabled -
Added support for preview shader platforms
-
Improve startup time for CookShadersCommandlet
-
Add new Mask4 Runtime Virtual Texture format. Compresses to BC3.
-
Create the correct type of material expression when you promote the Shader Model output pin to a parameter. [RN] minor, Rendering / Materials and Shaders
-
Adds a Blueprint exposed function on mesh component to set a FLinearColor parameter on a material. - Called SetColorParameterValueOnMaterials - I opted to not change the existing function (which only sets a vec3), since the automatic BP fixup code didn't do the correct thing on existing assets (it disconnected the input and gave a BP compile error).
-
Replace logging of slow shader compilation batches with logging specifying the slow individual jobs instead; modify so that instead of a hardcoded 60s batch threshold it instead uses a cvar driven individual job threshold (defaulting to 30s). Often the full batch contains a mix of fast and slow compilations so printing details for every job in the batch along with the total batch time contains additional unhelpful noise. If debug info is enabled for the job, the job debug output path will be printed instead of the default shadertype/permutation/format string - the debug path contains all of this information anyways, and this allows quick access to the debug artifacts for slow jobs.
-
Added a local position material expression, replacing the local position material function. This new native version directly accesses local position in vertex shaders rather than transforming world position back to local space. This improves precision and performance.
-
Add MeshPaintTextureReplace material expression.This is a material graph node that can select between two inputs depending on whether there is a valid Mesh Paint Texture on the shaded primitive or not.
-
Added manual port binding to ODSC server, e.g., "-port=12345". Game clients can connect to a nonstandard port by specifying it on the command line with the host address, e.g., "-odschost=127.0.0.1:12345".
-
Update daysequence 24hr sky material to use a procedural starfield and moon. #virtualized
-
Update default volumetric clouds to give better results out of the box. #virtualized
Bug Fix:
-
Fixed various crashes caused by deleting expressions inside Material Function as well performing undo/redo operations after deletion.
-
Fix GCreateShadersOnLoad by correctly checking GRHIShaderPlatform as it was done in the initial CL 1581054
-
Fixed crash in FHLSLMaterialTranslator::InExpressionConstantValue() triggering when a non-float constant is evaluated.
-
Handle line directives in ShaderMinifier ExtractBlock()
-
Fix an infinite loop bug in the shader preprocessor caused by '[at]' being considered part of the identifier character class, but not being handled properly by copy_and_filter_macro.
-
Improvements to CookShaders commandlet
-
Fixed crash in void UMaterialInstance::AddParameterValueInternal() due to missing StaticSwitch handling case.
-
Fixed a couple of bugs with the shader preprocessor: - fix line number mismatches caused due to multiline macro arguments by keeping leading/trailing whitespaces in cases of multiple lines encountered in a single macro argument (single line macro args still have whitespace trimmed as this is needed for token pasting) - avoid early out preventing parsing of "defined" builtin macro outside of #if conditions; this allows using defined in #define directives (among other places)
-
Fix a shader compiling issue if a traslucent material enable PreIntegratedGF in the ForwardShading.
-
Fix crash in error reporting if the shader compile worker crashes.
-
Fix thin translucency does not blend in the scene color in ray tracing.
-
[Materials] - Custom Buffer visualization now works with Material Instances. - The code would always get the parent UMaterial from the UMaterialInterface and render with that. - Now we use the original material interface (which could be a material instance with different parameters) to render with. - Still query the blendable location and other material settings from the parent material.
-
[MaterialLayers] - Bug fix to get tooltips working for scalar, vector, , and static bool parameters in the layer parameters view. - This code in SMaterialLayersFunctionsInstanceTreeItem::Construct is a duplicate of the code in SMaterialParametersOverviewTreeItem::Construct, and it layer version was missing a tooltip. - Texture parameters and channel mask parameter names are still broken, but for other reasons todo: cleanup the material parameter display code to not be duplicated.
-
Updated UMaterialFunction::OnPostLoad() to mark the function as invalid when some of its expressions fail to load (e.g. due to unavailable expression types) to force the translation of materials containing active calls to it to fail. Previously, materials with calls to functions missing expressions would still compile (potentially incorrectly); now, it fails translation and reports the error.
-
Decals: Fix decals always fading in, even when FadeDuration is 0
- Avoid initializing fade parameters in BatchUpdateDecals() when FadeDuration is 0, and reset the InvFadeDuration
-
Fix for TObjectIterator iterating over garbage objects in material-related code
-
Fix crash when swapping parent material on a material instance. - When the parent property changes we need to notify the material stats manager to update its cached material resources (see FMaterialInstanceEditor::NotifyPostChange) - The SetMaterial functions in MaterialStats.cpp never took into account the parent on the material changing and therefore having to update its cached state. The FShaderPlatformSettings cached off a UMaterial pointer to base material. When switching the parent material on the instance this code wasn't updating this pointer. This meant the stats thought it was the world grid material instead of the new parent material. - I relaxed some of the conditionals in SetMaterial to always update, and only update if the base material changed.
-
Fixed OutputsTranslucentVelocity flag to use Instance override. Before this change the override of OutputsTranslucentVelocity in Material Instances was ignored and only the override set in the parent Material was considered.
-
Fixed a connection issue between certain runtime configurations and ODSC/COTF server.
-
Removed $TemplateVersion from MaterialTranslator.ush. Please instead assign a different GUID to your change's stream MaterialTranslationDDCVersion entry in FDevSystemGuids.
-
Skipping the material translation DDC when a material is not flagged as Persistent.
-
Removed spurious ensure in material code
-
Fixed incorrect motion vectors when using translated worldspace in WPO and moving the camera.
-
Added checks to ensure that all Material Parameter Collections loaded succesfully in the translation results retrieved from the DDC before using them, other wise continue translation.
-
Holdouts: Ensure masked materials always output solid alpha. Some shading models using Opacity for other purposes could cause incorrect output
-
Fix infinite recursion UMaterialGraphNode::PropagatePropertyChange. - Check to see if we've already visited this node by checking
bNeedToUpdatePreview
which is set by PropagatePropertyChange. - If so, we just early out of the function. -
Fixed an issue where certain material assets could not be saved from the Editor while ODSC server was active.
-
Fix Shader SymbolsInfo causing non-determinism and defeating deduplication in the DDC. This info is now stored in shader map in editor only data alongside platform data.
-
Fix a crash caused from automatically setting the "Used with Nanite" material flag that could occur while using the material editor and previewing static meshes simultaneously.
-
Change shader parameter metadata layout hash to use xxhash64 instead of GetTypeHash (the latter is not intended to be persisted across sessions); this fixes occasional parameter struct layout hash mismatches between cook and runtime.
-
Fixed a deadlock when losing connection to ODSC server.
-
Make FTargetPlatformManagerModule::ShaderFormatVersion thread safe
-
Added safety code that prevents Material Functions from saving expression collections with nulls in them, causing continuous material invalidations on PostLoad().
-
Materials: Fixes MaterialTextureScale generating invalid data for materials with world position offsets
-
Disables WPO when rendering in RenderMaterialTexCoordScales.
-
Fix wrong UV density results from alpha channel in FMaterialUtilities::ExportMaterialUVDensities() by clearing with FColor::Transparent instead of FColor::Black
-
Restore bNullifyWorldSpacePosition logic lost in merge commit
-
-
Added null check to FHLSLMaterialTranslator::GetMaterialEnvironment() to avoid crashing when a referenced Parameter Collectino fails to load (e.g. no longer exists).
-
Fixed occasional crash when trying to create the preview of a deleted expression.
-
When abandoning compilation via ShaderCompileWorker due to an unexpected termination, forcibly terminate all worker processes and delete any files which said processes have already output. All pending jobs will be re-executed locally so these outputs are not needed. This fixes a rare cause of DDC corruption whereby on re-starting the workers jobs can be associated with incorrect results.
-
Fixed crash in material editor stats, when preview material instances get GCed
-
Fix coat energy conservation in ReflectionEnvironment shader
-
Fixed regression with UMaterial::RecursiveGetExpressionChain
-
Fx crash in UMaterialEditorInstanceConstant::ClearInvalidParameterOverrides() triggered when Parent is null.
-
Fixed crash by removing debugging data that was used to printing missing expressions on material function post-load.
-
Don't display material parameters in the Instance Editor if they are marked as using custom primitive data. - CPD parameters pull their data from the primitive, not from the material so displaying these parameters for the user to edit was confusing since they wouldn't do anything. - Cache off transient state on the UDEditorParameterValue on whether or not this is a CPD parameter. - Pull that info from the parameter metadata if PrimitiveDataIndex != INDEX_NONE - Adds helper function UsesCustomPrimitiveData(UDEditorParameterValue* Parameter) that determines if the parameter uses CPD. [RN] minor, Rendering / Materials and Shaders
-
Add check for null ParameterCollections references in translation data fetched from DDC and updated DDC key generation. - When null ParameterCollections are found in material translation data fetched from the DDC, translator will run again locally to re-translate the material and push new results to the DDC. - The material translation DDC key now includes project name.
-
Added calls ConditionalPostLoad() to texture assets referenced by parameters in Material Function when it is loaded, and made sure that ConditionalPostLoad() is called on layers and blends from Material Instances when loaded even outside of the editor.
-
Bug Fix: [ShaderCompiler] Ensure that AutogenShaderHeaders.ush exists and is up-to-date in CompileGlobalShaderMap.
Deprecated:
- Deprecated UMaterialExpression::GetInputsView() in favor of making GetInput() the only way to access all inputs in a material expression. To facilitate iteration, this change introduces FExpressionInputIterator that only provides a convenience layer on top of UMaterialExpression::GetInput() This change makes code more robust and consistent and enables future further simplifications & optimizations.
Nanite
New:
-
Add "Enable Tessellation" option to materials and the ability to override it in material instance constants, making the enabling of Nanite Tessellation in a material explicit, because previous attempts to automatically determine if displacement was effectively enabled resulted in bugs/issues.
-
The Nanite streaming pool is now allocated as a reserved resources (r.Nanite.Streaming.ReservedResources) on RHIs that support it. This allows it to resize without a large memory spike from temporarily having two version of the buffer in memory.
-
Added the ability for the streaming pool size (r.Nanite.Streaming.StreamingPoolSize) to be adjusted at runtime, for instance in game graphics settings.
-
The Nanite streamer now adjusts the global quality target dynamically when the streaming pool is being overcommitted. This makes it converge to more uniform quality across the screen in those scenarios.
-
Disable async rasterization for Lumen Mesh Card pass and Nanite custom depth pass as it was causing large stalls while waiting for previously scheduled work in the async queue to finish.
-
Improved performance of Nanite tessellation patch splitter and rasterization shaders on console platforms.
-
Optimization: Added sorting of Nanite rasterizers (r.Nanite.RasterSort) to increase depth rejection rates for masked and PDO materials.
Bug Fix:
-
Fixed a bug that could cause the Nanite rasterizer to attempt to use shader permutations that were not cooked, resulting in asserts when displacement was used for Nanite materials in the project.
-
Fixed an issue that could cause triangles to disappear when rendering clusters with multiple materials and at least one of those materials using masked or pixel depth offset.
-
Fixed an issue where the Nanite builder could crash if the input mesh had no UVs
-
Fixed an issue where the material preview would show the world grid material when using Nanite custom mesh
-
Fix an issue where enabling tessellation on a Nanite material could result in compiling vertex programmable hardware rasterization shaders that could never be used.
-
Fix disabling of programmable rasterization for Nanite skinned meshes.
-
Fix an issue where toggling
r.Nanite
at run-time could cause all Nanite to render with a single material. -
Fix an issue where the "Actor Hidden in Game" option would prevent the editor selection outline for Nanite objects from rendering.
-
Fixed an issue where the GPU readback buffer for streaming requests could overflow for very demanding renders. The size of the buffer is now adjusted dynamically based on demand.
-
Fixed some issues when rendering Wireframe where Nanite objects would be incorrectly colored according to their selection status.
-
Fix a bug where the Substrate outputs would get mixed up for Nanite compute shaded materials when base pass velocity is disabled.
-
Fix a bug where the cooker would cook shader maps with the wrong DDC key if the project and platform supported Nanite but the machine running the cook didn't have support for 64-bit atomics.
-
Fix bad approximation for barycentric derivative in the nanite tessellation code path. The original code didn't take depth change into account, which could lead to bad derivatives. This was very clear for nanite landscape where the typical oblique view of landscape meant that we would often underestimate world positon derivatives.
-
Fix a bug where TexCoord1 in a Nanite material would always be 0 for Masked Opaque with no displacement or WPO.
-
Fix a bug where all Nanite will render for a view with ShowOnly primitives enabled, but has an empty list.
-
Fix custom depth rendering in right eye when Instanced Stereo is enabled with Nanite objects in view.
-
Fixed Nanite meshes disappearing when all lighting channels are disabled.
-
Setting the CVar "r.CustomDepthTemporalAAJitter" to 0 now works as expected for Nanite custom depth rendering.
-
Fix bugs with motion vectors on Nanite objects that have materials both with and without World Position Offset when the Velocity Pass is set to "Depth Pass".
-
Fixed an issue with Nanite hardware rasterization on hardware that doesn't guarantee wave size >= 32.
-
Fix a race condition bug where Nanite materials could randomly be mixed up throughout the scene.
Niagara
New:
-
Added Default Empty Emitter (DisplayName: Minimal Emitter) property to niagara editor settings. All 'Add Minimal Emitter' UI actions & menus try to use that before falling back to a fully empty emitter
-
Allow data interface inputs to be flagged as required, so they don't accept the pin default values and need to be wired to something
-
Change type of function signature output variables, as they can't have default values
-
Added a validation rule to check if a map for node is used in a cpu script (as it only works correctly on gpu at the moment)
-
Niagara Fluids: Update base emitter - Parameters toggled to only update on commit where appropriate. - Option to color the fire as well/instead of smoke added. - AO and normal output added for Baker output. - HV controls and material parameter promoted to Summary View. - Update templates to latest. - Add Colored Fire template. #virtualized
-
Added property diff tool support for some Niagara types
-
Added an export function for Niagara sim caches to save their data to disk. There is no importer, so this is a one-way trip to get the data stored within into an independent format like json.
-
Improve Slate render time for large systems by wrapping the overview graph node contents in invalidation panels
-
Reset sequencer speed when recording a cache and it's in reverse mode
-
Fixed tooltip and search keywords for lerp operation
-
Improved debug hud ux
-
Added Rename rightclick menu & shortcut to scratch pad script UI
-
Improved reference count widget in parameter panel with detailed tooltip info. It now shows reads and writes separately and on hover shows a details breakdown where each read or write occurs.
-
Improved sequencer sim caching:
-
Allow scalability override per cache track
-
Allow locking of cache tracks to prevent unintentionally overriding a cache asset
-
Display system name inside cache assets
-
Disable sequencer looping when recording
-
-
Niagara Graph wiring style is closer to Blueprint wiring style (tangents & hovering connections)
-
Added a validation rule to make sure some modules are only used once per script
-
Added a new module to play looping audio. This is similar to the existing "persistent audio" module, with the difference that there can be multiple "play looping audio" modules per emitter and only one "persistent audio" module.
-
Added support for custom module wizards that can generate scatch pad modules
-
Added wizards for data channel read and write modules
-
Renamed 'Empty' emitter template to 'Minimal' - Updated Minimal emitter description - Changed "Add empty emitter" menu entry to "Add minimal emitter", and changed the tooltip to mention that the minimal emitter is specified in Niagara settings, as well as to include the description of the selected asset. This is supposed to close the gap in understanding what's happening #changelist validated #virtualized
-
Niagara GBuffer module: Maps particle position to screen space and queries color from the opaque buffer. UVs can also be manually defined on the particle. #virtualized
-
Exposed Niagara validation rules api
-
Some improvements to the HWRT async traces within Niagara. Adds support for inline HW traces, where supported, through a compute shader (in some artificial tests it results in 50% performance improvement, but results will vary). Also fixes up collision group masking.
-
Allow enum properties to be display as segmented button widget. Any enum property that is annotated with the "SegmentedDisplay" meta tag will use this new widget instead of a combo box dropdown in the details panel.
-
Allow static variables to be linked to non-static inputs of the same underlying type
-
Effect Types support being opened in read-only mode.
-
Made new emitter assets inheritable by default
-
Improve Content Browser tooltips for Niagara asset types
-
Added integer-based equal/not equal ops for enum graph pins
-
Allow individual module inputs to opt out of the "immediate update" mode when the user is typing. This is mainly for inputs like grid size that cause a big lag spike when the whole system needs to adjust with each keystroke.
-
Remove "experimental" tag from Niagara sim caching plugin and enable by default
-
Added a wizard to spawn particles from data channel entries
-
Surface DI function descriptions as tooltips in search menu
-
Updated occlusion DI functions for better consistency when it comes to naming and tooltips
-
Added getter and setter functions for geometry collection data interface. Allows you to get and modify the transforms for all the elements in a collection. Also updated existing functionality to work with lwc coordinates.
-
Added some initial system templates for lightweight emitters. #virtualized
-
Nicer names for debug capture tabs
-
Added Quick Init widget to the Niagara NDC Write node
-
Added Read-Only support for Niagara Script assets
-
Niagara dynamic input: Add dynamic inputs for Distance to Camera and Camera Fade. #virtualized
-
Niagara: Add bias control to curl noise force #virtualized
-
Niagara Dynamic Input: Added Custom Position from Bool #virtualized
-
Niagara Module: Add Debug Draw utility module to draw lines, boxes or spheres on particles. #virtualized
-
Niagara Fluids: Minor clean up to the master 3D gas emitter including exposing the NDC parameter to the Summary. #virtualized
-
Added Deprecated & Hidden tags & View Options in the Niagara Asset Browser Hidden tag & Deprecated tag will stop an asset from showing up Deprecated tag can be used to return an error using validation.
-
Added Lightweight Asset Tag for Niagara. Available for Niagara Systems.
-
Add support for specular scale with the simple lights. Includes support for Niagara to set the attribute per light through the light renderer.
-
Add ForceCompile option to Niagara Scripts
-
Made implicit type truncations explicit
-
Removed deprecated kismet math library methods
-
Fixed some bugs caused by incorrect type conversions
-
Made several properties on the cached Niagara Script data Transient. This prevents conflicts with deterministic DDC results (DDC-Verify) and reduces the size of our DDC payload substantially (about 50% smaller).
-
Niagara Module: Add AsyncGPUTrace utility. This module uses HWRT to find the first hit along a user defined ray. #virtualized
-
Made severity of invalid namespace writes in niagara scripts a plugin setting
-
Automatically add struct types of called DI functions to hlsl definition
-
Added duplicate User Parameter rightclick action in User Parameters panel
-
'Divide' will now be preselected when typing '/' in Niagara Scripts
Bug Fix:
-
Implicit dependency tracking with niagara assets for iterative cooking. Core responsibility is now on the NiagaraSystem which calls into the NiagaraScript & NiagaraShader to get the necessary data hashed. Also includes the per-asset dependency tracking to handle per-platform shader platform details.
-
Fixed a bug where scratch pads didn't always enable the apply button after a change
-
Cleaned up logging when exceeding primitive counts with the NiagaraDataInterfaceRigidMeshCollisionQuery
-
Flush the ShaderFileCache when we are force compiling a niagara system when r.ShaderDevelopmentMode is enabled. Allows quick iteration of DI ush files during development.
-
Reduce calls to USoundCue::IsLooping() with the Niagara audio player DI
-
Fixed a bug where undo/redo didn't work correctly for some emitter properties
-
Fixed a bug that prevented users to edit any complex structs in user parameters (e.g. matrices)
-
Re-enable fixed error messages for unset variables being read
-
Fix for default values for variables using StackContext. Before, the variables would be left as default initialized to 0. Some modules will now have subtle behavioral differences with variables having better default values in their spawn script (quats will be 0,0,0,1 instead of 0,0,0,0), only to be assigned newer values in update; but also, the use of StackContext within update modules will have their defaults properly set.
-
Add bFilterByObjectType option to the RigidMeshCollisionQuery DI to allow people to try what seems to be a more reliable mechanism for controlling which rigid bodies get added to the query.
-
Improve GetClosestPointMeshDistanceField so that it will produce valid results when the search point is outside of the volume of the mesh distance field
-
Reflect parameter removal to AffectedScripts when stack function inputs are reset to their base
-
Small improvements to component renderer runtime to avoid string creation and static fname creation each frame
-
Fixes presizing buffer for bones and sockets when using Niagara's skel mesh DI
-
Clear out resolved data on scripts belonging to standalone emitters when they are updated from the transient system during editing. This prevents an issue where referenced objects parented to the transient system could be getting saved (incorrectly) into the standalone emitter.
-
Additional protection for guarding against crashes when compiling (with the old compilation mode) Niagara systems and they are being edited at the same time. Code was in place to catch emitters being deleted, but wouldn't catch emitters being added or reordered (which would cause crashes later in the precompile).
-
Incorporate the script path into the ddc key for the niagara gpu scripts to prevent non-deterministic DDC results
-
Limit the Water DI to no longer support querying depth related information as it requires accessing data that is unsafe from the concurrent task. Two new properties have been added to the DI bEvaluateSystemDepth & bEvaluateSystemDepthPerFrame which indicates that the depth should be sampled from the water body on the game thread using the system instance. Also, legacy behavior can be restored through the cvar fx.Niagara.Water.DepthQuerySupported.
-
Fixed a crash when checking the paused state on a recently disabled Niagara component
-
Fix for disabling an override from an NPC Instance not being reflected immediately
-
Fix for intermitent crash with NiagaraWorldManager getting out of date delegate broadcasts for system edits
-
Fixed compile error when using "draw torus" function in gpu emitters. It's still not doing anything, but at least it compiles without error.
-
Replace adhoc traversal of graph nodes with UNiagaraGraph::BuildTraversal() when deleting modules. Avoids potential combinatorial explosion leading to a hang.
-
Fixed problems with module version upgrades:
-
Fixed crash when setting bool values from python
-
Fixed old inputs creating a warning after version upgrade
-
Fixed a crash when using the quick fix version upgrade option
-
-
Fixed a crash when undoing parameter type changes
-
Provides a fallback path to the parameter map traversal to ensure that we get accurate aliased variables in the history. Without the aliases in place we can miss resetting the chunk cache in the translator which leads to variables leaking between emitters and between the emitter and the system scripts. This was typically seen using a dynamic input in both system and update scripts (Multiply Float).
-
Fixed a bug with the barycentric coordinate function
-
Added function to compare two numeric values with an error tolerance
-
Update normal extraction from (non VT) landscape with Niagara DI. Not all platforms seem to handle SampleLevel with an explicit index offset, so stole the implementation from the landscape PS using a pair of gathers instead.
-
Added a fix for inaccurate quat interpolation in spawn scripts
-
Fixed a bug where hitting undo when editing a color user parameter resulted in a crash
-
Fixed a bug where clicking during a cache recording could cause dropped frames from Slate throttling
-
Make sure that the translator collapses attributes that are going to be overlapping in script execution (same name and equivalent type)
-
Fixed a bug where recording a cache didn't work when the editor window lost focus
-
Fixed a bug where new parameter collections were only visible in Niagara systems after an editor restart
-
Fixed a bug where the context menu in module scripts would show invalid conversion operations for primitive types
-
Adjust MIC creation for niagara renderers to avoid unnecessary allocations of MIC. This restructure fixes a problem with the AsyncTask compilation mode where a previously created MIC would interfere with the cook because the unused version would be cached, and wouldn't get reprocessed after it was recreated.
-
Fixed a crash where the niagara system finalize task could be called from another object's postload method
-
Validation fix for iteration source DI writes
-
Fix for DI binding in cooked builds caused by the binding information not being serialized
-
Fixed mesh renderer thumbnails causing a crash when multiple mesh entries without any assigned mesh assets (user param bound for example) exist.
-
Small optimization to the ticking of NPC. Cache the MPC instance, if one is referenced, rather than looking for it on the world each tick
-
Fixed a bug where renaming a parameter in a module script would in some edge cases not correctly propagate to existing usages
-
Fixed missing tooltip for set attributes node when linked to a parameter definition asset
-
Fixed ui bug in param definition editor
-
Fixed a crash when using a Data Channel asset without a type set
-
Clean up dynamic string allocations when processing NPC set functions
-
Fixed an issue where inputs with BroadcastValueChangesPerKey=true would not apply entered math expressions correctly
-
Fix for user exposed curves in cooked builds not getting their LUT range copied over properly.
-
Fix for GPU emitter's still working (while complaining about compilation) when event scripts are present
-
Fixed a bug where undo wouldn't work when deleting a parameter from a module script
-
Ensure that scripts that fail to compile because of missing function implementations (like the deleted native fast path stuff) will invalidate the compile results. This avoids trying to optimize the byte code which would fail.
-
Make sure to PostLoad the RendererBindings so that they can be sorted & searchable in cooked builds. Addresses some sporadic issues where static bools used for bindings might not be found and assumed to be false.
-
Clean up handling of PerformanceMode within the niagara toolkit to behave better when toggling states which would enable/disable it (the EVVM) -toggle button is now hidden when the current system is unsupported -UI won't crash unexpectedly when you muck around with enabling/disabling things
-
Fixed a bug where adding module inputs to the emitter summary was not captured in the transaction buffer
-
Fixed crash when Undo/Redoing deleting an emitter while in Scalability Mode
-
Fixed crash when undoing creation of scratch pad
-
Fixed GridLocation learning content emitter being inheritable. Templates & Learning Content shouldn't be inheritable.
-
Made Niagara stack note header wrappable & reduced max width for note tooltip as it was just too wide
-
Readded missing rightclick option for static switch output pins to move up and down
-
Fixed emitter nodes in emitter assets not keeping their collapsed state
Deprecated:
- Deprecated vortex velocity module
Path Tracer
New:
-
Path Tracer: Add a cvar to quickly override the use of reference Depth of Field
-
Path Tracer: Optimize the handling of glass materials in the path tracer.
-
Path Tracer: Give control over background alpha
The new cvar r.PathTracing.BackgroundAlpha can be used to control the alpha value written for background pixels (including when using a skylight visible to camera). The default value is 0.0 but can be changed to 1.0 to make the background opaque.
-
Path Tracer: Add an opacity cutoff to volume tracing so that ray marching can stop as we approach full opacity.
-
Path Tracer: Add support for missing legacy shading models when using Substrate Subsurface and two-sided foliage legacy shading models were not being handled properly.
-
OpenImageDenoise: Add alpha denoising and change albedo/normal buffers to 16 bits
-
Add analytical derivate support for vertex normal in world space.
-
Path Tracer: Optimized dispatch of successive bounces
-
OpenImageDenoise: Update to v2.3.0
- When using the r.OIDN.DenoiseAuxilaryInputs cvar, use the new highest quality network weights. The default remains the balanced mode.
Bug Fix:
-
Path tracing denoiser support update: 1. Change variance output for radiance and albedo from population std to the std of the sampling distribution of mean. Change that for normal to output the std of the mean length. 2. Stop path tracing variance buffer update in editor after denoising has been applied.
-
Path Tracer: Fix inconsistency in the handling of skylight intensity between path tracer and raster
-
Path Tracer: Fix artifacts from solid angle sampling of small rectangles
-
Fix analytical derivative with PT. The clip positions were divided by .w prior to compute barycentric derivatives. This was causing barycentrics derivatives to be incorrect (i.e., constant) as w=1.
-
Path Tracer: Fix possible NaNs in specular highlights when Anisotropy is set but Tangent is not
-
Path Tracer: Fix unlit materials not being able to emit more than ~64k radiance values.
-
Path Tracer: Fix light functions on directional lights
-
Path Tracer: Fix alpha channel not accumulating to 1.0 through dense volumes in some cases.
Postprocessing
New:
-
Allow public access to new lens distortion LUT.
-
Add project setting "Enable virtual textures for Post Processing Materials". This allows virtual texture sampling in post processing materials but without any guarantees that things will work well. Note that there is no virtual texture feedback from the post processing passes so the VT will only have good resolution pages in the cache if some other system is already triggering feedback.
-
Adding ECVF_Scalability to r.LUT.Size. Default remains the same = 32.
-
Add Medium-High TAA mode (3) Equivalent filtering quality to Medium, adds anti-ghosting Slightly slower than Medium (1), much faster than High (2)
-
[Engine Content] Set bloom kernel to default to 512 px. This comes up often as a opportunity for optimization.
Bug Fix:
-
Raised the priority of propagate alpha in a non-final tonemap pass, so that subsequent operations can retain full precision and reliably use scene color alpha.
-
Fix SpiralBlure - SceneTexture has border artifacts when applied to translucent materials by clamping the min max uv by the viewport bilinear filtering min max. #virtualized
-
Fix post process ambient occlusion border filtering out of range. Clamp the sampling UV to ViewportMin/Max bounds. Mobile ignores this clamp as it does not use half resolution normals and Downsampled AO created in the setup.
-
Fixed alpha channel update with after motion blur translucency composite.
-
Fix a bug where upscaling post-motion blur translucency would use point sampling instead of bilinear filtering in the composite.
RHI
New:
-
Use normal D3D12 RHI deferred deletion queue to manage explicit descriptor heap reuse, instead of relying on frame fence
- Prevents memory bloat when BeginFrame/EndFrame is not called periodically
-
Implement support for reserved textures with mip maps in D3D12 RHI. Allow reserved render targets and depth buffers.
-
Add a FGPUDebugCrashUtilsCS variant that triggers shader assert
- Use
gpudebugcrash assert
console command to trigger
- Use
-
Change the CHECK_METAL_COMPILER_TOOLCHAIN_SETUP define to a cvar Metal.CheckCompilerToolChainSetup
-
Deprecate FRayTracingShaderBindingsWriter and use FRHIBatchedShaderParameters instead in the high-level rendering code
-
VulkanRHI: Enable bindless and ray tracing pipelines by default in Vulkan SM6.
-
VulkanRHI: Vulkan SDK upgrade 1.3.290.0.
-
D3D12: Add mode to set stable power state on device creation instead of only during profiling This can be useful for in-editor benchmarking on PC by reducing the influence of adaptive GPU clock rate on the frame time.
-
Input latency stat computation enabled for DX11/DX12 using IDXGISwapChain::GetFrameStatistics and correlate the input reading timestamp to when the frame is handed to the display
- New command line option r.VsyncInformationInsights that will show bookmark in Unreal Insight for when the input sampling happen and when the Vsync event happen in the timeline.
-
Groundwork for using FRHIBatchedShaderParameters instead of FRayTracingShaderBindings when binding ray generation shader resources
-
Move some of the generic parts of D3D12DiagnosticBuffer into a cross-platform base in RHICore
- The diagnostic buffer is now always created on startup, independently of GPU breadcrumbs
-
Added support for asynchronous pipeline state caching, which is enabled by default. It can be disabled to restore the old behavior with a console variable ("r.pso.EnableAsyncCacheConsolidation").
-
Add MetalOptimizeBySize setting for MetalShaderFormat
-
Support GPU diagnostic buffer binding when using static root signature
-
Add rhi.Metal.MaxBucketSize cvar to restrict the MaxBucket Size of the Pooled Buffer
-
Implement basic support for reserved volume textures in D3D12 RHI
-
Add RHI unit test for binding UAVs to graphics stages - Test basic UAV write from pixel shader
-
Allow UAV binding in Vertex Shaders in D3D11 and D3D12 RHIs
Bug Fix:
-
Fix Metal freeze when cooking on Windows
-
Fixed Vulkan Validation Error for SceneColorMS texture not getting VK_IMAGE_USAGE_SAMPLED_BIT because it's memoryless
-
Fix diagnostic buffer root parameter slot initialization for static root signatures
-
Defer residency update for reserved resources as their residency handles are only known on the RHI Submission Thread
- Fixes crash due to race condition between parallel translation and tile mapping updates
-
Add padding to ShowFlags to fix a bug when building them for shipping
-
Read the metal windows native toolchain from the right path
-
Zero the FD3D12ResourceDesc struct to fix a memory leak in the D3D12 RHI when compiling with Clang.
-
Eagerly flush PayloadsToHandDown in FD3D12DynamicRHI::ProcessSubmissionQueue when the list grows beyond a certain threshold
-
Metal does not support ETC2_11 on 3D textures
-
Fix validation code in SetRayTracingShaderParameters() that previously did not account for padding in FRHIShaderParameterResource
Substrate
New:
-
Add support for merged light data on mobile with Substrate.
-
Improve Substrate Fuzz look when mixed with SSS material. Fuzz is now always on top of SSS surface.
-
Hide IsThin property on material instance when Substrate is disabled.
-
Improved Lumen support & stability with Substrate.
-
Improve Substrate's specular profile look with env. lighting.
-
Make ShadingModel override on material instance only visible if parent material have a SubstrateShadingModel node.
-
Add Substrate support for MegaLight.
-
Add colored refracted light support for Lumen reflection on object with non-zero transmittance.
-
Force Substrate's max closure count to 1 on SM5 platforms.
-
Add support for imported materials with Substrate (MDL, AxF, USD, ...).
-
Add raytracing debug view for visualizating Substrate's material properties.
Bug Fix:
-
Remove compilation of anisotropy shader when substrate is enabled.
-
Fix incorrect legacy SSS profile classification
-
Fix missing preexposure on ReflectionEnvomnemntPixelShader, causing indirect lighting to be too dark.
-
Fix runtime generation of energy conservation table.
-
Substrate now works with RTTranslucency similarly to the legacy path.
-
Readd energy conservation correction rough diffuse. Without this correction the diffuse value at grazing angle are too low, which is problematic when doing accurate material matching. This correction is disabled for lower platforms.
-
Fix material compilation failure with Substrate with Nanite displacement.
-
Fix hair strands tangent output when using hair attribute output in tangent space with Substrate.
-
Fix hair (voxel) shadow causing incorrect shadow.
-
Fix Substrate shader compilation issue when running -featureleveles31 with material having glints.
-
Fix incorrect dual source blending on PS4 with Substrate due to incorrect output format for the second RT.
-
Fix missing SSS on surface with precomputed lighting when Substrate is enabled.
-
Fix numerical precision causing incorrect shading results on certain platform when opaque rough refraction is enabled with Substrate.
-
Fix unlit Lumen material receiving lighting.
-
Fix LTC-based sheen integration with rect light. The LTC matrices were inverted and had a missing scaling factor.
-
Fix missing translucent in Lumen's reflection with Substrate.
-
Fix incorrect eye / hair material conversion with Substrate.
-
Fix DFAO upsampling not using the correct UV on stereo rendering with Substrate.
-
Fix missing custom tangent input when converting eye material using material attributes.
-
Fix Substrate with Nanite compute material.
-
Fix incorrect output texture format during SLW base pass with Substrate, causing SLW to be incorrect.
-
Fix Substrate shader compilation with terrain layer blend node and material attributes.
-
Fix EnergyConservation tables format not supported on certain platforms. This CLs adds RG8/R8 format support for the energy conservation tables.
-
Fix uninitialized rect light output vector causing NaN value on Substrate Glint material.
-
Fix incorrect legacy model detection causing SSS material with Fuzz to be converted into legacy wrap SSS.
-
Fix incorrect PSO precaching on Substrate classification shader with WaveOps permutation.
-
Change ThinTranslucent legacy shading conversion. The conversion is implified, and now use a simple transmittance color lerp, rather than using LAB + MFP lerp.
-
Fix dual source blending with Substrate on the mobile rendered.
-
Fix Substrate output with hair strands geometry rendering on certain platforms.
-
Fix Legacy SSS profile having incorrect roughness.
-
Fix decal material creation with Substrate. The domain and blend mode where not set correctly when introducing a ConvertToDecal node.
-
Fix decal on mobile forward rendering with Substrate.
-
Fix material conversion when the input normal is not a float3/float4.
-
Fix cluster shading with substrate when viewport is resized.
-
Fix NoL being applied twice on eye shading causing a darkerning compare to legacy shading.
-
Fix missing SSS profile on eye when using material attributes and fix incorrect shadow with VSM with SSS profile
-
Fix incorrect material's connected inputs, causing decals to select an blending mode at runtime in cook build with Substrate.
-
Fix missing diffuse albedo on SSS surface in Lumen hit lighting shaders.
-
Fix specular occlusion being applied on specular indirect lighting, while it should only be applied on the rough specular indirect lighting, during the indirect lighting composition with Substrate.
UnrealLightmass
Bug Fix:
- Bumping down an assertion in Lightmass.cpp to an ensure when adding a material with different export settings
Simulation
New:
-
[NetworkPhysicsComponent] Refactored the NetworkPhysicsComponent to run with a proper async physics flow.
-
[NetworkPhysicsSettingsComponent] Implemented the NetworkPhysicsSettingsComponent to as a way to set individual settings for networked physics per actor.
-
Added a new callback OnPostInitialize_Internal() in Chaos::ISimCallbackObject, which is only called once, on the physics-thread after the first initial input data has been marshalled from the game-thread.
-
[NetworkPhysics] Don't automatically initialize RewindData from NetworkPhysicsComponent unless it's using resimulation.
-
[NetworkPhysics] Predictive Interpolation replication mode can now perform rotational correction via transform shifting, instead of only via angular velocity.
-
[NetworkPhysics] Predictive Interpolation replication mode now apply transform shift in a way that overcome friction and the transform shift can be applied to other connected particles.
-
[NetworkPhysicsComponent] Reliable network flow in NetworkPhysicsComponent allows the user to to mark input/state data as important and have those sent reliably, works alongside the unreliable / unimportant data.
-
[NetworkPhysicsComponent] Added the virtual FNetworkPhysicsData::CompareData function that can be used to trigger resimulations if the data (input or state) was mispredicted on the client.
-
[NetworkPhysics] Implemented settings in the physics resimulation flow to further allow optimizations by disabling individual caches of data that might not be needed for certain games/projects, following changes made:
-
Deactivated FEvolutionResimCache by default, API in FPhysicsSolverBase to toggle on and off and the normal EnableRewindCapture call will enable it if the parameter for it is true.
-
Put in CVar, enabled by default, to be able to disable FPushPhysicsData dirty proxies from being cached in history: p.Resim.CachePushDataDirtyProxies
-
Put in CVar, enabled by default, to be able to disable FPushPhysicsData async inputs from being cached in history: p.Resim.CachePushDataAsyncInputs
-
Put in CVar, enabled by default, to optimize RewindData: p.Resim.RewindDataOptimization
-
-
Rely on FRewindData for stepping through non-resim objects histories if FEvolutionResimCache is not enabled.
-
[NetworkPhysics] Implemented smooth kinematic replication via the Predictive Interpolation replication mode.
-
[NetworkPhysics] Implemented logic to apply positional correction as a transform shift in the Predictive Interpolation replication mode, as opposed to the already existing flow to apply the positional correction as a velocity.
-
[NetPhysics] Improvements to the runtime correction logic in the resimulation replication mode, mainly to overcome friction while doing smaller corrections.
-
[NetworkPhysicsComponent] The NetworkPhysicsComponent can act as a local pawn by setting UNetworkPhysicsComponent::SetIsRelayingLocalInputs, which is useful for server-side AIs or non-pawn controllable actors on the client.
-
[NetworkPhysics] Refactored the physics replication cache to run a proper async flow between physics thread and game thread.
-
[NetworkPhysics] Don't perform transform shift corrections on connected particles that also replicate physics via the Predictive Interpolation or Resimulation replication modes. Allows multiple replicated physics-objects to replicate individually.
-
[NetworkPhysics] Implemented logic to trigger resimulations from desync in rotation, linear velocity and angular velocity, alongside the already implemented positional desync. Settings in Project Settings -> Physics -> Replication -> Physics Prediction -> Resimulation Replication Settings, or per actor via the NetworkPhysicsSettingsComponent.
-
[NetworkPhysics] Implemented Chaos::ISimCallback FirstPreResimStep_Internal(int32 PhysicsStep) to get called on when a resimulation start, requires ESimCallbackOptions::Rewind.
Bug Fix:
-
[NetworkPhysicsComponent] Made NetworkPhysicsComponent run properly without RewindData being initalized.
-
[NetworkPhysics] Fixed a bug with render interpolation after a physics resimulation which would result in a large visual desync.
-
Allow RewindData to run with variable tick physics.
-
[NetworkPhysics] Made physics tick offset synchronization handle when the phsics solver resets and tick numbers start again from 0. Happens when loading a new level for example.
-
[NetworkPhysicsComponents] Improved handling of client/server desync in NetworkPhysicsComponents with following changes:
-
Inputs sent from client and server are sent from latest processed frame, with redundant inputs back in time.
-
If inputs arrive late to the server and the buffer is empty, inject the input to be used for the next tick.
-
If client receives target states from the server before the client has simulated the corresponding tick, compare that state after the client has simulated the tick.
-
Deactivate logic that checks if all NetworkPhysicsComponents have inputs and states when performing a rewind, this often stopped resimulations from triggering due to not all sim-proxies having all data aligned for one single frame.
-
Allow larger time accumulation on the game thread towards fixed async physics when having physics prediction enabled.
-
Rebalance time dilation and physics tick synchronization corrections
-
-
[NetworkPhysics] Force correct state to be applied when setting a resimulation object to sleep.
-
[NetworkPhysics] Fixed a bug where applying state for particles during a resimulation via FEvolutionResimCache would not update kinematic particles.
-
[NetPhysics] Optimized memory by only creating render interpolation API for physics proxies that actively use it.
-
[NetPhysics] Fixed bug where if two physics ticks had been processed between a game tick, the error correction in render interpolation would be wrong due to not decaying the error in discrete steps, producing inconsistent render interpolation corrections after a resimulation.
-
[NetworkPhysics] Set sleeping state on all connected particles when the predictive interpolation replication wants to sleep.
Physics
New:
-
Cloth Editor: adding two ways to hide/show triangles in the paint tool: - A new HideTriangles brush mode that will hide triangles that are brushed - A new tool property that is a list of Patterns and whether each one is visible or not Limitations: - Hide/show information does not come along when switching between 2D/3D modes - Checkbox interface for selecting which patterns to show is clunky - Manually hiding triangles via brush then unchecking all patterns will clear the manually hidden triangles Also adding an optional white-red mode to visualize the weight map. Painting an all black object in 3D with a dark grey background is pretty annoying.
-
Changed the tolerance used when we calculate the normal of a triangle to 1.e-8f (it was using 1.e-4f ). During cook we are accepting triangles with a squared area less smaller than 1.e-4f. There are further improvements to make in this area
-
Cloth Remesh node: do the 2D -> 3D projection for each pattern individually to handle patterns that might overlap in 2D space
-
Gravity property can now be enabled/disabled at runtime for Geometry Collections
-
Added support for Copy On Write for Managed Array Collection
-
Cloth Editor Remesh Node: if the Cloth Collection input has proxy deformer data, remove that data from the output and warn the user that we are doing so
-
[Chaos Visual Debugger] Refactored playback logic refactor to improve stability and lay the ground work to support different sync modes.
-
[Chaos Visual Debugger] Added a new button to the solver playback controls that allows you to enable or disable its syncing with other tracks.
-
Reduced Geometry Collection Physics Proxy runtime memory footprint by about 320 bytes
-
Cloth Asset and Legacy Cloth: Added concept of Inner and Outer Lift and Drag. This allows setting different lift and drag coefficients for when air is hitting the frontface vs backface of the cloth.
- Cloth Asset only: Added ability to specify WindVelocity in different spaces rather than just world space.
-
Cloth Editor: add a new "WeightMapNode" that will supersede AddWeightMapNode. Deprecate the old AddWeightMapNode. The new Node has only one set of vertex weights rather than two. The deprecated AddWeightMapNode still works in the graph but its properties cannot be edited and is no longer linked to the Weight Map Paint Tool. Users should migrate their weight map data out of the AddWeightMap nodes and into WeightMap nodes.
-
Added weight map support to Buckling Ratio on Chaos Cloth Assets.
-
New:** [Chaos Visual Debugger] Added Viewport option to go to specific locations by using a vector in string format (similar to how you can go to locations using the BugItGo console command)
-
[Chaos Visual Debugger] Added support to visualize the log output stream
-
Bug Fix:** [Chaos Visual Debugger] Made an speculative fix for a crash that can happen while playing back a recording with particles being individually destroyed before the entire solver is destroyed.
-
[Chaos Visual Debugger] Refactored the existing CVD Settings system. Now each category has its own settings object, and they can be saved independently of each other.
-
[Chaos Visual Debugger] Re-Implemented the show menu as a proper UE tool menu.
-
Added the ability to Show/Hide pins in Dataflow and set many existing Chaos Cloth Asset dataflow nodes to hide inputs by default.
-
[Chaos Visual Debugger] Added a way to start recording and auto connect as live session directly from CVD's UI, if you are in the editor and recording a PIE session.
-
[Chaos Visual Debugger] Added pop ups informing the user if an error has happened instead of silently fail (or just trigger an ensure).
-
[Chaos Visual Debugger] Added a commandline argument that can be used to start a CVD recording automatically on startup.
-
Cloth Editor: optional information in the Construction viewport - Numeric mesh stats (so far just triangle/vertex count) - Color-coded cloth patterns
-
[Chaos Visual Debugger] Initial Implementation of CVD as a standalone program. Now CVD can be built as an unreal program (in addition to being an editor tool).
-
Cloth Editor: remove secondary selection from Selection Tool. Allow importing secondary selection from input collection, to allow safe data migration.
-
ChaosFlesh: Add vertex selection set input pin into position target node for flesh asset setup
-
[Chaos Visual Debugger] Implemented a Scene Query Browser. This is a scene Outliner like window, just for scene queries with a set of features specific to browse recorded scene queries
-
The SetSimulatePhysics tooltip in PrimitiveComponent has been improved to cover all the derived classes as well, which might have slightly different behaviour(and currently tooltips can't be overridden in derived classes).
-
Dataflow Editor Tool Registry: a map from Node types to Tools that the Dataflow Editor can use. Also: - Replace UClothEditorContextObject with UDataflowContextObject in the cloth editor so that Cloth tools can be used in the Dataflow Editor - Dataflow Editor: get the input collection of the selected node and add it to the context object when a tool starts - Rename PrimarySelectedNode to SelectedNode and PrimaryRenderCollection to RenderCollection in UDataflowContextObject
-
Legacy Chaos Cloth: add FlatnessRatio to the config.
-
Dataflow: highlight "Deprecated" or "Experimental" nodes
-
Cloth Editor: disable mouse "flight controls" in the construction viewport. Only alt+mouse or WASD should move the camera.
-
Cloth Editor Preview: when reloading or changing the SkeletalMeshAsset, save and restore the animation state so that it doesn't always start playing from time zero
-
[Chaos Visual Debugger] Fixed a crash that can happen when a new solver is being loaded while scrubbing
-
Cloth paint tool changes - set default Strength to 1.0 - hook up Q/A hotkeys to cycle through brush modes - hook up W/E hotkeys to adjust Value property
-
Add additional solver stage stats to Chaos advance tasks, particularly for marshalling manager updates and rewind
-
[Chaos Visual Debugger] Added an option to override the playback framerate.
-
[Chaos Visual Debugger] Eliminated the use of material instance dynamic. CVD only needs to change the color value read by the material depending on the settings and the recorded data for any given particle, so now we store the color data as primitive data, so the material can just read it from the primitive itself.
-
[Chaos Visual Debugger] Re-implemented the CVD's mesh component pool system to be more uobject generic. Part of this work included improve how we generate unique names for the pooled components
-
[Chaos Visual Debugger] Moved more of the mesh generation process into worker threads
-
[Chaos Visual Debugger] Removed support for dynamic meshes. It has been over a year we don't use dynamic meshes in the visual debugger, and the code path as not been really tested since then. removing support now allows us to remove templatized code and make everything easier to read/maintain.
-
[Chaos Visual Debugger] Parallelized how we process the Tri mesh and Heightfield implicit object data. Now we process the vertex data in parallel when converting the data to a format we can use to create a static mesh.
-
Properties in dataflow node details are now read only when they are connected to another node
-
Dataflow: Move rendering code to Editor module
-
Add support for non-nanite fallback mesh for nanite geometry collections.
- To enable that, set EnableNaniteFallback on the geometry collection (defaults to off). Also strip geometry collection nanite render data when cooking for non-nanite platforms.
-
Exposed the Skeletal Mesh Component's ClothTeleportMode property to Sequencer and added a new HardReset mode which rebuilds the cloths.
-
[Chaos Visual Debugger] Fixed an issue where skeletal mesh bones movement are not recorded every frame .
-
Add "experimental" text to the context menu item for loading a Cloth Asset in the Dataflow Editor. This will signal to the user that the asset will be loaded in a different editor than the usual Cloth Asset Editor.
-
Enable opening Cloth Assets in the Dataflow Editor via content browser context menu
-
Dataflow Editor: - Allow changing the construction view mode while a tool is running, if the tool supports it - Make the Cloth Weight Map Paint Tool support this - If the tool does not support changing the view mode, follow the Cloth Editor behavior of shutting down and restarting the tool. (Initially the Selection Tool will have this behavior, but in a future CL we will likely enable changing view modes on the fly for this tool as well.) - If the tool requires a view mode that we are not already in, automatically change to a valid view mode before starting the tool
-
Added Geometry Collection component GetLocalRestTransform blueprint function
-
Geometry Collection using custom renderers now support the actor SetHiddenInGame flag
-
Dataflow Editor: PDI rendering callbacks for Contruction and Simulation viewports - Also implement Cloth viewport visualizations for the Dataflow Editor using this system - Fix UDataflowContextObject having a stale Selected Collection member
-
[Chaos Visual Debugger] Added a simple Recent Files menu
-
[Chaos Visual Debugger] Added the new Viewmode Lit Wireframe that was added to the normal level editor
-
Chaos:add per-body control of position/velocity/projection iterations. The iterations can be set on physics section of the detail panel. During solve of rigid bodies, an island group takes maximum of the iterations from all its particles as its iteration count.
-
Cloth Editor Weight Map Paint Tool: replace the change tracker for undo/redo. Rather than using the generic FDynamicMeshChangeTracker, we instead store changes to the weight map values as they would be stored on the Weight Map Node. This should allow the same change to be applied to different mesh configurations (Sim2D/Sim3D). This is a prerequisite for being able to change view modes while keeping the tool running and maintaining the undo history.
-
New:** [Chaos Visual Debugger] Added support to record disabled particles that are inside an active cluster particle. This allows record all updates of particles that are in a cluster union (and therefore disabled). Without this change these particles only got updated every 10 seconds which is the interval we have use between key frames. As this change is not free performance wise when a recording is active, this new data is gated it behind a new data channel that is disabled by default, and can be enabled as needed.
-
Chaos::add per-joint linear/nonlinear solver option to joints. It's available in physics editor of the constraint setting. It can be used for long thin objects when they are not solved correctly by the linear solver.
-
Make the Skeletal Mesh Component's ClothCollisionSource methods BlueprintCallable.
-
Added Dataflow Vector and Trigonometric math nodes using the general numeric type inputs
-
[Chaos Visual Debugger] Created a details panel customization to process the recorded Sim and Query filter data and present it like the collision response matrix used in the rest of the editor. This also handles conversion from Chaos formatted flags into the UE formatted flags (like the Collision Enabled enum).
-
[Chaos Visual Debugger] Created customization for the scene query collision response params to show the recorded flags array as the collision response matrix used in the rest of the editor.
-
[Chaos Visual Debugger] Created customization for the scene query object response params to show the recorded integer as a list of flags per object type
-
[Chaos Visual Debugger] Made Scene query visualization to use World priority instead of foreground by default, and exposed that as a setting on the existing visualization settings menu for scene queries.
-
[Chaos Visual Debugger] Fixed an issue where objects might incorrectly be unloaded if certain conditions are met. This is fallout of the fix for another issue. As part of that fix, now when a CVD file is loaded, if we get particle (or other) data outside a Solver Stage scope, we auto generate a Solver Stage entry named "In-Between" stage.
-
Cloth Mesh Selection Tool: - Add a "Clear Selection" action - Replace the Grow/Shrink/Flood actions with SelectionMechanic calls
-
Opening a dataflow graph asset directly will prompt a message to open concrete assets using such graph
-
Fixed a few Chaos ISPC per-kernel variables not having or not using the preprocessor define for the default value.
-
Chaos::add CVar for joint simd in scene simulation. Use "p.Chaos.Solver.Joint.UseSimd" to control if joint solver uses SimD. It might improve performance of the solver up to 15%.
-
[Chaos Visual Debugger] Fixed an issue where debug draw text is shown at the incorrect position if DPI scaling is greater than 1.
-
Add in-editor support for collision visualization for the Geometry Collections using nanite
-
Cloth Transfer Skin Weights Tool: add scale to transform gizmo
-
Dataflow: allow the FDataflowCollectionAddScalarVertexPropertyNode to assign weights to different vertex targets depending on the schema of the Collection passing through the node. This will require developers of different Collection types to opt in by registering their vertex types.
-
Cluster union component now exposes a way to disable damage from collision
-
[Chaos Visual Debugger] Changed default colors to be less harsh to the eyes.
-
[Chaos Visual Debugger] Reduced the Directional light from 10 to 4 Lux
-
[Chaos Visual Debugger] Added a post-processing volume to enable an ambient light cubemap. This is needed so geometry that is shaded, it is not shaded completely dark which makes it difficult to see.
-
Changed Kinematic Targets to store its rotation in single precision
-
KinematicTarget is not a template class.
-
Reduced Geometry Collection component memory footprint optimization by avoiding over allocation when creating attributes
-
Enabled rendering of root proxy meshes in editor for geometry collections when available ( Changes back to normal rendering when geometry collection is selected in the Fracture Editor )
-
Dataflow Editor: add mechanism to FDataflowToolRegistry to allow enabling/disabling commands when tools begin or end. This allows hotkeys to be used in Dataflow tools that are defined in other modules. - Also enable shortcut keys in Dataflow Editor Construction Viewport.
-
Cloth Editor: add ability to visualize surface normals in the construction viewport
-
Added new convexity-based clustering options to fracture mode and to the dataflow geometry collection auto-cluster node
-
Reduced memory footprint of the Geometry Collection component by 400 bytes by removing unnecessary data structures
-
Remesher: add an optional edge length scale function that can be used for adaptive-density remeshing
-
Added support for Array Inputs to Dataflow Nodes.
-
Cloth Editor: Enable ChaosClothAssetEditor plugin for Mac and Linux. This fixes being unable to create cloth assets on these platforms. Also fix Linux build errors.
-
Dataflow Editor: add customizable View Modes to the construction view. We provide default 3D and 2D views, but allow other modules to define their own as well. Also: - Implement rendering of FClothCollection output - Replace the default Construction View toolbar with one like the Cloth Editor
-
Cloth Editor Remesh Node: Add a Simplify option for Render mesh decimation. When enabled, this will use FSimplifyMeshOp rather than FRemeshMeshOp. The Simplifier uses QEM to prioritize removing vertices in flat areas to preserve curvature. The result is typically a lower poly count but less uniform mesh than FRemeshOp produces. Because of this, it's only enabled for the Render mesh.
-
New:** [Chaos Visual Debugger] Added support for recording and visualization of generic debug draw shapes either from C++ code using macros, or blueprints.
-
[Chaos Visual Debugger] Added Optional CVD Data Channels. This allows opt out of recording some types of data (like specific solver stages, or scene queries).
-
Added the ability to change the interpolation mode on a Cache Collection asset
- This can be used for more precise interpolation of rotation in very slow or fast replays
-
Cloth Weight Map Paint Tool/Node: allow weight map painting on Render vertices. The AddWeightMapNode now stores two sets of vertex weights: one for sim vertices and one for rendering. Changing the view mode while the paint tool is active will load the appropriate weight map from the node. There is also a drop-down selector for choosing which of the two vertex weights should be saved into the ClothCollection (or both.)
-
Added density debug draw for Chaos ( p.Chaos.Solver.DebugDrawDensity )
-
Dataflow Editor: add Analytics events for starting/stopping the Dataflow Editor
-
Added an AssignPhysicsAsset node to the skel mesh editor subsystem to handle editor scripting of modifying the physics asset for a mesh.
-
Improved collection of Dataflow fracturing nodes for Geometry Collections
-
Cloth Editor: disable mouse "flight controls" in the Preview viewport. Only alt+mouse or WASD should move the camera. Note this change was made previously for the Construction viewport, this one applies to the Preview viewport.
-
Cloth Selection Tool: add a flood fill deselect action: shift+ctrl+click will deselect all connected mesh elements
-
Chaos Cloth Asset: Added the ability to specify Velocity Scale and clamps in different simulation spaces (defaults to Reference Bone space, which was the previous behavior).
-
[Chaos Visual Debugger] Implemented a details panel customization to show Shape instance data and other Collision Geometry object data.
-
Managed Array Collections now support copy on write by being able to share attributes in memory until they are changed
-
Add grow, shrink, and flood buttons to the Selection tool
-
Added scalar math node using numeric generic inputs and outputs
-
Cloth Editor: remove references to DataflowComponent (unused in the cloth editor)
-
Move cloth editor tool headers to private. Rename ClothEditorToolBuilder to ClothEditorToolBuilders and centralize ToolBuilder classes for the cloth editor
-
Chaos Cloth: Added Velocity and Acceleration clamps. Similar to RBAN, the clamps are applied after the scaling.
-
All the constraint parameters are now set when switching profiles, and the function that is used to do this is no exposed so that it can be used more generally.
-
[Chaos Visual Debugger] Fixed an issue where the editor will tell you there are assets that need to be saved after using CVD by marking CVD Materials as transient.
-
ChaosFlesh: Add support for addition, removal and stiffness adjustment for dynamic springs. Add Gauss Seidel dynamic weak constraints. Rewrite Gauss Seidel weak constraints using new data structure. The new constraint can be setup via constraint manager actor. It's an experimental feature for now.
-
Added In editor collision visualization for Geometry collection not using nanite (Player collision & Visibility collision)
-
Add support for per-bone hit proxies to geometry collection components using nanite.
-
Fracture Mode now has an option to not split islands when fracturing meshes, to make it easier to work with meshes that are made of disconnected pieces.
-
[Chaos Visual Debugger] Changed default geometry visualization flags. By default we were not showing Query only and Complex geometry to reduce visual noise, but this could be confusing for a new user as things will appear missing. Also, it is not the best default for most projects.
-
[Chaos Visual Debugger] Implemented auto-save for CVD settings so they don't reset between sessions.
-
[Chaos Visual Debugger] Added support for Record and Visualize Joint Constraints
-
[Chaos Visual Debugger] Added Collision data recording and Joint constraints data recording support for RBAN Solvers.
-
Cloth Editor preview scene: add a toggle to enable/disable PostProcess Blueprints on the SkeletalMeshComponent
-
Chaos Cache Track compression is now enabled by default
-
Cloth Editor: when clicking on a WeightMap node to start the Paint tool, change the construction viewport view mode to the appropriate Sim/Render mode based on the node's MeshTarget value. Don't allow changing between Render and Sim modes while the tool is active (but do allow changing 2D/3D if we are in Sim mode)
-
Dataflow Editor: add the cloth preview blueprint class when opening a cloth asset via the context menu. Also move the blueprint asset from ClothAsset to ClothAssetEditor
-
Cloth Editor and Dataflow Editor: allow tools to start when PIE is running
-
Cloth Editor Remesher: better handling of open meshes in the Render mesh. Add the option to detect connected boundary vertices that are coincident with another connected set of boundary vertices on another boundary elsewhere. We can then explicitly remesh these "seams" while maintaining a vertex pairing, before then going on to remesh the interior of the mesh islands.
-
Add support for displaying icons for dataflow nodes
-
Added support for reroute nodes in Dataflow
-
Cloth Editor: roll back previous change disabling fly mode camera in both viewports. Add a Click-Drag behavior that will prevent camera movement when left-mouse dragging but allow everything else
-
[Chaos Visual Debugger] Removed the need to call SetActorLabel to update the particle debug name in the outliner as it is too expensive.
-
[Chaos Visual Debugger] Removed the need to call SetActorLabel to update the particle debug name in the outliner as it is too expensive.
-
[Chaos Visual Debugger] Updated CVD Outliner mode to know how to read the particle debug name from the recorded particle data instead of the actor label.
- Limited the number of geometry generation tasks to be launched per frame.
-
[Chaos Visual Debugger] Chaged CVD's ISMC to do RemoveSwap when an instance is removed to reduce the performance impact the operation has.
-
[Chaos Visual Debugger] Improved the object tracking mode to reduce stutter
-
[Chaos Visual Debugger] Removed the need to add the ISMC to the instanced component arrays of the pool actor. We were not using that functionality and calling AddInstanceComponents does an AddUnique internally, which becomes too expensive when we are adding a huge number of components
-
[Chaos Visual Debugger] AChosVDParticleActor now does nothing when modify is called. These actors are completely transient and Modify calls where adding cost to the actor spawning process.
-
[Chaos Visual Debugger] Made the Scene Outliner mode block updates to the hierarchy while we are playing. The scene outliner will now update itself as soon we stop or pause a recording .
-
[Chaos Visual Debugger] Added Sync by Network Tick mode
-
Dataflow editor: set node output visibility based on node selection. Set wireframe view based on toggle button on the node
-
Add basic telemetry to the Cloth Editor: editor mode enter/exit and tool start/stop information
-
Reduced Geometry Collection physics proxy runtime memory footprint by better packing data structures
-
[Chaos Visual Debugger] Added support to record and visualize game thread acceleration structures
-
[Chaos Visual Debugger] Added a way to generate a struct view that can be fed to the vanilla details panel for Solver Data structs
-
[Chaos Visual Debugger] Added a way to allow CVD's main details panel to ignore struct types (needed to ignore structs that have their own data inspector widgets).
-
Reduced Geometry Collection component runtime memory footprint by 16 bytes per bone
-
[Chaos Visual Debugger] Fixed a crash that can happen when you are loading a CVD file.
-
Expose fully decayed flag on geometry collection components
-
ChaosFlesh : Add triangle mesh simulation properties node in the dataflow for flesh assets and restrict self collision to tetmesh surface.
-
When creating a new Geometry Collection in Fracture Mode, there is a new option to specify an associated Dataflow.
-
Chaos Cloth Component simulations can now be modified from blueprints via the UChaosClothAssetInteractor.
-
New: Improved help text for functions moving actors etc, giving more info about the behaviour when teleport is/isn't used.
-
Cloth weight paint tool: draw 0.0 weight values as blue, 1.0 weight values as yellow. Make this behavior toggle-able with a checkbox in the UI.
-
Cloth weight map paint tool: make changes to the weight map node undoable
-
Made improvements to the Chaos Cloth Asset Selection Node and tool to match behavior with the Weight Map Node.
-
Implement Min LOD handling for clothing assets.
-
Chaos Cloth visualization updates.
-
Fix cloth debug draw to display when PIE is paused. This was just a matter of switching to not draw in Foreground since the Foreground Linebatcher queue flushes every frame, even when paused.
-
Add an option to draw in foreground or in the world via cvar (p.ChaosClothVisualization.DrawInForeground)
-
Enable all text-based debug draw in PIE/outside of asset editors (doesn't work when paused, but it's a start).
-
Update Draw Local Space to show the name of the reference bones.
-
-
Remove ClothComponentToolTarget as it is not used in the Chaos Cloth Editor
-
Cloth Editor: add option to pause Preview viewport updates while either PIE or SIE is running in the level editor
-
Added ChaosClothAsset to Cloth Total cycle stat.
-
Add DATAFLOW_NODE_RENDER_TYPE macros to a bunch of Cloth nodes so they will render in the Dataflow Editor Construction Viewport
-
Added a StaticMeshToCollection node for dataflow
-
[ChaosVD] Add Character Ground Constraint
-
Enabled debug display of bones for follower skinned asset components (e.g., typical chaos cloth asset usage).
-
Added Center of Mass (CoM) visualization and manipulation tools to the Physics Asset Editor.
-
A yellow marker and a number can be displayed in the viewport, indicating the location of the CoM of a body along with its mass. Filters can be used to determine a subset of bodies for which these markers will be displayed.
-
The CoM markers can be selected and then used to manipulate the CoM offset value directly in the viewport with a standard translation widget.
-
Buttons next to each axis of the CoM offset property in the details panel can be used to lock the CoM position in component. This allows you to move the physics body whilst leaving the CoM position unchanged.
-
The new visualization tools are inactive by default but can be activated and configured through the ‘Mass Properties’ sub-menu found in the ‘Character’ menu visible at the top of the physics asset editor viewport.
-
Bug Fix:
-
[Chaos Visual Debugger] Fixed an issue where when you scrub from a solver timeline, the other solvers and game frames data is not updated.
-
[Chaos Visual Debugger] Fixed an issue with RBAN Particle Data Visualization.
-
[Chaos Visual Debugger] Fixed an assert that happened when the solver tracks tab was closed and then re-opened.
-
[Chaos Visual Debugger] Added a missing early out on the update visibility code path. Now if the visibility has not change, we don't do the update.
-
[Chaos Visual Debugger] Fixed an issue where the query mode in CVD was reported incorrectly.
-
[Chaos Visual Debugger] Fixed an issue where the incorrect shape instance index was used when we evaluate if a geometry is for a query only shape, resulting on objects with multiple collision shapes be shown with the incorrect material.
-
[Chaos Visual Debugger] Fixed an issue with CVD's Details panel where if you try to inspect a struct after uobject was inspected, the uobject details view was not being properly cleared out and hidden.
-
Fix crash when opening brand new Cloth Asset in the Dataflow Editor
-
Initialise centre of mass on FConvex construction in paths where we could exit early to avoid non-deterministic cooks for empty or small convex hulls.
-
Dataflow and Cloth Asset Editors: make undo/redo work when changing node property values.
-
Bug Fix: Fix the error rotation in
ApplyDeltaToAllPhysicsTransforms
. This affects movement applied to the character through the character movement component. Previously the rotation was applied in the wrong space. -
Fixed a crash that could occur when creating a new Geometry Collection from source actors on multiple levels. Also, new Geometry Collections are now placed on the active level instead of the source actor level.
-
FSkeletalMeshSceneProxy: set view relevance dynamic if bForceWireframe is set
-
Dirty kinematic particles that move on the physics thread. This ensures the correct state is transferred back to the game thread for the query structure.
-
Fix for ClothCollection::GetUserDefinedAttributeNames not returning any names if it doesn't have the optional schemas
-
Cloth Selection Node: check that selection indices are valid for the associated group before adding to the collection
-
Cloth Selection Node: allow selection nodes to remove elements from an existing selection, rather than just add to it
-
Chaos - Fix drifting in character ground constraint
-
Chaos::Fix bug in FPBDJointUtilities::ConditionInverseMassAndInertia. It resolves possible crashes from zero inverse inertia for skeletal meshes or physics asset.
-
Fixed a crash on undo that could occur in Fracture Mode.
-
Dataflow Editor: fix crash when resetting simulation
-
Fixed crash related to momentum restoring in rigid clustering code
-
Fixed assert about CachedDensityFromPhysicsMaterialInGCm3 when saving an empty Geometry Collection asset
-
Dataflow Editor: restore "Add Weight Map" button functionality in the UI
-
Fixed some geometry collection replication issues where internal cluster information was not properly send over to the client
-
Fixed crash in Chaos Cache track compression
-
Fix crash when right clicking a comment node in DataflowGraphEditor
-
Fixed issue with inertia computation for Geometry Collection with negative scale components
-
Fixed a crash when changing a cache name in a Cache Collection asset properties
-
Ensure AnimatedNormals and normals are initialized and updated correctly when LOD switching Chaos Cloth.
-
Fix crash in Dataflow Editor when the asset doesn't have a valid Dataflow asset
-
Update Dataflow Node Details panel to handle showing multiple selected nodes.
-
Fixed crash in physics object external interface when attempting to access element zero of an empty object view.
-
Fixed a bookkeeping bug where External Collisions would not be added and removed correctly with the Chaos Cloth Asset.
-
Fix crash when closing cloth editor while selection tool is running
-
Cloth Editor: don't start the preview animation any time anything changes in the graph
-
Cloth Editor: fix crash when changing Dataflow property. We were not passing in a null DataflowEditor when reinitializing the graph editor.
-
Cloth Asset Builder: don't assert if there is not one material per render pattern in the asset, just log a warning. Even though each pattern has a material in the ClothCollection, the user can still remove materials from the asset after the graph evaluates, which can cause this assert to fire when the asset is subsequently loaded.
-
Cloth Editor Weight Map Paint Tool: Smooth brush improvements: - consider a wider neighborhood of vertices when computing average values - added a falloff function
-
Cloth Editor: focus on tool-defined selection box when user hits 'F', not the entire cloth object
-
Cloth Editor: fix crash when reloading Dataflow asset
-
Bug Fix:** [Chaos Visual Debugger] Fixed an issue where if you scrub backwards one frame, and you happen to land on a frame that is not a keyframe (but it has a generated keyframe), the generated keyframe will not be processed and the visualization will get out of sync.
-
Chaos Cloth Asset Static and Skeletal Mesh import nodes will now remove topologically degenerate triangles when using the new _v2 versions of these nodes.
-
Fixed slow down when scrubbing a ChaosCacheManager start time property while having the Sequencer using it opened
-
Cloth Editor Selection Tool: request graph evaluation when leaving selection tool
-
Fixed Geometry Collection removed pieces failing to shrink when the feature is enabled
-
Fix: Twist/swing drive max torque was previously used instead of parameters for the slerp drive.
-
Fixed Geometry collection memory reporting for GetResourceSizeEx if editor data is filtered and the cooking data options are removed.
-
Fix an issue with how Long Range Attachments were calculated in the Chaos Cloth Asset using improperly scaled Max Distance maps.
-
Fix scene query crash when rewind/resim is in use and we invoke a query on the physics thread.
-
Dataflow Construction Scene: explicitly destroy DynamicMeshComponents when they are removed from the scene. This fixes a crash in Dataflow Editor
-
Cloth Editor Remesh Node: fix crash when collection has invalid stitches
-
Dataflow Editor: fix for meshes not rendering in 2D view mode. - added a 2-sided material for meshes in the Construction view - disabled the Advanced Preview Floor in orthographic view modes to avoid overly darkening the material.
-
Converted UGeometryCollection rest collections to shared ownership as the physics proxy now relies on the rest collection for immutable data.
-
Cloth Editor: Pass nullptr as DataflowEditor argument when constructing SDataflowGraphEditor. Fixes crash on ClothEditor startup.
-
Fixed issues where Geometry Collection rendering do not properly update the velocity buffers causing issues with motion blur and antialiasing
-
Cloth Editor Preview: save and load animation state when reimporting skeletal mesh. Previously this happened only when reloading the asset, not reimporting.
-
Fixed Geometry Collection Component removal logic preventing internal clusters from crumbling into smaller pieces
-
Fix typo: OnPreReimport -> OnPostReimport. Fixes a crash when reimporting SkelMesh after the Cloth Editor is closed.
-
Cloth Editor: when nothing is selected in the preview scene, disable the numeric transform inputs
-
Cloth selection tool: fix back face material checkerboard
-
Fixed potential crash in InitializeBodiesPT method when using Geometry Collections
-
Cloth Editor paint tool: allow brush to get super small. Also fix brush circle not updating after manually setting the brush size property
-
Dataflow Editor: fix for Skeletal Mesh being cleared from the Preview scene when changing Animations, and vice-versa. Removes the Skeleton property from UDataflowSkeletalContent
-
Altered dirty particle checking to make sure we always add dirty kinematics to be processed to ensure correct velocities for kinematic bodies.
-
Fix a check that occurs when clicking a node after doing "Save As" in the Cloth Editor
-
Fixed a bug where Fictitious Angular Scale would apply a force when teleporting Cloth (both Skeletal Mesh-based cloth and new Chaos Cloth Asset panel cloth).
-
Fix material index mapping when turning multiple cloth collections into LODs for one asset
-
[Chaos Visual Debugger] Fixed random ensure caused because data was recorded outside a solver stage. In these scenario now an auto-generated solver stage will be shown in the UI, named "In-Between Stage Data"
-
Dataflow node inputs and outputs using Arrays now properly have their type set to the full templated type
-
Fixed source actors not being properly removed from level by the Fracture Mode 'new' tool
-
Fixed potential crash in Niagara Chaos Destruction Interface related to using trailing events
-
Fix use-after-free error: we were accessing the name of a property that has already been unloaded in a ShutdownModule call. ASAN preflight: 66b3a23ea82c869bf2232b71
-
Cloth Editor: fix for the mesh in the construction viewport not updating when node properties in the details panel are changed
-
Cloth Editor: when selecting a node for the first time, focus the construction viewport to capture the dynamic mesh
-
Fixed an issue with Fracture Mode where bone colors of a Geometry Collection would sometimes not update to reflect the active Fracture Level.
-
Cloth Editor: when clicking a node for the first time start any corresponding tool immediately. This change just creates the DynamicMeshComponent before trying to start the tool. Also: clear the bDynamicMeshComponentInitDeferred flag after testing it in the Tick function, not inside ReinitializeDynamicMeshComponents(), to prevent unexpected behavior calling ReinitializeDynamicMeshComponents out of sequence.
-
Cloth Editor: don't store the animation instance in the Preview scene, just allow the SkeletMeshComponent to keep track of it. This fixes a problem where the animation playback controls don't respond after reloading the SkeletalMesh asset in the preview scene. When a SkelMeshComponent is re-registered (e.g. after the asset is reloaded), it unconditionally destroys and re-creates its AnimScriptInstance, so we're guaranteed to be holding onto the wrong object in the editor if we are tracking it ourselves.
-
Fixed a crash when moving a Geometry Collection component in a blueprint editor
-
Cloth Editor and Dataflow Editor: fix for toolbar actions running in the wrong editor instance. We should register toolbar commands in the EditorToolkit, not the EditorModeToolkit
-
Fixed body instance filter calculation when its SourceObject member is unset.
-
Fixed GravityGroupIndex not being initialized for body instances
-
Fixed heightfield queries missing when they begin outside of the heightfield grid and the clipped query ends up within a single cell
-
Fixed removal timer starting at -1 and causing remove on break to be last longer by a second
-
Dataflow Editor: - when a tool is running hide wireframe rendering in the scene and disable toggling wireframe mode on graph nodes - when clicking on a node, don't update ShouldRenderNode unless the node selection actually changes
-
Fix bug where geometry collection components that use nanite did not visually rotate when rotating with the gizmo.
-
Dataflow Editor: fix for not being able to select a mesh in the construction viewport when there is no terminal node in the graph. This was caused by SetLastModifiedTimestamp being called with Invalid on every tick, which rebuilds the construction scene.
-
Fix crash when deleting selection node while selection tool is active
-
Dataflow geometry collection nodes now properly handle material instances
-
Cloth Editor: make Selection node changes via the tool undoable, similar to previous change to the Weight Map Paint tool. Also make the previously-added FWeightMapNodeChange a nested class inside FChaosClothAssetAddWeightMapNode
-
Dataflow Editor: - if p.Dataflow.Editor.ContextCaching CVAR is false, mark the UDataflowBaseContent object as transient to prevent it from setting the Dataflow asset's package dirty - when user hits the Save button, only prompt to checkout and save assets that are actuallly modified
-
Fixed Sphere-Convex trace not taking radius into account when not requesting MTD information.
-
Fix shape index resolution in collision event handling ensuring that the shapes are correctly ordered when notifying components
-
Dataflow Editor: when user presses 'F' while a tool is running, use that tool's focus box to orient the camera, if it has one defined
-
Fixed a bug where the Chaos Cloth Simulation would continue to run when EnableSimulation was set to false on the component.
-
Fixed crash when adding a Geometry Collection to a Blueprint that contains embedded geometries
-
The fracture mode and dataflow neighbor/contact selection tools/nodes now work as expected across clusters.
-
ChaosFlesh:: fix jira Clang compiler issue. Fix copy-and-paste errors from GaussSeidelWeakConstraints
-
Dataflow Editor: delay loading the editor module to PostDefault to allow other modules to register their nodes, tools, and view modes. Warn if trying to register tools and view modes after editor commands have already been set up.
-
In fracture mode, shared settings now persist across the different fracture tools
UI
New:
-
CommonTabListWidgetBase - Updated CommonTabListWidgetBase to use a widget pool for the case of recreating tabs in this widget. - It should alleviate the need to call create widget any time we're trying to build a new set of tabs. It also improves performance for that case.
-
Added branch name to Unreal Insights window title, to more easily identify branches when working on multiple ones simultaneously
-
Added branch name to Live Coding Console window title, to better differentiate instances when working on multiple branches
Bug Fix:
- Fixed a crash in WidgetComponent when widget visibility changes but the widget pointer is invalid.
Slate
New:
-
Slate: Add ability to customize details for 'edit-inline' instanced UObjects. This is locked behind 'AllowEditInlineCustomization' property metadata.
-
Updated FNotificationButtonInfo to support dynamic Text, Visibility, and IsEnabled bindings
-
Added tooltip to MultiBoxBuilder's AddToolBarWidget
-
Add support for disabling gamepad navigation scrolling in listview
-
Exposed missing delegate variants on TAttribute (SPLambda, WeakLambda)
-
Added CVar "Slate.AllowTooltipsWithHiddenCursor" to SlateUser to enable tooltips even when the cursor is hidden. This will enable tooltips when using something like the CommonUI analog cursor.
-
Asset pickers can now specify their own asset view options menu profile by name.
-
Add CSV Substats to Slate
-
Mark certain slate classes as final, in attempt to support devirtualization
-
Slate Font Atlas Visualizer: when hovering a glyph, info about it (Font, size,...) will be displayed in a tooltip.
-
Allow SMessageDialog to optionally use plain-text
- This is controlled via a new UseRichText attribute, and may be set to false when rich-text support is not required.
Bug Fix:
-
Fix Android build break on Slate RDG changes
-
SPropertyEditorInline: Fix refresh issue with editing inline/instanced properties.
-
Fixed Slate accessing a deleted FWindowsStylusInputInterface when destroying windows after UStylusInputSubsystem had already shutdown
-
Flush resources when drawing with minimized windows
-
Ensure that brushes are always loaded when needed, even for lazily loaded widgets
-
Fix Post Buffer updates not triggering with global invalidation due cached batch buffer use not being considered.
-
Remove check for unscaled view rect non negative, assumption is not correct when accounting for PIE scene view offset.
-
Disable slate postbuffers when launching multi-PIE
-
Fixed an issue with OverflowPolicy "Ellipsis" when using outline, where the outline could get clipped at a different glyph than the main text.
-
Prevent crashes if custom slate drawer is GC'd before element is added
-
Fix typo in log format string when a widget gets deactivated
-
Fixed the ellipsis position for texts that are both left to right and wrapping. Previously, the ellipsis was displayed after the last whitespaces of a line instead of right after the last visible glyph, which could result in the ellipsis to be partially clipped.
-
Fixed a crash in data validation with abstract blueprints.
-
Add missing transtition to SRV to slate blur external
Deprecated:
- Implemented new type priority system for InputPreProcessors in SlateApplication, refactored callsites and removed re-registration hacks
UMG
New:
-
Add autocast for object types for async conversion functions.
-
Add QueueAnimation methods, which perform better when multiple animation transitions occur in one frame.
-
Add conversion functions for MVVM Material Param updates.
-
CommonUI: Adding virtual to methods that were needed to support Enhanced Input's Triggers and Modifiers in CommonUI widgets
-
Fix null pointers: [Common UI] Add the CommonUI.ResetUIInputConfigOnActivatableTreeDeactivation console variable
-
Add designer preview entries to MVVM panel extension.
-
Fixed unsafe pointer in CommonActionWidget (CommonUI)
-
Expose ViewportScaleUI view uniform to materials (Temporarily only set in editor, since in non-editor acquring scale can permanently leave DPI with an invalid value)
-
Add verbose info to invalid conversion functions.
-
Add helper for setting an array of ftext using MVVM macros
-
Add MaterialFunction to easily access Cursor Position in UMG
-
Add ability to set default resolver to select by default in MVVM plugin settings.
-
Add Async MakeBrush & LoadTexture / LoadMaterial Nodes for MVVM
-
Expose CommonVideoPlayer functions to BP
-
Add LoadAsset & derived classes to allowlist for MVVM Make Node Bindings show display name rather than node class name
-
Experimental UI Compoment System feature for UMG This is the first submit for very basic Component implementation. It's hidden behind a CVar and there is a few features missing. Using this we can Create Components that add functionnality to any UWidget in UMG. The first Components will come in future submits.
-
Migrate cached batch post buffer usage checks to single loop
-
Added UUserWidget::NativeOnFinishedPointerInput which is called from SObjectWidget::OnFinishedPointerInput after all input events have already been processed for a widget (this callback existed for Slate widgets but not UMG)
-
Remove enum state functionality
-
UMG: In Blueprint, allow setting InText inline for URichTextBlock::SetText, this aligns with UTextBlock::SetText
Bug Fix:
-
Change World that widget previews use to fix Material Parameter Collections not updating correctly.
-
Disable adding children to panel hierarchy when it has an MVVM extension.
-
Fix Manual Arg refresh required when node added to MVVM Allowlist
-
CommonUI: Fix not being able to remove widgets from a UCommonActivatableWidgetContainerBase after slate resources have been released
-
Fixed an issue where the interface of other players was not hidden when split-screen was disabled.
-
Fix: common button styling consistently updates via SetIsInteractionEnabled
-
CommonUI: Fix CommonButtonBase not binding Pressed/Released events when using Enhanced Input
-
Fix Screen Space widgets not working in split screen
-
Fix Slate PostBuffer not working on formats other than PF_A2B10G10R10.
-
Correction to Fix to UWidget::TakeWidget to properly handle dynamically created UWidget that are not part of an asset.
-
Add option to DynamicEntryBoxBase to remove widgets while deleting slate.
-
Free widget list in ReleaseSlateResources for Activatable Containers, also clear pool and migrate widgets into inactive list so they can be reused.
-
UWidgetComponent - Added null checks when creating scene proxy.
-
Disable drag and dropping children into panel hierarchy when it has an MVVM extension.
-
[Retainer] Fixed an issue with clipping working not properly in case Stencil clipping was used on elements inside the retainer.
-
Fix bug preventing visibility of CommonActionWidget from being setable in editor.
- By default at runtime it's visibility is still generally controlled by the widget itself.
-
Fix MVVM Show Graph not working in view binding due to missing graph editor mode set
-
Fix for Shipping Build Console with Common UI Input.
-
Fix Common Bound Action Bar
-
Fixed warning about REINST widget tree objects being nullptred on compilation in complicated widget graphs
-
Fixed UWidgetComponent::GetOwnerPlayer crash when owning world has no game instance.
Virtual Production
New:
-
Camera Calibration: Added the ability to change focus and zoom values on calibrated data points, with UI to handle merging/replacing existing points, as well as editing multiple linked values at the same time
-
CameraCalibration: Improved media source selection for the lens file editor. Users can now select from any media source or media texture asset in addition to media profile sources, as well as select live media tracks in the open level sequence editor.
-
SB: Added action menu to package the cluster. The user is now able to package the game and launch it (for nDisplay devices). Toggling between packaged and -game is a matter of toggling the packaged game checkbox in nDisplay settings.
-
CameraCalibration: Added alternate curve mode to the curve editor that displays lens data tables with a focus axis instead of a zoom axis, and allows the values of those points to be edited. The curve is forced to be a linear interpolation with no tangent editing since there isn't any tangent data being stored in the data tables for the focus axis.
-
StageMonitor: Enable data reporting in packaged dev builds. This will allow packaged nDisplay nodes to report back to a Monitor their stats.
-
LiveLink: Added BP function to query subject state (invalid, disconnected, unresponsive). This should mimic the state indicated in the live link panel for a given subject. The function is blueprint callable, and is called GetLiveLinkSubjectState. The value returned is an enum, as follows: enum class ELiveLinkSubjectState : uint8 { Connected, Unresponsive, Disconnected, InvalidOrDisabled, Unknown }; It is similar to ETimedDataInputState but can report more states suitable to a higher level query.
Bug Fix:
-
Fix intermittent test failures caused by FStageProviderMessage initializing DateTime and FrameTime to TimeNow() and GetCurrentFrameTime The FAutomationTestAttemptToFindUninitializedScriptStructMembers sometime initializes the structure at different times which would fail the test. Instead of initializing FStageProviderMessage with FDateTime::Now, we are now setting the time in IStageDataProvider::SendMessage which all messages go through.
-
Fixed DC.Stats.Frame race condition for accurate timecode & frame number inspection.
-
Fixed a case where a Remote Control WebSocket message would not be sent when only a single boolean property was changed in the editor
DMX
Bug Fix:
-
Fix issues where DMX Control Console Actor did not send DMX in certain setups.
-
DMX Control Console Actor now correctly sends DMX in Standalone.
-
DMX Control Console Actor now correctly sends DMX in PIE after toggling send DMX in editor.
-
DMX Control Console Actor now correctly sends DMX in editor when auto-activate and send DMX in editor is enabled.
-
Media IO
New:
-
Update AJA SDK to 17.0.0.1
-
Reinitialize timecode and custom timestep after blueprint compile. This should allow modifying timecode providers without having to manually set them again after compiling them
-
Add option to output interlace video as progressive. ( Experimental ) Could help in cases where you have an interlace signal going through UE to keep frames as-is. Combining OutputInterlaceAsProgressive with using Deinterlacer - None on an interlace input should let the interlace frame go through Unreal untouched.
-
Added option to the LiveLink component to force all outstanding data updates to be applied before the component evaluates.
-
MediaIOCore: Update CaptureImmediate_RenderThread to return a boolean that indicates if the capture was successfully processed.
Bug Fix:
-
Add option to disable color conversion on media texture samples
-
Fix not being able to select a video format when using the blackmagic 8k pro for input.
-
Fixed 1-frame delay between LiveLink evaluation and MRQ rendering with an option on the LiveLink component to force LiveLink to immediately apply all outstanding updates for that frame.
-
Fix Rivermax YUV10Bit422ToRGBACS shader function
-
Aja - Fix 4k Output
- Fix Aja output not correctly setting card framerate when starting output on other channels than 1
-
Rmax: Changed default rate multiplier from 1.05 to 1.00, since the multiplier was upsetting the receiver, and it seems to not be needed anymore.
-
Rivermax: Fix double skipped frame due to false de-sync detection. The false de-sync detection was happening when the barriers are entered on the nodes at different times with respect to ptp vsync, such that theit latest frame presentation does not correspond to the same vsync. The barrier now carries the last to frame presentation datas, and a desync is only confirmed when the same vsync presented different frames. Otherwise it conservatively does nothing.
nDisplay
New:
-
nDisplay and Rivermax: The p-node now sends an event every 120 frames (cvar to set frequency) with a list of any detected PTP video frame mismatches. The goal is that the operator is able to detect the nodes that have PTP misconfiguration by looking at the Stage Monitor events, and also get an idea of the extent of the PTP mismatch. PTP mismatches are made with respect to the primary node, or if the primary node is not in the barrier, then the first node in alphabetical order. Use Rivermax.Sync.Ptp.UnsyncFramesPerReport to control how often to send the events (-1 to disable them). When enabled, the event is always generated, including when all nodes are in PTP sync, to give positive confirmation to the operator that the cluster is operating as expected.
-
nDisplay: The UDisplayClusterEditorEngine class has been moved to the public API.
-
nDisplay: Hide lightcard in Editor, but keep it in the nDisplay preview. This avoids the doubled up view of the lightcard which was sometimes confusing.
-
nDisplay: Show summary in asset tooltip. Also hides the illegible json from the content browser NDC asset tooltip.
-
Switchboard: Disable Python by default when launching nDisplay. This avoids about 10ms of reachability analysis which contribute to GC hitches. Also added an option (default to off) to set gc.AllowIncrementalReachability to 1. Can be re-enabled with checkbox in nDisplay section settings.
Bug Fix:
-
nDisplay: Fixed 2110 Split Frustum Tearing Currently, the incoming texture may have extra black columns on the right side due to required padding. This will fixed at the Rivermax level in the future, but this change is a workaround that trims them based on the destination texture in nDisplay. For the cases of resolutions that are different, which would not be the viewport-viewport case, a cvar was provided to control how many rightmost columns to trim:
-
nDisplay.Media.Rivermax.CropWorkaround
-
nDisplay.Media.Rivermax.ExtraPixelsThreshold
-
nDisplay.Media.Rivermax.ExtraPixelsRemove
-
-
Switchboard: Added missing vulkan sm5 and sm6 options.
-
Switchboard: Default nDisplay launches to -NoLoadingScreen to avoid blackouts when loading new maps or saving them from Multi-User. An option has been added in case the user wants to suppress this option.
-
nDisplay: Fix Distance To Wall when camera is outside the stage geometry. The distance from the camera to the wall is determined using a line trace to the stage geometry (which is always a gapless morphed isosphere). This works ok when the camera is inside the stage geometry, but when the camera is outside, it was only measuring the distance to the outside of the stage geo, which is not correct. This was happening because procedural meshes default to being double sided, so to fix this, we force it to match that of the isosphere static mesh that it is morphing.
-
nDisplay - Prevent being able to add a new viewport from the output mapping graph when no cluster node is present. The option to add a viewport is removed unless it is safe to do, fixing a crash and keeping the behavior the same as in the treeview.
-
Fix for remote controlled properties with setter through nDisplay interception.
-
Switchboard: Fix nDisplay node hitches that happen after SBL is left running for a few hours. For the regular GPU stat calls, the NvAPI calls were replaced with NVMI calls, which do not seem to be causing hitches. "Refresh Mosaics" button renamed to "Refresh Table" because it now refreshes more than just the mosaics. Now it also requests a full sync status poll. This intentional action might cause a hitch on the nodes but this is now triggered explicitly by the user, which is rarely needed anyway, instead of every second. Also fixed an issue of the nDisplay monitor table not updating its display after emitting the dataChanged signal. Fixed nDisplay Monitor not updating when the nDisplay node name or address changed. Improved nDisplay monitor to show the connection icon instead of the wider column "Connected" with yes/no values. It now doesn't use the orange warning color on certain columns that are only relevant when the node is running (e.g. present mode).
-
nDisplay - Fix deleting the NDC from a level not updating the ICVFX panel.
-
Fixed issue where root component transform properties were not added to the Transform details panel in the ICVFX drawer in the ICVFX window.
-
Fixed issue where stage geometry mesh had physics enabled, causing it to interact with physics objects.
Rendering
New:
-
Composure: Exposed new user view flag to CG Capture Comp element as an advanced property, for use in materials for per-view branches.
-
CompositePlane: Added (advanced) option to provide a static texture to the lumen scene (instead of the projected media), which can help lighting stability in certain cases with a moving camera.
Bug Fix:
-
Fixed Composure issue which incorrectly removed transform elements instead of input elements.
-
CompositePlane: Fix material & blueprint for non-external (new style output) media textures, which is now the default on newly created ones.
-
Disabled additional settings to the VP Utilities Passthrough PPV for convenience: film grain, chromatic aberration & lumen screen traces.
-
Fixed Composure issue with translucent objects and alpha: the alpha inversion was done in the middle of post-processing, breaking regular translucency compositing.
-
Fixed Composure to further disable show flags for the main (post-processing-only) render, for instance where lumen calculations were being performed and thrown away.
-
Fixed OpenColorIO 5.4 issue which prevented display-view creation/selection, without closing and re-opening the asset.
-
Fixed OpenColorIO plugin to allow negative colors through the generated transform shaders.
Tools
New:
-
VCam: Optimize TakesBrowser by using ListView
-
Added marquee selection support to the Lens File editor to let users select a sub-region of the image for checkerboard detection.
-
[Switchboard] Improved support for content plugins, including the AdditionalPluginDirectories field in the uproject descriptor. Switchboard is now aware of all plugins contained in the engine, project, and AdditionalPluginDirectories ("external" plugins), and supports selecting levels and other assets contained in their respective Content directories. All enabled project and external plugins are considered when enumerating content by default.
-
Added playback controls to Live Link Hub.
-
Added the Prompt Client For String Blueprint action, which lets you request a string input from the user of the Unreal VCam app.
-
VCam: Added carousel style take viewer
-
LiveLink - Added a user exposed Offset transform to the transform controller component. The new member applies an offset transform in the local space of the controlled scene component.
-
Remote Control - Add option to disable console command execution through the web api
-
Added a timeout to checkerboard detection in the Lens File Editor to prevent long stalls on the Game Thread.
-
LiveLinkHub - Add support for frame preprocessors and translators
-
Remote Control: Protocol Generate Transactions option is now available per Preset instead of being a global option in Project Settings, added a second option Generate Property Change Events. No transactions and no property change events is the new default.
-
Added experimental rendering mode for lens distortion that integrates more natively into the post-process rendering pipeline.
-
VCam: Added BookmarkBrowser
-
Inline material instance creation has been moved from the VirtualProductionUtilities plugin to a new InlineMaterialInstance plugin, This will be enabled by default if you enable the VirtualProductionUtilities plugin.
-
LiveLinkHub - Add subject remapper support Subject remappers allow you to remap bone and transform data that comes through a livelink subject. This should remove the need for anim blueprints that use a remap asset.
-
[Switchboard] Changelists from Perforce paths appearing in AdditionalPathsToSync are now enumerated in the project changelist selection dropdown.
-
[Switchboard] Engine/project changelist dropdowns now display the descriptions for changelists when hovering over the CL numbers.
-
LensComponent: Expose GetLensDistortionHandler to Blueprint. Replaces the functionality that used to be available via the Camera Calibration Subsystem.
-
LiveLink - Add support for virtual subject bone attachments Bone attachments allow you to combine subjects into a virtual subject by specifying the source and target bone of the attachment. In this initial verison, the bone names of the combined subjects must exist on the target skeleton.
-
LiveLink - Add LiveLinkTransformRoleToAnimation translator Add LiveLinkTransformRoleToAnimation role to translate Transform frame data to skeleton data. Remove SubjectAdded delegate from LiveLinkHub since static data broadcast is already handed elsewhere
-
Virtual Scout - Improvement to teleportation movement. Now always teleport to floor hit if there's a valid floor under the initial sphere trace.
-
LiveLink: Added basic deadband pre-processor
-
LiveLinkHub - When combining subjects, allow specifying if the location/rotation should be fetched from the parent subject, child subject or if it should be a combination of them.
-
[XR Creative Framework] Added experimental support for blueprintable custom transform gizmos, enabling users to easily construct Interactive Tools Framework gizmos from custom meshes and materials, and with blueprint logic hooks.
-
Improved accuracy of lens calibrations when using tracked calibration patterns.
-
VCam: Added post smoothing on recorded take
-
Added "Manual" evaluation mode to Lens Component to directly provide Focus and Zoom inputs to a calibrated LensFile without requiring a LiveLink subject.
-
[Switchboard] Improved handling of host key fingerprint mismatch. When encountering an unexpected fingerprint connecting to a device, a warning dialog is now shown, explaining the situation and allowing the user to proceed if desired. In order to help elucidate potential causes of key mismatch, the subject common name of the self-signed certificate now includes the OS username and computer name, and this information is surfaced in the warning dialog.
-
LiveLinkHub - Add resampling / timecode restamping support
-
WebRemoteControl: Support for jpeg thumbnails and correctly identify the mime types in header (include svg for slate brushes).
-
Show the record button even if no multi-user users have specified that they want to record. This means that the first person to click record will be the recorder.
-
Remote Control: Get Protocol Names are now returned in alphabetical order
Bug Fix:
-
LiveLinkHub - Add IP Address to connected client info
-
[XR Creative Framework / Virtual Scouting] Removed an unnecessary dependency on the Settings module, replacing its use with UDeveloperSettings. This enables successful packaging in Shipping configurations.
-
[Switchboard] Fixed an issue where Switchboard would not terminate the multi-user server process upon invoking a build, even if you clicked the corresponding button on the confirmation prompt.
-
LiveLinkHub - Fix livelinkhub not connecting to NDisplay render nodes
-
Switchboard: Added optimizations to keep the UI responsive when connected to many (e.g. 30) nDisplay nodes.
-
Changed to standard table model that seems more optimized and manages its own internal cache of table data.
-
Spread nDisplay node status polls in time instead of doing all at the same time.
-
Added indexed caches on write operations of the program queue so that multiple readers can find programs quickly.
-
-
LiveLinkHub - Fix display name of IP address in LiveLinkHub's connected client info struct.
-
[Switchboard] The Build.version CompatibleChangelist value stored in version control is now ignored by Switchboard, as it is typically not relevant for production workflows, and could cause Switchboard to incorrectly indicate the synced changelist had not yet been built.
-
[Switchboard] Fixed several issues with the
p4_changelist_inspection.determine_changelist_type
function, causing it to incorrectly consider any file extensions (or extensionless names) ending in the letters 'c' or 'h' to constitute code changes, while several other file extensions were incorrectly ignored. [Switchboard] Reduced the progress logging from the sync process, preventing SwitchboardListener from trying to send potentially dozens of megabytes of output at the end of a sync, which was occasionally causing disconnects. -
Fix p4 workspace discovery not working when the path had a trailing directory separator.
-
RemoteControl: Fix scrollbar is now visible for protocol bindings when a preset with existing protocol bindings is opened, allowing too edit the binding as expected.
-
Fix advanced category not expanding in objects' details added through external objects CL 26991755 added lazy refresh to FDetailCategoryImpl which introduced a regression that causes categories added through AddExtenalObjects to not get refreshed when RefreshTree is called. This is because RefreshTree adds the category node to the parent layout builder's list of nodes to tick, but DetailLayoutBuilderImpl's tick method isn't called for external objects. You could see this behavior when adding a LiveLink component to an actor and selecting a subject, then trying to expand this object's advanced category.
-
LiveLinkHub - Fix subjects being removed when renamed to another subject of the same name
-
LiveLink - Append basic frame data when combining subjects in an animation virtual subject. This will enable workflows like combining ARkit's face tracking with a body motion capture tracking subject.
-
Virtual Scouting: fix for lack of handedness implementation in the measure tool
-
Virtual Scouting: measure tool. Fix crash crash in undo redo measure lines.
-
LiveLinkHub - Fix rename to same name as other subject breaking the livelink connection
-
CameraCalibration: LiveLink controllers can now be added. Also added default even/odd materials. #virtualized
-
Remote Control: Fix issues when controlling struct properties with Remote Control Protocols, fix issues specific to controlling struct properties that support masking such as FVector or FColor
-
Remote Control Panel: Fix Function Picker crash when multiple objects of the same type are present in the scene.
-
Virtual Scouting: Viewfinder tool. Fix for squeeze factor of values other than 1 on viewfinder lens. Rebuilds monitor on each lens swap to account for mixed ratio lens sets.
-
Remove call to FPlatformProcess::Sleep from LiveLinkMessageBusDiscoveryManager and use an event instead to speed up the shutdown process.
-
LensComponent: Transact camera changes when cleaning up distortion. When apply distortion is cleared on the lens component, clear distortion is also called which clears the property that indicates that distortion is set up, which is something that clear distortion looks at before doing anything. Therefore the MU client that receives this transaction never actually cleans up the distortion. This change adds the camera component to the ongoing transaction when it distortion is cleaned up, such that the receiver gets the value as well.
-
WebRemoteControl: Fixing API inconsistency with PresetGetController and PresetSetController routes to support either the Preset Name or Id to be consistent with the other routes.
-
Remote Control: Protocol bindings now remain functional after deleting a property or binding in a Remote Control PResetand undo the change
-
Bug Fix: [SwitchboardListener] Don't warn about CRYPTO_secure_malloc_init failure on Windows; this call would always fail because we use OpenSSL binaries compiled without the required support.
Deprecated:
-
VP Utilities - Moved all Legacy VScout assets to a "DEPRECATED" folder. - Fixed up any text-based references to those assets in their new folder. [RN] Legacy Virtual Scouting toolset is marked as deprecated #virtualized
-
Legacy Virtual Scouting tools are marked as deprecated and scheduled for removal in UE5.6
升级说明
Animation
Runtime
Upgrade Notes:
-
Direct use of retarget source asset has been deprecated, setter and getter is now available at anim sequences and pose assets
-
BlendSpaces that previously had the "Axis Scaling" feature enabled, but were using animations with sync markers, wouldn't have been time-scaling the playback of those animations. Following the fix, they will, so you might find that your blend spaces are scaling the playback speed. If this happens, either the axis scaling feature can be disabled, or you could clamp the inputs to the blendspace.
New:
-
Added functionality on anim sequence and pose asset tp avoid setting transient retarget source assets.
- The change includes a console command (a.CheckRetargetSourceAssetData) to scan assets in the project and optiomally clean the retarget data if the source is missing.
Bug Fix:
-
New: BlendSpace option to sync animations. Previously, BlendSpaces would always sync animations if they had sync markers, but this allows that to be disabled (in which case, animations will be blended as if there are no sync markers).
-
Bug Fix: BlendSpace applies time scaling using the "Axis Scaling" feature whether or not animations are being synced (previously it would only time-scale if animations were not being synced)
DMX
Upgrade Notes:
-
Deprecated various types and functions in C++ that were previously deprecated in Blueprints only
-
Deprecated unused types
-
See deprecation warnings for the respective functions for instructions how to upgrade your code to 5.5.
-
New:
-
DMX Engine blueprint nodes and C++ functions clean up:
-
DMX Subsystem blueprint nodes show more descriptive comments.
-
Renamed GetAllDMXLibraries to LoadAllDMXLibrariesSynchronous.
-
Renamed GetAttributesValues to GetAttributeValues and GetNormalizedAttributesValues to GetNormalizedAttributeValues.
-
Editor
Upgrade Notes:
-
New right-click context menu option for Spline Components
-
Closed Loop - Quickly change the closed loop setting of the spline
-
Straighten To Next / Previous Point - Right-Click Spline Points and select these options to quickly set the tangent handle to point directly at the next or previous spline point. Use this to straighten out spline segments.
-
Allow Snap Tangents Updates On Snap - When performing a "Snap To" operation on a spline point, tangents will automatically reset. This behavior can now be toggled on / off.
-
-
Unassigned default hotkey bind of 'A' from Add Spline Point Here
- This would frequently add accidental spline points when attempting to move the camera using WASD and having the mouse cursor over a spline component. "Add Spline Point Here" hotkey can be manually re-assigned in Editor Preferences -> Keyboard Shortcuts
New:
-
[SplineComponentVisualizer]
- Added new commands: - ToggleSnapTangentAdjustments, StraightenToNext, StraightenToPrevious, ToggleClosedLoop
Bug Fix:
-
[SplineComponentVisualizer]
- Removed default of A-Key from Add Spline Point keyboard shortcut
Foundation
Core
API Change:
- Changed TScriptDelegate to only take a read lock during execution (ProcessDelegate). This allows script delegates to call functions which may go wide and do additional reads on the running delegate. Now, the invocation list is compacted after the execution is complete rather than inline with execution.
Upgrade Notes:
-
When UnrealPak is invoked from BuildCookRun it will read project specific config files instead of the Program/Engine config files, and it will write its UnrealPak.log file to the project's Saved directory rather than to the Engine/Programs/UnrealPak directory.
-
OnGetExtraObjectTagsWithContext delegates must now be thread safe.
-
Implementations of FDerivedDataPluginInterface that return true from IsBuildThreadsafe() will now have builds run on worker threads. This will expose issues with plugins that incorrectly declared themselves to be thread-safe.
-
Reduced the strength of the lock held by TScriptDelegate from write to read to allow additional flexibility in allowed operations during execution and prevent potentially spurious multithreaded access detector errors.
New:
-
When UnrealPak is invoked from BuildCookRun it will read project specific config files instead of the Program/Engine config files, and it will write its UnrealPak.log file to the project's Saved directory rather than to the Engine/Programs/UnrealPak directory. The project directory is picked up from the existing .uproject argument that can be provided first on the command line. This change was required for UnrealPak to correctly pick up the project's DDC configuration when being run with -compressionEnableDDC, a feature that has been optimized in this engine release.
-
Converted OnGetExtraObjectTagsWithContext to be a threadsafe multicast delegate, fixed TMulticastScriptDelegate to no longer require write access when being serialized, and added locks to AssetSearchManager to ensure that it can be safely accessed from multiple threads during asset tag serialization.
-
Eliminated blocking tasks used by the legacy DDC API
Bug Fix:
- Changing TScriptDelegate to only take a read lock during execution (ProcessDelegate). This allows script delegates to call functions which may go wide and do additional reads on the running delegate. Now, the invocation list is compacted after the execution is complete rather than inline with execution.
Dev Tools
Upgrade Notes:
-
UhtHeaderFile is no longer part of Outer chain for types. This makes the Outer chain match the engine.
-
UhtPackages can no longer be enumerated from UhtSession.
-
UhtModule has been added which can now be enumerated from UhtSession. UhtPackages and UhtHeaderFiles can be enumerated from each module.
-
UhtHeaderFile contains a complete list of all root level types found in the header. Those types can also be enumerated from the individual UhtPackages found in the module owning the header file.
New:
- Added the ability for UHT to support multiple packages per module (limited to one /Script/ package). This change will likely require changes to any UHT exporter plugs. The UE_5_5_OR_LATER define can be used to maintain backwards compatibility with older versions of UE.
Framework
Upgrade Notes:
-
Passing ANSI strings to many functions on UCanvas has been deprecated to avoid expensive string conversions. Pass TCHAR strings to avoid deprecation warnings.
-
To opt-in to these fixes, enable the following CVars:
-
LatentActions.GuaranteeNextTickDelay
-
TimerManager.GuaranteeEngineTickDelay
-
New:
-
Updated many UCanvas functions to accept FStringView instead of const TCHAR* and const FString&.
-
Added FCanvasTextStringViewItem to support efficiently drawing strings allocated on the stack.
Bug Fix:
- Fixed cases where DelayUntilNextTick and SetTimerForNextTick wouldn't always wait until the next world tick before triggering. Requires opt-in.
AI Navigation
API Change:
- Some navigation specific properties have shifted to living in a new struct. So you may need to access some properties through the struct rather than just the NavMovementComponent. Some functions for nav movement have also changed and are defined in INavMovementInterface and implemented by the UNavMovementComponent. Most functions and properties kept the same functionality and name, they have just been shuffled around to allow other movement systems use of the pathfollowing system.
Upgrade Notes:
- Any extensions to the PathFollowingComponent will need to be reevaluated as the PathFollowingComponent no longer has a direct reference to a UNavMovementComponent. This component reference has been replaced with an INavMovementInterface that the PathFollowingComponent now uses in place of it. Any code that depends on the old movment system directly (e.g. UNavMovementComponent) will need to change or be added to the new interface. Movement properties that the PathFollowingComponent needs have also been moved out to a new FNavMovementProperties struct so they can be found and enforced across movement systems. So any additional properties that lived on UNavMovementComponent that will be used by other navigation systems (like path following) will need to be moved to this struct. Properties that are not used by a system like path following should be fine to leave on the component as is.
New:
- Added a new NavMovement interface to allow other movement components to implement and handle pathfollowing driven nav movement. Also contains necessary changes to convert existing code to use this new interface.
Gameplay
Upgrade Notes:
-
Please add EngineCameras as a plugin/module dependency if your code uses camera animations and/or camera shakes.
-
In order to upgrade your existing assets, switch any replicated variables to reliable RPC's. This will give you control over the timing of the sending/receiving with respect to activation of your Gameplay Ability. Recall that you will not receive these RPC's by the time your Activate function runs. Read the new GAS README.md for solutions to such problems.
-
Make sure that all Actor classes that override Actor::EndPlay call Super::EndPlay()
-
CVar to enable again: np2.CMC.EnableClientAuthScheduledPushForces 1
-
Make sure that all classes that override ActorComponent::EndPlay call Super::EndPlay everytime.
-
Set Project Settings -> Network Prediction -> Enable Fixed Tick Smoothing to enable the service.
- For a Mover actor, set the Smoothing Mode property to "Visual Component Offset".
-
Added a CVar "AbilitySystem.PlayMontage.FireInterruptOnAnimEndInterrupt" which can be set to false if this causes issues.
-
Playback only works when SimulatedProxyNetworkLOD = Interpolated.
-
This feature can be enabled with the bProcessArcadeStick setting in the Game Input Developer Settings.
-
This feature can be enabled with the bProcessFlightStick setting in the Game Input Developer Settings
-
This feature can be enabled with the "bool bProcessRacingWheel" setting in the game input developer settings.
New:
-
GAS - Deprecating the use of Replicated Properties in Gameplay Abilities. The reason these are deprecated is that since properties replication uses a separate channel than reliable RPC's, the ordering of variable replication with respect to all other Gameplay Ability functionality (such as activating a GA, or providing TargetData) is not guaranteed. This can lead to very subtle and unexpected bugs.
-
Actor
-
Ensure if we detect that the EndPlay virtual functions did not end up calling AActor::EndPlay.
-
EndPlay must always be called otherwise replicated actors and their subobjects might leak and be forever referenced by the ReplicationSystem
-
-
[NetworkPhysics] [CharacterMovementComponent] A kinematic CharacterMovementComponent pawn with physics interactions enabled along with physics prediction enabled has a client authoritative flow that schedules forces on the server, move this behind a CVar setting rather than being the default mode.
-
Actor - Added ensure to detect if the ActorComponent::EndPlay did not called due to an override behavior
-
Added optional fixed tick smoothing service to the Network Prediction Plugin, which can now be used to support visual component smoothing for Mover-driven actors.
-
Arcade Stick support in Game Input
-
Add flight stick processing to GameInput
-
Racing Wheel support for Game Input Windows
Bug Fix:
-
GAS - Fixed MontageTask Interrupt After BlendOut
-
Network Prediction plugin: added partial support for replays, fixing crashes and supporting authority/autonomous roles
Level Design and Art Tools
World Building
Upgrade Notes:
- This requires manual fix-up of any references to the PointCount declaration in Custom HLSL Shader Source and Shader Functions text fields.
New:
- Rename PointCount to NumPoints in PCG Custom HLSL node
Localization
API Change:
-
API improvements for creating and finding localized FText
-
FText::FindText is deprecated as it can no longer find untranslated text. Consider FText::FindTextInLiveTable_Advanced or FText::AsLocalizable_Advanced as a replacement, depending on your use-case.
-
FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText is deprecated in favor of FText::AsLocalizable_Advanced. Note: FText::AsLocalizable_Advanced takes its arguments in a different order!
-
-
Store the in-memory FTextKey string data as UTF-8 by default
- You can set UE_TEXTKEY_USE_UTF8=0 to restore the previous behavior of storing TCHAR data internally
Upgrade Notes:
-
API improvements for creating and finding localized FText
-
Added FText::AsLocalizable_Advanced
-
This is the replacement for FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText within the formal FText API.
-
It is the implementation of the LOCTEXT macro, and is NOT a replacement for creating text literals in C++!
-
It is intended for advanced use-cases that were already using FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText to create a localizable FText that was then being assigned to something like a FText property on an asset, OR as an alternative to FText::FindTextInLiveTable_Advanced for cases where the text exists, but isn't yet translated.
-
-
Added FText::FindTextInLiveTable_Advanced
-
This is the replacement for FText::FindText.
-
It has the same behavior as before, but is clearer about what it can and cannot do.
-
Existing FText::FindText usage should be audited to decide whether to continue to use FText::FindTextInLiveTable_Advanced or swap to using FText::AsLocalizable_Advanced on a case-by-case basis.
-
-
-
Store the in-memory FTextKey string data as UTF-8 by default
- This change deprecates FTextKey::GetChars(). Use FTextKey::ToString/AppendString instead.
New:
-
API improvements for creating and finding localized FText
-
Store the in-memory FTextKey string data as UTF-8 by default
- This trades some CPU cost when converting FString -> FTextKey -> FString, in exchange for halving the text key string memory (as most, if not all, text keys are actually ASCII).
Platform
XR
Upgrade Notes:
- Replace usages of GetMotionControllerData with GetMotionControllerState and/or GetHandTrackingState, as appropriate.
New:
- GetMotionControllerData Refactoring -Added new methods to get controller and hand tracking status separately rather than mushed together with ambiguous validity and tracking status. -Removed GetControllerTransformForTime which was deprecated in 5.3.
Platform Mobile
iOS, tvOS, and iPadOS
Upgrade Notes:
- See the
SLoginFlowImpl::HandleBeforePopup()
function for an example of openingtarget="_blank"
links on IOS in a default external browser.
Bug Fix:
- Fixed an issue where IOS WebBrowser could not handle links with
target="_blank"
. These are now routed to theOnBeforePopup()
event.
Rendering
Lighting
Upgrade Notes:
-
Accurate rect lights path is enabled by default since the quality is superior and the performance difference is minimal even with many rect lights. Can be disabled with r.TranslucencyLightingVolume.AccurateRectLights 0.
-
See r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias and associated notes for the difference in WPO handling in shadow passes.
New:
-
Implement a faster batched path for translucency lighting volume injection. Added a more accurate RectLight integration for translucency light volume (to both paths).
-
Refactor virtual shadow map invalidations to improve instance culling performance.
-
Changes to how WPO distance disable is handled in the virtual shadow map pass.
Materials and Shaders
Upgrade Notes:
- Updated DirectXShaderCompiler (DXC) to version release-1.8.2403.
New:
- [DXC] DXC release-1.8.2403 update This is the last CL of the DXC update including the binary files and API headers. The other CLs including all source changes are: - 32164743 SPIRV-Headers - 32166600 SPIRV-Tools - 32165724 SPIRV-Cross - 32165890 DirectXShaderCompiler - 32165937 ShaderConductor - 32165762 googletest - 32165815 cxxopts
Nanite
Upgrade Notes:
- Use the new "Tessellation" view mode to identify displaced materials instead of the "Pixel Programmable" view mode that previously included these materials for performance risk identification.
New:
- Added "Tessellation" view to the standard Nanite Visualization list of view modes. Also removed materials with displacement from the "Pixel Programmable" view. Use the new "Tessellation" view mode to identify displaced materials instead.
Niagara
Upgrade Notes:
- This might break some existing content, but whatever it compiled down to before didn't work anyway.
Bug Fix:
- Niagara now fails to compile when writing to attributes from the wrong namespace (e.g. to Emitter.Age from a particle script)
Simulation
Physics
Upgrade Notes:
-
Existing assets using the per-platform MinLod property will automatically be upgraded using the per-platform values of p.ClothAsset.MinLodQualityLevel
-
Previous LogString Dataflow nodes have been deprecated and it is recommended to replace them the new Print node instead
-
The current version node is now deprecated and any node placed in Dataflow prior to 5.5 requires replacing it with a new one
-
v2 versions of the Skeletal and Static Mesh Import nodes were added with the correct Normals import so as not to affect existing assets.
New:
-
Implemented Quality Level Min Lod for Chaos Cloth Assets, which can be enabled via the Engine.ini file. This matches how Quality Level Min Lod works for Static Meshes and Skeletal Meshes. The cvar p.ClothAsset.MinLodQualityLevel can be set in per platform ini files to manage MinLodQualityLevel on a per-platform basis.
-
Added Print Dataflow node with string compatible generic input (Also deprecated the previous LogString nodes)
Bug Fix:
-
Fixed CollectionTransformSelectCluster dataflow node that was wrongly selecting leaves instead of clusters
-
Fixed normal calculation/import when creating Chaos Cloth Assets so they're no longer flipped.
Pixel Streaming
-
Upgrade Notes: The following list includes some of the high-level changes you should be aware of when moving to Pixel Streaming 2:
-
All Blueprint nodes have a Pixel Streaming 2 version. If you are migrating your project, you must manually recreate and relink relevant nodes in your Blueprints. A redirector is not possible when the entire plugin name is changed.
-
We significantly changed the C++ API. Several files and members have been added, removed, or renamed.
-
The Pixel Streaming settings have changed. We added some new options, changed default values for some existing options, and deprecated legacy options.
-
You can now set the Pixel Streaming settings from .ini, console, or command line. The setting priority order is .ini is overridden by command line, which is overridden by console.
-
Pixel Streaming Player functionality is included with Pixel Streaming 2, rather than requiring an additional plugin. The setup steps have significantly changed so please see the official Unreal Engine Docs for detailed instructions.
-
Stream sharing has been removed as it was a hack with many issues around stuttering and freezing. Users who were relying on the stream sharing functionality to support multiple viewers per stream should instead opt to use the Selective Forwarding Unit (SFU) as a replacement for this functionality. More information on its functionality and how to use it can be found in the official Unreal Engine Docs.
-
-
API Change: PixelStreaming
-
IPixelStreamingAudioConsumer.h
*Renamed to IPixelStreaming2AudioConsumer.h. No other changes
-
IPixelStreamingAudioInput.h
- Renamed to IPixelStreaming2AudioProducer.h. No other changes
-
IPixelStreamingAudioSink.h
- Renamed to IPixelStreaming2AudioSink.h. The IPixelStreamingAudioSink has had the
bool HasAudioConsumers
method removed. Users are not required to interact with this method. They may continue to use the remainingAddAudioConsumer
andRemoveAudioConsumer
methods.
- Renamed to IPixelStreaming2AudioSink.h. The IPixelStreamingAudioSink has had the
-
IPixelStreamingModule.h
- Renamed to IPixelStreaming2Module.h
-
Additionally, the following methods were removed:
-
SetCodec
-
GetCodec
- The above methods have been removed as they were just wrapping CVar functionality. Users wishing to set the PS2 codec programmatically should use the Engine’s IConsoleManager and its relevant methods.
-
SetExternalVideoSourceFPS
-
SetExternalVideoSourceCoupleFramerate
-
SetExternalVideoSourceInput
-
CreateExternalVideoSource
-
ReleaseExternalVideoSource
-
CreateVideoEncoderFactory
- The above methods have been removed as the external video source was a hack for another plugin.
-
AddInputComponent
-
RemoveInputComponent
-
GetInputComponents
- The above methods have been removed from the module as the InputComponent C++ interface has moved internally to the module. The following methods have been added:
-
CreateVideoProducer
-
CreateAudioProducer
-
-
IPixelStreamingSignallingConnection.h
- Has been completely removed with no replacement. This class is no longer required as signaling is abstracted away from the user in the new plugin.
-
IPixelStreamingSignallingConnectionObserver.h
*Has been completely removed with no replacement. This class is no longer required as signaling is abstracted away from the user in the new plugin.
-
IPixelStreamingStats.h
- Renamed to IPixelStreaming2Stats.h. No other changes.
-
IPixelStreamingStreamer.h
*Renamed to IPixelStreaming2Streamer.h.
-
Additionally, the following methods have been removed:
-
SetTargetViewport
-
GetTargetViewport
-
SetTargetWindow
-
GetTargetWindow
-
SetTargetScreenRect
-
GetTargetScreenRect
-
Users using the above methods should instead use GetInputHandler before calling the above methods on the input handler directly.
-
-
OnInputReceived delegate has been removed. Users that were relying on this functionality should instead register a message handler with the streamer’s input handler.
-
SendPlayerMessage renamed to SendAllPlayerMessage and types changes. Type changes from uint8 to FString which represents the string based identifier for the message you wish to send e.g. "Command"
-
SendPlayerMessage is a new method (despite having the same name as a previous method) that sends a message to a particular PlayerId.
-
SetInputHandler has been removed in favor of users using the same input handler, but instead registering their own custom message handler.
-
GetSignallingConnection
-
SetSignallingConnection
-
GetSignallingConnectionObserver
- The above methods have been removed as the signalling interface is no longer exposed through the PS2 plugin.
-
SetPlayerLayerPreference has been removed in favor of a frontend setting.
-
SetInputHandlerType has been removed as it just proxied the input handler’s method. Users should get the input handler from the streamer and then call SetInputType on the handler.
-
CreateAudioInput has been removed in favor of the Module’s CreateAudioProducer.
-
RemoveAudioInput has been removed as the audio input lifecycle is automatically managed.
-
The following methods have been renamed:
-
SetVideoInput has been replaced with SetVideoProducer.
-
GetVideoInput has been replaced with GetVideoProducer.
-
-
The following methods have been added:
-
GetPeerVideoSink.
-
GetUnwatchedVideoSink.
-
-
PixelStreamingAudioComponent.h
*This header exposes two types: FWebRTCSoundGenerator and UPixelStreamingAudioComponent both are now private in C++. The purpose of this header was to make the Pixel Streaming audio component available for use in blueprint, this is still achieved with this header becoming private. If users need to access this functionality in C++ then they will have to make custom types that mimic these in their own project. However, this should be straightforward as all the required types are public.
-
PixelStreamingBufferBuilder.h
*Has been completely removed with no replacement as it was used purely by the datachannel, which has become an internal type in Pixel Streaming 2. Users who were using the buffer builder functionality can easily replicate it in their own code as all the required types are common UE types and still available for use.
-
PixelStreamingCodec.h
*Has been completely removed with no replacement and instead EVideoCodec from Plugins\Experimental\AVCodecs\AVCodecsCore\Source\AVCodecsCore\Public\Video\VideoConfig.h are used instead.PixelStreamingDataChannel.hHas been completely removed with no replacement. For users wanting to send messages, these methods have moved to SendAllPlayerMessage and SendPlayerMessage on the IPixelStreaming2Streamer. Users previously depending on the OnMessageReceived delegate should instead register a message handler with the streamer’s input handler. Users relying on OnOpen and OnClosed can use UPixelStreaming2Delegates OnDataTrack(Open/Closed) and OnDataTrack(Open/Closed)Native noting that these delegates don’t expose the track itself and are purely for tracking data track lifetime.PixelStreamingDelegates.hRenamed to PixelStreaming2Delegates.h. The following delegates have been removed
-
OnQualityControllerChangedNative as the stream sharing functionality is no longer available in PS2. For users wishing to stream to a large number of peers simultaneously, consider using the Selective Forwarding Unit (SFU) from the PixelStreamingInfra.
-
The following delegates have been replaced:
-
Fixed spelling of OnFallbackToSoftwareEncodering(/Native) to OnFallbackToSoftwareEncoding(/Native)
-
Renamed OnDataChannelOpen/Closed(/Native) to OnDataTrackOpen/Closed(/Native)
-
OnConnectedToSignallingServer modified to broadcast an FString parameter representing the ID of the streamer that connected to the signalling server
-
OnConnectedToSignallingServerNative modified to broadcast an FString parameter representing the ID of the streamer that connected to the signalling server
-
OnDisconnectedFromSignallingServer modified to broadcast an FString parameter representing the ID of the streamer that connected to the signalling server
-
OnDisconnectedFromSignallingServerNative modified to broadcast an FString parameter representing the ID of the streamer that connected to the signalling server
-
-
The following delegates have been added:
-
Added C++ delegates for when VideoTracks and AudioTracks are Open/Closed
-
Additional info:
-
Moved all delegates C++ to be thread safe
-
Static boolean bIsExiting Removed, users can track this with IsEngineExitRequested.
-
Removed CreateInstance method and renamed GetPixelStreamingDelegates to simply Get. Users can now call UPixelStreaming2Delegates::Get() to obtain the singleton pointer to the delegates object.
-
-
PixelStreamingInputComponent.h
- Has been completely removed with no replacement. This component is used to send and receive datachannel messages from blueprint. This functionality is still exposed in blueprints, however, interacting with this type in C++ has now been made internal to the plugin only. For users wanting to send and receive datachannel messages in C++ please use PixelStreamingInputHandler.h, which has been exposed for several engine versions now.
-
PixelStreamingPeerConnection.h
- Has been completely removed with no replacement as this file exclusively used WebRTC types which are no longer referenced in PS2.
-
PixelStreamingPlayerConfig.h
- Has been completely removed with no replacement. This type was previously exposed for handling signaling messages such as
PlayerConnected
. However all signaling logic has been moved to be internal in Pixel Streaming 2, therefore this header’s types are no longer required.
- Has been completely removed with no replacement. This type was previously exposed for handling signaling messages such as
-
PixelStreamingPlayerId.h
- Has been completely removed with no replacement as it was typedef of FString. You can safely substitute FString in all call sites where PixelStreamingPlayerId was previously being used.PixelStreamingSessionDescriptonObserver.hHas been completely removed with no replacement.PixelStreamingSettings.hHas been completely removed with no replacement. It contained three methods: (1) GetSimulcastParameters, (2) GetCaptureUseFence, and (3) GetVPXUseCompute. Methods (1) and (2) can be queried using CVars, ini settings, or plugin settings and (3) has been removed entirely as this codepath related to VPX compute shaders showed no meaningful improvement.PixelStreamingSignallingConnection.hHas been completely removed with no replacement.
-
PixelStreamingStatNames.h
- Renamed to PixelStreaming2StatNames.h. QualityController stat has been removed because QualityController is no longer used by PixelStreaming.
-
PixelStreamingUtils.h
- Renamed to PixelStreaming2Utils.h
-
PixelStreamingTrace.h
- Has been completely removed with no replacement. This header is only for internal use inside Pixel Streaming and its related modules. If you were using this trace definition, you should create your own trace definition using
UE_TRACE_CHANNEL_EXTERN
.
- Has been completely removed with no replacement. This header is only for internal use inside Pixel Streaming and its related modules. If you were using this trace definition, you should create your own trace definition using
-
**PixelStreamingVideoInput.h
-
PixelStreamingVideoInputBackBuffer.h
-
PixelStreamingVideoInputI420.h
-
PixelStreamingVideoInputNV12.h
-
PixelStreamingVideoInputPIEViewport.h
-
PixelStreamingVideoInputRenderTarget.h
-
PixelStreamingVideoInputRHI.h
- These have been moved to internal and replaced by IPixelStreaming2VideoProducer.h for the public API. Users can now use the Modules CreateVideoProducer method as well as the Streamers SetVideoProducer method to use their custom video producers with PixelStreaming2.
-
PixelStreamingVideoSink.h
- Has been removed and replaced with IPixelStreaming2VideoSink.h. Users must create their own class that implements IPixelStreaming2VideoConsumer from IPixelStreaming2VideoConsumer.h. Once this is done, users can obtain a video sink from the Streamers GetVideoSink method and then call AddVideoConsumer with a pointer to their custom consumer.
-
PixelStreamingWebRTCIncludes.h
- Has been completely removed with no replacement as WebRTC is no longer exposed and EpicRtc is used.
PixelStreamingEditor
-
IPixelStreamingEditorModule.h
- Renamed to IPixelStreaming2EditorModule.h. Additionally, the
bool UserExternalSignallingServer
andvoid UseExternalSignallingServer(bool bUseExternalSignallingServer)
methods have been removed and this information should instead be queried from the appropriate ini / cvars.PixelStreamingEditorUtils.hThis header has been removed. It contained three methods: (1) ToString(EStreamType), (2) ToString(EWindowType), and (3) HashWindow. All three methods provided no functionality so have been removed entirely. The EStreamType enum has moved to PixelStreaming2CoreEnums.h and renamed to EPixelStreaming2EditorStreamTypes.PixelStreamingStyle.hThis header has been moved to Internal. Its functionality was only used internally for the Editor streaming module and as such has been relocated.PixelStreamingVideoBackBufferComposited.hThis header has been moved to Internal.
- Renamed to IPixelStreaming2EditorModule.h. Additionally, the
-
PixelStreamingVideoViewport.h
- This header has been moved to Internal.
PixelStreamingHMD
-
IPixelStreamingHMDModule.h
- Renamed to IPixelStreaming2HMDModule.h. Additionally, GetPixelStreamingHMD now returns the new interface type.
-
PixelStreamingHMD.h
- This header has been replaced with IPixelStreaming2HMD.h. Users can use the two exposed functions: (1) SetTransform and (2) SetEyeViews as they were previously.
-
PixelStreamingHMDEnums.h
- Renamed to PixelStreaming2HMDEnums.h
PixelStreamingServers
-
PixelStreamingServers.h
- The following methods have been removed: (1) MakeCirrusServer and (2) MakeLegacySignallingServer. With these removals, users wishing to launch a signalling server from the application are forced to create an embedded C++ signalling server that still serves the PixelStreamingInfra frontend.EndPoint has had Signalling_Matchmaker removed.
PixelStreamingInput
-
EditorPixelStreamingSettings.h
*The purpose of this header was to expose some plugin settings that can be set via the Unreal Editor plugin UI. This functionality has now been made internal; however, you may still set these settings using the plugin UI.
-
IPixelStreamingInputHandler
-
OnSendMessage
- This member has been changed from a multicast delegate to an event as only internal Pixel Streaming code should be able to broadcast this event. However, you may still bind to this member to add custom handling to messages that input handler is sending over the datachannel (e.g. the gamepad id message and textbox entry message).IPixelStreamingInputModule
-
OnProtocolUpdated
*This member delegate has been moved into the new interface IPixelStreamingDataProtocol, which can be accessed via the IPixelStreamingInputHandler::GetFromStreamerProtocol() and IPixelStreamingInputHandler::GetToStreamerProtocol().The functionality remains the same, except now each streamer can have its own protocols (e.g. each streamer has a ToStreamer and FromStreamer protocol), and as such each protocol has its own OnProtocolUpdated delegate.
-
-
PixelStreamingInputConversion.h
- This header was only used by the PixelStreaming Input module, so it has now been made private. If you were using mappings from this header, then you can replicate those mappings in your own project by creating your own version of these maps and populating them. All the types required are public and available.
-
PixelStreamingEnums.h
- Added EPixelSreamingToStreamerMessage FStrings and EPixelSreamingFromStreamerMessage FStrings. These are effectively used as enums.
-
PixelStreamingInputMessage.h
- Has been completely removed. There is now a new header that exposes an interface for these messages in IPixelStreaming2InputMessage.h.
-
PixelStreamingInputProtocol.h
- This header has been removed. The two static protocols in this header have been replaced with IPixelStreaming2InputHandler::GetToStreamerProtocol and IPixelStreaming2InputHandler::GetFromStreamerProtocol.
-
PixelStreamingInputProtocolMap.h
- This header was previously used to add custom data channel messages and has been moved to internal. Users wishing to create and add their own Input Message should no longer use the map directly, but rather use the Add() method from IPixelStreaming2DataProtocol, which if successful, will return the newly created and added message.
PixelStreamingPlayer
-
PixelStreamingMediaTexture.h
- Has been completely removed with no replacement. This component is used to update materials with video frames received in PS2. This functionality is still exposed in blueprints, however, interacting with this type in C++ has now been made internal to the plugin only. For users wanting to display video frames received in PS2, users should implement IPixelStreaming2VideoConsumer and add it to an IPixelStreaming2VideoSink.
-
PixelStreamingPeerComponent.h
- Has been completely removed with no replacement. This component is used to receive a PixelStreaming stream in the engine. This functionality is still exposed in blueprints, however, interacting with this type in C++ has now been made internal to the plugin only. For users wanting to receive a stream in the engine, users should implement their own peer similar to how this class achieves the functionality.
-
PixelStreamingSignallingComponent.h
- Has been completely removed with no replacement. This class is no longer required as signaling is abstracted away from the user in the new plugin.
-
PixelStreamingWebRTCWrappers.h
- Has been completely removed with no replacement as WebRTC is no longer exposed and EpicRtc is used.
Settings Changes
-
-PixelStreamingSignalingKeepAliveInterval - new
-
-PixelStreamingUseMediaCapture - true now by default
-
-PixelStreamingID - can now be set by command line
-
-PixelStreamingSendPlayerIdAsInteger - removed
-
-PixelStreamingVPXUseCompute - removed
-
-PixelStreamingExperimentalAudioInput - removed and now always enabled
-
-PixelStreamingSuppressICECandidateErrors - removed as it was only useful for some flaky tests, which have since been stabilized.
-
-PixelStreamingFastPan - removed as there was no code path that has used this option for multiple UE versions now.
-
-PixelStreamingEncoderMinQuality - replaces MaxQP which sets the lower bound for encoding quality. The reason for this change was MaxQP controlling the quality lower bound was unclear to most users and the previous value range, [1-51], was only useful for H.264. The new range is [0 - 100], where 0 is the lowest quality and 100 is the highest quality, can be used across all supported Pixel Streaming codecs.
-
-PixelStreamingEncoderMaxQuality - replaces MinQP which sets the upper bound for encoding quality. The reason for this change was MinQP controlling the quality upper bound was unclear to most users and the previous value range, [1-51], was only useful for H.264. The new range is [0 - 100], where 0 is the lowest quality and 100 is the highest quality, can be used across all supported Pixel Streaming codecs..
-
-PixelStreamingEncoderPreset - Replaced with PixelStreamingEncoderQualityPreset and PixelStreamingEncoderLatencyMode
-
-PixelStreamingEncoderQualityPreset - Preset that configures several settings of an encoder and balances quality and bitrate.
-
-PixelStreamingEncoderLatencyMode - new setting that configures several aspects of an encoder and balances latency and quality. Note selecting lower latency modes with a high quality preset will likely result in lower quality than if latency is default.
-
-PixelStreamingEncoderIntraRefreshPeriodFrames - removed as its functionality was duplicated by -PixelStreamingEncoderKeyframeInterval
-
-PixelStreamingEncoderRateControl - removed
-
-PixelStreamingEnableFillerData - removed
-
-PixelStreamingEncoderMultipass - removed: low latency modes will disable mulitpass
-
-PixelStreamingEncoderIntraRefreshPeriodFrames - removed
-
-PixelStreamingEncoderIntraRefreshCountFrames - removed
-
-PixelStreamingDegradationPreference - removed and hardcoded to MAINTAIN_FRAMERATE
-
-PixelStreamingEncoderKeyframeInterval - Default is now -1 so no periodic keyframes
-
-SimulcastParameters - replaced with PixelStreamingEncoderEnableSimulcast
-
-PixelStreamingEncoderScalabilityMode - specifies the encoder scalability mode which is one of the supported modes: https://www.w3.org/TR/webrtc-svc/#scalabilitymodes*.
-
-PixelStreamingWebRTCMaxBitrate - drop default from 100mb/s to 40mb/s
-
-PixelStreamingWebRTCLowQpThreshold - removed
-
-PixelStreamingWebRTCHighQpThreshold - removed
-
-PixelStreamingWebRTCUseLegacyAudioDevice - removed and LegacyAudioDevice is deprecated
-
Virtual Production
nDisplay
Upgrade Notes:
-
SwitchboardListenerHelper is not required anymore.
-
If old projects had intentional overrides, they will now use the blueprint values.
New:
-
SBL: It can now lock the GPUs itself. SBLH is not required anymore. We are keeping SBLH around mostly so that the user doesn't need to run SBL as admin. Also fixed an issue where the open button icon of unreal devices in SB would not always update because it would update before the program queue was updated after a program ended notification came from the listener, and that program queue was checked when updating the classes.
-
nDisplay: Force media settings to use archetype values, avoiding potential mismatch in media settings between level instance and blueprint.
Tools
Upgrade Notes:
-
5.4 files are not compatible and recordings will need to be saved again.
-
XRCreative Framework is now Beta
-
Remote Control Protocol Masking UI improved to be more clear when a component is ON/OFF
New:
-
LiveLinkHub assets now support saving and loading recordings asynchronously. When loading from disk, sections are buffered into memory up to a configurable memory limit.
-
XRCreative Changed Experimental to Beta plugin designation [RN] XRCreative Framework is considered Beta
-
Remote Control: Improved Mask UI for clarity